From a22048df2dc0fc0cad4678f404172a15323408a3 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Tue, 1 Apr 2025 17:00:35 +0200 Subject: [PATCH 001/110] Add initial client implementation - configs, docker, etc in `client_configs` - currently is using poetry --- ATTRIBUTIONS.md | 2 +- client_configs/Dockerfile | 38 + client_configs/README.md | 15 + client_configs/_pyproject_uv.toml | 22 + client_configs/conftest.py | 29 + client_configs/poetry.lock | 1520 ++++++ client_configs/pyproject.toml | 60 + codegen/.openapi-generator/FILES | 64 + codegen/.openapi-generator/VERSION | 1 + codegen/aignx/codegen/api/externals_api.py | 4201 +++++++++++++++++ codegen/aignx/codegen/api_client.py | 782 +++ codegen/aignx/codegen/api_response.py | 25 + codegen/aignx/codegen/configuration.py | 564 +++ codegen/aignx/codegen/exceptions.py | 196 + codegen/aignx/codegen/models/__init__.py | 57 + .../models/application_creation_request.py | 87 + .../models/application_creation_response.py | 83 + .../models/application_read_response.py | 91 + .../codegen/models/application_run_status.py | 41 + .../codegen/models/application_version.py | 129 + .../application_version_read_response.py | 126 + .../aignx/codegen/models/artifact_event.py | 36 + .../aignx/codegen/models/artifact_status.py | 41 + .../codegen/models/http_validation_error.py | 92 + .../aignx/codegen/models/input_artifact.py | 94 + .../models/input_artifact_creation_request.py | 87 + .../models/input_artifact_read_response.py | 94 + .../input_artifact_schema_creation_request.py | 87 + .../codegen/models/item_creation_request.py | 94 + codegen/aignx/codegen/models/item_event.py | 35 + .../models/item_event_creation_request.py | 87 + .../models/item_event_creation_response.py | 87 + .../codegen/models/item_read_response.py | 103 + .../models/item_result_read_response.py | 108 + codegen/aignx/codegen/models/item_status.py | 39 + .../models/organization_creation_request.py | 89 + .../codegen/models/organization_quota.py | 90 + .../codegen/models/organization_response.py | 94 + .../models/organization_update_request.py | 95 + .../aignx/codegen/models/output_artifact.py | 101 + .../output_artifact_event_trigger_request.py | 94 + .../output_artifact_event_trigger_response.py | 87 + .../models/output_artifact_read_response.py | 98 + .../output_artifact_result_read_response.py | 103 + ...output_artifact_schema_creation_request.py | 94 + .../codegen/models/output_artifact_scope.py | 35 + .../models/output_artifact_visibility.py | 35 + .../codegen/models/payload_input_artifact.py | 87 + codegen/aignx/codegen/models/payload_item.py | 114 + .../codegen/models/payload_output_artifact.py | 95 + codegen/aignx/codegen/models/quota_name.py | 42 + .../codegen/models/quota_read_response.py | 87 + .../codegen/models/quota_update_request.py | 87 + .../codegen/models/quota_update_response.py | 87 + .../codegen/models/quotas_read_response.py | 92 + .../codegen/models/quotas_update_request.py | 92 + .../codegen/models/quotas_update_response.py | 92 + .../codegen/models/run_creation_request.py | 98 + .../codegen/models/run_creation_response.py | 83 + .../aignx/codegen/models/run_read_response.py | 107 + .../codegen/models/slug_version_request.py | 92 + codegen/aignx/codegen/models/transfer_urls.py | 85 + .../codegen/models/user_creation_request.py | 92 + codegen/aignx/codegen/models/user_payload.py | 116 + codegen/aignx/codegen/models/user_quota.py | 90 + codegen/aignx/codegen/models/user_response.py | 102 + .../codegen/models/user_update_request.py | 95 + .../aignx/codegen/models/validation_error.py | 96 + .../models/validation_error_loc_inner.py | 130 + .../models/version_creation_request.py | 110 + .../models/version_creation_response.py | 83 + .../codegen/models/version_read_response.py | 120 + codegen/aignx/codegen/rest.py | 254 + codegen/docs/ExternalsApi.md | 1269 +++++ docs/source/_static/openapi_v1.yaml | 45 +- docs/source/_static/openapi_v2.yaml | 45 +- schema/api.json | 1 + schema/config.json | 13 + schema/generate.sh | 24 + src/aignx/platform/__init__.py | 1 + src/aignx/platform/__main__.py | 95 + src/aignx/platform/_authentication.py | 208 + src/aignx/platform/_client.py | 37 + src/aignx/platform/resources/applications.py | 30 + src/aignx/platform/resources/runs.py | 197 + src/aignx/platform/utils.py | 87 + tests/aignx/platform/applications_test.py | 121 + .../aignx/platform/two_task_dummy_app_test.py | 113 + 88 files changed, 15115 insertions(+), 31 deletions(-) create mode 100644 client_configs/Dockerfile create mode 100644 client_configs/README.md create mode 100644 client_configs/_pyproject_uv.toml create mode 100644 client_configs/conftest.py create mode 100644 client_configs/poetry.lock create mode 100644 client_configs/pyproject.toml create mode 100644 codegen/.openapi-generator/FILES create mode 100644 codegen/.openapi-generator/VERSION create mode 100644 codegen/aignx/codegen/api/externals_api.py create mode 100644 codegen/aignx/codegen/api_client.py create mode 100644 codegen/aignx/codegen/api_response.py create mode 100644 codegen/aignx/codegen/configuration.py create mode 100644 codegen/aignx/codegen/exceptions.py create mode 100644 codegen/aignx/codegen/models/__init__.py create mode 100644 codegen/aignx/codegen/models/application_creation_request.py create mode 100644 codegen/aignx/codegen/models/application_creation_response.py create mode 100644 codegen/aignx/codegen/models/application_read_response.py create mode 100644 codegen/aignx/codegen/models/application_run_status.py create mode 100644 codegen/aignx/codegen/models/application_version.py create mode 100644 codegen/aignx/codegen/models/application_version_read_response.py create mode 100644 codegen/aignx/codegen/models/artifact_event.py create mode 100644 codegen/aignx/codegen/models/artifact_status.py create mode 100644 codegen/aignx/codegen/models/http_validation_error.py create mode 100644 codegen/aignx/codegen/models/input_artifact.py create mode 100644 codegen/aignx/codegen/models/input_artifact_creation_request.py create mode 100644 codegen/aignx/codegen/models/input_artifact_read_response.py create mode 100644 codegen/aignx/codegen/models/input_artifact_schema_creation_request.py create mode 100644 codegen/aignx/codegen/models/item_creation_request.py create mode 100644 codegen/aignx/codegen/models/item_event.py create mode 100644 codegen/aignx/codegen/models/item_event_creation_request.py create mode 100644 codegen/aignx/codegen/models/item_event_creation_response.py create mode 100644 codegen/aignx/codegen/models/item_read_response.py create mode 100644 codegen/aignx/codegen/models/item_result_read_response.py create mode 100644 codegen/aignx/codegen/models/item_status.py create mode 100644 codegen/aignx/codegen/models/organization_creation_request.py create mode 100644 codegen/aignx/codegen/models/organization_quota.py create mode 100644 codegen/aignx/codegen/models/organization_response.py create mode 100644 codegen/aignx/codegen/models/organization_update_request.py create mode 100644 codegen/aignx/codegen/models/output_artifact.py create mode 100644 codegen/aignx/codegen/models/output_artifact_event_trigger_request.py create mode 100644 codegen/aignx/codegen/models/output_artifact_event_trigger_response.py create mode 100644 codegen/aignx/codegen/models/output_artifact_read_response.py create mode 100644 codegen/aignx/codegen/models/output_artifact_result_read_response.py create mode 100644 codegen/aignx/codegen/models/output_artifact_schema_creation_request.py create mode 100644 codegen/aignx/codegen/models/output_artifact_scope.py create mode 100644 codegen/aignx/codegen/models/output_artifact_visibility.py create mode 100644 codegen/aignx/codegen/models/payload_input_artifact.py create mode 100644 codegen/aignx/codegen/models/payload_item.py create mode 100644 codegen/aignx/codegen/models/payload_output_artifact.py create mode 100644 codegen/aignx/codegen/models/quota_name.py create mode 100644 codegen/aignx/codegen/models/quota_read_response.py create mode 100644 codegen/aignx/codegen/models/quota_update_request.py create mode 100644 codegen/aignx/codegen/models/quota_update_response.py create mode 100644 codegen/aignx/codegen/models/quotas_read_response.py create mode 100644 codegen/aignx/codegen/models/quotas_update_request.py create mode 100644 codegen/aignx/codegen/models/quotas_update_response.py create mode 100644 codegen/aignx/codegen/models/run_creation_request.py create mode 100644 codegen/aignx/codegen/models/run_creation_response.py create mode 100644 codegen/aignx/codegen/models/run_read_response.py create mode 100644 codegen/aignx/codegen/models/slug_version_request.py create mode 100644 codegen/aignx/codegen/models/transfer_urls.py create mode 100644 codegen/aignx/codegen/models/user_creation_request.py create mode 100644 codegen/aignx/codegen/models/user_payload.py create mode 100644 codegen/aignx/codegen/models/user_quota.py create mode 100644 codegen/aignx/codegen/models/user_response.py create mode 100644 codegen/aignx/codegen/models/user_update_request.py create mode 100644 codegen/aignx/codegen/models/validation_error.py create mode 100644 codegen/aignx/codegen/models/validation_error_loc_inner.py create mode 100644 codegen/aignx/codegen/models/version_creation_request.py create mode 100644 codegen/aignx/codegen/models/version_creation_response.py create mode 100644 codegen/aignx/codegen/models/version_read_response.py create mode 100644 codegen/aignx/codegen/rest.py create mode 100644 codegen/docs/ExternalsApi.md create mode 100644 schema/api.json create mode 100644 schema/config.json create mode 100755 schema/generate.sh create mode 100644 src/aignx/platform/__init__.py create mode 100644 src/aignx/platform/__main__.py create mode 100644 src/aignx/platform/_authentication.py create mode 100644 src/aignx/platform/_client.py create mode 100644 src/aignx/platform/resources/applications.py create mode 100644 src/aignx/platform/resources/runs.py create mode 100644 src/aignx/platform/utils.py create mode 100644 tests/aignx/platform/applications_test.py create mode 100644 tests/aignx/platform/two_task_dummy_app_test.py diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index c1861643..ad87801e 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -337,7 +337,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## aignostics (0.0.9) - MIT License +## aignostics (0.0.10) - MIT License 🔬 Python SDK providing access to Aignostics AI services. diff --git a/client_configs/Dockerfile b/client_configs/Dockerfile new file mode 100644 index 00000000..38f29d31 --- /dev/null +++ b/client_configs/Dockerfile @@ -0,0 +1,38 @@ +ARG REPO_PATH=/srv/repo + +FROM europe-docker.pkg.dev/aignx-shared-tools-ebagiogxst/aignx-dockerhub-registry-prd-ar/python:3.12-slim-bookworm AS base +ARG REPO_PATH + +# Install Poetry without defiling environment with its dependencies +RUN apt-get update && apt-get install -y curl libmagic1 +RUN curl -sSL https://install.python-poetry.org | python3 - +ENV PATH="/root/.local/bin:${PATH}" + +RUN mkdir -p ${REPO_PATH} +WORKDIR $REPO_PATH + +RUN poetry config virtualenvs.create false + +COPY poetry.lock poetry.lock +COPY pyproject.toml pyproject.toml + +# todo(andreas): change to .env and also adjust code +COPY .env .env.dev +COPY .env .env +COPY src/ src +COPY codegen/ codegen + +ENV PYTHONPATH="\ +$REPO_PATH/src/:\ +$REPO_PATH/codegen/:\ +" + +FROM base AS test +ARG REPO_PATH + +COPY tests/ tests + +WORKDIR $REPO_PATH +RUN poetry install --sync --no-root + +CMD ["pytest"] diff --git a/client_configs/README.md b/client_configs/README.md new file mode 100644 index 00000000..94c04398 --- /dev/null +++ b/client_configs/README.md @@ -0,0 +1,15 @@ +# Generate client +Run the `schema/generate.sh` shell script from the library root to generate +a new version of the client based on the `schema/api.json` schema. + +# Run tests +```sh +# build docker image if necessary +docker build -t aignx-client . + +# run tests in docker container (requires SA that has permissions to generate signed urls for sample slides) +docker run \ +-v :/.config/google-sa.json \ +-e GOOGLE_APPLICATION_CREDENTIALS=/.config/google-sa.json \ +-e AIGNX_REFRESH_TOKEN="" aignx-client +``` diff --git a/client_configs/_pyproject_uv.toml b/client_configs/_pyproject_uv.toml new file mode 100644 index 00000000..3232e7b9 --- /dev/null +++ b/client_configs/_pyproject_uv.toml @@ -0,0 +1,22 @@ +[project] +name = "aignx-platform-client" +version = "0.1.0" +description = "Client library for the Aignostics Platform API" +#authors = ["Aignostics GmbH "] +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ + "pydantic>=2.10.6", + "codegen" +] + +[tool.uv.sources] +codegen = { path = "true" } + +[tool.uv.workspace] +members = ["packages/*"] +#exclude = ["codegen/docs"] + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" diff --git a/client_configs/conftest.py b/client_configs/conftest.py new file mode 100644 index 00000000..ef44e226 --- /dev/null +++ b/client_configs/conftest.py @@ -0,0 +1,29 @@ +default_label_set = {"unit-test", "automated-test"} + + +# see https://docs.getxray.app/display/XRAYCLOUD/Taking+advantage+of+JUnit+XML+reports +# as well as https://docs.pytest.org/en/6.2.x/reference.html#collection-hooks +def pytest_collection_modifyitems(session, config, items): + """Iterate over markers and add properties.""" + for item in items: + jira_issues_set = set() + + for marker in item.iter_markers(name="requirements"): + jira_issues_set.update(req.strip() for req in marker.args[0].split(",")) + + for marker in item.iter_markers(name="specifications"): + jira_issues_set.update(spec.strip() for spec in marker.args[0].split(",")) + + if jira_issues_set: + jira_issues = ",".join(jira_issues_set) + item.user_properties.append(("requirements", jira_issues)) + + for marker in item.iter_markers(name="labels"): + default_label_set.update(marker.args[0].split(",")) + + if default_label_set: + labels = ",".join(default_label_set) + item.user_properties.append(("tags", labels)) + + for marker in item.iter_markers(name="description"): + item.user_properties.append(("test_description", marker.args[0])) diff --git a/client_configs/poetry.lock b/client_configs/poetry.lock new file mode 100644 index 00000000..0b731ceb --- /dev/null +++ b/client_configs/poetry.lock @@ -0,0 +1,1520 @@ +# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.9.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, + {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + +[[package]] +name = "attrs" +version = "25.3.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, + {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "cachetools" +version = "5.5.2" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a"}, + {file = "cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4"}, +] + +[[package]] +name = "certifi" +version = "2025.1.31" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win32\""} + +[[package]] +name = "coverage" +version = "7.7.1" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "coverage-7.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:553ba93f8e3c70e1b0031e4dfea36aba4e2b51fe5770db35e99af8dc5c5a9dfe"}, + {file = "coverage-7.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:44683f2556a56c9a6e673b583763096b8efbd2df022b02995609cf8e64fc8ae0"}, + {file = "coverage-7.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02fad4f8faa4153db76f9246bc95c1d99f054f4e0a884175bff9155cf4f856cb"}, + {file = "coverage-7.7.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c181ceba2e6808ede1e964f7bdc77bd8c7eb62f202c63a48cc541e5ffffccb6"}, + {file = "coverage-7.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b5b207a8b08c6a934b214e364cab2fa82663d4af18981a6c0a9e95f8df7602"}, + {file = "coverage-7.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:25fe40967717bad0ce628a0223f08a10d54c9d739e88c9cbb0f77b5959367542"}, + {file = "coverage-7.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:881cae0f9cbd928c9c001487bb3dcbfd0b0af3ef53ae92180878591053be0cb3"}, + {file = "coverage-7.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90e9141e9221dd6fbc16a2727a5703c19443a8d9bf7d634c792fa0287cee1ab"}, + {file = "coverage-7.7.1-cp310-cp310-win32.whl", hash = "sha256:ae13ed5bf5542d7d4a0a42ff5160e07e84adc44eda65ddaa635c484ff8e55917"}, + {file = "coverage-7.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:171e9977c6a5d2b2be9efc7df1126fd525ce7cad0eb9904fe692da007ba90d81"}, + {file = "coverage-7.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1165490be0069e34e4f99d08e9c5209c463de11b471709dfae31e2a98cbd49fd"}, + {file = "coverage-7.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:44af11c00fd3b19b8809487630f8a0039130d32363239dfd15238e6d37e41a48"}, + {file = "coverage-7.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fbba59022e7c20124d2f520842b75904c7b9f16c854233fa46575c69949fb5b9"}, + {file = "coverage-7.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af94fb80e4f159f4d93fb411800448ad87b6039b0500849a403b73a0d36bb5ae"}, + {file = "coverage-7.7.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eae79f8e3501133aa0e220bbc29573910d096795882a70e6f6e6637b09522133"}, + {file = "coverage-7.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e33426a5e1dc7743dd54dfd11d3a6c02c5d127abfaa2edd80a6e352b58347d1a"}, + {file = "coverage-7.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b559adc22486937786731dac69e57296cb9aede7e2687dfc0d2696dbd3b1eb6b"}, + {file = "coverage-7.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b838a91e84e1773c3436f6cc6996e000ed3ca5721799e7789be18830fad009a2"}, + {file = "coverage-7.7.1-cp311-cp311-win32.whl", hash = "sha256:2c492401bdb3a85824669d6a03f57b3dfadef0941b8541f035f83bbfc39d4282"}, + {file = "coverage-7.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:1e6f867379fd033a0eeabb1be0cffa2bd660582b8b0c9478895c509d875a9d9e"}, + {file = "coverage-7.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:eff187177d8016ff6addf789dcc421c3db0d014e4946c1cc3fbf697f7852459d"}, + {file = "coverage-7.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2444fbe1ba1889e0b29eb4d11931afa88f92dc507b7248f45be372775b3cef4f"}, + {file = "coverage-7.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:177d837339883c541f8524683e227adcaea581eca6bb33823a2a1fdae4c988e1"}, + {file = "coverage-7.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15d54ecef1582b1d3ec6049b20d3c1a07d5e7f85335d8a3b617c9960b4f807e0"}, + {file = "coverage-7.7.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c82b27c56478d5e1391f2e7b2e7f588d093157fa40d53fd9453a471b1191f2"}, + {file = "coverage-7.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:315ff74b585110ac3b7ab631e89e769d294f303c6d21302a816b3554ed4c81af"}, + {file = "coverage-7.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4dd532dac197d68c478480edde74fd4476c6823355987fd31d01ad9aa1e5fb59"}, + {file = "coverage-7.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:385618003e3d608001676bb35dc67ae3ad44c75c0395d8de5780af7bb35be6b2"}, + {file = "coverage-7.7.1-cp312-cp312-win32.whl", hash = "sha256:63306486fcb5a827449464f6211d2991f01dfa2965976018c9bab9d5e45a35c8"}, + {file = "coverage-7.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:37351dc8123c154fa05b7579fdb126b9f8b1cf42fd6f79ddf19121b7bdd4aa04"}, + {file = "coverage-7.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eebd927b86761a7068a06d3699fd6c20129becf15bb44282db085921ea0f1585"}, + {file = "coverage-7.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2a79c4a09765d18311c35975ad2eb1ac613c0401afdd9cb1ca4110aeb5dd3c4c"}, + {file = "coverage-7.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b1c65a739447c5ddce5b96c0a388fd82e4bbdff7251396a70182b1d83631019"}, + {file = "coverage-7.7.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:392cc8fd2b1b010ca36840735e2a526fcbd76795a5d44006065e79868cc76ccf"}, + {file = "coverage-7.7.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bb47cc9f07a59a451361a850cb06d20633e77a9118d05fd0f77b1864439461b"}, + {file = "coverage-7.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b4c144c129343416a49378e05c9451c34aae5ccf00221e4fa4f487db0816ee2f"}, + {file = "coverage-7.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bc96441c9d9ca12a790b5ae17d2fa6654da4b3962ea15e0eabb1b1caed094777"}, + {file = "coverage-7.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3d03287eb03186256999539d98818c425c33546ab4901028c8fa933b62c35c3a"}, + {file = "coverage-7.7.1-cp313-cp313-win32.whl", hash = "sha256:8fed429c26b99641dc1f3a79179860122b22745dd9af36f29b141e178925070a"}, + {file = "coverage-7.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:092b134129a8bb940c08b2d9ceb4459af5fb3faea77888af63182e17d89e1cf1"}, + {file = "coverage-7.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3154b369141c3169b8133973ac00f63fcf8d6dbcc297d788d36afbb7811e511"}, + {file = "coverage-7.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:264ff2bcce27a7f455b64ac0dfe097680b65d9a1a293ef902675fa8158d20b24"}, + {file = "coverage-7.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba8480ebe401c2f094d10a8c4209b800a9b77215b6c796d16b6ecdf665048950"}, + {file = "coverage-7.7.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:520af84febb6bb54453e7fbb730afa58c7178fd018c398a8fcd8e269a79bf96d"}, + {file = "coverage-7.7.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88d96127ae01ff571d465d4b0be25c123789cef88ba0879194d673fdea52f54e"}, + {file = "coverage-7.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0ce92c5a9d7007d838456f4b77ea159cb628187a137e1895331e530973dcf862"}, + {file = "coverage-7.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0dab4ef76d7b14f432057fdb7a0477e8bffca0ad39ace308be6e74864e632271"}, + {file = "coverage-7.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7e688010581dbac9cab72800e9076e16f7cccd0d89af5785b70daa11174e94de"}, + {file = "coverage-7.7.1-cp313-cp313t-win32.whl", hash = "sha256:e52eb31ae3afacdacfe50705a15b75ded67935770c460d88c215a9c0c40d0e9c"}, + {file = "coverage-7.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a6b6b3bd121ee2ec4bd35039319f3423d0be282b9752a5ae9f18724bc93ebe7c"}, + {file = "coverage-7.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:34a3bf6b92e6621fc4dcdaab353e173ccb0ca9e4bfbcf7e49a0134c86c9cd303"}, + {file = "coverage-7.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d6874929d624d3a670f676efafbbc747f519a6121b581dd41d012109e70a5ebd"}, + {file = "coverage-7.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ba5ff236c87a7b7aa1441a216caf44baee14cbfbd2256d306f926d16b026578"}, + {file = "coverage-7.7.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452735fafe8ff5918236d5fe1feac322b359e57692269c75151f9b4ee4b7e1bc"}, + {file = "coverage-7.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5f99a93cecf799738e211f9746dc83749b5693538fbfac279a61682ba309387"}, + {file = "coverage-7.7.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:11dd6f52c2a7ce8bf0a5f3b6e4a8eb60e157ffedc3c4b4314a41c1dfbd26ce58"}, + {file = "coverage-7.7.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:b52edb940d087e2a96e73c1523284a2e94a4e66fa2ea1e2e64dddc67173bad94"}, + {file = "coverage-7.7.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d2e73e2ac468536197e6b3ab79bc4a5c9da0f078cd78cfcc7fe27cf5d1195ef0"}, + {file = "coverage-7.7.1-cp39-cp39-win32.whl", hash = "sha256:18f544356bceef17cc55fcf859e5664f06946c1b68efcea6acdc50f8f6a6e776"}, + {file = "coverage-7.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:d66ff48ab3bb6f762a153e29c0fc1eb5a62a260217bc64470d7ba602f5886d20"}, + {file = "coverage-7.7.1-pp39.pp310.pp311-none-any.whl", hash = "sha256:5b7b02e50d54be6114cc4f6a3222fec83164f7c42772ba03b520138859b5fde1"}, + {file = "coverage-7.7.1-py3-none-any.whl", hash = "sha256:822fa99dd1ac686061e1219b67868e25d9757989cf2259f735a4802497d6da31"}, + {file = "coverage-7.7.1.tar.gz", hash = "sha256:199a1272e642266b90c9f40dec7fd3d307b51bf639fa0d15980dc0b3246c1393"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "faker" +version = "37.1.0" +description = "Faker is a Python package that generates fake data for you." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "faker-37.1.0-py3-none-any.whl", hash = "sha256:dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c"}, + {file = "faker-37.1.0.tar.gz", hash = "sha256:ad9dc66a3b84888b837ca729e85299a96b58fdaef0323ed0baace93c9614af06"}, +] + +[package.dependencies] +tzdata = "*" + +[[package]] +name = "google-api-core" +version = "2.24.2" +description = "Google API client core library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9"}, + {file = "google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696"}, +] + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.0" +googleapis-common-protos = ">=1.56.2,<2.0.0" +proto-plus = [ + {version = ">=1.25.0,<2.0.0", markers = "python_version >= \"3.13\""}, + {version = ">=1.22.3,<2.0.0", markers = "python_version < \"3.13\""}, +] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" +requests = ">=2.18.0,<3.0.0" + +[package.extras] +async-rest = ["google-auth[aiohttp] (>=2.35.0,<3.0.dev0)"] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-auth" +version = "2.38.0" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a"}, + {file = "google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography", "pyopenssl"] +pyjwt = ["cryptography (>=38.0.3)", "pyjwt (>=2.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "google-cloud-core" +version = "2.4.3" +description = "Google Cloud API client core library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "google_cloud_core-2.4.3-py2.py3-none-any.whl", hash = "sha256:5130f9f4c14b4fafdff75c79448f9495cfade0d8775facf1b09c3bf67e027f6e"}, + {file = "google_cloud_core-2.4.3.tar.gz", hash = "sha256:1fab62d7102844b278fe6dead3af32408b1df3eb06f5c7e8634cbd40edc4da53"}, +] + +[package.dependencies] +google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" + +[package.extras] +grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] + +[[package]] +name = "google-cloud-storage" +version = "3.1.0" +description = "Google Cloud Storage API client library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "google_cloud_storage-3.1.0-py2.py3-none-any.whl", hash = "sha256:eaf36966b68660a9633f03b067e4a10ce09f1377cae3ff9f2c699f69a81c66c6"}, + {file = "google_cloud_storage-3.1.0.tar.gz", hash = "sha256:944273179897c7c8a07ee15f2e6466a02da0c7c4b9ecceac2a26017cb2972049"}, +] + +[package.dependencies] +google-api-core = ">=2.15.0,<3.0.0dev" +google-auth = ">=2.26.1,<3.0dev" +google-cloud-core = ">=2.4.2,<3.0dev" +google-crc32c = ">=1.0,<2.0dev" +google-resumable-media = ">=2.7.2" +requests = ">=2.18.0,<3.0.0dev" + +[package.extras] +protobuf = ["protobuf (<6.0.0dev)"] +tracing = ["opentelemetry-api (>=1.1.0)"] + +[[package]] +name = "google-crc32c" +version = "1.7.1" +description = "A python wrapper of the C library 'Google CRC32C'" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "google_crc32c-1.7.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b07d48faf8292b4db7c3d64ab86f950c2e94e93a11fd47271c28ba458e4a0d76"}, + {file = "google_crc32c-1.7.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7cc81b3a2fbd932a4313eb53cc7d9dde424088ca3a0337160f35d91826880c1d"}, + {file = "google_crc32c-1.7.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c67ca0a1f5b56162951a9dae987988679a7db682d6f97ce0f6381ebf0fbea4c"}, + {file = "google_crc32c-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc5319db92daa516b653600794d5b9f9439a9a121f3e162f94b0e1891c7933cb"}, + {file = "google_crc32c-1.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcdf5a64adb747610140572ed18d011896e3b9ae5195f2514b7ff678c80f1603"}, + {file = "google_crc32c-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:754561c6c66e89d55754106739e22fdaa93fafa8da7221b29c8b8e8270c6ec8a"}, + {file = "google_crc32c-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06"}, + {file = "google_crc32c-1.7.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9"}, + {file = "google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77"}, + {file = "google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53"}, + {file = "google_crc32c-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d"}, + {file = "google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194"}, + {file = "google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e"}, + {file = "google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337"}, + {file = "google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65"}, + {file = "google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6"}, + {file = "google_crc32c-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35"}, + {file = "google_crc32c-1.7.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638"}, + {file = "google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb"}, + {file = "google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6"}, + {file = "google_crc32c-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db"}, + {file = "google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3"}, + {file = "google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9"}, + {file = "google_crc32c-1.7.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:9fc196f0b8d8bd2789352c6a522db03f89e83a0ed6b64315923c396d7a932315"}, + {file = "google_crc32c-1.7.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:bb5e35dcd8552f76eed9461a23de1030920a3c953c1982f324be8f97946e7127"}, + {file = "google_crc32c-1.7.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2226b6a8da04f1d9e61d3e357f2460b9551c5e6950071437e122c958a18ae14"}, + {file = "google_crc32c-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f2b3522222746fff0e04a9bd0a23ea003ba3cccc8cf21385c564deb1f223242"}, + {file = "google_crc32c-1.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bda0fcb632d390e3ea8b6b07bf6b4f4a66c9d02dcd6fbf7ba00a197c143f582"}, + {file = "google_crc32c-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:713121af19f1a617054c41f952294764e0c5443d5a5d9034b2cd60f5dd7e0349"}, + {file = "google_crc32c-1.7.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8e9afc74168b0b2232fb32dd202c93e46b7d5e4bf03e66ba5dc273bb3559589"}, + {file = "google_crc32c-1.7.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa8136cc14dd27f34a3221c0f16fd42d8a40e4778273e61a3c19aedaa44daf6b"}, + {file = "google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48"}, + {file = "google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82"}, + {file = "google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472"}, +] + +[package.extras] +testing = ["pytest"] + +[[package]] +name = "google-resumable-media" +version = "2.7.2" +description = "Utilities for Google Media Downloads and Resumable Uploads" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "google_resumable_media-2.7.2-py2.py3-none-any.whl", hash = "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa"}, + {file = "google_resumable_media-2.7.2.tar.gz", hash = "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0"}, +] + +[package.dependencies] +google-crc32c = ">=1.0,<2.0dev" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "google-auth (>=1.22.0,<2.0dev)"] +requests = ["requests (>=2.18.0,<3.0.0dev)"] + +[[package]] +name = "googleapis-common-protos" +version = "1.69.2" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "googleapis_common_protos-1.69.2-py3-none-any.whl", hash = "sha256:0b30452ff9c7a27d80bfc5718954063e8ab53dd3697093d3bc99581f5fd24212"}, + {file = "googleapis_common_protos-1.69.2.tar.gz", hash = "sha256:3e1b904a27a33c821b4b749fd31d334c0c9c30e6113023d495e48979a3dc9c5f"}, +] + +[package.dependencies] +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0)"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.28.1" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "iniconfig" +version = "2.1.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, +] + +[[package]] +name = "jsf" +version = "0.11.2" +description = "Creates fake JSON files from a JSON schema" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jsf-0.11.2-py3-none-any.whl", hash = "sha256:b4472c8c2d776eb3e0bb08368caa6ae0ead7ea78b20653facc07b6d93768612c"}, + {file = "jsf-0.11.2.tar.gz", hash = "sha256:07055b363281d38ce871a9256a00587d8472802c5108721a7fe5884465104b5d"}, +] + +[package.dependencies] +faker = ">=15.3.4" +jsonschema = ">=4.17.3" +pydantic = ">=2.0.0" +rstr = ">=3.2.0" +smart-open = {version = ">=6.3.0", extras = ["http"]} +typing-extensions = ">=4.9.0" + +[package.extras] +cli = ["typer (>=0.7.0)"] + +[[package]] +name = "jsonschema" +version = "4.23.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "numpy" +version = "2.2.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "numpy-2.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9"}, + {file = "numpy-2.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae"}, + {file = "numpy-2.2.4-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775"}, + {file = "numpy-2.2.4-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9"}, + {file = "numpy-2.2.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2"}, + {file = "numpy-2.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020"}, + {file = "numpy-2.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3"}, + {file = "numpy-2.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017"}, + {file = "numpy-2.2.4-cp310-cp310-win32.whl", hash = "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a"}, + {file = "numpy-2.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542"}, + {file = "numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4"}, + {file = "numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4"}, + {file = "numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f"}, + {file = "numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880"}, + {file = "numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1"}, + {file = "numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5"}, + {file = "numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687"}, + {file = "numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6"}, + {file = "numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09"}, + {file = "numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91"}, + {file = "numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4"}, + {file = "numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854"}, + {file = "numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24"}, + {file = "numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee"}, + {file = "numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba"}, + {file = "numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592"}, + {file = "numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb"}, + {file = "numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f"}, + {file = "numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00"}, + {file = "numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146"}, + {file = "numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7"}, + {file = "numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0"}, + {file = "numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392"}, + {file = "numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc"}, + {file = "numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298"}, + {file = "numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7"}, + {file = "numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6"}, + {file = "numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd"}, + {file = "numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c"}, + {file = "numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3"}, + {file = "numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8"}, + {file = "numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39"}, + {file = "numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd"}, + {file = "numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0"}, + {file = "numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960"}, + {file = "numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8"}, + {file = "numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc"}, + {file = "numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff"}, + {file = "numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286"}, + {file = "numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d"}, + {file = "numpy-2.2.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8"}, + {file = "numpy-2.2.4-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c"}, + {file = "numpy-2.2.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d"}, + {file = "numpy-2.2.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d"}, + {file = "numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f"}, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "packaging" +version = "24.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "proto-plus" +version = "1.26.1" +description = "Beautiful, Pythonic protocol buffers" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66"}, + {file = "proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<7.0.0" + +[package.extras] +testing = ["google-api-core (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "6.30.2" +description = "" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "protobuf-6.30.2-cp310-abi3-win32.whl", hash = "sha256:b12ef7df7b9329886e66404bef5e9ce6a26b54069d7f7436a0853ccdeb91c103"}, + {file = "protobuf-6.30.2-cp310-abi3-win_amd64.whl", hash = "sha256:7653c99774f73fe6b9301b87da52af0e69783a2e371e8b599b3e9cb4da4b12b9"}, + {file = "protobuf-6.30.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:0eb523c550a66a09a0c20f86dd554afbf4d32b02af34ae53d93268c1f73bc65b"}, + {file = "protobuf-6.30.2-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:50f32cc9fd9cb09c783ebc275611b4f19dfdfb68d1ee55d2f0c7fa040df96815"}, + {file = "protobuf-6.30.2-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:4f6c687ae8efae6cf6093389a596548214467778146b7245e886f35e1485315d"}, + {file = "protobuf-6.30.2-cp39-cp39-win32.whl", hash = "sha256:524afedc03b31b15586ca7f64d877a98b184f007180ce25183d1a5cb230ee72b"}, + {file = "protobuf-6.30.2-cp39-cp39-win_amd64.whl", hash = "sha256:acec579c39c88bd8fbbacab1b8052c793efe83a0a5bd99db4a31423a25c0a0e2"}, + {file = "protobuf-6.30.2-py3-none-any.whl", hash = "sha256:ae86b030e69a98e08c77beab574cbcb9fff6d031d57209f574a5aea1445f4b51"}, + {file = "protobuf-6.30.2.tar.gz", hash = "sha256:35c859ae076d8c56054c25b59e5e59638d86545ed6e2b6efac6be0b6ea3ba048"}, +] + +[[package]] +name = "pyasn1" +version = "0.6.1" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a"}, + {file = "pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6"}, +] + +[package.dependencies] +pyasn1 = ">=0.6.1,<0.7.0" + +[[package]] +name = "pydantic" +version = "2.11.1" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic-2.11.1-py3-none-any.whl", hash = "sha256:5b6c415eee9f8123a14d859be0c84363fec6b1feb6b688d6435801230b56e0b8"}, + {file = "pydantic-2.11.1.tar.gz", hash = "sha256:442557d2910e75c991c39f4b4ab18963d57b9b55122c8b2a9cd176d8c29ce968"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.33.0" +typing-extensions = ">=4.12.2" +typing-inspection = ">=0.4.0" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] + +[[package]] +name = "pydantic-core" +version = "2.33.0" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic_core-2.33.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71dffba8fe9ddff628c68f3abd845e91b028361d43c5f8e7b3f8b91d7d85413e"}, + {file = "pydantic_core-2.33.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:abaeec1be6ed535a5d7ffc2e6c390083c425832b20efd621562fbb5bff6dc518"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759871f00e26ad3709efc773ac37b4d571de065f9dfb1778012908bcc36b3a73"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dcfebee69cd5e1c0b76a17e17e347c84b00acebb8dd8edb22d4a03e88e82a207"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b1262b912435a501fa04cd213720609e2cefa723a07c92017d18693e69bf00b"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4726f1f3f42d6a25678c67da3f0b10f148f5655813c5aca54b0d1742ba821b8f"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e790954b5093dff1e3a9a2523fddc4e79722d6f07993b4cd5547825c3cbf97b5"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34e7fb3abe375b5c4e64fab75733d605dda0f59827752debc99c17cb2d5f3276"}, + {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ecb158fb9b9091b515213bed3061eb7deb1d3b4e02327c27a0ea714ff46b0760"}, + {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:4d9149e7528af8bbd76cc055967e6e04617dcb2a2afdaa3dea899406c5521faa"}, + {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e81a295adccf73477220e15ff79235ca9dcbcee4be459eb9d4ce9a2763b8386c"}, + {file = "pydantic_core-2.33.0-cp310-cp310-win32.whl", hash = "sha256:f22dab23cdbce2005f26a8f0c71698457861f97fc6318c75814a50c75e87d025"}, + {file = "pydantic_core-2.33.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cb2390355ba084c1ad49485d18449b4242da344dea3e0fe10babd1f0db7dcfc"}, + {file = "pydantic_core-2.33.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a608a75846804271cf9c83e40bbb4dab2ac614d33c6fd5b0c6187f53f5c593ef"}, + {file = "pydantic_core-2.33.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e1c69aa459f5609dec2fa0652d495353accf3eda5bdb18782bc5a2ae45c9273a"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9ec80eb5a5f45a2211793f1c4aeddff0c3761d1c70d684965c1807e923a588b"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e925819a98318d17251776bd3d6aa9f3ff77b965762155bdad15d1a9265c4cfd"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bf68bb859799e9cec3d9dd8323c40c00a254aabb56fe08f907e437005932f2b"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b2ea72dea0825949a045fa4071f6d5b3d7620d2a208335207793cf29c5a182d"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1583539533160186ac546b49f5cde9ffc928062c96920f58bd95de32ffd7bffd"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23c3e77bf8a7317612e5c26a3b084c7edeb9552d645742a54a5867635b4f2453"}, + {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7a7f2a3f628d2f7ef11cb6188bcf0b9e1558151d511b974dfea10a49afe192b"}, + {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:f1fb026c575e16f673c61c7b86144517705865173f3d0907040ac30c4f9f5915"}, + {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:635702b2fed997e0ac256b2cfbdb4dd0bf7c56b5d8fba8ef03489c03b3eb40e2"}, + {file = "pydantic_core-2.33.0-cp311-cp311-win32.whl", hash = "sha256:07b4ced28fccae3f00626eaa0c4001aa9ec140a29501770a88dbbb0966019a86"}, + {file = "pydantic_core-2.33.0-cp311-cp311-win_amd64.whl", hash = "sha256:4927564be53239a87770a5f86bdc272b8d1fbb87ab7783ad70255b4ab01aa25b"}, + {file = "pydantic_core-2.33.0-cp311-cp311-win_arm64.whl", hash = "sha256:69297418ad644d521ea3e1aa2e14a2a422726167e9ad22b89e8f1130d68e1e9a"}, + {file = "pydantic_core-2.33.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6c32a40712e3662bebe524abe8abb757f2fa2000028d64cc5a1006016c06af43"}, + {file = "pydantic_core-2.33.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ec86b5baa36f0a0bfb37db86c7d52652f8e8aa076ab745ef7725784183c3fdd"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4deac83a8cc1d09e40683be0bc6d1fa4cde8df0a9bf0cda5693f9b0569ac01b6"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:175ab598fb457a9aee63206a1993874badf3ed9a456e0654273e56f00747bbd6"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f36afd0d56a6c42cf4e8465b6441cf546ed69d3a4ec92724cc9c8c61bd6ecf4"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a98257451164666afafc7cbf5fb00d613e33f7e7ebb322fbcd99345695a9a61"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecc6d02d69b54a2eb83ebcc6f29df04957f734bcf309d346b4f83354d8376862"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a69b7596c6603afd049ce7f3835bcf57dd3892fc7279f0ddf987bebed8caa5a"}, + {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea30239c148b6ef41364c6f51d103c2988965b643d62e10b233b5efdca8c0099"}, + {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:abfa44cf2f7f7d7a199be6c6ec141c9024063205545aa09304349781b9a125e6"}, + {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20d4275f3c4659d92048c70797e5fdc396c6e4446caf517ba5cad2db60cd39d3"}, + {file = "pydantic_core-2.33.0-cp312-cp312-win32.whl", hash = "sha256:918f2013d7eadea1d88d1a35fd4a1e16aaf90343eb446f91cb091ce7f9b431a2"}, + {file = "pydantic_core-2.33.0-cp312-cp312-win_amd64.whl", hash = "sha256:aec79acc183865bad120b0190afac467c20b15289050648b876b07777e67ea48"}, + {file = "pydantic_core-2.33.0-cp312-cp312-win_arm64.whl", hash = "sha256:5461934e895968655225dfa8b3be79e7e927e95d4bd6c2d40edd2fa7052e71b6"}, + {file = "pydantic_core-2.33.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f00e8b59e1fc8f09d05594aa7d2b726f1b277ca6155fc84c0396db1b373c4555"}, + {file = "pydantic_core-2.33.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a73be93ecef45786d7d95b0c5e9b294faf35629d03d5b145b09b81258c7cd6d"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff48a55be9da6930254565ff5238d71d5e9cd8c5487a191cb85df3bdb8c77365"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a4ea04195638dcd8c53dadb545d70badba51735b1594810e9768c2c0b4a5da"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41d698dcbe12b60661f0632b543dbb119e6ba088103b364ff65e951610cb7ce0"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae62032ef513fe6281ef0009e30838a01057b832dc265da32c10469622613885"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f225f3a3995dbbc26affc191d0443c6c4aa71b83358fd4c2b7d63e2f6f0336f9"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bdd36b362f419c78d09630cbaebc64913f66f62bda6d42d5fbb08da8cc4f181"}, + {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a0147c0bef783fd9abc9f016d66edb6cac466dc54a17ec5f5ada08ff65caf5d"}, + {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:c860773a0f205926172c6644c394e02c25421dc9a456deff16f64c0e299487d3"}, + {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:138d31e3f90087f42aa6286fb640f3c7a8eb7bdae829418265e7e7474bd2574b"}, + {file = "pydantic_core-2.33.0-cp313-cp313-win32.whl", hash = "sha256:d20cbb9d3e95114325780f3cfe990f3ecae24de7a2d75f978783878cce2ad585"}, + {file = "pydantic_core-2.33.0-cp313-cp313-win_amd64.whl", hash = "sha256:ca1103d70306489e3d006b0f79db8ca5dd3c977f6f13b2c59ff745249431a606"}, + {file = "pydantic_core-2.33.0-cp313-cp313-win_arm64.whl", hash = "sha256:6291797cad239285275558e0a27872da735b05c75d5237bbade8736f80e4c225"}, + {file = "pydantic_core-2.33.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7b79af799630af263eca9ec87db519426d8c9b3be35016eddad1832bac812d87"}, + {file = "pydantic_core-2.33.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eabf946a4739b5237f4f56d77fa6668263bc466d06a8036c055587c130a46f7b"}, + {file = "pydantic_core-2.33.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8a1d581e8cdbb857b0e0e81df98603376c1a5c34dc5e54039dcc00f043df81e7"}, + {file = "pydantic_core-2.33.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:7c9c84749f5787781c1c45bb99f433402e484e515b40675a5d121ea14711cf61"}, + {file = "pydantic_core-2.33.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:64672fa888595a959cfeff957a654e947e65bbe1d7d82f550417cbd6898a1d6b"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bc7367c0961dec292244ef2549afa396e72e28cc24706210bd44d947582c59"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce72d46eb201ca43994303025bd54d8a35a3fc2a3495fac653d6eb7205ce04f4"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14229c1504287533dbf6b1fc56f752ce2b4e9694022ae7509631ce346158de11"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:085d8985b1c1e48ef271e98a658f562f29d89bda98bf120502283efbc87313eb"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31860fbda80d8f6828e84b4a4d129fd9c4535996b8249cfb8c720dc2a1a00bb8"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f200b2f20856b5a6c3a35f0d4e344019f805e363416e609e9b47c552d35fd5ea"}, + {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f72914cfd1d0176e58ddc05c7a47674ef4222c8253bf70322923e73e14a4ac3"}, + {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:91301a0980a1d4530d4ba7e6a739ca1a6b31341252cb709948e0aca0860ce0ae"}, + {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7419241e17c7fbe5074ba79143d5523270e04f86f1b3a0dff8df490f84c8273a"}, + {file = "pydantic_core-2.33.0-cp39-cp39-win32.whl", hash = "sha256:7a25493320203005d2a4dac76d1b7d953cb49bce6d459d9ae38e30dd9f29bc9c"}, + {file = "pydantic_core-2.33.0-cp39-cp39-win_amd64.whl", hash = "sha256:82a4eba92b7ca8af1b7d5ef5f3d9647eee94d1f74d21ca7c21e3a2b92e008358"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e2762c568596332fdab56b07060c8ab8362c56cf2a339ee54e491cd503612c50"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bf637300ff35d4f59c006fff201c510b2b5e745b07125458a5389af3c0dff8c"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c151ce3d59ed56ebd7ce9ce5986a409a85db697d25fc232f8e81f195aa39a1"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee65f0cc652261744fd07f2c6e6901c914aa6c5ff4dcfaf1136bc394d0dd26b"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:024d136ae44d233e6322027bbf356712b3940bee816e6c948ce4b90f18471b3d"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e37f10f6d4bc67c58fbd727108ae1d8b92b397355e68519f1e4a7babb1473442"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:502ed542e0d958bd12e7c3e9a015bce57deaf50eaa8c2e1c439b512cb9db1e3a"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:715c62af74c236bf386825c0fdfa08d092ab0f191eb5b4580d11c3189af9d330"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bccc06fa0372151f37f6b69834181aa9eb57cf8665ed36405fb45fbf6cac3bae"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d8dc9f63a26f7259b57f46a7aab5af86b2ad6fbe48487500bb1f4b27e051e4c"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30369e54d6d0113d2aa5aee7a90d17f225c13d87902ace8fcd7bbf99b19124db"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3eb479354c62067afa62f53bb387827bee2f75c9c79ef25eef6ab84d4b1ae3b"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0310524c833d91403c960b8a3cf9f46c282eadd6afd276c8c5edc617bd705dc9"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eddb18a00bbb855325db27b4c2a89a4ba491cd6a0bd6d852b225172a1f54b36c"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ade5dbcf8d9ef8f4b28e682d0b29f3008df9842bb5ac48ac2c17bc55771cc976"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2c0afd34f928383e3fd25740f2050dbac9d077e7ba5adbaa2227f4d4f3c8da5c"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7da333f21cd9df51d5731513a6d39319892947604924ddf2e24a4612975fb936"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b6d77c75a57f041c5ee915ff0b0bb58eabb78728b69ed967bc5b780e8f701b8"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba95691cf25f63df53c1d342413b41bd7762d9acb425df8858d7efa616c0870e"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f1ab031feb8676f6bd7c85abec86e2935850bf19b84432c64e3e239bffeb1ec"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58c1151827eef98b83d49b6ca6065575876a02d2211f259fb1a6b7757bd24dd8"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a66d931ea2c1464b738ace44b7334ab32a2fd50be023d863935eb00f42be1778"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0bcf0bab28995d483f6c8d7db25e0d05c3efa5cebfd7f56474359e7137f39856"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:89670d7a0045acb52be0566df5bc8b114ac967c662c06cf5e0c606e4aadc964b"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:b716294e721d8060908dbebe32639b01bfe61b15f9f57bcc18ca9a0e00d9520b"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fc53e05c16697ff0c1c7c2b98e45e131d4bfb78068fffff92a82d169cbb4c7b7"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:68504959253303d3ae9406b634997a2123a0b0c1da86459abbd0ffc921695eac"}, + {file = "pydantic_core-2.33.0.tar.gz", hash = "sha256:40eb8af662ba409c3cbf4a8150ad32ae73514cd7cb1f1a2113af39763dd616b3"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pyjwt" +version = "2.10.1" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, +] + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +groups = ["main"] +files = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyrfc6266" +version = "1.0.2" +description = "RFC6266 implementation in Python" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pyrfc6266-1.0.2-py3-none-any.whl", hash = "sha256:0532307f319566f337dba97577dfaefe493c3e0c40ab211449ba4566fc2cf73d"}, + {file = "pyrfc6266-1.0.2.tar.gz", hash = "sha256:3c41616b6a1f2e9a26df7f005fbaa634f960121769ccc4445acfb404e9f8fd4c"}, +] + +[package.dependencies] +pyparsing = ">=3.0.7,<3.1.0" + +[[package]] +name = "pytest" +version = "8.3.5" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"}, + {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "5.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + +[[package]] +name = "pytest-timeout" +version = "2.3.1" +description = "pytest plugin to abort hanging tests" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9"}, + {file = "pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e"}, +] + +[package.dependencies] +pytest = ">=7.0.0" + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.1.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"}, + {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "referencing" +version = "0.36.2" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, + {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" +typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +description = "OAuthlib authentication support for Requests." +optional = false +python-versions = ">=3.4" +groups = ["main"] +files = [ + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "rpds-py" +version = "0.24.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "rpds_py-0.24.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:006f4342fe729a368c6df36578d7a348c7c716be1da0a1a0f86e3021f8e98724"}, + {file = "rpds_py-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2d53747da70a4e4b17f559569d5f9506420966083a31c5fbd84e764461c4444b"}, + {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8acd55bd5b071156bae57b555f5d33697998752673b9de554dd82f5b5352727"}, + {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7e80d375134ddb04231a53800503752093dbb65dad8dabacce2c84cccc78e964"}, + {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60748789e028d2a46fc1c70750454f83c6bdd0d05db50f5ae83e2db500b34da5"}, + {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e1daf5bf6c2be39654beae83ee6b9a12347cb5aced9a29eecf12a2d25fff664"}, + {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b221c2457d92a1fb3c97bee9095c874144d196f47c038462ae6e4a14436f7bc"}, + {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:66420986c9afff67ef0c5d1e4cdc2d0e5262f53ad11e4f90e5e22448df485bf0"}, + {file = "rpds_py-0.24.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:43dba99f00f1d37b2a0265a259592d05fcc8e7c19d140fe51c6e6f16faabeb1f"}, + {file = "rpds_py-0.24.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a88c0d17d039333a41d9bf4616bd062f0bd7aa0edeb6cafe00a2fc2a804e944f"}, + {file = "rpds_py-0.24.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc31e13ce212e14a539d430428cd365e74f8b2d534f8bc22dd4c9c55b277b875"}, + {file = "rpds_py-0.24.0-cp310-cp310-win32.whl", hash = "sha256:fc2c1e1b00f88317d9de6b2c2b39b012ebbfe35fe5e7bef980fd2a91f6100a07"}, + {file = "rpds_py-0.24.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0145295ca415668420ad142ee42189f78d27af806fcf1f32a18e51d47dd2052"}, + {file = "rpds_py-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2d3ee4615df36ab8eb16c2507b11e764dcc11fd350bbf4da16d09cda11fcedef"}, + {file = "rpds_py-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e13ae74a8a3a0c2f22f450f773e35f893484fcfacb00bb4344a7e0f4f48e1f97"}, + {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf86f72d705fc2ef776bb7dd9e5fbba79d7e1f3e258bf9377f8204ad0fc1c51e"}, + {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c43583ea8517ed2e780a345dd9960896afc1327e8cf3ac8239c167530397440d"}, + {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cd031e63bc5f05bdcda120646a0d32f6d729486d0067f09d79c8db5368f4586"}, + {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34d90ad8c045df9a4259c47d2e16a3f21fdb396665c94520dbfe8766e62187a4"}, + {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e838bf2bb0b91ee67bf2b889a1a841e5ecac06dd7a2b1ef4e6151e2ce155c7ae"}, + {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04ecf5c1ff4d589987b4d9882872f80ba13da7d42427234fce8f22efb43133bc"}, + {file = "rpds_py-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:630d3d8ea77eabd6cbcd2ea712e1c5cecb5b558d39547ac988351195db433f6c"}, + {file = "rpds_py-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ebcb786b9ff30b994d5969213a8430cbb984cdd7ea9fd6df06663194bd3c450c"}, + {file = "rpds_py-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:174e46569968ddbbeb8a806d9922f17cd2b524aa753b468f35b97ff9c19cb718"}, + {file = "rpds_py-0.24.0-cp311-cp311-win32.whl", hash = "sha256:5ef877fa3bbfb40b388a5ae1cb00636a624690dcb9a29a65267054c9ea86d88a"}, + {file = "rpds_py-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:e274f62cbd274359eff63e5c7e7274c913e8e09620f6a57aae66744b3df046d6"}, + {file = "rpds_py-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d8551e733626afec514b5d15befabea0dd70a343a9f23322860c4f16a9430205"}, + {file = "rpds_py-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e374c0ce0ca82e5b67cd61fb964077d40ec177dd2c4eda67dba130de09085c7"}, + {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d69d003296df4840bd445a5d15fa5b6ff6ac40496f956a221c4d1f6f7b4bc4d9"}, + {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8212ff58ac6dfde49946bea57474a386cca3f7706fc72c25b772b9ca4af6b79e"}, + {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:528927e63a70b4d5f3f5ccc1fa988a35456eb5d15f804d276709c33fc2f19bda"}, + {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a824d2c7a703ba6daaca848f9c3d5cb93af0505be505de70e7e66829affd676e"}, + {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d51febb7a114293ffd56c6cf4736cb31cd68c0fddd6aa303ed09ea5a48e029"}, + {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3fab5f4a2c64a8fb64fc13b3d139848817a64d467dd6ed60dcdd6b479e7febc9"}, + {file = "rpds_py-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9be4f99bee42ac107870c61dfdb294d912bf81c3c6d45538aad7aecab468b6b7"}, + {file = "rpds_py-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:564c96b6076a98215af52f55efa90d8419cc2ef45d99e314fddefe816bc24f91"}, + {file = "rpds_py-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:75a810b7664c17f24bf2ffd7f92416c00ec84b49bb68e6a0d93e542406336b56"}, + {file = "rpds_py-0.24.0-cp312-cp312-win32.whl", hash = "sha256:f6016bd950be4dcd047b7475fdf55fb1e1f59fc7403f387be0e8123e4a576d30"}, + {file = "rpds_py-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034"}, + {file = "rpds_py-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2d8e4508e15fc05b31285c4b00ddf2e0eb94259c2dc896771966a163122a0c"}, + {file = "rpds_py-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f00c16e089282ad68a3820fd0c831c35d3194b7cdc31d6e469511d9bffc535c"}, + {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951cc481c0c395c4a08639a469d53b7d4afa252529a085418b82a6b43c45c240"}, + {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9ca89938dff18828a328af41ffdf3902405a19f4131c88e22e776a8e228c5a8"}, + {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0ef550042a8dbcd657dfb284a8ee00f0ba269d3f2286b0493b15a5694f9fe8"}, + {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2356688e5d958c4d5cb964af865bea84db29971d3e563fb78e46e20fe1848b"}, + {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78884d155fd15d9f64f5d6124b486f3d3f7fd7cd71a78e9670a0f6f6ca06fb2d"}, + {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a4a535013aeeef13c5532f802708cecae8d66c282babb5cd916379b72110cf7"}, + {file = "rpds_py-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:84e0566f15cf4d769dade9b366b7b87c959be472c92dffb70462dd0844d7cbad"}, + {file = "rpds_py-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:823e74ab6fbaa028ec89615ff6acb409e90ff45580c45920d4dfdddb069f2120"}, + {file = "rpds_py-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c61a2cb0085c8783906b2f8b1f16a7e65777823c7f4d0a6aaffe26dc0d358dd9"}, + {file = "rpds_py-0.24.0-cp313-cp313-win32.whl", hash = "sha256:60d9b630c8025b9458a9d114e3af579a2c54bd32df601c4581bd054e85258143"}, + {file = "rpds_py-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a"}, + {file = "rpds_py-0.24.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:d09dc82af2d3c17e7dd17120b202a79b578d79f2b5424bda209d9966efeed114"}, + {file = "rpds_py-0.24.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5fc13b44de6419d1e7a7e592a4885b323fbc2f46e1f22151e3a8ed3b8b920405"}, + {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c347a20d79cedc0a7bd51c4d4b7dbc613ca4e65a756b5c3e57ec84bd43505b47"}, + {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20f2712bd1cc26a3cc16c5a1bfee9ed1abc33d4cdf1aabd297fe0eb724df4272"}, + {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad911555286884be1e427ef0dc0ba3929e6821cbeca2194b13dc415a462c7fd"}, + {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0aeb3329c1721c43c58cae274d7d2ca85c1690d89485d9c63a006cb79a85771a"}, + {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0f156e9509cee987283abd2296ec816225145a13ed0391df8f71bf1d789e2d"}, + {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa6800adc8204ce898c8a424303969b7aa6a5e4ad2789c13f8648739830323b7"}, + {file = "rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a18fc371e900a21d7392517c6f60fe859e802547309e94313cd8181ad9db004d"}, + {file = "rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9168764133fd919f8dcca2ead66de0105f4ef5659cbb4fa044f7014bed9a1797"}, + {file = "rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f6e3cec44ba05ee5cbdebe92d052f69b63ae792e7d05f1020ac5e964394080c"}, + {file = "rpds_py-0.24.0-cp313-cp313t-win32.whl", hash = "sha256:8ebc7e65ca4b111d928b669713865f021b7773350eeac4a31d3e70144297baba"}, + {file = "rpds_py-0.24.0-cp313-cp313t-win_amd64.whl", hash = "sha256:675269d407a257b8c00a6b58205b72eec8231656506c56fd429d924ca00bb350"}, + {file = "rpds_py-0.24.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a36b452abbf29f68527cf52e181fced56685731c86b52e852053e38d8b60bc8d"}, + {file = "rpds_py-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b3b397eefecec8e8e39fa65c630ef70a24b09141a6f9fc17b3c3a50bed6b50e"}, + {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdabcd3beb2a6dca7027007473d8ef1c3b053347c76f685f5f060a00327b8b65"}, + {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5db385bacd0c43f24be92b60c857cf760b7f10d8234f4bd4be67b5b20a7c0b6b"}, + {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8097b3422d020ff1c44effc40ae58e67d93e60d540a65649d2cdaf9466030791"}, + {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493fe54318bed7d124ce272fc36adbf59d46729659b2c792e87c3b95649cdee9"}, + {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8aa362811ccdc1f8dadcc916c6d47e554169ab79559319ae9fae7d7752d0d60c"}, + {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d8f9a6e7fd5434817526815f09ea27f2746c4a51ee11bb3439065f5fc754db58"}, + {file = "rpds_py-0.24.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8205ee14463248d3349131bb8099efe15cd3ce83b8ef3ace63c7e976998e7124"}, + {file = "rpds_py-0.24.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:921ae54f9ecba3b6325df425cf72c074cd469dea843fb5743a26ca7fb2ccb149"}, + {file = "rpds_py-0.24.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32bab0a56eac685828e00cc2f5d1200c548f8bc11f2e44abf311d6b548ce2e45"}, + {file = "rpds_py-0.24.0-cp39-cp39-win32.whl", hash = "sha256:f5c0ed12926dec1dfe7d645333ea59cf93f4d07750986a586f511c0bc61fe103"}, + {file = "rpds_py-0.24.0-cp39-cp39-win_amd64.whl", hash = "sha256:afc6e35f344490faa8276b5f2f7cbf71f88bc2cda4328e00553bd451728c571f"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:619ca56a5468f933d940e1bf431c6f4e13bef8e688698b067ae68eb4f9b30e3a"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:4b28e5122829181de1898c2c97f81c0b3246d49f585f22743a1246420bb8d399"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e5ab32cf9eb3647450bc74eb201b27c185d3857276162c101c0f8c6374e098"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:208b3a70a98cf3710e97cabdc308a51cd4f28aa6e7bb11de3d56cd8b74bab98d"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbc4362e06f950c62cad3d4abf1191021b2ffaf0b31ac230fbf0526453eee75e"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebea2821cdb5f9fef44933617be76185b80150632736f3d76e54829ab4a3b4d1"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4df06c35465ef4d81799999bba810c68d29972bf1c31db61bfdb81dd9d5bb"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d3aa13bdf38630da298f2e0d77aca967b200b8cc1473ea05248f6c5e9c9bdb44"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:041f00419e1da7a03c46042453598479f45be3d787eb837af382bfc169c0db33"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d8754d872a5dfc3c5bf9c0e059e8107451364a30d9fd50f1f1a85c4fb9481164"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:896c41007931217a343eff197c34513c154267636c8056fb409eafd494c3dcdc"}, + {file = "rpds_py-0.24.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:92558d37d872e808944c3c96d0423b8604879a3d1c86fdad508d7ed91ea547d5"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f9e0057a509e096e47c87f753136c9b10d7a91842d8042c2ee6866899a717c0d"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6e109a454412ab82979c5b1b3aee0604eca4bbf9a02693bb9df027af2bfa91a"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc1c892b1ec1f8cbd5da8de287577b455e388d9c328ad592eabbdcb6fc93bee5"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c39438c55983d48f4bb3487734d040e22dad200dab22c41e331cee145e7a50d"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d7e8ce990ae17dda686f7e82fd41a055c668e13ddcf058e7fb5e9da20b57793"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ea7f4174d2e4194289cb0c4e172d83e79a6404297ff95f2875cf9ac9bced8ba"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb2954155bb8f63bb19d56d80e5e5320b61d71084617ed89efedb861a684baea"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04f2b712a2206e13800a8136b07aaedc23af3facab84918e7aa89e4be0260032"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:eda5c1e2a715a4cbbca2d6d304988460942551e4e5e3b7457b50943cd741626d"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:9abc80fe8c1f87218db116016de575a7998ab1629078c90840e8d11ab423ee25"}, + {file = "rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6a727fd083009bc83eb83d6950f0c32b3c94c8b80a9b667c87f4bd1274ca30ba"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e0f3ef95795efcd3b2ec3fe0a5bcfb5dadf5e3996ea2117427e524d4fbf309c6"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:2c13777ecdbbba2077670285dd1fe50828c8742f6a4119dbef6f83ea13ad10fb"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79e8d804c2ccd618417e96720ad5cd076a86fa3f8cb310ea386a3e6229bae7d1"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd822f019ccccd75c832deb7aa040bb02d70a92eb15a2f16c7987b7ad4ee8d83"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0047638c3aa0dbcd0ab99ed1e549bbf0e142c9ecc173b6492868432d8989a046"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5b66d1b201cc71bc3081bc2f1fc36b0c1f268b773e03bbc39066651b9e18391"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbcbb6db5582ea33ce46a5d20a5793134b5365110d84df4e30b9d37c6fd40ad3"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63981feca3f110ed132fd217bf7768ee8ed738a55549883628ee3da75bb9cb78"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3a55fc10fdcbf1a4bd3c018eea422c52cf08700cf99c28b5cb10fe97ab77a0d3"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:c30ff468163a48535ee7e9bf21bd14c7a81147c0e58a36c1078289a8ca7af0bd"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:369d9c6d4c714e36d4a03957b4783217a3ccd1e222cdd67d464a3a479fc17796"}, + {file = "rpds_py-0.24.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:24795c099453e3721fda5d8ddd45f5dfcc8e5a547ce7b8e9da06fecc3832e26f"}, + {file = "rpds_py-0.24.0.tar.gz", hash = "sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e"}, +] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +groups = ["main"] +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "rstr" +version = "3.2.2" +description = "Generate random strings in Python" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "rstr-3.2.2-py3-none-any.whl", hash = "sha256:f39195d38da1748331eeec52f1276e71eb6295e7949beea91a5e9af2340d7b3b"}, + {file = "rstr-3.2.2.tar.gz", hash = "sha256:c4a564d4dfb4472d931d145c43d1cf1ad78c24592142e7755b8866179eeac012"}, +] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "smart-open" +version = "7.1.0" +description = "Utils for streaming large files (S3, HDFS, GCS, Azure Blob Storage, gzip, bz2...)" +optional = false +python-versions = "<4.0,>=3.7" +groups = ["main"] +files = [ + {file = "smart_open-7.1.0-py3-none-any.whl", hash = "sha256:4b8489bb6058196258bafe901730c7db0dcf4f083f316e97269c66f45502055b"}, + {file = "smart_open-7.1.0.tar.gz", hash = "sha256:a4f09f84f0f6d3637c6543aca7b5487438877a21360e7368ccf1f704789752ba"}, +] + +[package.dependencies] +requests = {version = "*", optional = true, markers = "extra == \"http\""} +wrapt = "*" + +[package.extras] +all = ["azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "paramiko", "requests", "zstandard"] +azure = ["azure-common", "azure-core", "azure-storage-blob"] +gcs = ["google-cloud-storage (>=2.6.0)"] +http = ["requests"] +s3 = ["boto3"] +ssh = ["paramiko"] +test = ["awscli", "azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "moto[server]", "numpy", "paramiko", "pyopenssl", "pytest", "pytest-benchmark", "pytest-rerunfailures", "requests", "responses", "zstandard"] +webhdfs = ["requests"] +zst = ["zstandard"] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "tifffile" +version = "2025.3.30" +description = "Read and write TIFF files" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "tifffile-2025.3.30-py3-none-any.whl", hash = "sha256:0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c"}, + {file = "tifffile-2025.3.30.tar.gz", hash = "sha256:3cdee47fe06cd75367c16bc3ff34523713156dae6cd498e3a392e5b39a51b789"}, +] + +[package.dependencies] +numpy = "*" + +[package.extras] +all = ["defusedxml", "fsspec", "imagecodecs (>=2024.12.30)", "lxml", "matplotlib", "zarr (<3)"] +codecs = ["imagecodecs (>=2024.12.30)"] +plot = ["matplotlib"] +test = ["cmapfile", "czifile", "dask", "defusedxml", "fsspec", "imagecodecs", "lfdfiles", "lxml", "ndtiff", "oiffile", "psdtags", "pytest", "roifile", "xarray", "zarr (<3)"] +xml = ["defusedxml", "lxml"] +zarr = ["fsspec", "zarr (<3)"] + +[[package]] +name = "tqdm" +version = "4.67.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "typing-extensions" +version = "4.13.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5"}, + {file = "typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b"}, +] + +[[package]] +name = "typing-inspection" +version = "0.4.0" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f"}, + {file = "typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + +[[package]] +name = "tzdata" +version = "2025.2" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +groups = ["main"] +files = [ + {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, + {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + +[metadata] +lock-version = "2.1" +python-versions = ">=3.12,<4.0" +content-hash = "ee3c11073e00ca5c479aee828bd3d962e690e25d35cf7250a2c50530fdcd0dba" diff --git a/client_configs/pyproject.toml b/client_configs/pyproject.toml new file mode 100644 index 00000000..8763bff9 --- /dev/null +++ b/client_configs/pyproject.toml @@ -0,0 +1,60 @@ +#[tool.pyright] +#venvPath = "." +#venv = ".venv" +#include = ["src", "codegen"] +#pythonVersion = "3.12" +#executionEnvironments = [{ root = ".", extraPaths = ["codegen"] }] + +[build-system] +requires = ["poetry-core>=1.2.0"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry] +name = "aignostics_platform_client" +version = "0.1.0" +description = "Client library for the Aignostics Platform API" +authors = ["Aignostics GmbH "] +readme = "README.md" +packages = [ + { include = "aignx", from = "src" }, + { include = "aignx", from = "codegen" }, + { include = "aignx", from = "tests" }, +] + +[tool.poetry.dependencies] +python = ">=3.12,<4.0" +pydantic = "^2.9.2" +typing-extensions = ">=4.13.0" +python-dateutil = "^2.9.0.post0" +urllib3 = "^2.2.3" +requests-oauthlib = "^2.0.0" +requests = "^2.32.3" +httpx = "^0.28.1" +tifffile = "^2025.1.10" +pyrfc6266 = "^1.0.2" +tqdm = "^4.67.1" +jsonschema = "4.23.0" +google-crc32c = "1.7.1" +google-cloud-storage = "3.1.0" +pyjwt = "2.10.1" +#keyring = "25.6.0" +# to temp. store the tokens in the cache folder +appdirs = "1.4.4" +python-dotenv = "1.1.0" +jsf = "0.11.2" + + +[tool.poetry.group.dev.dependencies] +pytest = "^8.2.0" +pytest-cov = "^5.0.0" +pytest-timeout = "2.3.1" + + +[tool.pytest.ini_options] +addopts = "--strict-markers" +markers = [ + "requirements: mark tests with ids (e.g., PAPI-123, HETA-123) of requirements in Jira. The test will be linked to them - optional; comma-separated", + "specifications: mark test with ids (e.g., PAPI-123, HETA-123) of specifications in Jira. The test will be linked to them - optional; comma-separated", + "labels: mark test with labels that are attached to the test tickets in Jira - optional; comma-separated", + "description: textual description what the test does, goes in `description` field in the Jira ticket - optional" +] diff --git a/codegen/.openapi-generator/FILES b/codegen/.openapi-generator/FILES new file mode 100644 index 00000000..7b6034dc --- /dev/null +++ b/codegen/.openapi-generator/FILES @@ -0,0 +1,64 @@ +aignx/codegen/api/externals_api.py +aignx/codegen/api_client.py +aignx/codegen/api_response.py +aignx/codegen/configuration.py +aignx/codegen/exceptions.py +aignx/codegen/models/application_creation_request.py +aignx/codegen/models/application_creation_response.py +aignx/codegen/models/application_read_response.py +aignx/codegen/models/application_run_status.py +aignx/codegen/models/application_version.py +aignx/codegen/models/application_version_read_response.py +aignx/codegen/models/artifact_event.py +aignx/codegen/models/artifact_status.py +aignx/codegen/models/http_validation_error.py +aignx/codegen/models/input_artifact.py +aignx/codegen/models/input_artifact_creation_request.py +aignx/codegen/models/input_artifact_read_response.py +aignx/codegen/models/input_artifact_schema_creation_request.py +aignx/codegen/models/item_creation_request.py +aignx/codegen/models/item_event.py +aignx/codegen/models/item_event_creation_request.py +aignx/codegen/models/item_event_creation_response.py +aignx/codegen/models/item_read_response.py +aignx/codegen/models/item_result_read_response.py +aignx/codegen/models/item_status.py +aignx/codegen/models/organization_creation_request.py +aignx/codegen/models/organization_quota.py +aignx/codegen/models/organization_response.py +aignx/codegen/models/organization_update_request.py +aignx/codegen/models/output_artifact.py +aignx/codegen/models/output_artifact_event_trigger_request.py +aignx/codegen/models/output_artifact_event_trigger_response.py +aignx/codegen/models/output_artifact_read_response.py +aignx/codegen/models/output_artifact_result_read_response.py +aignx/codegen/models/output_artifact_schema_creation_request.py +aignx/codegen/models/output_artifact_scope.py +aignx/codegen/models/output_artifact_visibility.py +aignx/codegen/models/payload_input_artifact.py +aignx/codegen/models/payload_item.py +aignx/codegen/models/payload_output_artifact.py +aignx/codegen/models/quota_name.py +aignx/codegen/models/quota_read_response.py +aignx/codegen/models/quota_update_request.py +aignx/codegen/models/quota_update_response.py +aignx/codegen/models/quotas_read_response.py +aignx/codegen/models/quotas_update_request.py +aignx/codegen/models/quotas_update_response.py +aignx/codegen/models/run_creation_request.py +aignx/codegen/models/run_creation_response.py +aignx/codegen/models/run_read_response.py +aignx/codegen/models/slug_version_request.py +aignx/codegen/models/transfer_urls.py +aignx/codegen/models/user_creation_request.py +aignx/codegen/models/user_payload.py +aignx/codegen/models/user_quota.py +aignx/codegen/models/user_response.py +aignx/codegen/models/user_update_request.py +aignx/codegen/models/validation_error.py +aignx/codegen/models/validation_error_loc_inner.py +aignx/codegen/models/version_creation_request.py +aignx/codegen/models/version_creation_response.py +aignx/codegen/models/version_read_response.py +aignx/codegen/rest.py +docs/ExternalsApi.md diff --git a/codegen/.openapi-generator/VERSION b/codegen/.openapi-generator/VERSION new file mode 100644 index 00000000..758bb9c8 --- /dev/null +++ b/codegen/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.10.0 diff --git a/codegen/aignx/codegen/api/externals_api.py b/codegen/aignx/codegen/api/externals_api.py new file mode 100644 index 00000000..96a2268f --- /dev/null +++ b/codegen/aignx/codegen/api/externals_api.py @@ -0,0 +1,4201 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + +from typing import Annotated, Any + +from pydantic import Field, StrictFloat, StrictInt, StrictStr, validate_call + +from aignx.codegen.api_client import ApiClient, RequestSerialized +from aignx.codegen.api_response import ApiResponse +from aignx.codegen.models.application_read_response import ApplicationReadResponse +from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse +from aignx.codegen.models.item_result_read_response import ItemResultReadResponse +from aignx.codegen.models.item_status import ItemStatus +from aignx.codegen.models.run_creation_request import RunCreationRequest +from aignx.codegen.models.run_creation_response import RunCreationResponse +from aignx.codegen.models.run_read_response import RunReadResponse +from aignx.codegen.models.user_creation_request import UserCreationRequest +from aignx.codegen.models.user_response import UserResponse +from aignx.codegen.models.user_update_request import UserUpdateRequest +from aignx.codegen.models.version_creation_request import VersionCreationRequest +from aignx.codegen.models.version_creation_response import VersionCreationResponse +from aignx.codegen.models.version_read_response import VersionReadResponse +from aignx.codegen.rest import RESTResponseType + + +class ExternalsApi: + """NOTE: This class is auto generated by OpenAPI Generator + Ref: https://openapi-generator.tech + + Do not edit the class manually. + """ + + def __init__(self, api_client=None) -> None: + if api_client is None: + api_client = ApiClient.get_default() + self.api_client = api_client + + @validate_call + def cancel_run_v1_runs_application_run_id_cancel_post( + self, + application_run_id: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> object: + """Cancel Run + + :param application_run_id: (required) + :type application_run_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( + application_run_id=application_run_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "202": "object", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def cancel_run_v1_runs_application_run_id_cancel_post_with_http_info( + self, + application_run_id: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[object]: + """Cancel Run + + :param application_run_id: (required) + :type application_run_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( + application_run_id=application_run_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "202": "object", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def cancel_run_v1_runs_application_run_id_cancel_post_without_preload_content( + self, + application_run_id: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Cancel Run + + :param application_run_id: (required) + :type application_run_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( + application_run_id=application_run_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "202": "object", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _cancel_run_v1_runs_application_run_id_cancel_post_serialize( + self, + application_run_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + if application_run_id is not None: + _path_params["application_run_id"] = application_run_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="POST", + resource_path="/v1/runs/{application_run_id}/cancel", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def create_application_run_v1_runs_post( + self, + run_creation_request: RunCreationRequest, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RunCreationResponse: + """Create Application Run + + :param run_creation_request: (required) + :type run_creation_request: RunCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._create_application_run_v1_runs_post_serialize( + run_creation_request=run_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "201": "RunCreationResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def create_application_run_v1_runs_post_with_http_info( + self, + run_creation_request: RunCreationRequest, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[RunCreationResponse]: + """Create Application Run + + :param run_creation_request: (required) + :type run_creation_request: RunCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._create_application_run_v1_runs_post_serialize( + run_creation_request=run_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "201": "RunCreationResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def create_application_run_v1_runs_post_without_preload_content( + self, + run_creation_request: RunCreationRequest, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Create Application Run + + :param run_creation_request: (required) + :type run_creation_request: RunCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._create_application_run_v1_runs_post_serialize( + run_creation_request=run_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "201": "RunCreationResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _create_application_run_v1_runs_post_serialize( + self, + run_creation_request, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + if run_creation_request is not None: + _body_params = run_creation_request + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # set the HTTP header `Content-Type` + if _content_type: + _header_params["Content-Type"] = _content_type + else: + _default_content_type = ( + self.api_client.select_header_content_type( + [ + "application/json" + ] + ) + ) + if _default_content_type is not None: + _header_params["Content-Type"] = _default_content_type + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="POST", + resource_path="/v1/runs", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def create_user_v1_users_post( + self, + user_creation_request: UserCreationRequest, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> UserResponse: + """Create User + + :param user_creation_request: (required) + :type user_creation_request: UserCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._create_user_v1_users_post_serialize( + user_creation_request=user_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "UserResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def create_user_v1_users_post_with_http_info( + self, + user_creation_request: UserCreationRequest, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[UserResponse]: + """Create User + + :param user_creation_request: (required) + :type user_creation_request: UserCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._create_user_v1_users_post_serialize( + user_creation_request=user_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "UserResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def create_user_v1_users_post_without_preload_content( + self, + user_creation_request: UserCreationRequest, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Create User + + :param user_creation_request: (required) + :type user_creation_request: UserCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._create_user_v1_users_post_serialize( + user_creation_request=user_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "UserResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _create_user_v1_users_post_serialize( + self, + user_creation_request, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + if user_creation_request is not None: + _body_params = user_creation_request + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # set the HTTP header `Content-Type` + if _content_type: + _header_params["Content-Type"] = _content_type + else: + _default_content_type = ( + self.api_client.select_header_content_type( + [ + "application/json" + ] + ) + ) + if _default_content_type is not None: + _header_params["Content-Type"] = _default_content_type + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="POST", + resource_path="/v1/users/", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def delete_run_results_v1_runs_application_run_id_results_delete( + self, + application_run_id: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> None: + """Delete Run Results + + :param application_run_id: (required) + :type application_run_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + application_run_id=application_run_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "204": None, + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( + self, + application_run_id: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[None]: + """Delete Run Results + + :param application_run_id: (required) + :type application_run_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + application_run_id=application_run_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "204": None, + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def delete_run_results_v1_runs_application_run_id_results_delete_without_preload_content( + self, + application_run_id: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Delete Run Results + + :param application_run_id: (required) + :type application_run_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + application_run_id=application_run_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "204": None, + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( + self, + application_run_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + if application_run_id is not None: + _path_params["application_run_id"] = application_run_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="DELETE", + resource_path="/v1/runs/{application_run_id}/results", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def get_run_v1_runs_application_run_id_get( + self, + application_run_id: StrictStr, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RunReadResponse: + """Get Run + + :param application_run_id: (required) + :type application_run_id: str + :param include: + :type include: List[object] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._get_run_v1_runs_application_run_id_get_serialize( + application_run_id=application_run_id, + include=include, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "RunReadResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def get_run_v1_runs_application_run_id_get_with_http_info( + self, + application_run_id: StrictStr, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[RunReadResponse]: + """Get Run + + :param application_run_id: (required) + :type application_run_id: str + :param include: + :type include: List[object] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._get_run_v1_runs_application_run_id_get_serialize( + application_run_id=application_run_id, + include=include, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "RunReadResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def get_run_v1_runs_application_run_id_get_without_preload_content( + self, + application_run_id: StrictStr, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Get Run + + :param application_run_id: (required) + :type application_run_id: str + :param include: + :type include: List[object] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._get_run_v1_runs_application_run_id_get_serialize( + application_run_id=application_run_id, + include=include, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "RunReadResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _get_run_v1_runs_application_run_id_get_serialize( + self, + application_run_id, + include, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + "include": "multi", + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + if application_run_id is not None: + _path_params["application_run_id"] = application_run_id + # process the query parameters + if include is not None: + + _query_params.append(("include", include)) + + # process the header parameters + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="GET", + resource_path="/v1/runs/{application_run_id}", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def get_user_v1_users_user_id_get( + self, + user_id: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> UserResponse: + """Get User + + :param user_id: (required) + :type user_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._get_user_v1_users_user_id_get_serialize( + user_id=user_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "UserResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def get_user_v1_users_user_id_get_with_http_info( + self, + user_id: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[UserResponse]: + """Get User + + :param user_id: (required) + :type user_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._get_user_v1_users_user_id_get_serialize( + user_id=user_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "UserResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def get_user_v1_users_user_id_get_without_preload_content( + self, + user_id: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Get User + + :param user_id: (required) + :type user_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._get_user_v1_users_user_id_get_serialize( + user_id=user_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "UserResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _get_user_v1_users_user_id_get_serialize( + self, + user_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + if user_id is not None: + _path_params["user_id"] = user_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="GET", + resource_path="/v1/users/{user_id}", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def get_version_v1_versions_application_version_id_get( + self, + application_version_id: StrictStr, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> VersionReadResponse: + """Get Version + + :param application_version_id: (required) + :type application_version_id: str + :param include: + :type include: List[object] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._get_version_v1_versions_application_version_id_get_serialize( + application_version_id=application_version_id, + include=include, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "VersionReadResponse", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def get_version_v1_versions_application_version_id_get_with_http_info( + self, + application_version_id: StrictStr, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[VersionReadResponse]: + """Get Version + + :param application_version_id: (required) + :type application_version_id: str + :param include: + :type include: List[object] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._get_version_v1_versions_application_version_id_get_serialize( + application_version_id=application_version_id, + include=include, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "VersionReadResponse", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def get_version_v1_versions_application_version_id_get_without_preload_content( + self, + application_version_id: StrictStr, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Get Version + + :param application_version_id: (required) + :type application_version_id: str + :param include: + :type include: List[object] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._get_version_v1_versions_application_version_id_get_serialize( + application_version_id=application_version_id, + include=include, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "VersionReadResponse", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _get_version_v1_versions_application_version_id_get_serialize( + self, + application_version_id, + include, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + "include": "multi", + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + if application_version_id is not None: + _path_params["application_version_id"] = application_version_id + # process the query parameters + if include is not None: + + _query_params.append(("include", include)) + + # process the header parameters + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="GET", + resource_path="/v1/versions/{application_version_id}", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def list_application_runs_v1_runs_get( + self, + application_id: StrictStr | None = None, + application_version_id: StrictStr | None = None, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> list[RunReadResponse]: + """List Application Runs + + :param application_id: + :type application_id: str + :param application_version_id: + :type application_version_id: str + :param include: + :type include: List[object] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_application_runs_v1_runs_get_serialize( + application_id=application_id, + application_version_id=application_version_id, + include=include, + page=page, + page_size=page_size, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[RunReadResponse]", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def list_application_runs_v1_runs_get_with_http_info( + self, + application_id: StrictStr | None = None, + application_version_id: StrictStr | None = None, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[list[RunReadResponse]]: + """List Application Runs + + :param application_id: + :type application_id: str + :param application_version_id: + :type application_version_id: str + :param include: + :type include: List[object] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_application_runs_v1_runs_get_serialize( + application_id=application_id, + application_version_id=application_version_id, + include=include, + page=page, + page_size=page_size, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[RunReadResponse]", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def list_application_runs_v1_runs_get_without_preload_content( + self, + application_id: StrictStr | None = None, + application_version_id: StrictStr | None = None, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """List Application Runs + + :param application_id: + :type application_id: str + :param application_version_id: + :type application_version_id: str + :param include: + :type include: List[object] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_application_runs_v1_runs_get_serialize( + application_id=application_id, + application_version_id=application_version_id, + include=include, + page=page, + page_size=page_size, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[RunReadResponse]", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _list_application_runs_v1_runs_get_serialize( + self, + application_id, + application_version_id, + include, + page, + page_size, + sort, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + "include": "multi", + "sort": "multi", + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + # process the query parameters + if application_id is not None: + + _query_params.append(("application_id", application_id)) + + if application_version_id is not None: + + _query_params.append(("application_version_id", application_version_id)) + + if include is not None: + + _query_params.append(("include", include)) + + if page is not None: + + _query_params.append(("page", page)) + + if page_size is not None: + + _query_params.append(("page_size", page_size)) + + if sort is not None: + + _query_params.append(("sort", sort)) + + # process the header parameters + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="GET", + resource_path="/v1/runs", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def list_applications_v1_applications_get( + self, + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> list[ApplicationReadResponse]: + """List Applications + + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_applications_v1_applications_get_serialize( + page=page, + page_size=page_size, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[ApplicationReadResponse]", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def list_applications_v1_applications_get_with_http_info( + self, + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[list[ApplicationReadResponse]]: + """List Applications + + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_applications_v1_applications_get_serialize( + page=page, + page_size=page_size, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[ApplicationReadResponse]", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def list_applications_v1_applications_get_without_preload_content( + self, + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """List Applications + + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_applications_v1_applications_get_serialize( + page=page, + page_size=page_size, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[ApplicationReadResponse]", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _list_applications_v1_applications_get_serialize( + self, + page, + page_size, + sort, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + "sort": "multi", + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + # process the query parameters + if page is not None: + + _query_params.append(("page", page)) + + if page_size is not None: + + _query_params.append(("page_size", page_size)) + + if sort is not None: + + _query_params.append(("sort", sort)) + + # process the header parameters + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="GET", + resource_path="/v1/applications", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def list_run_results_v1_runs_application_run_id_results_get( + self, + application_run_id: StrictStr, + item_id__in: list[StrictStr | None] | None = None, + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + reference__in: list[StrictStr] | None = None, + status__in: list[ItemStatus] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> list[ItemResultReadResponse]: + """List Run Results + + :param application_run_id: (required) + :type application_run_id: str + :param item_id__in: + :type item_id__in: List[Optional[str]] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param reference__in: + :type reference__in: List[str] + :param status__in: + :type status__in: List[ItemStatus] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( + application_run_id=application_run_id, + item_id__in=item_id__in, + page=page, + page_size=page_size, + reference__in=reference__in, + status__in=status__in, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[ItemResultReadResponse]", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def list_run_results_v1_runs_application_run_id_results_get_with_http_info( + self, + application_run_id: StrictStr, + item_id__in: list[StrictStr | None] | None = None, + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + reference__in: list[StrictStr] | None = None, + status__in: list[ItemStatus] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[list[ItemResultReadResponse]]: + """List Run Results + + :param application_run_id: (required) + :type application_run_id: str + :param item_id__in: + :type item_id__in: List[Optional[str]] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param reference__in: + :type reference__in: List[str] + :param status__in: + :type status__in: List[ItemStatus] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( + application_run_id=application_run_id, + item_id__in=item_id__in, + page=page, + page_size=page_size, + reference__in=reference__in, + status__in=status__in, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[ItemResultReadResponse]", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def list_run_results_v1_runs_application_run_id_results_get_without_preload_content( + self, + application_run_id: StrictStr, + item_id__in: list[StrictStr | None] | None = None, + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + reference__in: list[StrictStr] | None = None, + status__in: list[ItemStatus] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """List Run Results + + :param application_run_id: (required) + :type application_run_id: str + :param item_id__in: + :type item_id__in: List[Optional[str]] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param reference__in: + :type reference__in: List[str] + :param status__in: + :type status__in: List[ItemStatus] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( + application_run_id=application_run_id, + item_id__in=item_id__in, + page=page, + page_size=page_size, + reference__in=reference__in, + status__in=status__in, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[ItemResultReadResponse]", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _list_run_results_v1_runs_application_run_id_results_get_serialize( + self, + application_run_id, + item_id__in, + page, + page_size, + reference__in, + status__in, + sort, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + "item_id__in": "multi", + "reference__in": "multi", + "status__in": "multi", + "sort": "multi", + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + if application_run_id is not None: + _path_params["application_run_id"] = application_run_id + # process the query parameters + if item_id__in is not None: + + _query_params.append(("item_id__in", item_id__in)) + + if page is not None: + + _query_params.append(("page", page)) + + if page_size is not None: + + _query_params.append(("page_size", page_size)) + + if reference__in is not None: + + _query_params.append(("reference__in", reference__in)) + + if status__in is not None: + + _query_params.append(("status__in", status__in)) + + if sort is not None: + + _query_params.append(("sort", sort)) + + # process the header parameters + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="GET", + resource_path="/v1/runs/{application_run_id}/results", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def list_versions_by_application_id_v1_applications_application_id_versions_get( + self, + application_id: StrictStr, + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + version: StrictStr | None = None, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> list[ApplicationVersionReadResponse]: + """List Versions By Application Id + + :param application_id: (required) + :type application_id: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( + application_id=application_id, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[ApplicationVersionReadResponse]", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def list_versions_by_application_id_v1_applications_application_id_versions_get_with_http_info( + self, + application_id: StrictStr, + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + version: StrictStr | None = None, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[list[ApplicationVersionReadResponse]]: + """List Versions By Application Id + + :param application_id: (required) + :type application_id: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( + application_id=application_id, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[ApplicationVersionReadResponse]", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def list_versions_by_application_id_v1_applications_application_id_versions_get_without_preload_content( + self, + application_id: StrictStr, + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + version: StrictStr | None = None, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """List Versions By Application Id + + :param application_id: (required) + :type application_id: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( + application_id=application_id, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[ApplicationVersionReadResponse]", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( + self, + application_id, + page, + page_size, + version, + include, + sort, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + "include": "multi", + "sort": "multi", + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + if application_id is not None: + _path_params["application_id"] = application_id + # process the query parameters + if page is not None: + + _query_params.append(("page", page)) + + if page_size is not None: + + _query_params.append(("page_size", page_size)) + + if version is not None: + + _query_params.append(("version", version)) + + if include is not None: + + _query_params.append(("include", include)) + + if sort is not None: + + _query_params.append(("sort", sort)) + + # process the header parameters + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="GET", + resource_path="/v1/applications/{application_id}/versions", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def list_versions_by_application_slug_v1_applications_application_slug_versions_get( + self, + application_slug: Annotated[str, Field(strict=True)], + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + version: StrictStr | None = None, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> list[ApplicationVersionReadResponse]: + """List Versions By Application Slug + + :param application_slug: (required) + :type application_slug: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( + application_slug=application_slug, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[ApplicationVersionReadResponse]", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def list_versions_by_application_slug_v1_applications_application_slug_versions_get_with_http_info( + self, + application_slug: Annotated[str, Field(strict=True)], + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + version: StrictStr | None = None, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[list[ApplicationVersionReadResponse]]: + """List Versions By Application Slug + + :param application_slug: (required) + :type application_slug: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( + application_slug=application_slug, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[ApplicationVersionReadResponse]", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def list_versions_by_application_slug_v1_applications_application_slug_versions_get_without_preload_content( + self, + application_slug: Annotated[str, Field(strict=True)], + page: Annotated[int, Field(strict=True, ge=1)] | None = None, + page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, + version: StrictStr | None = None, + include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, + sort: list[StrictStr] | None = None, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """List Versions By Application Slug + + :param application_slug: (required) + :type application_slug: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( + application_slug=application_slug, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "List[ApplicationVersionReadResponse]", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( + self, + application_slug, + page, + page_size, + version, + include, + sort, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + "include": "multi", + "sort": "multi", + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + if application_slug is not None: + _path_params["application_slug"] = application_slug + # process the query parameters + if page is not None: + + _query_params.append(("page", page)) + + if page_size is not None: + + _query_params.append(("page_size", page_size)) + + if version is not None: + + _query_params.append(("version", version)) + + if include is not None: + + _query_params.append(("include", include)) + + if sort is not None: + + _query_params.append(("sort", sort)) + + # process the header parameters + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="GET", + resource_path="/v1/applications/{application_slug}/versions", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def read_application_by_id_v1_applications_application_id_get( + self, + application_id: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApplicationReadResponse: + """Read Application By Id + + :param application_id: (required) + :type application_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._read_application_by_id_v1_applications_application_id_get_serialize( + application_id=application_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "ApplicationReadResponse", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def read_application_by_id_v1_applications_application_id_get_with_http_info( + self, + application_id: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[ApplicationReadResponse]: + """Read Application By Id + + :param application_id: (required) + :type application_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._read_application_by_id_v1_applications_application_id_get_serialize( + application_id=application_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "ApplicationReadResponse", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def read_application_by_id_v1_applications_application_id_get_without_preload_content( + self, + application_id: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Read Application By Id + + :param application_id: (required) + :type application_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._read_application_by_id_v1_applications_application_id_get_serialize( + application_id=application_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "ApplicationReadResponse", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _read_application_by_id_v1_applications_application_id_get_serialize( + self, + application_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + if application_id is not None: + _path_params["application_id"] = application_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="GET", + resource_path="/v1/applications/{application_id}", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def read_application_by_slug_v1_applications_application_slug_get( + self, + application_slug: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApplicationReadResponse: + """Read Application By Slug + + :param application_slug: (required) + :type application_slug: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( + application_slug=application_slug, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "ApplicationReadResponse", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def read_application_by_slug_v1_applications_application_slug_get_with_http_info( + self, + application_slug: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[ApplicationReadResponse]: + """Read Application By Slug + + :param application_slug: (required) + :type application_slug: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( + application_slug=application_slug, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "ApplicationReadResponse", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def read_application_by_slug_v1_applications_application_slug_get_without_preload_content( + self, + application_slug: StrictStr, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Read Application By Slug + + :param application_slug: (required) + :type application_slug: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( + application_slug=application_slug, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "ApplicationReadResponse", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _read_application_by_slug_v1_applications_application_slug_get_serialize( + self, + application_slug, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + if application_slug is not None: + _path_params["application_slug"] = application_slug + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="GET", + resource_path="/v1/applications/{application_slug}", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def register_version_v1_versions_post( + self, + version_creation_request: VersionCreationRequest, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> VersionCreationResponse: + """Register Version + + :param version_creation_request: (required) + :type version_creation_request: VersionCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._register_version_v1_versions_post_serialize( + version_creation_request=version_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "201": "VersionCreationResponse", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def register_version_v1_versions_post_with_http_info( + self, + version_creation_request: VersionCreationRequest, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[VersionCreationResponse]: + """Register Version + + :param version_creation_request: (required) + :type version_creation_request: VersionCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._register_version_v1_versions_post_serialize( + version_creation_request=version_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "201": "VersionCreationResponse", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def register_version_v1_versions_post_without_preload_content( + self, + version_creation_request: VersionCreationRequest, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Register Version + + :param version_creation_request: (required) + :type version_creation_request: VersionCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._register_version_v1_versions_post_serialize( + version_creation_request=version_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "201": "VersionCreationResponse", + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _register_version_v1_versions_post_serialize( + self, + version_creation_request, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + if version_creation_request is not None: + _body_params = version_creation_request + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # set the HTTP header `Content-Type` + if _content_type: + _header_params["Content-Type"] = _content_type + else: + _default_content_type = ( + self.api_client.select_header_content_type( + [ + "application/json" + ] + ) + ) + if _default_content_type is not None: + _header_params["Content-Type"] = _default_content_type + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="POST", + resource_path="/v1/versions", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + @validate_call + def update_user_v1_users_user_id_patch( + self, + user_id: StrictStr, + user_update_request: UserUpdateRequest, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> UserResponse: + """Update User + + :param user_id: (required) + :type user_id: str + :param user_update_request: (required) + :type user_update_request: UserUpdateRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._update_user_v1_users_user_id_patch_serialize( + user_id=user_id, + user_update_request=user_update_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "UserResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + @validate_call + def update_user_v1_users_user_id_patch_with_http_info( + self, + user_id: StrictStr, + user_update_request: UserUpdateRequest, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[UserResponse]: + """Update User + + :param user_id: (required) + :type user_id: str + :param user_update_request: (required) + :type user_update_request: UserUpdateRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._update_user_v1_users_user_id_patch_serialize( + user_id=user_id, + user_update_request=user_update_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "UserResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + @validate_call + def update_user_v1_users_user_id_patch_without_preload_content( + self, + user_id: StrictStr, + user_update_request: UserUpdateRequest, + _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, + _request_auth: dict[StrictStr, Any] | None = None, + _content_type: StrictStr | None = None, + _headers: dict[StrictStr, Any] | None = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Update User + + :param user_id: (required) + :type user_id: str + :param user_update_request: (required) + :type user_update_request: UserUpdateRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ + _param = self._update_user_v1_users_user_id_patch_serialize( + user_id=user_id, + user_update_request=user_update_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: dict[str, str | None] = { + "200": "UserResponse", + "404": None, + "422": "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + def _update_user_v1_users_user_id_patch_serialize( + self, + user_id, + user_update_request, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: dict[str, str] = { + } + + _path_params: dict[str, str] = {} + _query_params: list[tuple[str, str]] = [] + _header_params: dict[str, str | None] = _headers or {} + _form_params: list[tuple[str, str]] = [] + _files: dict[ + str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + ] = {} + _body_params: bytes | None = None + + # process the path parameters + if user_id is not None: + _path_params["user_id"] = user_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + if user_update_request is not None: + _body_params = user_update_request + + # set the HTTP header `Accept` + if "Accept" not in _header_params: + _header_params["Accept"] = self.api_client.select_header_accept( + [ + "application/json" + ] + ) + + # set the HTTP header `Content-Type` + if _content_type: + _header_params["Content-Type"] = _content_type + else: + _default_content_type = ( + self.api_client.select_header_content_type( + [ + "application/json" + ] + ) + ) + if _default_content_type is not None: + _header_params["Content-Type"] = _default_content_type + + # authentication setting + _auth_settings: list[str] = [ + "OAuth2AuthorizationCodeBearer" + ] + + return self.api_client.param_serialize( + method="PATCH", + resource_path="/v1/users/{user_id}", + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) diff --git a/codegen/aignx/codegen/api_client.py b/codegen/aignx/codegen/api_client.py new file mode 100644 index 00000000..52a16b6e --- /dev/null +++ b/codegen/aignx/codegen/api_client.py @@ -0,0 +1,782 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +import datetime +import decimal +import json +import mimetypes +import os +import re +import tempfile +from enum import Enum +from urllib.parse import quote + +from dateutil.parser import parse +from pydantic import SecretStr + +import aignx.codegen.models +from aignx.codegen import rest +from aignx.codegen.api_response import ApiResponse +from aignx.codegen.api_response import T as ApiResponseT +from aignx.codegen.configuration import Configuration +from aignx.codegen.exceptions import ( + ApiException, + ApiValueError, +) + +RequestSerialized = tuple[str, str, dict[str, str], str | None, list[str]] + + +class ApiClient: + """Generic API client for OpenAPI client library builds. + + OpenAPI generic API client. This client handles the client- + server communication, and is invariant across implementations. Specifics of + the methods and models for each application are generated from the OpenAPI + templates. + + :param configuration: .Configuration object for this client + :param header_name: a header to pass when making calls to the API. + :param header_value: a header value to pass when making calls to + the API. + :param cookie: a cookie to include in the header when making calls + to the API + """ + + PRIMITIVE_TYPES = (float, bool, bytes, str, int) + NATIVE_TYPES_MAPPING = { + "int": int, + "long": int, # TODO remove as only py3 is supported? + "float": float, + "str": str, + "bool": bool, + "date": datetime.date, + "datetime": datetime.datetime, + "decimal": decimal.Decimal, + "object": object, + } + _pool = None + + def __init__( + self, + configuration=None, + header_name=None, + header_value=None, + cookie=None + ) -> None: + # use default configuration if none is provided + if configuration is None: + configuration = Configuration.get_default() + self.configuration = configuration + + self.rest_client = rest.RESTClientObject(configuration) + self.default_headers = {} + if header_name is not None: + self.default_headers[header_name] = header_value + self.cookie = cookie + # Set default User-Agent. + self.user_agent = "OpenAPI-Generator/1.0.0/python" + self.client_side_validation = configuration.client_side_validation + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + @property + def user_agent(self): + """User agent for this API client""" + return self.default_headers["User-Agent"] + + @user_agent.setter + def user_agent(self, value): + self.default_headers["User-Agent"] = value + + def set_default_header(self, header_name, header_value): + self.default_headers[header_name] = header_value + + _default = None + + @classmethod + def get_default(cls): + """Return new instance of ApiClient. + + This method returns newly created, based on default constructor, + object of ApiClient class or returns a copy of default + ApiClient. + + :return: The ApiClient object. + """ + if cls._default is None: + cls._default = ApiClient() + return cls._default + + @classmethod + def set_default(cls, default): + """Set default instance of ApiClient. + + It stores default ApiClient. + + :param default: object of ApiClient. + """ + cls._default = default + + def param_serialize( + self, + method, + resource_path, + path_params=None, + query_params=None, + header_params=None, + body=None, + post_params=None, + files=None, auth_settings=None, + collection_formats=None, + _host=None, + _request_auth=None + ) -> RequestSerialized: + """Builds the HTTP request params needed by the request. + :param method: Method to call. + :param resource_path: Path to method endpoint. + :param path_params: Path parameters in the url. + :param query_params: Query parameters in the url. + :param header_params: Header parameters to be + placed in the request header. + :param body: Request body. + :param post_params dict: Request post form parameters, + for `application/x-www-form-urlencoded`, `multipart/form-data`. + :param auth_settings list: Auth Settings names for the request. + :param files dict: key -> filename, value -> filepath, + for `multipart/form-data`. + :param collection_formats: dict of collection formats for path, query, + header, and post parameters. + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the authentication + in the spec for a single request. + :return: tuple of form (path, http_method, query_params, header_params, + body, post_params, files) + """ + config = self.configuration + + # header parameters + header_params = header_params or {} + header_params.update(self.default_headers) + if self.cookie: + header_params["Cookie"] = self.cookie + if header_params: + header_params = self.sanitize_for_serialization(header_params) + header_params = dict( + self.parameters_to_tuples(header_params, collection_formats) + ) + + # path parameters + if path_params: + path_params = self.sanitize_for_serialization(path_params) + path_params = self.parameters_to_tuples( + path_params, + collection_formats + ) + for k, v in path_params: + # specified safe chars, encode everything + resource_path = resource_path.replace( + "{%s}" % k, + quote(str(v), safe=config.safe_chars_for_path_param) + ) + + # post parameters + if post_params or files: + post_params = post_params or [] + post_params = self.sanitize_for_serialization(post_params) + post_params = self.parameters_to_tuples( + post_params, + collection_formats + ) + if files: + post_params.extend(self.files_parameters(files)) + + # auth setting + self.update_params_for_auth( + header_params, + query_params, + auth_settings, + resource_path, + method, + body, + request_auth=_request_auth + ) + + # body + if body: + body = self.sanitize_for_serialization(body) + + # request url + if _host is None or self.configuration.ignore_operation_servers: + url = self.configuration.host + resource_path + else: + # use server/host defined in path or operation instead + url = _host + resource_path + + # query parameters + if query_params: + query_params = self.sanitize_for_serialization(query_params) + url_query = self.parameters_to_url_query( + query_params, + collection_formats + ) + url += "?" + url_query + + return method, url, header_params, body, post_params + + def call_api( + self, + method, + url, + header_params=None, + body=None, + post_params=None, + _request_timeout=None + ) -> rest.RESTResponse: + """Makes the HTTP request (synchronous) + :param method: Method to call. + :param url: Path to method endpoint. + :param header_params: Header parameters to be + placed in the request header. + :param body: Request body. + :param post_params dict: Request post form parameters, + for `application/x-www-form-urlencoded`, `multipart/form-data`. + :param _request_timeout: timeout setting for this request. + :return: RESTResponse + """ + try: + # perform request and return response + response_data = self.rest_client.request( + method, url, + headers=header_params, + body=body, post_params=post_params, + _request_timeout=_request_timeout + ) + + except ApiException as e: + raise e + + return response_data + + def response_deserialize( + self, + response_data: rest.RESTResponse, + response_types_map: dict[str, ApiResponseT] | None = None + ) -> ApiResponse[ApiResponseT]: + """Deserializes response into an object. + :param response_data: RESTResponse object to be deserialized. + :param response_types_map: dict of response types. + :return: ApiResponse + """ + msg = "RESTResponse.read() must be called before passing it to response_deserialize()" + assert response_data.data is not None, msg + + response_type = response_types_map.get(str(response_data.status), None) + if not response_type and isinstance(response_data.status, int) and 100 <= response_data.status <= 599: + # if not found, look for '1XX', '2XX', etc. + response_type = response_types_map.get(str(response_data.status)[0] + "XX", None) + + # deserialize response data + response_text = None + return_data = None + try: + if response_type == "bytearray": + return_data = response_data.data + elif response_type == "file": + return_data = self.__deserialize_file(response_data) + elif response_type is not None: + match = None + content_type = response_data.getheader("content-type") + if content_type is not None: + match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type) + encoding = match.group(1) if match else "utf-8" + response_text = response_data.data.decode(encoding) + return_data = self.deserialize(response_text, response_type, content_type) + finally: + if not 200 <= response_data.status <= 299: + raise ApiException.from_response( + http_resp=response_data, + body=response_text, + data=return_data, + ) + + return ApiResponse( + status_code=response_data.status, + data=return_data, + headers=response_data.getheaders(), + raw_data=response_data.data + ) + + def sanitize_for_serialization(self, obj): + """Builds a JSON POST object. + + If obj is None, return None. + If obj is SecretStr, return obj.get_secret_value() + If obj is str, int, long, float, bool, return directly. + If obj is datetime.datetime, datetime.date + convert to string in iso8601 format. + If obj is decimal.Decimal return string representation. + If obj is list, sanitize each element in the list. + If obj is dict, return the dict. + If obj is OpenAPI model, return the properties dict. + + :param obj: The data to serialize. + :return: The serialized form of data. + """ + if obj is None: + return None + if isinstance(obj, Enum): + return obj.value + if isinstance(obj, SecretStr): + return obj.get_secret_value() + if isinstance(obj, self.PRIMITIVE_TYPES): + return obj + if isinstance(obj, list): + return [ + self.sanitize_for_serialization(sub_obj) for sub_obj in obj + ] + if isinstance(obj, tuple): + return tuple( + self.sanitize_for_serialization(sub_obj) for sub_obj in obj + ) + if isinstance(obj, (datetime.datetime, datetime.date)): + return obj.isoformat() + if isinstance(obj, decimal.Decimal): + return str(obj) + + if isinstance(obj, dict): + obj_dict = obj + # Convert model obj to dict except + # attributes `openapi_types`, `attribute_map` + # and attributes which value is not None. + # Convert attribute name to json key in + # model definition for request. + elif hasattr(obj, "to_dict") and callable(obj.to_dict): + obj_dict = obj.to_dict() + else: + obj_dict = obj.__dict__ + + return { + key: self.sanitize_for_serialization(val) + for key, val in obj_dict.items() + } + + def deserialize(self, response_text: str, response_type: str, content_type: str | None): + """Deserializes response into an object. + + :param response: RESTResponse object to be deserialized. + :param response_type: class literal for + deserialized object, or string of class name. + :param content_type: content type of response. + + :return: deserialized object. + """ + # fetch data from response object + if content_type is None: + try: + data = json.loads(response_text) + except ValueError: + data = response_text + elif re.match(r"^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)", content_type, re.IGNORECASE): + if response_text == "": + data = "" + else: + data = json.loads(response_text) + elif re.match(r"^text\/[a-z.+-]+\s*(;|$)", content_type, re.IGNORECASE): + data = response_text + else: + raise ApiException( + status=0, + reason=f"Unsupported content type: {content_type}" + ) + + return self.__deserialize(data, response_type) + + def __deserialize(self, data, klass): + """Deserializes dict, list, str into an object. + + :param data: dict, list or str. + :param klass: class literal, or string of class name. + + :return: object. + """ + if data is None: + return None + + if isinstance(klass, str): + if klass.startswith("List["): + m = re.match(r"List\[(.*)]", klass) + assert m is not None, "Malformed List type definition" + sub_kls = m.group(1) + return [self.__deserialize(sub_data, sub_kls) + for sub_data in data] + + if klass.startswith("Dict["): + m = re.match(r"Dict\[([^,]*), (.*)]", klass) + assert m is not None, "Malformed Dict type definition" + sub_kls = m.group(2) + return {k: self.__deserialize(v, sub_kls) + for k, v in data.items()} + + # convert str to class + if klass in self.NATIVE_TYPES_MAPPING: + klass = self.NATIVE_TYPES_MAPPING[klass] + else: + klass = getattr(aignx.codegen.models, klass) + + if klass in self.PRIMITIVE_TYPES: + return self.__deserialize_primitive(data, klass) + if klass == object: + return self.__deserialize_object(data) + if klass == datetime.date: + return self.__deserialize_date(data) + if klass == datetime.datetime: + return self.__deserialize_datetime(data) + if klass == decimal.Decimal: + return decimal.Decimal(data) + if issubclass(klass, Enum): + return self.__deserialize_enum(data, klass) + return self.__deserialize_model(data, klass) + + def parameters_to_tuples(self, params, collection_formats): + """Get parameters as list of tuples, formatting collections. + + :param params: Parameters as dict or list of two-tuples + :param dict collection_formats: Parameter collection formats + :return: Parameters as list of tuples, collections formatted + """ + new_params: list[tuple[str, str]] = [] + if collection_formats is None: + collection_formats = {} + for k, v in params.items() if isinstance(params, dict) else params: + if k in collection_formats: + collection_format = collection_formats[k] + if collection_format == "multi": + new_params.extend((k, value) for value in v) + else: + if collection_format == "ssv": + delimiter = " " + elif collection_format == "tsv": + delimiter = "\t" + elif collection_format == "pipes": + delimiter = "|" + else: # csv is the default + delimiter = "," + new_params.append( + (k, delimiter.join(str(value) for value in v))) + else: + new_params.append((k, v)) + return new_params + + def parameters_to_url_query(self, params, collection_formats): + """Get parameters as list of tuples, formatting collections. + + :param params: Parameters as dict or list of two-tuples + :param dict collection_formats: Parameter collection formats + :return: URL query string (e.g. a=Hello%20World&b=123) + """ + new_params: list[tuple[str, str]] = [] + if collection_formats is None: + collection_formats = {} + for k, v in params.items() if isinstance(params, dict) else params: + if isinstance(v, bool): + v = str(v).lower() + if isinstance(v, (int, float)): + v = str(v) + if isinstance(v, dict): + v = json.dumps(v) + + if k in collection_formats: + collection_format = collection_formats[k] + if collection_format == "multi": + new_params.extend((k, str(value)) for value in v) + else: + if collection_format == "ssv": + delimiter = " " + elif collection_format == "tsv": + delimiter = "\t" + elif collection_format == "pipes": + delimiter = "|" + else: # csv is the default + delimiter = "," + new_params.append( + (k, delimiter.join(quote(str(value)) for value in v)) + ) + else: + new_params.append((k, quote(str(v)))) + + return "&".join(["=".join(map(str, item)) for item in new_params]) + + def files_parameters( + self, + files: dict[str, str | bytes | list[str] | list[bytes] | tuple[str, bytes]], + ): + """Builds form parameters. + + :param files: File parameters. + :return: Form parameters with files. + """ + params = [] + for k, v in files.items(): + if isinstance(v, str): + with open(v, "rb") as f: + filename = os.path.basename(f.name) + filedata = f.read() + elif isinstance(v, bytes): + filename = k + filedata = v + elif isinstance(v, tuple): + filename, filedata = v + elif isinstance(v, list): + for file_param in v: + params.extend(self.files_parameters({k: file_param})) + continue + else: + raise ValueError("Unsupported file value") + mimetype = ( + mimetypes.guess_type(filename)[0] + or "application/octet-stream" + ) + params.append( + tuple([k, tuple([filename, filedata, mimetype])]) + ) + return params + + def select_header_accept(self, accepts: list[str]) -> str | None: + """Returns `Accept` based on an array of accepts provided. + + :param accepts: List of headers. + :return: Accept (e.g. application/json). + """ + if not accepts: + return None + + for accept in accepts: + if re.search(r"json", accept, re.IGNORECASE): + return accept + + return accepts[0] + + def select_header_content_type(self, content_types): + """Returns `Content-Type` based on an array of content_types provided. + + :param content_types: List of content-types. + :return: Content-Type (e.g. application/json). + """ + if not content_types: + return None + + for content_type in content_types: + if re.search(r"json", content_type, re.IGNORECASE): + return content_type + + return content_types[0] + + def update_params_for_auth( + self, + headers, + queries, + auth_settings, + resource_path, + method, + body, + request_auth=None + ) -> None: + """Updates header and query params based on authentication setting. + + :param headers: Header parameters dict to be updated. + :param queries: Query parameters tuple list to be updated. + :param auth_settings: Authentication setting identifiers list. + :resource_path: A string representation of the HTTP request resource path. + :method: A string representation of the HTTP request method. + :body: A object representing the body of the HTTP request. + The object type is the return value of sanitize_for_serialization(). + :param request_auth: if set, the provided settings will + override the token in the configuration. + """ + if not auth_settings: + return + + if request_auth: + self._apply_auth_params( + headers, + queries, + resource_path, + method, + body, + request_auth + ) + else: + for auth in auth_settings: + auth_setting = self.configuration.auth_settings().get(auth) + if auth_setting: + self._apply_auth_params( + headers, + queries, + resource_path, + method, + body, + auth_setting + ) + + def _apply_auth_params( + self, + headers, + queries, + resource_path, + method, + body, + auth_setting + ) -> None: + """Updates the request parameters based on a single auth_setting + + :param headers: Header parameters dict to be updated. + :param queries: Query parameters tuple list to be updated. + :resource_path: A string representation of the HTTP request resource path. + :method: A string representation of the HTTP request method. + :body: A object representing the body of the HTTP request. + The object type is the return value of sanitize_for_serialization(). + :param auth_setting: auth settings for the endpoint + """ + if auth_setting["in"] == "cookie": + headers["Cookie"] = auth_setting["value"] + elif auth_setting["in"] == "header": + if auth_setting["type"] != "http-signature": + headers[auth_setting["key"]] = auth_setting["value"] + elif auth_setting["in"] == "query": + queries.append((auth_setting["key"], auth_setting["value"])) + else: + raise ApiValueError( + "Authentication token must be in `query` or `header`" + ) + + def __deserialize_file(self, response): + """Deserializes body to file + + Saves response body into a file in a temporary folder, + using the filename from the `Content-Disposition` header if provided. + + handle file downloading + save response body into a tmp file and return the instance + + :param response: RESTResponse. + :return: file path. + """ + fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) + os.close(fd) + os.remove(path) + + content_disposition = response.getheader("Content-Disposition") + if content_disposition: + m = re.search( + r'filename=[\'"]?([^\'"\s]+)[\'"]?', + content_disposition + ) + assert m is not None, "Unexpected 'content-disposition' header value" + filename = m.group(1) + path = os.path.join(os.path.dirname(path), filename) + + with open(path, "wb") as f: + f.write(response.data) + + return path + + def __deserialize_primitive(self, data, klass): + """Deserializes string to primitive type. + + :param data: str. + :param klass: class literal. + + :return: int, long, float, str, bool. + """ + try: + return klass(data) + except UnicodeEncodeError: + return str(data) + except TypeError: + return data + + def __deserialize_object(self, value): + """Return an original value. + + :return: object. + """ + return value + + def __deserialize_date(self, string): + """Deserializes string to date. + + :param string: str. + :return: date. + """ + try: + return parse(string).date() + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, + reason=f"Failed to parse `{string}` as date object" + ) + + def __deserialize_datetime(self, string): + """Deserializes string to datetime. + + The string should be in iso8601 datetime format. + + :param string: str. + :return: datetime. + """ + try: + return parse(string) + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, + reason=( + f"Failed to parse `{string}` as datetime object" + + ) + ) + + def __deserialize_enum(self, data, klass): + """Deserializes primitive type to enum. + + :param data: primitive type. + :param klass: class literal. + :return: enum value. + """ + try: + return klass(data) + except ValueError: + raise rest.ApiException( + status=0, + reason=( + f"Failed to parse `{data}` as `{klass}`" + + ) + ) + + def __deserialize_model(self, data, klass): + """Deserializes list or dict to model. + + :param data: dict, list. + :param klass: class literal. + :return: model object. + """ + return klass.from_dict(data) diff --git a/codegen/aignx/codegen/api_response.py b/codegen/aignx/codegen/api_response.py new file mode 100644 index 00000000..fbdf12c9 --- /dev/null +++ b/codegen/aignx/codegen/api_response.py @@ -0,0 +1,25 @@ +"""API response object.""" + +from __future__ import annotations + +from collections.abc import Mapping +from typing import Generic, TypeVar + +from pydantic import BaseModel, Field, StrictBytes, StrictInt + +T = TypeVar("T") + + +class ApiResponse(BaseModel, Generic[T]): + """ + API response object + """ + + status_code: StrictInt = Field(description="HTTP status code") + headers: Mapping[str, str] | None = Field(None, description="HTTP headers") + data: T = Field(description="Deserialized data given the data type") + raw_data: StrictBytes = Field(description="Raw data (HTTP response body)") + + model_config = { + "arbitrary_types_allowed": True + } diff --git a/codegen/aignx/codegen/configuration.py b/codegen/aignx/codegen/configuration.py new file mode 100644 index 00000000..d6a28432 --- /dev/null +++ b/codegen/aignx/codegen/configuration.py @@ -0,0 +1,564 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +import copy +import http.client as httplib +import logging +import multiprocessing +import sys +from logging import FileHandler +from typing import Any, ClassVar, Literal, NotRequired, Self, TypedDict + +import urllib3 + +JSON_SCHEMA_VALIDATION_KEYWORDS = { + "multipleOf", "maximum", "exclusiveMaximum", + "minimum", "exclusiveMinimum", "maxLength", + "minLength", "pattern", "maxItems", "minItems" +} + +ServerVariablesT = dict[str, str] + +GenericAuthSetting = TypedDict( + "GenericAuthSetting", + { + "type": str, + "in": str, + "key": str, + "value": str, + }, +) + + +OAuth2AuthSetting = TypedDict( + "OAuth2AuthSetting", + { + "type": Literal["oauth2"], + "in": Literal["header"], + "key": Literal["Authorization"], + "value": str, + }, +) + + +APIKeyAuthSetting = TypedDict( + "APIKeyAuthSetting", + { + "type": Literal["api_key"], + "in": str, + "key": str, + "value": str | None, + }, +) + + +BasicAuthSetting = TypedDict( + "BasicAuthSetting", + { + "type": Literal["basic"], + "in": Literal["header"], + "key": Literal["Authorization"], + "value": str | None, + }, +) + + +BearerFormatAuthSetting = TypedDict( + "BearerFormatAuthSetting", + { + "type": Literal["bearer"], + "in": Literal["header"], + "format": Literal["JWT"], + "key": Literal["Authorization"], + "value": str, + }, +) + + +BearerAuthSetting = TypedDict( + "BearerAuthSetting", + { + "type": Literal["bearer"], + "in": Literal["header"], + "key": Literal["Authorization"], + "value": str, + }, +) + + +HTTPSignatureAuthSetting = TypedDict( + "HTTPSignatureAuthSetting", + { + "type": Literal["http-signature"], + "in": Literal["header"], + "key": Literal["Authorization"], + "value": None, + }, +) + + +class AuthSettings(TypedDict, total=False): + OAuth2AuthorizationCodeBearer: OAuth2AuthSetting + + +class HostSettingVariable(TypedDict): + description: str + default_value: str + enum_values: list[str] + + +class HostSetting(TypedDict): + url: str + description: str + variables: NotRequired[dict[str, HostSettingVariable]] + + +class Configuration: + """This class contains various settings of the API client. + + :param host: Base url. + :param ignore_operation_servers + Boolean to ignore operation servers for the API client. + Config will use `host` as the base url regardless of the operation servers. + :param api_key: Dict to store API key(s). + Each entry in the dict specifies an API key. + The dict key is the name of the security scheme in the OAS specification. + The dict value is the API key secret. + :param api_key_prefix: Dict to store API prefix (e.g. Bearer). + The dict key is the name of the security scheme in the OAS specification. + The dict value is an API key prefix when generating the auth data. + :param username: Username for HTTP basic authentication. + :param password: Password for HTTP basic authentication. + :param access_token: Access token. + :param server_index: Index to servers configuration. + :param server_variables: Mapping with string values to replace variables in + templated server configuration. The validation of enums is performed for + variables with defined enum values before. + :param server_operation_index: Mapping from operation ID to an index to server + configuration. + :param server_operation_variables: Mapping from operation ID to a mapping with + string values to replace variables in templated server configuration. + The validation of enums is performed for variables with defined enum + values before. + :param ssl_ca_cert: str - the path to a file of concatenated CA certificates + in PEM format. + :param retries: Number of retries for API requests. + + :Example: + """ + + _default: ClassVar[Self | None] = None + + def __init__( + self, + host: str | None = None, + api_key: dict[str, str] | None = None, + api_key_prefix: dict[str, str] | None = None, + username: str | None = None, + password: str | None = None, + access_token: str | None = None, + server_index: int | None = None, + server_variables: ServerVariablesT | None = None, + server_operation_index: dict[int, int] | None = None, + server_operation_variables: dict[int, ServerVariablesT] | None = None, + ignore_operation_servers: bool = False, + ssl_ca_cert: str | None = None, + retries: int | None = None, + *, + debug: bool | None = None, + ) -> None: + """Constructor + """ + self._base_path = "http://localhost" if host is None else host + """Default Base url + """ + self.server_index = 0 if server_index is None and host is None else server_index + self.server_operation_index = server_operation_index or {} + """Default server index + """ + self.server_variables = server_variables or {} + self.server_operation_variables = server_operation_variables or {} + """Default server variables + """ + self.ignore_operation_servers = ignore_operation_servers + """Ignore operation servers + """ + self.temp_folder_path = None + """Temp file folder for downloading files + """ + # Authentication Settings + self.api_key = {} + if api_key: + self.api_key = api_key + """dict to store API key(s) + """ + self.api_key_prefix = {} + if api_key_prefix: + self.api_key_prefix = api_key_prefix + """dict to store API prefix (e.g. Bearer) + """ + self.refresh_api_key_hook = None + """function hook to refresh API key if expired + """ + self.username = username + """Username for HTTP basic authentication + """ + self.password = password + """Password for HTTP basic authentication + """ + self.access_token = access_token + """Access token + """ + self.logger = {} + """Logging Settings + """ + self.logger["package_logger"] = logging.getLogger("aignx.codegen") + self.logger["urllib3_logger"] = logging.getLogger("urllib3") + self.logger_format = "%(asctime)s %(levelname)s %(message)s" + """Log format + """ + self.logger_stream_handler = None + """Log stream handler + """ + self.logger_file_handler: FileHandler | None = None + """Log file handler + """ + self.logger_file = None + """Debug file location + """ + if debug is not None: + self.debug = debug + else: + self.__debug = False + """Debug switch + """ + + self.verify_ssl = True + """SSL/TLS verification + Set this to false to skip verifying SSL certificate when calling API + from https server. + """ + self.ssl_ca_cert = ssl_ca_cert + """Set this to customize the certificate file to verify the peer. + """ + self.cert_file = None + """client certificate file + """ + self.key_file = None + """client key file + """ + self.assert_hostname = None + """Set this to True/False to enable/disable SSL hostname verification. + """ + self.tls_server_name = None + """SSL/TLS Server Name Indication (SNI) + Set this to the SNI value expected by the server. + """ + + self.connection_pool_maxsize = multiprocessing.cpu_count() * 5 + """urllib3 connection pool's maximum number of connections saved + per pool. urllib3 uses 1 connection as default value, but this is + not the best value when you are making a lot of possibly parallel + requests to the same host, which is often the case here. + cpu_count * 5 is used as default value to increase performance. + """ + + self.proxy: str | None = None + """Proxy URL + """ + self.proxy_headers = None + """Proxy headers + """ + self.safe_chars_for_path_param = "" + """Safe chars for path_param + """ + self.retries = retries + """Adding retries to override urllib3 default value 3 + """ + # Enable client side validation + self.client_side_validation = True + + self.socket_options = None + """Options to pass down to the underlying urllib3 socket + """ + + self.datetime_format = "%Y-%m-%dT%H:%M:%S.%f%z" + """datetime format + """ + + self.date_format = "%Y-%m-%d" + """date format + """ + + def __deepcopy__(self, memo: dict[int, Any]) -> Self: + cls = self.__class__ + result = cls.__new__(cls) + memo[id(self)] = result + for k, v in self.__dict__.items(): + if k not in ("logger", "logger_file_handler"): + setattr(result, k, copy.deepcopy(v, memo)) + # shallow copy of loggers + result.logger = copy.copy(self.logger) + # use setters to configure loggers + result.logger_file = self.logger_file + result.debug = self.debug + return result + + def __setattr__(self, name: str, value: Any) -> None: + object.__setattr__(self, name, value) + + @classmethod + def set_default(cls, default: Self | None) -> None: + """Set default instance of configuration. + + It stores default configuration, which can be + returned by get_default_copy method. + + :param default: object of Configuration + """ + cls._default = default + + @classmethod + def get_default_copy(cls) -> Self: + """Deprecated. Please use `get_default` instead. + + Deprecated. Please use `get_default` instead. + + :return: The configuration object. + """ + return cls.get_default() + + @classmethod + def get_default(cls) -> Self: + """Return the default configuration. + + This method returns newly created, based on default constructor, + object of Configuration class or returns a copy of default + configuration. + + :return: The configuration object. + """ + if cls._default is None: + cls._default = cls() + return cls._default + + @property + def logger_file(self) -> str | None: + """The logger file. + + If the logger_file is None, then add stream handler and remove file + handler. Otherwise, add file handler and remove stream handler. + + :param value: The logger_file path. + :type: str + """ + return self.__logger_file + + @logger_file.setter + def logger_file(self, value: str | None) -> None: + """The logger file. + + If the logger_file is None, then add stream handler and remove file + handler. Otherwise, add file handler and remove stream handler. + + :param value: The logger_file path. + :type: str + """ + self.__logger_file = value + if self.__logger_file: + # If set logging file, + # then add file handler and remove stream handler. + self.logger_file_handler = logging.FileHandler(self.__logger_file) + self.logger_file_handler.setFormatter(self.logger_formatter) + for _, logger in self.logger.items(): + logger.addHandler(self.logger_file_handler) + + @property + def debug(self) -> bool: + """Debug status + + :param value: The debug status, True or False. + :type: bool + """ + return self.__debug + + @debug.setter + def debug(self, value: bool) -> None: + """Debug status + + :param value: The debug status, True or False. + :type: bool + """ + self.__debug = value + if self.__debug: + # if debug status is True, turn on debug logging + for _, logger in self.logger.items(): + logger.setLevel(logging.DEBUG) + # turn on httplib debug + httplib.HTTPConnection.debuglevel = 1 + else: + # if debug status is False, turn off debug logging, + # setting log level to default `logging.WARNING` + for _, logger in self.logger.items(): + logger.setLevel(logging.WARNING) + # turn off httplib debug + httplib.HTTPConnection.debuglevel = 0 + + @property + def logger_format(self) -> str: + """The logger format. + + The logger_formatter will be updated when sets logger_format. + + :param value: The format string. + :type: str + """ + return self.__logger_format + + @logger_format.setter + def logger_format(self, value: str) -> None: + """The logger format. + + The logger_formatter will be updated when sets logger_format. + + :param value: The format string. + :type: str + """ + self.__logger_format = value + self.logger_formatter = logging.Formatter(self.__logger_format) + + def get_api_key_with_prefix(self, identifier: str, alias: str | None = None) -> str | None: + """Gets API key (with prefix if set). + + :param identifier: The identifier of apiKey. + :param alias: The alternative identifier of apiKey. + :return: The token for api key authentication. + """ + if self.refresh_api_key_hook is not None: + self.refresh_api_key_hook(self) + key = self.api_key.get(identifier, self.api_key.get(alias) if alias is not None else None) + if key: + prefix = self.api_key_prefix.get(identifier) + if prefix: + return "%s %s" % (prefix, key) + return key + + return None + + def get_basic_auth_token(self) -> str | None: + """Gets HTTP basic authentication header (string). + + :return: The token for basic HTTP authentication. + """ + username = "" + if self.username is not None: + username = self.username + password = "" + if self.password is not None: + password = self.password + return urllib3.util.make_headers( + basic_auth=username + ":" + password + ).get("authorization") + + def auth_settings(self) -> AuthSettings: + """Gets Auth Settings dict for api client. + + :return: The Auth Settings information dict. + """ + auth: AuthSettings = {} + if self.access_token is not None: + auth["OAuth2AuthorizationCodeBearer"] = { + "type": "oauth2", + "in": "header", + "key": "Authorization", + "value": "Bearer " + self.access_token + } + return auth + + def to_debug_report(self) -> str: + """Gets the essential information for debugging. + + :return: The report for debugging. + """ + return "Python SDK Debug Report:\n"\ + f"OS: {sys.platform}\n"\ + f"Python Version: {sys.version}\n"\ + "Version of the API: 0.1.0\n"\ + "SDK Package Version: 1.0.0" + + def get_host_settings(self) -> list[HostSetting]: + """Gets an array of host settings + + :return: An array of host settings + """ + return [ + { + "url": "", + "description": "No description provided", + } + ] + + def get_host_from_settings( + self, + index: int | None, + variables: ServerVariablesT | None = None, + servers: list[HostSetting] | None = None, + ) -> str: + """Gets host URL based on the index and variables + :param index: array index of the host settings + :param variables: hash of variable and the corresponding value + :param servers: an array of host settings or None + :return: URL based on host settings + """ + if index is None: + return self._base_path + + variables = {} if variables is None else variables + servers = self.get_host_settings() if servers is None else servers + + try: + server = servers[index] + except IndexError: + raise ValueError( + f"Invalid index {index} when selecting the host settings. " + f"Must be less than {len(servers)}") + + url = server["url"] + + # go through variables and replace placeholders + for variable_name, variable in server.get("variables", {}).items(): + used_value = variables.get( + variable_name, variable["default_value"]) + + if "enum_values" in variable \ + and used_value not in variable["enum_values"]: + raise ValueError( + "The variable `{0}` in the host URL has invalid value " + "{1}. Must be {2}.".format( + variable_name, variables[variable_name], + variable["enum_values"])) + + url = url.replace("{" + variable_name + "}", used_value) + + return url + + @property + def host(self) -> str: + """Return generated host.""" + return self.get_host_from_settings(self.server_index, variables=self.server_variables) + + @host.setter + def host(self, value: str) -> None: + """Fix base path.""" + self._base_path = value + self.server_index = None diff --git a/codegen/aignx/codegen/exceptions.py b/codegen/aignx/codegen/exceptions.py new file mode 100644 index 00000000..e25a58d3 --- /dev/null +++ b/codegen/aignx/codegen/exceptions.py @@ -0,0 +1,196 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + +from typing import Any, Self + + +class OpenApiException(Exception): + """The base exception class for all OpenAPIExceptions""" + + +class ApiTypeError(OpenApiException, TypeError): + def __init__(self, msg, path_to_item=None, valid_classes=None, + key_type=None) -> None: + """Raises an exception for TypeErrors + + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (list): a list of keys an indices to get to the + current_item + None if unset + valid_classes (tuple): the primitive classes that current item + should be an instance of + None if unset + key_type (bool): False if our value is a value in a dict + True if it is a key in a dict + False if our item is an item in a list + None if unset + """ + self.path_to_item = path_to_item + self.valid_classes = valid_classes + self.key_type = key_type + full_msg = msg + if path_to_item: + full_msg = f"{msg} at {render_path(path_to_item)}" + super(ApiTypeError, self).__init__(full_msg) + + +class ApiValueError(OpenApiException, ValueError): + def __init__(self, msg, path_to_item=None) -> None: + """ + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (list) the path to the exception in the + received_data dict. None if unset + """ + self.path_to_item = path_to_item + full_msg = msg + if path_to_item: + full_msg = f"{msg} at {render_path(path_to_item)}" + super(ApiValueError, self).__init__(full_msg) + + +class ApiAttributeError(OpenApiException, AttributeError): + def __init__(self, msg, path_to_item=None) -> None: + """ + Raised when an attribute reference or assignment fails. + + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (None/list) the path to the exception in the + received_data dict + """ + self.path_to_item = path_to_item + full_msg = msg + if path_to_item: + full_msg = f"{msg} at {render_path(path_to_item)}" + super(ApiAttributeError, self).__init__(full_msg) + + +class ApiKeyError(OpenApiException, KeyError): + def __init__(self, msg, path_to_item=None) -> None: + """ + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (None/list) the path to the exception in the + received_data dict + """ + self.path_to_item = path_to_item + full_msg = msg + if path_to_item: + full_msg = f"{msg} at {render_path(path_to_item)}" + super(ApiKeyError, self).__init__(full_msg) + + +class ApiException(OpenApiException): + + def __init__( + self, + status=None, + reason=None, + http_resp=None, + *, + body: str | None = None, + data: Any | None = None, + ) -> None: + self.status = status + self.reason = reason + self.body = body + self.data = data + self.headers = None + + if http_resp: + if self.status is None: + self.status = http_resp.status + if self.reason is None: + self.reason = http_resp.reason + if self.body is None: + try: + self.body = http_resp.data.decode("utf-8") + except Exception: + pass + self.headers = http_resp.getheaders() + + @classmethod + def from_response( + cls, + *, + http_resp, + body: str | None, + data: Any | None, + ) -> Self: + if http_resp.status == 400: + raise BadRequestException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 401: + raise UnauthorizedException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 403: + raise ForbiddenException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 404: + raise NotFoundException(http_resp=http_resp, body=body, data=data) + + if 500 <= http_resp.status <= 599: + raise ServiceException(http_resp=http_resp, body=body, data=data) + raise ApiException(http_resp=http_resp, body=body, data=data) + + def __str__(self): + """Custom error messages for exception""" + error_message = f"({self.status})\n"\ + f"Reason: {self.reason}\n" + if self.headers: + error_message += f"HTTP response headers: {self.headers}\n" + + if self.data or self.body: + error_message += f"HTTP response body: {self.data or self.body}\n" + + return error_message + + +class BadRequestException(ApiException): + pass + + +class NotFoundException(ApiException): + pass + + +class UnauthorizedException(ApiException): + pass + + +class ForbiddenException(ApiException): + pass + + +class ServiceException(ApiException): + pass + + +def render_path(path_to_item): + """Returns a string representation of a path""" + result = "" + for pth in path_to_item: + if isinstance(pth, int): + result += f"[{pth}]" + else: + result += f"['{pth}']" + return result diff --git a/codegen/aignx/codegen/models/__init__.py b/codegen/aignx/codegen/models/__init__.py new file mode 100644 index 00000000..44dc76b3 --- /dev/null +++ b/codegen/aignx/codegen/models/__init__.py @@ -0,0 +1,57 @@ +from .application_creation_request import * +from .application_creation_response import * +from .application_read_response import * +from .application_run_status import * +from .application_version import * +from .application_version_read_response import * +from .artifact_event import * +from .artifact_status import * +from .http_validation_error import * +from .input_artifact import * +from .input_artifact_creation_request import * +from .input_artifact_read_response import * +from .input_artifact_schema_creation_request import * +from .item_creation_request import * +from .item_event import * +from .item_event_creation_request import * +from .item_event_creation_response import * +from .item_read_response import * +from .item_result_read_response import * +from .item_status import * +from .organization_creation_request import * +from .organization_quota import * +from .organization_response import * +from .organization_update_request import * +from .output_artifact import * +from .output_artifact_event_trigger_request import * +from .output_artifact_event_trigger_response import * +from .output_artifact_read_response import * +from .output_artifact_result_read_response import * +from .output_artifact_schema_creation_request import * +from .output_artifact_scope import * +from .output_artifact_visibility import * +from .payload_input_artifact import * +from .payload_item import * +from .payload_output_artifact import * +from .quota_name import * +from .quota_read_response import * +from .quota_update_request import * +from .quota_update_response import * +from .quotas_read_response import * +from .quotas_update_request import * +from .quotas_update_response import * +from .run_creation_request import * +from .run_creation_response import * +from .run_read_response import * +from .slug_version_request import * +from .transfer_urls import * +from .user_creation_request import * +from .user_payload import * +from .user_quota import * +from .user_response import * +from .user_update_request import * +from .validation_error import * +from .validation_error_loc_inner import * +from .version_creation_request import * +from .version_creation_response import * +from .version_read_response import * diff --git a/codegen/aignx/codegen/models/application_creation_request.py b/codegen/aignx/codegen/models/application_creation_request.py new file mode 100644 index 00000000..e8933db1 --- /dev/null +++ b/codegen/aignx/codegen/models/application_creation_request.py @@ -0,0 +1,87 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + + +class ApplicationCreationRequest(BaseModel): + """ + ApplicationCreationRequest + """ + name: StrictStr + description: StrictStr + regulatory_classes: list[StrictStr] + __properties: ClassVar[list[str]] = ["name", "description", "regulatory_classes"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of ApplicationCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of ApplicationCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "description": obj.get("description"), + "regulatory_classes": obj.get("regulatory_classes") + }) + return _obj diff --git a/codegen/aignx/codegen/models/application_creation_response.py b/codegen/aignx/codegen/models/application_creation_response.py new file mode 100644 index 00000000..59486a36 --- /dev/null +++ b/codegen/aignx/codegen/models/application_creation_response.py @@ -0,0 +1,83 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + + +class ApplicationCreationResponse(BaseModel): + """ + ApplicationCreationResponse + """ + application_id: StrictStr + __properties: ClassVar[list[str]] = ["application_id"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of ApplicationCreationResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of ApplicationCreationResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_id": obj.get("application_id") + }) + return _obj diff --git a/codegen/aignx/codegen/models/application_read_response.py b/codegen/aignx/codegen/models/application_read_response.py new file mode 100644 index 00000000..8b1cdbad --- /dev/null +++ b/codegen/aignx/codegen/models/application_read_response.py @@ -0,0 +1,91 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + + +class ApplicationReadResponse(BaseModel): + """ + ApplicationReadResponse + """ + application_id: StrictStr + name: StrictStr + slug: StrictStr + regulatory_classes: list[StrictStr] + description: StrictStr + __properties: ClassVar[list[str]] = ["application_id", "name", "slug", "regulatory_classes", "description"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of ApplicationReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of ApplicationReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_id": obj.get("application_id"), + "name": obj.get("name"), + "slug": obj.get("slug"), + "regulatory_classes": obj.get("regulatory_classes"), + "description": obj.get("description") + }) + return _obj diff --git a/codegen/aignx/codegen/models/application_run_status.py b/codegen/aignx/codegen/models/application_run_status.py new file mode 100644 index 00000000..b0b884ef --- /dev/null +++ b/codegen/aignx/codegen/models/application_run_status.py @@ -0,0 +1,41 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +from enum import Enum +from typing import Self + + +class ApplicationRunStatus(str, Enum): + """ + ApplicationRunStatus + """ + + """ + allowed enum values + """ + CANCELED_SYSTEM = "canceled_system" + CANCELED_USER = "canceled_user" + COMPLETED = "completed" + COMPLETED_WITH_ERROR = "completed_with_error" + RECEIVED = "received" + REJECTED = "rejected" + RUNNING = "running" + SCHEDULED = "scheduled" + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ApplicationRunStatus from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/application_version.py b/codegen/aignx/codegen/models/application_version.py new file mode 100644 index 00000000..a9534c44 --- /dev/null +++ b/codegen/aignx/codegen/models/application_version.py @@ -0,0 +1,129 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import TYPE_CHECKING, Any, Self + +from pydantic import BaseModel, StrictStr, ValidationError, field_validator + +from aignx.codegen.models.slug_version_request import SlugVersionRequest + +APPLICATIONVERSION_ANY_OF_SCHEMAS = ["SlugVersionRequest", "str"] + + +class ApplicationVersion(BaseModel): + """ + ApplicationVersion + """ + + # data type: str + anyof_schema_1_validator: StrictStr | None = None + # data type: SlugVersionRequest + anyof_schema_2_validator: SlugVersionRequest | None = None + if TYPE_CHECKING: + actual_instance: SlugVersionRequest | str | None = None + else: + actual_instance: Any = None + any_of_schemas: set[str] = {"SlugVersionRequest", "str"} + + model_config = { + "validate_assignment": True, + "protected_namespaces": (), + } + + def __init__(self, *args, **kwargs) -> None: + if args: + if len(args) > 1: + raise ValueError("If a position argument is used, only 1 is allowed to set `actual_instance`") + if kwargs: + raise ValueError("If a position argument is used, keyword arguments cannot be used.") + super().__init__(actual_instance=args[0]) + else: + super().__init__(**kwargs) + + @field_validator("actual_instance") + def actual_instance_must_validate_anyof(cls, v): + instance = ApplicationVersion.model_construct() + error_messages = [] + # validate data type: str + try: + instance.anyof_schema_1_validator = v + return v + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # validate data type: SlugVersionRequest + if not isinstance(v, SlugVersionRequest): + error_messages.append(f"Error! Input type `{type(v)}` is not `SlugVersionRequest`") + else: + return v + + if error_messages: + # no match + raise ValueError("No match found when setting the actual_instance in ApplicationVersion with anyOf schemas: SlugVersionRequest, str. Details: " + ", ".join(error_messages)) + return v + + @classmethod + def from_dict(cls, obj: dict[str, Any]) -> Self: + return cls.from_json(json.dumps(obj)) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Returns the object represented by the json string""" + instance = cls.model_construct() + error_messages = [] + # deserialize data into str + try: + # validation + instance.anyof_schema_1_validator = json.loads(json_str) + # assign value to actual_instance + instance.actual_instance = instance.anyof_schema_1_validator + return instance + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # anyof_schema_2_validator: Optional[SlugVersionRequest] = None + try: + instance.actual_instance = SlugVersionRequest.from_json(json_str) + return instance + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + + if error_messages: + # no match + raise ValueError("No match found when deserializing the JSON string into ApplicationVersion with anyOf schemas: SlugVersionRequest, str. Details: " + ", ".join(error_messages)) + return instance + + def to_json(self) -> str: + """Returns the JSON representation of the actual instance""" + if self.actual_instance is None: + return "null" + + if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): + return self.actual_instance.to_json() + return json.dumps(self.actual_instance) + + def to_dict(self) -> dict[str, Any] | SlugVersionRequest | str | None: + """Returns the dict representation of the actual instance""" + if self.actual_instance is None: + return None + + if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): + return self.actual_instance.to_dict() + return self.actual_instance + + def to_str(self) -> str: + """Returns the string representation of the actual instance""" + return pprint.pformat(self.model_dump()) diff --git a/codegen/aignx/codegen/models/application_version_read_response.py b/codegen/aignx/codegen/models/application_version_read_response.py new file mode 100644 index 00000000..f530d262 --- /dev/null +++ b/codegen/aignx/codegen/models/application_version_read_response.py @@ -0,0 +1,126 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re +from typing import Annotated, Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator + +from aignx.codegen.models.input_artifact_read_response import InputArtifactReadResponse +from aignx.codegen.models.output_artifact_read_response import OutputArtifactReadResponse + + +class ApplicationVersionReadResponse(BaseModel): + """ + ApplicationVersionReadResponse + """ + application_version_id: StrictStr + application_version_slug: Annotated[str, Field(strict=True)] + version: StrictStr + application_id: StrictStr + flow_id: StrictStr | None = None + changelog: StrictStr + input_artifacts: list[InputArtifactReadResponse] + output_artifacts: list[OutputArtifactReadResponse] + __properties: ClassVar[list[str]] = ["application_version_id", "application_version_slug", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] + + @field_validator("application_version_slug") + def application_version_slug_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$", value): + raise ValueError(r"must validate the regular expression /^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of ApplicationVersionReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) + _items = [] + if self.input_artifacts: + for _item_input_artifacts in self.input_artifacts: + if _item_input_artifacts: + _items.append(_item_input_artifacts.to_dict()) + _dict["input_artifacts"] = _items + # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) + _items = [] + if self.output_artifacts: + for _item_output_artifacts in self.output_artifacts: + if _item_output_artifacts: + _items.append(_item_output_artifacts.to_dict()) + _dict["output_artifacts"] = _items + # set to None if flow_id (nullable) is None + # and model_fields_set contains the field + if self.flow_id is None and "flow_id" in self.model_fields_set: + _dict["flow_id"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of ApplicationVersionReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_version_id": obj.get("application_version_id"), + "application_version_slug": obj.get("application_version_slug"), + "version": obj.get("version"), + "application_id": obj.get("application_id"), + "flow_id": obj.get("flow_id"), + "changelog": obj.get("changelog"), + "input_artifacts": [InputArtifactReadResponse.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None, + "output_artifacts": [OutputArtifactReadResponse.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/artifact_event.py b/codegen/aignx/codegen/models/artifact_event.py new file mode 100644 index 00000000..490cbf97 --- /dev/null +++ b/codegen/aignx/codegen/models/artifact_event.py @@ -0,0 +1,36 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +from enum import Enum +from typing import Self + + +class ArtifactEvent(str, Enum): + """ + This is a subset of the OutputArtifactEvent used by the state machine. Only the variants defined below are allowed to be submitted from the Algorithms/Applications. + """ + + """ + allowed enum values + """ + SUCCEEDED = "succeeded" + FAILED_WITH_USER_ERROR = "failed_with_user_error" + FAILED_WITH_SYSTEM_ERROR = "failed_with_system_error" + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ArtifactEvent from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/artifact_status.py b/codegen/aignx/codegen/models/artifact_status.py new file mode 100644 index 00000000..e29c473b --- /dev/null +++ b/codegen/aignx/codegen/models/artifact_status.py @@ -0,0 +1,41 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +from enum import Enum +from typing import Self + + +class ArtifactStatus(str, Enum): + """ + ArtifactStatus + """ + + """ + allowed enum values + """ + PENDING = "pending" + CANCELED_USER = "canceled_user" + CANCELED_SYSTEM = "canceled_system" + ERROR_USER = "error_user" + ERROR_SYSTEM_FATAL = "error_system_fatal" + ERROR_SYSTEM_RECOVERABLE = "error_system_recoverable" + SKIPPED = "skipped" + SUCCEEDED = "succeeded" + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ArtifactStatus from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/http_validation_error.py b/codegen/aignx/codegen/models/http_validation_error.py new file mode 100644 index 00000000..4081904b --- /dev/null +++ b/codegen/aignx/codegen/models/http_validation_error.py @@ -0,0 +1,92 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict + +from aignx.codegen.models.validation_error import ValidationError + + +class HTTPValidationError(BaseModel): + """ + HTTPValidationError + """ + detail: list[ValidationError] | None = None + __properties: ClassVar[list[str]] = ["detail"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of HTTPValidationError from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in detail (list) + _items = [] + if self.detail: + for _item_detail in self.detail: + if _item_detail: + _items.append(_item_detail.to_dict()) + _dict["detail"] = _items + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of HTTPValidationError from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "detail": [ValidationError.from_dict(_item) for _item in obj["detail"]] if obj.get("detail") is not None else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/input_artifact.py b/codegen/aignx/codegen/models/input_artifact.py new file mode 100644 index 00000000..e775245f --- /dev/null +++ b/codegen/aignx/codegen/models/input_artifact.py @@ -0,0 +1,94 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re +from typing import Annotated, Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator + + +class InputArtifact(BaseModel): + """ + InputArtifact + """ + name: StrictStr + mime_type: Annotated[str, Field(strict=True)] + metadata_schema: dict[str, Any] + __properties: ClassVar[list[str]] = ["name", "mime_type", "metadata_schema"] + + @field_validator("mime_type") + def mime_type_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of InputArtifact from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of InputArtifact from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "metadata_schema": obj.get("metadata_schema") + }) + return _obj diff --git a/codegen/aignx/codegen/models/input_artifact_creation_request.py b/codegen/aignx/codegen/models/input_artifact_creation_request.py new file mode 100644 index 00000000..2e3e20ae --- /dev/null +++ b/codegen/aignx/codegen/models/input_artifact_creation_request.py @@ -0,0 +1,87 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Annotated, Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, Field, StrictStr + + +class InputArtifactCreationRequest(BaseModel): + """ + InputArtifactCreationRequest + """ + name: StrictStr + download_url: Annotated[str, Field(min_length=1, strict=True, max_length=2083)] + metadata: dict[str, Any] + __properties: ClassVar[list[str]] = ["name", "download_url", "metadata"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of InputArtifactCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of InputArtifactCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "download_url": obj.get("download_url"), + "metadata": obj.get("metadata") + }) + return _obj diff --git a/codegen/aignx/codegen/models/input_artifact_read_response.py b/codegen/aignx/codegen/models/input_artifact_read_response.py new file mode 100644 index 00000000..94326b2c --- /dev/null +++ b/codegen/aignx/codegen/models/input_artifact_read_response.py @@ -0,0 +1,94 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re +from typing import Annotated, Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator + + +class InputArtifactReadResponse(BaseModel): + """ + InputArtifactReadResponse + """ + name: StrictStr + mime_type: Annotated[str, Field(strict=True)] + metadata_schema: dict[str, Any] + __properties: ClassVar[list[str]] = ["name", "mime_type", "metadata_schema"] + + @field_validator("mime_type") + def mime_type_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of InputArtifactReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of InputArtifactReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "metadata_schema": obj.get("metadata_schema") + }) + return _obj diff --git a/codegen/aignx/codegen/models/input_artifact_schema_creation_request.py b/codegen/aignx/codegen/models/input_artifact_schema_creation_request.py new file mode 100644 index 00000000..968d2b3e --- /dev/null +++ b/codegen/aignx/codegen/models/input_artifact_schema_creation_request.py @@ -0,0 +1,87 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + + +class InputArtifactSchemaCreationRequest(BaseModel): + """ + InputArtifactSchemaCreationRequest + """ + name: StrictStr + mime_type: StrictStr + metadata_schema: dict[str, Any] + __properties: ClassVar[list[str]] = ["name", "mime_type", "metadata_schema"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of InputArtifactSchemaCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of InputArtifactSchemaCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "metadata_schema": obj.get("metadata_schema") + }) + return _obj diff --git a/codegen/aignx/codegen/models/item_creation_request.py b/codegen/aignx/codegen/models/item_creation_request.py new file mode 100644 index 00000000..83fcdafb --- /dev/null +++ b/codegen/aignx/codegen/models/item_creation_request.py @@ -0,0 +1,94 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.input_artifact_creation_request import InputArtifactCreationRequest + + +class ItemCreationRequest(BaseModel): + """ + ItemCreationRequest + """ + reference: StrictStr + input_artifacts: list[InputArtifactCreationRequest] + __properties: ClassVar[list[str]] = ["reference", "input_artifacts"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of ItemCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) + _items = [] + if self.input_artifacts: + for _item_input_artifacts in self.input_artifacts: + if _item_input_artifacts: + _items.append(_item_input_artifacts.to_dict()) + _dict["input_artifacts"] = _items + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of ItemCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "reference": obj.get("reference"), + "input_artifacts": [InputArtifactCreationRequest.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/item_event.py b/codegen/aignx/codegen/models/item_event.py new file mode 100644 index 00000000..9ef0947c --- /dev/null +++ b/codegen/aignx/codegen/models/item_event.py @@ -0,0 +1,35 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +from enum import Enum +from typing import Self + + +class ItemEvent(str, Enum): + """ + ItemEvent + """ + + """ + allowed enum values + """ + FAILED_WITH_SYSTEM_ERROR = "failed_with_system_error" + FAILED_RECOVERABLE = "failed_recoverable" + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ItemEvent from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/item_event_creation_request.py b/codegen/aignx/codegen/models/item_event_creation_request.py new file mode 100644 index 00000000..ff489473 --- /dev/null +++ b/codegen/aignx/codegen/models/item_event_creation_request.py @@ -0,0 +1,87 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.item_event import ItemEvent + + +class ItemEventCreationRequest(BaseModel): + """ + ItemEventCreationRequest + """ + event: ItemEvent + error: StrictStr + __properties: ClassVar[list[str]] = ["event", "error"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of ItemEventCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of ItemEventCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "event": obj.get("event"), + "error": obj.get("error") + }) + return _obj diff --git a/codegen/aignx/codegen/models/item_event_creation_response.py b/codegen/aignx/codegen/models/item_event_creation_response.py new file mode 100644 index 00000000..72d006ee --- /dev/null +++ b/codegen/aignx/codegen/models/item_event_creation_response.py @@ -0,0 +1,87 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.item_status import ItemStatus + + +class ItemEventCreationResponse(BaseModel): + """ + ItemEventCreationResponse + """ + item_id: StrictStr + status: ItemStatus + __properties: ClassVar[list[str]] = ["item_id", "status"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of ItemEventCreationResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of ItemEventCreationResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "item_id": obj.get("item_id"), + "status": obj.get("status") + }) + return _obj diff --git a/codegen/aignx/codegen/models/item_read_response.py b/codegen/aignx/codegen/models/item_read_response.py new file mode 100644 index 00000000..d4ee1b56 --- /dev/null +++ b/codegen/aignx/codegen/models/item_read_response.py @@ -0,0 +1,103 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.item_status import ItemStatus + + +class ItemReadResponse(BaseModel): + """ + ItemReadResponse + """ + item_id: StrictStr + application_run_id: StrictStr | None = None + reference: StrictStr + status: ItemStatus + error: StrictStr | None + __properties: ClassVar[list[str]] = ["item_id", "application_run_id", "reference", "status", "error"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of ItemReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if application_run_id (nullable) is None + # and model_fields_set contains the field + if self.application_run_id is None and "application_run_id" in self.model_fields_set: + _dict["application_run_id"] = None + + # set to None if error (nullable) is None + # and model_fields_set contains the field + if self.error is None and "error" in self.model_fields_set: + _dict["error"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of ItemReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "item_id": obj.get("item_id"), + "application_run_id": obj.get("application_run_id"), + "reference": obj.get("reference"), + "status": obj.get("status"), + "error": obj.get("error") + }) + return _obj diff --git a/codegen/aignx/codegen/models/item_result_read_response.py b/codegen/aignx/codegen/models/item_result_read_response.py new file mode 100644 index 00000000..caae55dd --- /dev/null +++ b/codegen/aignx/codegen/models/item_result_read_response.py @@ -0,0 +1,108 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.item_status import ItemStatus +from aignx.codegen.models.output_artifact_result_read_response import OutputArtifactResultReadResponse + + +class ItemResultReadResponse(BaseModel): + """ + ItemResultReadResponse + """ + item_id: StrictStr + application_run_id: StrictStr + reference: StrictStr + status: ItemStatus + error: StrictStr | None + output_artifacts: list[OutputArtifactResultReadResponse] + __properties: ClassVar[list[str]] = ["item_id", "application_run_id", "reference", "status", "error", "output_artifacts"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of ItemResultReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) + _items = [] + if self.output_artifacts: + for _item_output_artifacts in self.output_artifacts: + if _item_output_artifacts: + _items.append(_item_output_artifacts.to_dict()) + _dict["output_artifacts"] = _items + # set to None if error (nullable) is None + # and model_fields_set contains the field + if self.error is None and "error" in self.model_fields_set: + _dict["error"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of ItemResultReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "item_id": obj.get("item_id"), + "application_run_id": obj.get("application_run_id"), + "reference": obj.get("reference"), + "status": obj.get("status"), + "error": obj.get("error"), + "output_artifacts": [OutputArtifactResultReadResponse.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/item_status.py b/codegen/aignx/codegen/models/item_status.py new file mode 100644 index 00000000..eab72cad --- /dev/null +++ b/codegen/aignx/codegen/models/item_status.py @@ -0,0 +1,39 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +from enum import Enum +from typing import Self + + +class ItemStatus(str, Enum): + """ + ItemStatus + """ + + """ + allowed enum values + """ + PENDING = "pending" + CANCELED_USER = "canceled_user" + CANCELED_SYSTEM = "canceled_system" + ERROR_USER = "error_user" + ERROR_SYSTEM = "error_system" + SUCCEEDED = "succeeded" + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ItemStatus from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/organization_creation_request.py b/codegen/aignx/codegen/models/organization_creation_request.py new file mode 100644 index 00000000..e587f375 --- /dev/null +++ b/codegen/aignx/codegen/models/organization_creation_request.py @@ -0,0 +1,89 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr + + +class OrganizationCreationRequest(BaseModel): + """ + OrganizationCreationRequest + """ + organization_id: StrictStr + owner_email: StrictStr + slide_quota: StrictInt + batch_size: StrictInt + __properties: ClassVar[list[str]] = ["organization_id", "owner_email", "slide_quota", "batch_size"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of OrganizationCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of OrganizationCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "organization_id": obj.get("organization_id"), + "owner_email": obj.get("owner_email"), + "slide_quota": obj.get("slide_quota"), + "batch_size": obj.get("batch_size") + }) + return _obj diff --git a/codegen/aignx/codegen/models/organization_quota.py b/codegen/aignx/codegen/models/organization_quota.py new file mode 100644 index 00000000..a5ff8882 --- /dev/null +++ b/codegen/aignx/codegen/models/organization_quota.py @@ -0,0 +1,90 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictInt + + +class OrganizationQuota(BaseModel): + """ + OrganizationQuota + """ + total: StrictInt | None + used: StrictInt + __properties: ClassVar[list[str]] = ["total", "used"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of OrganizationQuota from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if total (nullable) is None + # and model_fields_set contains the field + if self.total is None and "total" in self.model_fields_set: + _dict["total"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of OrganizationQuota from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "total": obj.get("total"), + "used": obj.get("used") + }) + return _obj diff --git a/codegen/aignx/codegen/models/organization_response.py b/codegen/aignx/codegen/models/organization_response.py new file mode 100644 index 00000000..daadd054 --- /dev/null +++ b/codegen/aignx/codegen/models/organization_response.py @@ -0,0 +1,94 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr + +from aignx.codegen.models.organization_quota import OrganizationQuota + + +class OrganizationResponse(BaseModel): + """ + OrganizationResponse + """ + organization_id: StrictStr + owner_id: StrictStr + slide_quota: OrganizationQuota + batch_size: StrictInt + __properties: ClassVar[list[str]] = ["organization_id", "owner_id", "slide_quota", "batch_size"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of OrganizationResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of slide_quota + if self.slide_quota: + _dict["slide_quota"] = self.slide_quota.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of OrganizationResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "organization_id": obj.get("organization_id"), + "owner_id": obj.get("owner_id"), + "slide_quota": OrganizationQuota.from_dict(obj["slide_quota"]) if obj.get("slide_quota") is not None else None, + "batch_size": obj.get("batch_size") + }) + return _obj diff --git a/codegen/aignx/codegen/models/organization_update_request.py b/codegen/aignx/codegen/models/organization_update_request.py new file mode 100644 index 00000000..30ade97d --- /dev/null +++ b/codegen/aignx/codegen/models/organization_update_request.py @@ -0,0 +1,95 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictInt + + +class OrganizationUpdateRequest(BaseModel): + """ + OrganizationUpdateRequest + """ + slide_quota: StrictInt | None = None + batch_size: StrictInt | None = None + __properties: ClassVar[list[str]] = ["slide_quota", "batch_size"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of OrganizationUpdateRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if slide_quota (nullable) is None + # and model_fields_set contains the field + if self.slide_quota is None and "slide_quota" in self.model_fields_set: + _dict["slide_quota"] = None + + # set to None if batch_size (nullable) is None + # and model_fields_set contains the field + if self.batch_size is None and "batch_size" in self.model_fields_set: + _dict["batch_size"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of OrganizationUpdateRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "slide_quota": obj.get("slide_quota"), + "batch_size": obj.get("batch_size") + }) + return _obj diff --git a/codegen/aignx/codegen/models/output_artifact.py b/codegen/aignx/codegen/models/output_artifact.py new file mode 100644 index 00000000..99b639d8 --- /dev/null +++ b/codegen/aignx/codegen/models/output_artifact.py @@ -0,0 +1,101 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re +from typing import Annotated, Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator + +from aignx.codegen.models.output_artifact_scope import OutputArtifactScope +from aignx.codegen.models.output_artifact_visibility import OutputArtifactVisibility + + +class OutputArtifact(BaseModel): + """ + OutputArtifact + """ + name: StrictStr + mime_type: Annotated[str, Field(strict=True)] + metadata_schema: dict[str, Any] + scope: OutputArtifactScope + visibility: OutputArtifactVisibility + __properties: ClassVar[list[str]] = ["name", "mime_type", "metadata_schema", "scope", "visibility"] + + @field_validator("mime_type") + def mime_type_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of OutputArtifact from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of OutputArtifact from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "metadata_schema": obj.get("metadata_schema"), + "scope": obj.get("scope"), + "visibility": obj.get("visibility") + }) + return _obj diff --git a/codegen/aignx/codegen/models/output_artifact_event_trigger_request.py b/codegen/aignx/codegen/models/output_artifact_event_trigger_request.py new file mode 100644 index 00000000..a6f4b382 --- /dev/null +++ b/codegen/aignx/codegen/models/output_artifact_event_trigger_request.py @@ -0,0 +1,94 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.artifact_event import ArtifactEvent + + +class OutputArtifactEventTriggerRequest(BaseModel): + """ + OutputArtifactEventTriggerRequest + """ + event: ArtifactEvent + metadata: dict[str, Any] + error: StrictStr | None = None + __properties: ClassVar[list[str]] = ["event", "metadata", "error"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of OutputArtifactEventTriggerRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if error (nullable) is None + # and model_fields_set contains the field + if self.error is None and "error" in self.model_fields_set: + _dict["error"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of OutputArtifactEventTriggerRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "event": obj.get("event"), + "metadata": obj.get("metadata"), + "error": obj.get("error") + }) + return _obj diff --git a/codegen/aignx/codegen/models/output_artifact_event_trigger_response.py b/codegen/aignx/codegen/models/output_artifact_event_trigger_response.py new file mode 100644 index 00000000..f5fe7d4c --- /dev/null +++ b/codegen/aignx/codegen/models/output_artifact_event_trigger_response.py @@ -0,0 +1,87 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.artifact_status import ArtifactStatus + + +class OutputArtifactEventTriggerResponse(BaseModel): + """ + OutputArtifactEventTriggerResponse + """ + output_artifact_id: StrictStr + status: ArtifactStatus + __properties: ClassVar[list[str]] = ["output_artifact_id", "status"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of OutputArtifactEventTriggerResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of OutputArtifactEventTriggerResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "output_artifact_id": obj.get("output_artifact_id"), + "status": obj.get("status") + }) + return _obj diff --git a/codegen/aignx/codegen/models/output_artifact_read_response.py b/codegen/aignx/codegen/models/output_artifact_read_response.py new file mode 100644 index 00000000..8f9a670a --- /dev/null +++ b/codegen/aignx/codegen/models/output_artifact_read_response.py @@ -0,0 +1,98 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re +from typing import Annotated, Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator + +from aignx.codegen.models.output_artifact_scope import OutputArtifactScope + + +class OutputArtifactReadResponse(BaseModel): + """ + OutputArtifactReadResponse + """ + name: StrictStr + mime_type: Annotated[str, Field(strict=True)] + metadata_schema: dict[str, Any] + scope: OutputArtifactScope + __properties: ClassVar[list[str]] = ["name", "mime_type", "metadata_schema", "scope"] + + @field_validator("mime_type") + def mime_type_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of OutputArtifactReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of OutputArtifactReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "metadata_schema": obj.get("metadata_schema"), + "scope": obj.get("scope") + }) + return _obj diff --git a/codegen/aignx/codegen/models/output_artifact_result_read_response.py b/codegen/aignx/codegen/models/output_artifact_result_read_response.py new file mode 100644 index 00000000..e346e8ae --- /dev/null +++ b/codegen/aignx/codegen/models/output_artifact_result_read_response.py @@ -0,0 +1,103 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re +from typing import Annotated, Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator + + +class OutputArtifactResultReadResponse(BaseModel): + """ + OutputArtifactResultReadResponse + """ + output_artifact_id: StrictStr + name: StrictStr + mime_type: Annotated[str, Field(strict=True)] + metadata: dict[str, Any] + download_url: Annotated[str, Field(min_length=1, strict=True, max_length=2083)] | None + __properties: ClassVar[list[str]] = ["output_artifact_id", "name", "mime_type", "metadata", "download_url"] + + @field_validator("mime_type") + def mime_type_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of OutputArtifactResultReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if download_url (nullable) is None + # and model_fields_set contains the field + if self.download_url is None and "download_url" in self.model_fields_set: + _dict["download_url"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of OutputArtifactResultReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "output_artifact_id": obj.get("output_artifact_id"), + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "metadata": obj.get("metadata"), + "download_url": obj.get("download_url") + }) + return _obj diff --git a/codegen/aignx/codegen/models/output_artifact_schema_creation_request.py b/codegen/aignx/codegen/models/output_artifact_schema_creation_request.py new file mode 100644 index 00000000..765f01db --- /dev/null +++ b/codegen/aignx/codegen/models/output_artifact_schema_creation_request.py @@ -0,0 +1,94 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.output_artifact_scope import OutputArtifactScope +from aignx.codegen.models.output_artifact_visibility import OutputArtifactVisibility + + +class OutputArtifactSchemaCreationRequest(BaseModel): + """ + OutputArtifactSchemaCreationRequest + """ + name: StrictStr + mime_type: StrictStr + scope: OutputArtifactScope + visibility: OutputArtifactVisibility + metadata_schema: dict[str, Any] + __properties: ClassVar[list[str]] = ["name", "mime_type", "scope", "visibility", "metadata_schema"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of OutputArtifactSchemaCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of OutputArtifactSchemaCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "scope": obj.get("scope"), + "visibility": obj.get("visibility"), + "metadata_schema": obj.get("metadata_schema") + }) + return _obj diff --git a/codegen/aignx/codegen/models/output_artifact_scope.py b/codegen/aignx/codegen/models/output_artifact_scope.py new file mode 100644 index 00000000..c6276db8 --- /dev/null +++ b/codegen/aignx/codegen/models/output_artifact_scope.py @@ -0,0 +1,35 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +from enum import Enum +from typing import Self + + +class OutputArtifactScope(str, Enum): + """ + OutputArtifactScope + """ + + """ + allowed enum values + """ + ITEM = "item" + GLOBAL = "global" + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of OutputArtifactScope from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/output_artifact_visibility.py b/codegen/aignx/codegen/models/output_artifact_visibility.py new file mode 100644 index 00000000..09161192 --- /dev/null +++ b/codegen/aignx/codegen/models/output_artifact_visibility.py @@ -0,0 +1,35 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +from enum import Enum +from typing import Self + + +class OutputArtifactVisibility(str, Enum): + """ + OutputArtifactVisibility + """ + + """ + allowed enum values + """ + INTERNAL = "internal" + EXTERNAL = "external" + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of OutputArtifactVisibility from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/payload_input_artifact.py b/codegen/aignx/codegen/models/payload_input_artifact.py new file mode 100644 index 00000000..3705978c --- /dev/null +++ b/codegen/aignx/codegen/models/payload_input_artifact.py @@ -0,0 +1,87 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Annotated, Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, Field, StrictStr + + +class PayloadInputArtifact(BaseModel): + """ + PayloadInputArtifact + """ + input_artifact_id: StrictStr + metadata: dict[str, Any] + download_url: Annotated[str, Field(min_length=1, strict=True)] + __properties: ClassVar[list[str]] = ["input_artifact_id", "metadata", "download_url"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of PayloadInputArtifact from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of PayloadInputArtifact from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "input_artifact_id": obj.get("input_artifact_id"), + "metadata": obj.get("metadata"), + "download_url": obj.get("download_url") + }) + return _obj diff --git a/codegen/aignx/codegen/models/payload_item.py b/codegen/aignx/codegen/models/payload_item.py new file mode 100644 index 00000000..49bc09ee --- /dev/null +++ b/codegen/aignx/codegen/models/payload_item.py @@ -0,0 +1,114 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.payload_input_artifact import PayloadInputArtifact +from aignx.codegen.models.payload_output_artifact import PayloadOutputArtifact + + +class PayloadItem(BaseModel): + """ + PayloadItem + """ + item_id: StrictStr + input_artifacts: dict[str, PayloadInputArtifact] + output_artifacts: dict[str, PayloadOutputArtifact] + __properties: ClassVar[list[str]] = ["item_id", "input_artifacts", "output_artifacts"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of PayloadItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each value in input_artifacts (dict) + _field_dict = {} + if self.input_artifacts: + for _key_input_artifacts in self.input_artifacts: + if self.input_artifacts[_key_input_artifacts]: + _field_dict[_key_input_artifacts] = self.input_artifacts[_key_input_artifacts].to_dict() + _dict["input_artifacts"] = _field_dict + # override the default output from pydantic by calling `to_dict()` of each value in output_artifacts (dict) + _field_dict = {} + if self.output_artifacts: + for _key_output_artifacts in self.output_artifacts: + if self.output_artifacts[_key_output_artifacts]: + _field_dict[_key_output_artifacts] = self.output_artifacts[_key_output_artifacts].to_dict() + _dict["output_artifacts"] = _field_dict + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of PayloadItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "item_id": obj.get("item_id"), + "input_artifacts": dict( + (_k, PayloadInputArtifact.from_dict(_v)) + for _k, _v in obj["input_artifacts"].items() + ) + if obj.get("input_artifacts") is not None + else None, + "output_artifacts": dict( + (_k, PayloadOutputArtifact.from_dict(_v)) + for _k, _v in obj["output_artifacts"].items() + ) + if obj.get("output_artifacts") is not None + else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/payload_output_artifact.py b/codegen/aignx/codegen/models/payload_output_artifact.py new file mode 100644 index 00000000..f407ef47 --- /dev/null +++ b/codegen/aignx/codegen/models/payload_output_artifact.py @@ -0,0 +1,95 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.transfer_urls import TransferUrls + + +class PayloadOutputArtifact(BaseModel): + """ + PayloadOutputArtifact + """ + output_artifact_id: StrictStr + data: TransferUrls + metadata: TransferUrls + __properties: ClassVar[list[str]] = ["output_artifact_id", "data", "metadata"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of PayloadOutputArtifact from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of data + if self.data: + _dict["data"] = self.data.to_dict() + # override the default output from pydantic by calling `to_dict()` of metadata + if self.metadata: + _dict["metadata"] = self.metadata.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of PayloadOutputArtifact from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "output_artifact_id": obj.get("output_artifact_id"), + "data": TransferUrls.from_dict(obj["data"]) if obj.get("data") is not None else None, + "metadata": TransferUrls.from_dict(obj["metadata"]) if obj.get("metadata") is not None else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/quota_name.py b/codegen/aignx/codegen/models/quota_name.py new file mode 100644 index 00000000..3c9c113f --- /dev/null +++ b/codegen/aignx/codegen/models/quota_name.py @@ -0,0 +1,42 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +from enum import Enum +from typing import Self + + +class QuotaName(str, Enum): + """ + Global, API-level, and slide-level quotas for Samia API. + """ + + """ + allowed enum values + """ + MAX_USERS = "max_users" + MAX_ORGANIZATIONS = "max_organizations" + MAX_USERS_PER_ORGANIZATION = "max_users_per_organization" + MAX_APPLICATIONS = "max_applications" + MAX_APPLICATION_VERSIONS = "max_application_versions" + MAX_SLIDES_PER_RUN = "max_slides_per_run" + MAX_PARALLEL_RUNS = "max_parallel_runs" + MAX_PARALLEL_RUNS_PER_ORGANIZATION = "max_parallel_runs_per_organization" + MAX_PARALLEL_RUNS_PER_USER = "max_parallel_runs_per_user" + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of QuotaName from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/quota_read_response.py b/codegen/aignx/codegen/models/quota_read_response.py new file mode 100644 index 00000000..647021b3 --- /dev/null +++ b/codegen/aignx/codegen/models/quota_read_response.py @@ -0,0 +1,87 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictInt + +from aignx.codegen.models.quota_name import QuotaName + + +class QuotaReadResponse(BaseModel): + """ + GET response payload for quota read. + """ + name: QuotaName + quota: StrictInt + __properties: ClassVar[list[str]] = ["name", "quota"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of QuotaReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of QuotaReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "quota": obj.get("quota") + }) + return _obj diff --git a/codegen/aignx/codegen/models/quota_update_request.py b/codegen/aignx/codegen/models/quota_update_request.py new file mode 100644 index 00000000..7d3af858 --- /dev/null +++ b/codegen/aignx/codegen/models/quota_update_request.py @@ -0,0 +1,87 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictInt + +from aignx.codegen.models.quota_name import QuotaName + + +class QuotaUpdateRequest(BaseModel): + """ + PATCH request payload for quota update. + """ + name: QuotaName + quota: StrictInt + __properties: ClassVar[list[str]] = ["name", "quota"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of QuotaUpdateRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of QuotaUpdateRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "quota": obj.get("quota") + }) + return _obj diff --git a/codegen/aignx/codegen/models/quota_update_response.py b/codegen/aignx/codegen/models/quota_update_response.py new file mode 100644 index 00000000..182ee551 --- /dev/null +++ b/codegen/aignx/codegen/models/quota_update_response.py @@ -0,0 +1,87 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictInt + +from aignx.codegen.models.quota_name import QuotaName + + +class QuotaUpdateResponse(BaseModel): + """ + PATCH response payload for quota update. + """ + name: QuotaName + quota: StrictInt + __properties: ClassVar[list[str]] = ["name", "quota"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of QuotaUpdateResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of QuotaUpdateResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "quota": obj.get("quota") + }) + return _obj diff --git a/codegen/aignx/codegen/models/quotas_read_response.py b/codegen/aignx/codegen/models/quotas_read_response.py new file mode 100644 index 00000000..85216464 --- /dev/null +++ b/codegen/aignx/codegen/models/quotas_read_response.py @@ -0,0 +1,92 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict + +from aignx.codegen.models.quota_read_response import QuotaReadResponse + + +class QuotasReadResponse(BaseModel): + """ + GET response payload for multiple quota reads. + """ + quotas: list[QuotaReadResponse] + __properties: ClassVar[list[str]] = ["quotas"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of QuotasReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in quotas (list) + _items = [] + if self.quotas: + for _item_quotas in self.quotas: + if _item_quotas: + _items.append(_item_quotas.to_dict()) + _dict["quotas"] = _items + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of QuotasReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "quotas": [QuotaReadResponse.from_dict(_item) for _item in obj["quotas"]] if obj.get("quotas") is not None else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/quotas_update_request.py b/codegen/aignx/codegen/models/quotas_update_request.py new file mode 100644 index 00000000..47f4f330 --- /dev/null +++ b/codegen/aignx/codegen/models/quotas_update_request.py @@ -0,0 +1,92 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict + +from aignx.codegen.models.quota_update_request import QuotaUpdateRequest + + +class QuotasUpdateRequest(BaseModel): + """ + PATCH request payload for quota updates. + """ + quotas: list[QuotaUpdateRequest] + __properties: ClassVar[list[str]] = ["quotas"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of QuotasUpdateRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in quotas (list) + _items = [] + if self.quotas: + for _item_quotas in self.quotas: + if _item_quotas: + _items.append(_item_quotas.to_dict()) + _dict["quotas"] = _items + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of QuotasUpdateRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "quotas": [QuotaUpdateRequest.from_dict(_item) for _item in obj["quotas"]] if obj.get("quotas") is not None else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/quotas_update_response.py b/codegen/aignx/codegen/models/quotas_update_response.py new file mode 100644 index 00000000..e5e0b992 --- /dev/null +++ b/codegen/aignx/codegen/models/quotas_update_response.py @@ -0,0 +1,92 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict + +from aignx.codegen.models.quota_update_response import QuotaUpdateResponse + + +class QuotasUpdateResponse(BaseModel): + """ + PATCH response payload for quota updates. + """ + updated_quotas: list[QuotaUpdateResponse] + __properties: ClassVar[list[str]] = ["updated_quotas"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of QuotasUpdateResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in updated_quotas (list) + _items = [] + if self.updated_quotas: + for _item_updated_quotas in self.updated_quotas: + if _item_updated_quotas: + _items.append(_item_updated_quotas.to_dict()) + _dict["updated_quotas"] = _items + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of QuotasUpdateResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "updated_quotas": [QuotaUpdateResponse.from_dict(_item) for _item in obj["updated_quotas"]] if obj.get("updated_quotas") is not None else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/run_creation_request.py b/codegen/aignx/codegen/models/run_creation_request.py new file mode 100644 index 00000000..a84e27ab --- /dev/null +++ b/codegen/aignx/codegen/models/run_creation_request.py @@ -0,0 +1,98 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict + +from aignx.codegen.models.application_version import ApplicationVersion +from aignx.codegen.models.item_creation_request import ItemCreationRequest + + +class RunCreationRequest(BaseModel): + """ + RunCreationRequest + """ + application_version: ApplicationVersion + items: list[ItemCreationRequest] + __properties: ClassVar[list[str]] = ["application_version", "items"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of RunCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of application_version + if self.application_version: + _dict["application_version"] = self.application_version.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in items (list) + _items = [] + if self.items: + for _item_items in self.items: + if _item_items: + _items.append(_item_items.to_dict()) + _dict["items"] = _items + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of RunCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_version": ApplicationVersion.from_dict(obj["application_version"]) if obj.get("application_version") is not None else None, + "items": [ItemCreationRequest.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/run_creation_response.py b/codegen/aignx/codegen/models/run_creation_response.py new file mode 100644 index 00000000..b99f6505 --- /dev/null +++ b/codegen/aignx/codegen/models/run_creation_response.py @@ -0,0 +1,83 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + + +class RunCreationResponse(BaseModel): + """ + RunCreationResponse + """ + application_run_id: StrictStr + __properties: ClassVar[list[str]] = ["application_run_id"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of RunCreationResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of RunCreationResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_run_id": obj.get("application_run_id") + }) + return _obj diff --git a/codegen/aignx/codegen/models/run_read_response.py b/codegen/aignx/codegen/models/run_read_response.py new file mode 100644 index 00000000..c29c604d --- /dev/null +++ b/codegen/aignx/codegen/models/run_read_response.py @@ -0,0 +1,107 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from datetime import datetime +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.application_run_status import ApplicationRunStatus +from aignx.codegen.models.user_payload import UserPayload + + +class RunReadResponse(BaseModel): + """ + RunReadResponse + """ + application_run_id: StrictStr + application_version_id: StrictStr + organization_id: StrictStr + user_payload: UserPayload | None = None + status: ApplicationRunStatus + triggered_at: datetime + triggered_by: StrictStr + __properties: ClassVar[list[str]] = ["application_run_id", "application_version_id", "organization_id", "user_payload", "status", "triggered_at", "triggered_by"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of RunReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of user_payload + if self.user_payload: + _dict["user_payload"] = self.user_payload.to_dict() + # set to None if user_payload (nullable) is None + # and model_fields_set contains the field + if self.user_payload is None and "user_payload" in self.model_fields_set: + _dict["user_payload"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of RunReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_run_id": obj.get("application_run_id"), + "application_version_id": obj.get("application_version_id"), + "organization_id": obj.get("organization_id"), + "user_payload": UserPayload.from_dict(obj["user_payload"]) if obj.get("user_payload") is not None else None, + "status": obj.get("status"), + "triggered_at": obj.get("triggered_at"), + "triggered_by": obj.get("triggered_by") + }) + return _obj diff --git a/codegen/aignx/codegen/models/slug_version_request.py b/codegen/aignx/codegen/models/slug_version_request.py new file mode 100644 index 00000000..4f9842bd --- /dev/null +++ b/codegen/aignx/codegen/models/slug_version_request.py @@ -0,0 +1,92 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re +from typing import Annotated, Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator + + +class SlugVersionRequest(BaseModel): + """ + SlugVersionRequest + """ + application_slug: Annotated[str, Field(strict=True)] + version: StrictStr + __properties: ClassVar[list[str]] = ["application_slug", "version"] + + @field_validator("application_slug") + def application_slug_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-z](-?[a-z])*$", value): + raise ValueError(r"must validate the regular expression /^[a-z](-?[a-z])*$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of SlugVersionRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of SlugVersionRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_slug": obj.get("application_slug"), + "version": obj.get("version") + }) + return _obj diff --git a/codegen/aignx/codegen/models/transfer_urls.py b/codegen/aignx/codegen/models/transfer_urls.py new file mode 100644 index 00000000..33555798 --- /dev/null +++ b/codegen/aignx/codegen/models/transfer_urls.py @@ -0,0 +1,85 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Annotated, Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, Field + + +class TransferUrls(BaseModel): + """ + TransferUrls + """ + upload_url: Annotated[str, Field(min_length=1, strict=True)] + download_url: Annotated[str, Field(min_length=1, strict=True)] + __properties: ClassVar[list[str]] = ["upload_url", "download_url"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of TransferUrls from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of TransferUrls from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "upload_url": obj.get("upload_url"), + "download_url": obj.get("download_url") + }) + return _obj diff --git a/codegen/aignx/codegen/models/user_creation_request.py b/codegen/aignx/codegen/models/user_creation_request.py new file mode 100644 index 00000000..a8c2d4af --- /dev/null +++ b/codegen/aignx/codegen/models/user_creation_request.py @@ -0,0 +1,92 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + + +class UserCreationRequest(BaseModel): + """ + UserCreationRequest + """ + user_id: StrictStr + organization_id: StrictStr + email: StrictStr | None + __properties: ClassVar[list[str]] = ["user_id", "organization_id", "email"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of UserCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if email (nullable) is None + # and model_fields_set contains the field + if self.email is None and "email" in self.model_fields_set: + _dict["email"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of UserCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "user_id": obj.get("user_id"), + "organization_id": obj.get("organization_id"), + "email": obj.get("email") + }) + return _obj diff --git a/codegen/aignx/codegen/models/user_payload.py b/codegen/aignx/codegen/models/user_payload.py new file mode 100644 index 00000000..849380c0 --- /dev/null +++ b/codegen/aignx/codegen/models/user_payload.py @@ -0,0 +1,116 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.payload_item import PayloadItem +from aignx.codegen.models.payload_output_artifact import PayloadOutputArtifact + + +class UserPayload(BaseModel): + """ + UserPayload + """ + application_id: StrictStr + application_run_id: StrictStr + global_output_artifacts: dict[str, PayloadOutputArtifact] | None + items: list[PayloadItem] + __properties: ClassVar[list[str]] = ["application_id", "application_run_id", "global_output_artifacts", "items"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of UserPayload from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each value in global_output_artifacts (dict) + _field_dict = {} + if self.global_output_artifacts: + for _key_global_output_artifacts in self.global_output_artifacts: + if self.global_output_artifacts[_key_global_output_artifacts]: + _field_dict[_key_global_output_artifacts] = self.global_output_artifacts[_key_global_output_artifacts].to_dict() + _dict["global_output_artifacts"] = _field_dict + # override the default output from pydantic by calling `to_dict()` of each item in items (list) + _items = [] + if self.items: + for _item_items in self.items: + if _item_items: + _items.append(_item_items.to_dict()) + _dict["items"] = _items + # set to None if global_output_artifacts (nullable) is None + # and model_fields_set contains the field + if self.global_output_artifacts is None and "global_output_artifacts" in self.model_fields_set: + _dict["global_output_artifacts"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of UserPayload from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_id": obj.get("application_id"), + "application_run_id": obj.get("application_run_id"), + "global_output_artifacts": dict( + (_k, PayloadOutputArtifact.from_dict(_v)) + for _k, _v in obj["global_output_artifacts"].items() + ) + if obj.get("global_output_artifacts") is not None + else None, + "items": [PayloadItem.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/user_quota.py b/codegen/aignx/codegen/models/user_quota.py new file mode 100644 index 00000000..3fe8da0f --- /dev/null +++ b/codegen/aignx/codegen/models/user_quota.py @@ -0,0 +1,90 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictInt + + +class UserQuota(BaseModel): + """ + UserQuota + """ + total: StrictInt | None + used: StrictInt + __properties: ClassVar[list[str]] = ["total", "used"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of UserQuota from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if total (nullable) is None + # and model_fields_set contains the field + if self.total is None and "total" in self.model_fields_set: + _dict["total"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of UserQuota from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "total": obj.get("total"), + "used": obj.get("used") + }) + return _obj diff --git a/codegen/aignx/codegen/models/user_response.py b/codegen/aignx/codegen/models/user_response.py new file mode 100644 index 00000000..4d0aab99 --- /dev/null +++ b/codegen/aignx/codegen/models/user_response.py @@ -0,0 +1,102 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.user_quota import UserQuota + + +class UserResponse(BaseModel): + """ + UserResponse + """ + user_id: StrictStr | None + organization_id: StrictStr | None + slide_quota: UserQuota + __properties: ClassVar[list[str]] = ["user_id", "organization_id", "slide_quota"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of UserResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of slide_quota + if self.slide_quota: + _dict["slide_quota"] = self.slide_quota.to_dict() + # set to None if user_id (nullable) is None + # and model_fields_set contains the field + if self.user_id is None and "user_id" in self.model_fields_set: + _dict["user_id"] = None + + # set to None if organization_id (nullable) is None + # and model_fields_set contains the field + if self.organization_id is None and "organization_id" in self.model_fields_set: + _dict["organization_id"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of UserResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "user_id": obj.get("user_id"), + "organization_id": obj.get("organization_id"), + "slide_quota": UserQuota.from_dict(obj["slide_quota"]) if obj.get("slide_quota") is not None else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/user_update_request.py b/codegen/aignx/codegen/models/user_update_request.py new file mode 100644 index 00000000..c6ab2af3 --- /dev/null +++ b/codegen/aignx/codegen/models/user_update_request.py @@ -0,0 +1,95 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr + + +class UserUpdateRequest(BaseModel): + """ + UserUpdateRequest + """ + user_id: StrictStr | None = None + slide_quota: StrictInt | None = None + __properties: ClassVar[list[str]] = ["user_id", "slide_quota"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of UserUpdateRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if user_id (nullable) is None + # and model_fields_set contains the field + if self.user_id is None and "user_id" in self.model_fields_set: + _dict["user_id"] = None + + # set to None if slide_quota (nullable) is None + # and model_fields_set contains the field + if self.slide_quota is None and "slide_quota" in self.model_fields_set: + _dict["slide_quota"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of UserUpdateRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "user_id": obj.get("user_id"), + "slide_quota": obj.get("slide_quota") + }) + return _obj diff --git a/codegen/aignx/codegen/models/validation_error.py b/codegen/aignx/codegen/models/validation_error.py new file mode 100644 index 00000000..d118c19d --- /dev/null +++ b/codegen/aignx/codegen/models/validation_error.py @@ -0,0 +1,96 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.validation_error_loc_inner import ValidationErrorLocInner + + +class ValidationError(BaseModel): + """ + ValidationError + """ + loc: list[ValidationErrorLocInner] + msg: StrictStr + type: StrictStr + __properties: ClassVar[list[str]] = ["loc", "msg", "type"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of ValidationError from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in loc (list) + _items = [] + if self.loc: + for _item_loc in self.loc: + if _item_loc: + _items.append(_item_loc.to_dict()) + _dict["loc"] = _items + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of ValidationError from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "loc": [ValidationErrorLocInner.from_dict(_item) for _item in obj["loc"]] if obj.get("loc") is not None else None, + "msg": obj.get("msg"), + "type": obj.get("type") + }) + return _obj diff --git a/codegen/aignx/codegen/models/validation_error_loc_inner.py b/codegen/aignx/codegen/models/validation_error_loc_inner.py new file mode 100644 index 00000000..8f092369 --- /dev/null +++ b/codegen/aignx/codegen/models/validation_error_loc_inner.py @@ -0,0 +1,130 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import TYPE_CHECKING, Any, Self + +from pydantic import BaseModel, StrictInt, StrictStr, ValidationError, field_validator + +VALIDATIONERRORLOCINNER_ANY_OF_SCHEMAS = ["int", "str"] + + +class ValidationErrorLocInner(BaseModel): + """ + ValidationErrorLocInner + """ + + # data type: str + anyof_schema_1_validator: StrictStr | None = None + # data type: int + anyof_schema_2_validator: StrictInt | None = None + if TYPE_CHECKING: + actual_instance: int | str | None = None + else: + actual_instance: Any = None + any_of_schemas: set[str] = {"int", "str"} + + model_config = { + "validate_assignment": True, + "protected_namespaces": (), + } + + def __init__(self, *args, **kwargs) -> None: + if args: + if len(args) > 1: + raise ValueError("If a position argument is used, only 1 is allowed to set `actual_instance`") + if kwargs: + raise ValueError("If a position argument is used, keyword arguments cannot be used.") + super().__init__(actual_instance=args[0]) + else: + super().__init__(**kwargs) + + @field_validator("actual_instance") + def actual_instance_must_validate_anyof(cls, v): + instance = ValidationErrorLocInner.model_construct() + error_messages = [] + # validate data type: str + try: + instance.anyof_schema_1_validator = v + return v + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # validate data type: int + try: + instance.anyof_schema_2_validator = v + return v + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + if error_messages: + # no match + raise ValueError("No match found when setting the actual_instance in ValidationErrorLocInner with anyOf schemas: int, str. Details: " + ", ".join(error_messages)) + return v + + @classmethod + def from_dict(cls, obj: dict[str, Any]) -> Self: + return cls.from_json(json.dumps(obj)) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Returns the object represented by the json string""" + instance = cls.model_construct() + error_messages = [] + # deserialize data into str + try: + # validation + instance.anyof_schema_1_validator = json.loads(json_str) + # assign value to actual_instance + instance.actual_instance = instance.anyof_schema_1_validator + return instance + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into int + try: + # validation + instance.anyof_schema_2_validator = json.loads(json_str) + # assign value to actual_instance + instance.actual_instance = instance.anyof_schema_2_validator + return instance + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + + if error_messages: + # no match + raise ValueError("No match found when deserializing the JSON string into ValidationErrorLocInner with anyOf schemas: int, str. Details: " + ", ".join(error_messages)) + return instance + + def to_json(self) -> str: + """Returns the JSON representation of the actual instance""" + if self.actual_instance is None: + return "null" + + if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): + return self.actual_instance.to_json() + return json.dumps(self.actual_instance) + + def to_dict(self) -> dict[str, Any] | int | str | None: + """Returns the dict representation of the actual instance""" + if self.actual_instance is None: + return None + + if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): + return self.actual_instance.to_dict() + return self.actual_instance + + def to_str(self) -> str: + """Returns the string representation of the actual instance""" + return pprint.pformat(self.model_dump()) diff --git a/codegen/aignx/codegen/models/version_creation_request.py b/codegen/aignx/codegen/models/version_creation_request.py new file mode 100644 index 00000000..b8a85b47 --- /dev/null +++ b/codegen/aignx/codegen/models/version_creation_request.py @@ -0,0 +1,110 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.input_artifact_schema_creation_request import InputArtifactSchemaCreationRequest +from aignx.codegen.models.output_artifact_schema_creation_request import OutputArtifactSchemaCreationRequest + + +class VersionCreationRequest(BaseModel): + """ + VersionCreationRequest + """ + version: StrictStr + application_id: StrictStr + flow_id: StrictStr + changelog: StrictStr + input_artifacts: list[InputArtifactSchemaCreationRequest] + output_artifacts: list[OutputArtifactSchemaCreationRequest] + __properties: ClassVar[list[str]] = ["version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of VersionCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) + _items = [] + if self.input_artifacts: + for _item_input_artifacts in self.input_artifacts: + if _item_input_artifacts: + _items.append(_item_input_artifacts.to_dict()) + _dict["input_artifacts"] = _items + # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) + _items = [] + if self.output_artifacts: + for _item_output_artifacts in self.output_artifacts: + if _item_output_artifacts: + _items.append(_item_output_artifacts.to_dict()) + _dict["output_artifacts"] = _items + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of VersionCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "version": obj.get("version"), + "application_id": obj.get("application_id"), + "flow_id": obj.get("flow_id"), + "changelog": obj.get("changelog"), + "input_artifacts": [InputArtifactSchemaCreationRequest.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None, + "output_artifacts": [OutputArtifactSchemaCreationRequest.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None + }) + return _obj diff --git a/codegen/aignx/codegen/models/version_creation_response.py b/codegen/aignx/codegen/models/version_creation_response.py new file mode 100644 index 00000000..d7a18468 --- /dev/null +++ b/codegen/aignx/codegen/models/version_creation_response.py @@ -0,0 +1,83 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + + +class VersionCreationResponse(BaseModel): + """ + VersionCreationResponse + """ + application_version_id: StrictStr + __properties: ClassVar[list[str]] = ["application_version_id"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of VersionCreationResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of VersionCreationResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_version_id": obj.get("application_version_id") + }) + return _obj diff --git a/codegen/aignx/codegen/models/version_read_response.py b/codegen/aignx/codegen/models/version_read_response.py new file mode 100644 index 00000000..abe4c55e --- /dev/null +++ b/codegen/aignx/codegen/models/version_read_response.py @@ -0,0 +1,120 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations + +import json +import pprint +import re # noqa: F401 +from datetime import datetime +from typing import Any, ClassVar, Self + +from pydantic import BaseModel, ConfigDict, StrictStr + +from aignx.codegen.models.input_artifact import InputArtifact +from aignx.codegen.models.output_artifact import OutputArtifact + + +class VersionReadResponse(BaseModel): + """ + VersionReadResponse + """ + application_version_id: StrictStr + version: StrictStr + application_id: StrictStr + flow_id: StrictStr | None = None + changelog: StrictStr + input_artifacts: list[InputArtifact] + output_artifacts: list[OutputArtifact] + created_at: datetime + __properties: ClassVar[list[str]] = ["application_version_id", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts", "created_at"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Self | None: + """Create an instance of VersionReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) + _items = [] + if self.input_artifacts: + for _item_input_artifacts in self.input_artifacts: + if _item_input_artifacts: + _items.append(_item_input_artifacts.to_dict()) + _dict["input_artifacts"] = _items + # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) + _items = [] + if self.output_artifacts: + for _item_output_artifacts in self.output_artifacts: + if _item_output_artifacts: + _items.append(_item_output_artifacts.to_dict()) + _dict["output_artifacts"] = _items + # set to None if flow_id (nullable) is None + # and model_fields_set contains the field + if self.flow_id is None and "flow_id" in self.model_fields_set: + _dict["flow_id"] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + """Create an instance of VersionReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_version_id": obj.get("application_version_id"), + "version": obj.get("version"), + "application_id": obj.get("application_id"), + "flow_id": obj.get("flow_id"), + "changelog": obj.get("changelog"), + "input_artifacts": [InputArtifact.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None, + "output_artifacts": [OutputArtifact.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None, + "created_at": obj.get("created_at") + }) + return _obj diff --git a/codegen/aignx/codegen/rest.py b/codegen/aignx/codegen/rest.py new file mode 100644 index 00000000..4fff33a2 --- /dev/null +++ b/codegen/aignx/codegen/rest.py @@ -0,0 +1,254 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +import io +import json +import re +import ssl + +import urllib3 + +from aignx.codegen.exceptions import ApiException, ApiValueError + +SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"} +RESTResponseType = urllib3.HTTPResponse + + +def is_socks_proxy_url(url): + if url is None: + return False + split_section = url.split("://") + if len(split_section) < 2: + return False + return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES + + +class RESTResponse(io.IOBase): + + def __init__(self, resp) -> None: + self.response = resp + self.status = resp.status + self.reason = resp.reason + self.data = None + + def read(self): + if self.data is None: + self.data = self.response.data + return self.data + + def getheaders(self): + """Returns a dictionary of the response headers.""" + return self.response.headers + + def getheader(self, name, default=None): + """Returns a given response header.""" + return self.response.headers.get(name, default) + + +class RESTClientObject: + + def __init__(self, configuration) -> None: + # urllib3.PoolManager will pass all kw parameters to connectionpool + # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501 + # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501 + # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501 + + # cert_reqs + if configuration.verify_ssl: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + + pool_args = { + "cert_reqs": cert_reqs, + "ca_certs": configuration.ssl_ca_cert, + "cert_file": configuration.cert_file, + "key_file": configuration.key_file, + } + if configuration.assert_hostname is not None: + pool_args["assert_hostname"] = ( + configuration.assert_hostname + ) + + if configuration.retries is not None: + pool_args["retries"] = configuration.retries + + if configuration.tls_server_name: + pool_args["server_hostname"] = configuration.tls_server_name + + if configuration.socket_options is not None: + pool_args["socket_options"] = configuration.socket_options + + if configuration.connection_pool_maxsize is not None: + pool_args["maxsize"] = configuration.connection_pool_maxsize + + # https pool manager + self.pool_manager: urllib3.PoolManager + + if configuration.proxy: + if is_socks_proxy_url(configuration.proxy): + from urllib3.contrib.socks import SOCKSProxyManager + pool_args["proxy_url"] = configuration.proxy + pool_args["headers"] = configuration.proxy_headers + self.pool_manager = SOCKSProxyManager(**pool_args) + else: + pool_args["proxy_url"] = configuration.proxy + pool_args["proxy_headers"] = configuration.proxy_headers + self.pool_manager = urllib3.ProxyManager(**pool_args) + else: + self.pool_manager = urllib3.PoolManager(**pool_args) + + def request( + self, + method, + url, + headers=None, + body=None, + post_params=None, + _request_timeout=None + ): + """Perform requests. + + :param method: http request method + :param url: http request url + :param headers: http request headers + :param body: request json body, for `application/json` + :param post_params: request post parameters, + `application/x-www-form-urlencoded` + and `multipart/form-data` + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + """ + method = method.upper() + assert method in [ + "GET", + "HEAD", + "DELETE", + "POST", + "PUT", + "PATCH", + "OPTIONS" + ] + + if post_params and body: + raise ApiValueError( + "body parameter cannot be used with post_params parameter." + ) + + post_params = post_params or {} + headers = headers or {} + + timeout = None + if _request_timeout: + if isinstance(_request_timeout, (int, float)): + timeout = urllib3.Timeout(total=_request_timeout) + elif ( + isinstance(_request_timeout, tuple) + and len(_request_timeout) == 2 + ): + timeout = urllib3.Timeout( + connect=_request_timeout[0], + read=_request_timeout[1] + ) + + try: + # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` + if method in ["POST", "PUT", "PATCH", "OPTIONS", "DELETE"]: + + # no content type provided or payload is json + content_type = headers.get("Content-Type") + if ( + not content_type + or re.search(r"json", content_type, re.IGNORECASE) + ): + request_body = None + if body is not None: + request_body = json.dumps(body) + r = self.pool_manager.request( + method, + url, + body=request_body, + timeout=timeout, + headers=headers, + preload_content=False + ) + elif content_type == "application/x-www-form-urlencoded": + r = self.pool_manager.request( + method, + url, + fields=post_params, + encode_multipart=False, + timeout=timeout, + headers=headers, + preload_content=False + ) + elif content_type == "multipart/form-data": + # must del headers['Content-Type'], or the correct + # Content-Type which generated by urllib3 will be + # overwritten. + del headers["Content-Type"] + # Ensures that dict objects are serialized + post_params = [(a, json.dumps(b)) if isinstance(b, dict) else (a, b) for a, b in post_params] + r = self.pool_manager.request( + method, + url, + fields=post_params, + encode_multipart=True, + timeout=timeout, + headers=headers, + preload_content=False + ) + # Pass a `string` parameter directly in the body to support + # other content types than JSON when `body` argument is + # provided in serialized form. + elif isinstance(body, str) or isinstance(body, bytes): + r = self.pool_manager.request( + method, + url, + body=body, + timeout=timeout, + headers=headers, + preload_content=False + ) + elif headers["Content-Type"].startswith("text/") and isinstance(body, bool): + request_body = "true" if body else "false" + r = self.pool_manager.request( + method, + url, + body=request_body, + preload_content=False, + timeout=timeout, + headers=headers) + else: + # Cannot generate the request from given parameters + msg = """Cannot prepare a request message for provided + arguments. Please check that your arguments match + declared content type.""" + raise ApiException(status=0, reason=msg) + # For `GET`, `HEAD` + else: + r = self.pool_manager.request( + method, + url, + fields={}, + timeout=timeout, + headers=headers, + preload_content=False + ) + except urllib3.exceptions.SSLError as e: + msg = "\n".join([type(e).__name__, str(e)]) + raise ApiException(status=0, reason=msg) + + return RESTResponse(r) diff --git a/codegen/docs/ExternalsApi.md b/codegen/docs/ExternalsApi.md new file mode 100644 index 00000000..7e15a440 --- /dev/null +++ b/codegen/docs/ExternalsApi.md @@ -0,0 +1,1269 @@ +# aignx.codegen.ExternalsApi + +All URIs are relative to *http://localhost* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**cancel_run_v1_runs_application_run_id_cancel_post**](ExternalsApi.md#cancel_run_v1_runs_application_run_id_cancel_post) | **POST** /v1/runs/{application_run_id}/cancel | Cancel Run +[**create_application_run_v1_runs_post**](ExternalsApi.md#create_application_run_v1_runs_post) | **POST** /v1/runs | Create Application Run +[**create_user_v1_users_post**](ExternalsApi.md#create_user_v1_users_post) | **POST** /v1/users/ | Create User +[**delete_run_results_v1_runs_application_run_id_results_delete**](ExternalsApi.md#delete_run_results_v1_runs_application_run_id_results_delete) | **DELETE** /v1/runs/{application_run_id}/results | Delete Run Results +[**get_run_v1_runs_application_run_id_get**](ExternalsApi.md#get_run_v1_runs_application_run_id_get) | **GET** /v1/runs/{application_run_id} | Get Run +[**get_user_v1_users_user_id_get**](ExternalsApi.md#get_user_v1_users_user_id_get) | **GET** /v1/users/{user_id} | Get User +[**get_version_v1_versions_application_version_id_get**](ExternalsApi.md#get_version_v1_versions_application_version_id_get) | **GET** /v1/versions/{application_version_id} | Get Version +[**list_application_runs_v1_runs_get**](ExternalsApi.md#list_application_runs_v1_runs_get) | **GET** /v1/runs | List Application Runs +[**list_applications_v1_applications_get**](ExternalsApi.md#list_applications_v1_applications_get) | **GET** /v1/applications | List Applications +[**list_run_results_v1_runs_application_run_id_results_get**](ExternalsApi.md#list_run_results_v1_runs_application_run_id_results_get) | **GET** /v1/runs/{application_run_id}/results | List Run Results +[**list_versions_by_application_id_v1_applications_application_id_versions_get**](ExternalsApi.md#list_versions_by_application_id_v1_applications_application_id_versions_get) | **GET** /v1/applications/{application_id}/versions | List Versions By Application Id +[**list_versions_by_application_slug_v1_applications_application_slug_versions_get**](ExternalsApi.md#list_versions_by_application_slug_v1_applications_application_slug_versions_get) | **GET** /v1/applications/{application_slug}/versions | List Versions By Application Slug +[**read_application_by_id_v1_applications_application_id_get**](ExternalsApi.md#read_application_by_id_v1_applications_application_id_get) | **GET** /v1/applications/{application_id} | Read Application By Id +[**read_application_by_slug_v1_applications_application_slug_get**](ExternalsApi.md#read_application_by_slug_v1_applications_application_slug_get) | **GET** /v1/applications/{application_slug} | Read Application By Slug +[**register_version_v1_versions_post**](ExternalsApi.md#register_version_v1_versions_post) | **POST** /v1/versions | Register Version +[**update_user_v1_users_user_id_patch**](ExternalsApi.md#update_user_v1_users_user_id_patch) | **PATCH** /v1/users/{user_id} | Update User + + +# **cancel_run_v1_runs_application_run_id_cancel_post** +> object cancel_run_v1_runs_application_run_id_cancel_post(application_run_id) + +Cancel Run + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_run_id = 'application_run_id_example' # str | + + try: + # Cancel Run + api_response = api_instance.cancel_run_v1_runs_application_run_id_cancel_post(application_run_id) + print("The response of ExternalsApi->cancel_run_v1_runs_application_run_id_cancel_post:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->cancel_run_v1_runs_application_run_id_cancel_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_run_id** | **str**| | + +### Return type + +**object** + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**202** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **create_application_run_v1_runs_post** +> RunCreationResponse create_application_run_v1_runs_post(run_creation_request) + +Create Application Run + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.run_creation_request import RunCreationRequest +from aignx.codegen.models.run_creation_response import RunCreationResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + run_creation_request = aignx.codegen.RunCreationRequest() # RunCreationRequest | + + try: + # Create Application Run + api_response = api_instance.create_application_run_v1_runs_post(run_creation_request) + print("The response of ExternalsApi->create_application_run_v1_runs_post:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->create_application_run_v1_runs_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **run_creation_request** | [**RunCreationRequest**](RunCreationRequest.md)| | + +### Return type + +[**RunCreationResponse**](RunCreationResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**201** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **create_user_v1_users_post** +> UserResponse create_user_v1_users_post(user_creation_request) + +Create User + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.user_creation_request import UserCreationRequest +from aignx.codegen.models.user_response import UserResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + user_creation_request = aignx.codegen.UserCreationRequest() # UserCreationRequest | + + try: + # Create User + api_response = api_instance.create_user_v1_users_post(user_creation_request) + print("The response of ExternalsApi->create_user_v1_users_post:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->create_user_v1_users_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user_creation_request** | [**UserCreationRequest**](UserCreationRequest.md)| | + +### Return type + +[**UserResponse**](UserResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | User not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **delete_run_results_v1_runs_application_run_id_results_delete** +> delete_run_results_v1_runs_application_run_id_results_delete(application_run_id) + +Delete Run Results + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_run_id = 'application_run_id_example' # str | + + try: + # Delete Run Results + api_instance.delete_run_results_v1_runs_application_run_id_results_delete(application_run_id) + except Exception as e: + print("Exception when calling ExternalsApi->delete_run_results_v1_runs_application_run_id_results_delete: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_run_id** | **str**| | + +### Return type + +void (empty response body) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**204** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **get_run_v1_runs_application_run_id_get** +> RunReadResponse get_run_v1_runs_application_run_id_get(application_run_id, include=include) + +Get Run + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.run_read_response import RunReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_run_id = 'application_run_id_example' # str | + include = None # List[object] | (optional) + + try: + # Get Run + api_response = api_instance.get_run_v1_runs_application_run_id_get(application_run_id, include=include) + print("The response of ExternalsApi->get_run_v1_runs_application_run_id_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->get_run_v1_runs_application_run_id_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_run_id** | **str**| | + **include** | [**List[object]**](object.md)| | [optional] + +### Return type + +[**RunReadResponse**](RunReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **get_user_v1_users_user_id_get** +> UserResponse get_user_v1_users_user_id_get(user_id) + +Get User + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.user_response import UserResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + user_id = 'user_id_example' # str | + + try: + # Get User + api_response = api_instance.get_user_v1_users_user_id_get(user_id) + print("The response of ExternalsApi->get_user_v1_users_user_id_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->get_user_v1_users_user_id_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user_id** | **str**| | + +### Return type + +[**UserResponse**](UserResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | User not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **get_version_v1_versions_application_version_id_get** +> VersionReadResponse get_version_v1_versions_application_version_id_get(application_version_id, include=include) + +Get Version + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.version_read_response import VersionReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_version_id = 'application_version_id_example' # str | + include = None # List[object] | (optional) + + try: + # Get Version + api_response = api_instance.get_version_v1_versions_application_version_id_get(application_version_id, include=include) + print("The response of ExternalsApi->get_version_v1_versions_application_version_id_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->get_version_v1_versions_application_version_id_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_version_id** | **str**| | + **include** | [**List[object]**](object.md)| | [optional] + +### Return type + +[**VersionReadResponse**](VersionReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_application_runs_v1_runs_get** +> List[RunReadResponse] list_application_runs_v1_runs_get(application_id=application_id, application_version_id=application_version_id, include=include, page=page, page_size=page_size, sort=sort) + +List Application Runs + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.run_read_response import RunReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_id = 'application_id_example' # str | (optional) + application_version_id = 'application_version_id_example' # str | (optional) + include = None # List[object] | (optional) + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Application Runs + api_response = api_instance.list_application_runs_v1_runs_get(application_id=application_id, application_version_id=application_version_id, include=include, page=page, page_size=page_size, sort=sort) + print("The response of ExternalsApi->list_application_runs_v1_runs_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->list_application_runs_v1_runs_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_id** | **str**| | [optional] + **application_version_id** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[RunReadResponse]**](RunReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_applications_v1_applications_get** +> List[ApplicationReadResponse] list_applications_v1_applications_get(page=page, page_size=page_size, sort=sort) + +List Applications + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.application_read_response import ApplicationReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Applications + api_response = api_instance.list_applications_v1_applications_get(page=page, page_size=page_size, sort=sort) + print("The response of ExternalsApi->list_applications_v1_applications_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->list_applications_v1_applications_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[ApplicationReadResponse]**](ApplicationReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_run_results_v1_runs_application_run_id_results_get** +> List[ItemResultReadResponse] list_run_results_v1_runs_application_run_id_results_get(application_run_id, item_id__in=item_id__in, page=page, page_size=page_size, reference__in=reference__in, status__in=status__in, sort=sort) + +List Run Results + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.item_result_read_response import ItemResultReadResponse +from aignx.codegen.models.item_status import ItemStatus +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_run_id = 'application_run_id_example' # str | + item_id__in = ['item_id__in_example'] # List[Optional[str]] | (optional) + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + reference__in = ['reference__in_example'] # List[str] | (optional) + status__in = [aignx.codegen.ItemStatus()] # List[ItemStatus] | (optional) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Run Results + api_response = api_instance.list_run_results_v1_runs_application_run_id_results_get(application_run_id, item_id__in=item_id__in, page=page, page_size=page_size, reference__in=reference__in, status__in=status__in, sort=sort) + print("The response of ExternalsApi->list_run_results_v1_runs_application_run_id_results_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->list_run_results_v1_runs_application_run_id_results_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_run_id** | **str**| | + **item_id__in** | [**List[Optional[str]]**](str.md)| | [optional] + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **reference__in** | [**List[str]**](str.md)| | [optional] + **status__in** | [**List[ItemStatus]**](ItemStatus.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[ItemResultReadResponse]**](ItemResultReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_versions_by_application_id_v1_applications_application_id_versions_get** +> List[ApplicationVersionReadResponse] list_versions_by_application_id_v1_applications_application_id_versions_get(application_id, page=page, page_size=page_size, version=version, include=include, sort=sort) + +List Versions By Application Id + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_id = 'application_id_example' # str | + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + version = 'version_example' # str | (optional) + include = None # List[object] | (optional) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Versions By Application Id + api_response = api_instance.list_versions_by_application_id_v1_applications_application_id_versions_get(application_id, page=page, page_size=page_size, version=version, include=include, sort=sort) + print("The response of ExternalsApi->list_versions_by_application_id_v1_applications_application_id_versions_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->list_versions_by_application_id_v1_applications_application_id_versions_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_id** | **str**| | + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **version** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[ApplicationVersionReadResponse]**](ApplicationVersionReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_versions_by_application_slug_v1_applications_application_slug_versions_get** +> List[ApplicationVersionReadResponse] list_versions_by_application_slug_v1_applications_application_slug_versions_get(application_slug, page=page, page_size=page_size, version=version, include=include, sort=sort) + +List Versions By Application Slug + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_slug = 'application_slug_example' # str | + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + version = 'version_example' # str | (optional) + include = None # List[object] | (optional) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Versions By Application Slug + api_response = api_instance.list_versions_by_application_slug_v1_applications_application_slug_versions_get(application_slug, page=page, page_size=page_size, version=version, include=include, sort=sort) + print("The response of ExternalsApi->list_versions_by_application_slug_v1_applications_application_slug_versions_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->list_versions_by_application_slug_v1_applications_application_slug_versions_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_slug** | **str**| | + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **version** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[ApplicationVersionReadResponse]**](ApplicationVersionReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **read_application_by_id_v1_applications_application_id_get** +> ApplicationReadResponse read_application_by_id_v1_applications_application_id_get(application_id) + +Read Application By Id + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.application_read_response import ApplicationReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_id = 'application_id_example' # str | + + try: + # Read Application By Id + api_response = api_instance.read_application_by_id_v1_applications_application_id_get(application_id) + print("The response of ExternalsApi->read_application_by_id_v1_applications_application_id_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->read_application_by_id_v1_applications_application_id_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_id** | **str**| | + +### Return type + +[**ApplicationReadResponse**](ApplicationReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **read_application_by_slug_v1_applications_application_slug_get** +> ApplicationReadResponse read_application_by_slug_v1_applications_application_slug_get(application_slug) + +Read Application By Slug + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.application_read_response import ApplicationReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_slug = 'application_slug_example' # str | + + try: + # Read Application By Slug + api_response = api_instance.read_application_by_slug_v1_applications_application_slug_get(application_slug) + print("The response of ExternalsApi->read_application_by_slug_v1_applications_application_slug_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->read_application_by_slug_v1_applications_application_slug_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_slug** | **str**| | + +### Return type + +[**ApplicationReadResponse**](ApplicationReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **register_version_v1_versions_post** +> VersionCreationResponse register_version_v1_versions_post(version_creation_request) + +Register Version + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.version_creation_request import VersionCreationRequest +from aignx.codegen.models.version_creation_response import VersionCreationResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + version_creation_request = aignx.codegen.VersionCreationRequest() # VersionCreationRequest | + + try: + # Register Version + api_response = api_instance.register_version_v1_versions_post(version_creation_request) + print("The response of ExternalsApi->register_version_v1_versions_post:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->register_version_v1_versions_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **version_creation_request** | [**VersionCreationRequest**](VersionCreationRequest.md)| | + +### Return type + +[**VersionCreationResponse**](VersionCreationResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**201** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **update_user_v1_users_user_id_patch** +> UserResponse update_user_v1_users_user_id_patch(user_id, user_update_request) + +Update User + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.user_response import UserResponse +from aignx.codegen.models.user_update_request import UserUpdateRequest +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + user_id = 'user_id_example' # str | + user_update_request = aignx.codegen.UserUpdateRequest() # UserUpdateRequest | + + try: + # Update User + api_response = api_instance.update_user_v1_users_user_id_patch(user_id, user_update_request) + print("The response of ExternalsApi->update_user_v1_users_user_id_patch:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->update_user_v1_users_user_id_patch: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user_id** | **str**| | + **user_update_request** | [**UserUpdateRequest**](UserUpdateRequest.md)| | + +### Return type + +[**UserResponse**](UserResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | User not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index c1fbc081..ddfbea07 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -90,8 +90,10 @@ openapi: 3.1.0 paths: /echo/{text}: get: - description: "Echo back the provided text.\n\nArgs:\n text (str): The text\ - \ to echo.\n\nReturns:\n Echo: The echo.\n\nRaises:\n 422 Unprocessable\ + description: "Echo back the provided text.\n\nArgs:\n text (str): The +text\ + \ to echo.\n\nReturns:\n Echo: The echo.\n\nRaises:\n 422 +Unprocessable\ \ Entity: If text is not provided or empty." operationId: echo_echo__text__get parameters: @@ -119,12 +121,18 @@ paths: - Basics /health: get: - description: "Check the health of the service.\n\nThis endpoint returns the\ - \ health status of the service.\nThe health status can be either UP or DOWN.\n\ - If the service is healthy, the status will be UP.\nIf the service is unhealthy,\ - \ the status will be DOWN and a reason will be provided.\nThe response will\ - \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\ - \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\ + description: "Check the health of the service.\n\nThis endpoint returns +the\ + \ health status of the service.\nThe health status can be either UP or +DOWN.\n\ + If the service is healthy, the status will be UP.\nIf the service is +unhealthy,\ + \ the status will be DOWN and a reason will be provided.\nThe response +will\ + \ have a 200 OK status code if the service is healthy,\nand a 500 +Internal\ + \ Server Error status code if the service is unhealthy.\n\nReturns:\n +Health:\ \ The health status of the service." operationId: health_health_get responses: @@ -139,12 +147,18 @@ paths: - Observability /healthz: get: - description: "Check the health of the service.\n\nThis endpoint returns the\ - \ health status of the service.\nThe health status can be either UP or DOWN.\n\ - If the service is healthy, the status will be UP.\nIf the service is unhealthy,\ - \ the status will be DOWN and a reason will be provided.\nThe response will\ - \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\ - \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\ + description: "Check the health of the service.\n\nThis endpoint returns +the\ + \ health status of the service.\nThe health status can be either UP or +DOWN.\n\ + If the service is healthy, the status will be UP.\nIf the service is +unhealthy,\ + \ the status will be DOWN and a reason will be provided.\nThe response +will\ + \ have a 200 OK status code if the service is healthy,\nand a 500 +Internal\ + \ Server Error status code if the service is unhealthy.\n\nReturns:\n +Health:\ \ The health status of the service." operationId: health_healthz_get responses: @@ -159,7 +173,8 @@ paths: - Observability /hello-world: get: - description: "Return a hello world message.\n\nReturns:\n _HelloWorldResponse:\ + description: "Return a hello world message.\n\nReturns:\n +_HelloWorldResponse:\ \ A response containing the hello world message." operationId: hello_world_hello_world_get responses: diff --git a/docs/source/_static/openapi_v2.yaml b/docs/source/_static/openapi_v2.yaml index 91e1e607..720a9462 100644 --- a/docs/source/_static/openapi_v2.yaml +++ b/docs/source/_static/openapi_v2.yaml @@ -104,8 +104,10 @@ openapi: 3.1.0 paths: /echo: post: - description: "Echo back the provided utterance.\n\nArgs:\n request (Utterance):\ - \ The utterance to echo back.\n\nReturns:\n Echo: The echo.\n\nRaises:\n\ + description: "Echo back the provided utterance.\n\nArgs:\n request +(Utterance):\ + \ The utterance to echo back.\n\nReturns:\n Echo: The +echo.\n\nRaises:\n\ \ 422 Unprocessable Entity: If utterance is not provided or empty." operationId: echo_v2_echo_post requestBody: @@ -132,12 +134,18 @@ paths: - Basics /health: get: - description: "Check the health of the service.\n\nThis endpoint returns the\ - \ health status of the service.\nThe health status can be either UP or DOWN.\n\ - If the service is healthy, the status will be UP.\nIf the service is unhealthy,\ - \ the status will be DOWN and a reason will be provided.\nThe response will\ - \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\ - \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\ + description: "Check the health of the service.\n\nThis endpoint returns +the\ + \ health status of the service.\nThe health status can be either UP or +DOWN.\n\ + If the service is healthy, the status will be UP.\nIf the service is +unhealthy,\ + \ the status will be DOWN and a reason will be provided.\nThe response +will\ + \ have a 200 OK status code if the service is healthy,\nand a 500 +Internal\ + \ Server Error status code if the service is unhealthy.\n\nReturns:\n +Health:\ \ The health status of the service." operationId: health_health_get responses: @@ -152,12 +160,18 @@ paths: - Observability /healthz: get: - description: "Check the health of the service.\n\nThis endpoint returns the\ - \ health status of the service.\nThe health status can be either UP or DOWN.\n\ - If the service is healthy, the status will be UP.\nIf the service is unhealthy,\ - \ the status will be DOWN and a reason will be provided.\nThe response will\ - \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\ - \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\ + description: "Check the health of the service.\n\nThis endpoint returns +the\ + \ health status of the service.\nThe health status can be either UP or +DOWN.\n\ + If the service is healthy, the status will be UP.\nIf the service is +unhealthy,\ + \ the status will be DOWN and a reason will be provided.\nThe response +will\ + \ have a 200 OK status code if the service is healthy,\nand a 500 +Internal\ + \ Server Error status code if the service is unhealthy.\n\nReturns:\n +Health:\ \ The health status of the service." operationId: health_healthz_get responses: @@ -172,7 +186,8 @@ paths: - Observability /hello-world: get: - description: "Return a hello world message.\n\nReturns:\n _HelloWorldResponse:\ + description: "Return a hello world message.\n\nReturns:\n +_HelloWorldResponse:\ \ A response containing the hello world message." operationId: hello_world_hello_world_get responses: diff --git a/schema/api.json b/schema/api.json new file mode 100644 index 00000000..d7df3f2b --- /dev/null +++ b/schema/api.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"Aignostics Platform API","summary":"Interact with Aignostics' Application Platform","description":"Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`.","version":"0.1.0"},"paths":{"/v1/applications":{"post":{"tags":["Admins"],"summary":"Register Application","operationId":"register_application_v1_applications_post","security":[{"OAuth2AuthorizationCodeBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationCreationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationCreationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Externals"],"summary":"List Applications","operationId":"list_applications_v1_applications_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationReadResponse"},"title":"Response List Applications V1 Applications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_id}":{"get":{"tags":["Externals"],"summary":"Read Application By Id","operationId":"read_application_by_id_v1_applications__application_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_slug}":{"get":{"tags":["Externals"],"summary":"Read Application By Slug","operationId":"read_application_by_slug_v1_applications__application_slug__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_slug","in":"path","required":true,"schema":{"type":"string","title":"Application Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_id}/versions":{"get":{"tags":["Externals"],"summary":"List Versions By Application Id","operationId":"list_versions_by_application_id_v1_applications__application_id__versions_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Id V1 Applications Application Id Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_slug}/versions":{"get":{"tags":["Externals"],"summary":"List Versions By Application Slug","operationId":"list_versions_by_application_slug_v1_applications__application_slug__versions_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z](-?[a-z])*$","title":"Application Slug"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Slug V1 Applications Application Slug Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/artifacts/{output_artifact_id}/event":{"post":{"tags":["Algorithms/Apps"],"summary":"Trigger Artifact Event","operationId":"trigger_artifact_event_v1_artifacts__output_artifact_id__event_post","parameters":[{"name":"output_artifact_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Output Artifact Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputArtifactEventTriggerRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputArtifactEventTriggerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/items/{item_id}":{"get":{"tags":["Scheduler"],"summary":"Get Item","operationId":"get_item_v1_items__item_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/items/{item_id}/event":{"post":{"tags":["Scheduler"],"summary":"Register Item Event","operationId":"register_item_event_v1_items__item_id__event_post","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemEventCreationRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemEventCreationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/organizations":{"post":{"tags":["Organizations"],"summary":"Create Organization","operationId":"create_organization_v1_organizations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationCreationRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2AuthorizationCodeBearer":[]}]}},"/v1/organizations/{organization_id}":{"patch":{"tags":["Organizations"],"summary":"Update Organization","operationId":"update_organization_v1_organizations__organization_id__patch","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Organizations"],"summary":"Get Organization","operationId":"get_organization_v1_organizations__organization_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/quotas":{"get":{"tags":["Admins","Admins"],"summary":"List Quotas","operationId":"list_quotas_v1_quotas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotasReadResponse"}}}}},"security":[{"OAuth2AuthorizationCodeBearer":[]}]},"patch":{"tags":["Admins","Admins"],"summary":"Update Quotas","operationId":"update_quotas_v1_quotas_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotasUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotasUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2AuthorizationCodeBearer":[]}]}},"/v1/runs":{"get":{"tags":["Externals"],"summary":"List Application Runs","operationId":"list_application_runs_v1_runs_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Id"}},{"name":"application_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Version Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RunReadResponse"},"title":"Response List Application Runs V1 Runs Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Externals"],"summary":"Create Application Run","operationId":"create_application_run_v1_runs_post","security":[{"OAuth2AuthorizationCodeBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}":{"get":{"tags":["Externals","Scheduler"],"summary":"Get Run","operationId":"get_run_v1_runs__application_run_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunReadResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/cancel":{"post":{"tags":["Externals"],"summary":"Cancel Run","operationId":"cancel_run_v1_runs__application_run_id__cancel_post","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/results":{"get":{"tags":["Externals"],"summary":"List Run Results","operationId":"list_run_results_v1_runs__application_run_id__results_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}},{"name":"item_id__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Item Id In"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"reference__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Reference In"}},{"name":"status__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ItemStatus"}},{"type":"null"}],"title":"Status In"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ItemResultReadResponse"},"title":"Response List Run Results V1 Runs Application Run Id Results Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Externals"],"summary":"Delete Run Results","operationId":"delete_run_results_v1_runs__application_run_id__results_delete","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}}],"responses":{"204":{"description":"Successful Response"},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/":{"post":{"tags":["Externals"],"summary":"Create User","operationId":"create_user_v1_users__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"404":{"description":"User not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2AuthorizationCodeBearer":[]}]}},"/v1/users/{user_id}":{"patch":{"tags":["Externals"],"summary":"Update User","operationId":"update_user_v1_users__user_id__patch","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"404":{"description":"User not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Externals"],"summary":"Get User","operationId":"get_user_v1_users__user_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"404":{"description":"User not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/versions":{"post":{"tags":["Externals","Scheduler","Admins"],"summary":"Register Version","operationId":"register_version_v1_versions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreationRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2AuthorizationCodeBearer":[]}]}},"/v1/versions/{application_version_id}":{"get":{"tags":["Externals","Scheduler"],"summary":"Get Version","operationId":"get_version_v1_versions__application_version_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Version Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/liveness":{"get":{"tags":["Infrastructure"],"summary":"Liveness","description":"Check that the API application is alive and responsive.","operationId":"liveness_liveness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/readiness":{"get":{"tags":["Infrastructure"],"summary":"Readiness","description":"Check that the API application is ready to serve.","operationId":"readiness_readiness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["Infrastructure"],"summary":"Health","description":"Check that the API application is alive and responsive.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/docs":{"get":{"summary":"Get Documentation","operationId":"get_documentation_docs_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ApplicationCreationRequest":{"properties":{"name":{"type":"string","title":"Name","examples":["HETA"]},"description":{"type":"string","title":"Description","examples":["H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, cell detection and cell classfication"]},"regulatory_classes":{"items":{"type":"string"},"type":"array","title":"Regulatory Classes","examples":[["RuO"]]}},"type":"object","required":["name","description","regulatory_classes"],"title":"ApplicationCreationRequest"},"ApplicationCreationResponse":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"}},"type":"object","required":["application_id"],"title":"ApplicationCreationResponse"},"ApplicationReadResponse":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"},"name":{"type":"string","title":"Name","examples":["HETA"]},"slug":{"type":"string","title":"Slug","examples":["heta"]},"regulatory_classes":{"items":{"type":"string"},"type":"array","title":"Regulatory Classes","examples":[["RuO"]]},"description":{"type":"string","title":"Description","examples":["Aignostics H&E TME application"]}},"type":"object","required":["application_id","name","slug","regulatory_classes","description"],"title":"ApplicationReadResponse"},"ApplicationRunStatus":{"type":"string","enum":["canceled_system","canceled_user","completed","completed_with_error","received","rejected","running","scheduled"],"title":"ApplicationRunStatus"},"ApplicationVersionReadResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"application_version_slug":{"type":"string","pattern":"^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$","title":"Application Version Slug","examples":["tissue-segmentation-qc:v0.0.1"]},"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactReadResponse"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactReadResponse"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["application_version_id","application_version_slug","version","application_id","changelog","input_artifacts","output_artifacts"],"title":"ApplicationVersionReadResponse"},"ArtifactEvent":{"type":"string","enum":["succeeded","failed_with_user_error","failed_with_system_error"],"title":"ArtifactEvent","description":"This is a subset of the OutputArtifactEvent used by the state machine.\nOnly the variants defined below are allowed to be submitted from the Algorithms/Applications."},"ArtifactStatus":{"type":"string","enum":["pending","canceled_user","canceled_system","error_user","error_system_fatal","error_system_recoverable","skipped","succeeded"],"title":"ArtifactStatus"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InputArtifact":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifact"},"InputArtifactCreationRequest":{"properties":{"name":{"type":"string","title":"Name","examples":["slide"]},"download_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Download Url","examples":["https://example.com/case-no-1-slide.tiff"]},"metadata":{"type":"object","title":"Metadata","examples":[{"checksum_crc32c":"752f9554","height":2000,"height_mpp":0.5,"width":10000,"width_mpp":0.5}]}},"type":"object","required":["name","download_url","metadata"],"title":"InputArtifactCreationRequest"},"InputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactReadResponse"},"InputArtifactSchemaCreationRequest":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactSchemaCreationRequest"},"ItemCreationRequest":{"properties":{"reference":{"type":"string","title":"Reference","examples":["case-no-1"]},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactCreationRequest"},"type":"array","title":"Input Artifacts"}},"type":"object","required":["reference","input_artifacts"],"title":"ItemCreationRequest"},"ItemEvent":{"type":"string","enum":["failed_with_system_error","failed_recoverable"],"title":"ItemEvent"},"ItemEventCreationRequest":{"properties":{"event":{"$ref":"#/components/schemas/ItemEvent"},"error":{"type":"string","title":"Error"}},"type":"object","required":["event","error"],"title":"ItemEventCreationRequest"},"ItemEventCreationResponse":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"status":{"$ref":"#/components/schemas/ItemStatus"}},"type":"object","required":["item_id","status"],"title":"ItemEventCreationResponse"},"ItemReadResponse":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"application_run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Run Id"},"reference":{"type":"string","title":"Reference"},"status":{"$ref":"#/components/schemas/ItemStatus"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["item_id","reference","status","error"],"title":"ItemReadResponse"},"ItemResultReadResponse":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"reference":{"type":"string","title":"Reference"},"status":{"$ref":"#/components/schemas/ItemStatus"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactResultReadResponse"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["item_id","application_run_id","reference","status","error","output_artifacts"],"title":"ItemResultReadResponse"},"ItemStatus":{"type":"string","enum":["pending","canceled_user","canceled_system","error_user","error_system","succeeded"],"title":"ItemStatus"},"OrganizationCreationRequest":{"properties":{"organization_id":{"type":"string","title":"Organization Id"},"owner_email":{"type":"string","title":"Owner Email"},"slide_quota":{"type":"integer","title":"Slide Quota"},"batch_size":{"type":"integer","title":"Batch Size"}},"type":"object","required":["organization_id","owner_email","slide_quota","batch_size"],"title":"OrganizationCreationRequest"},"OrganizationQuota":{"properties":{"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"used":{"type":"integer","title":"Used"}},"type":"object","required":["total","used"],"title":"OrganizationQuota"},"OrganizationResponse":{"properties":{"organization_id":{"type":"string","title":"Organization Id"},"owner_id":{"type":"string","format":"uuid","title":"Owner Id"},"slide_quota":{"$ref":"#/components/schemas/OrganizationQuota"},"batch_size":{"type":"integer","title":"Batch Size"}},"type":"object","required":["organization_id","owner_id","slide_quota","batch_size"],"title":"OrganizationResponse"},"OrganizationUpdateRequest":{"properties":{"slide_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Slide Quota"},"batch_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Batch Size"}},"type":"object","title":"OrganizationUpdateRequest"},"OutputArtifact":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"},"visibility":{"$ref":"#/components/schemas/OutputArtifactVisibility"}},"type":"object","required":["name","mime_type","metadata_schema","scope","visibility"],"title":"OutputArtifact"},"OutputArtifactEventTriggerRequest":{"properties":{"event":{"$ref":"#/components/schemas/ArtifactEvent"},"metadata":{"type":"object","title":"Metadata"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["event","metadata"],"title":"OutputArtifactEventTriggerRequest"},"OutputArtifactEventTriggerResponse":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"status":{"$ref":"#/components/schemas/ArtifactStatus"}},"type":"object","required":["output_artifact_id","status"],"title":"OutputArtifactEventTriggerResponse"},"OutputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"}},"type":"object","required":["name","mime_type","metadata_schema","scope"],"title":"OutputArtifactReadResponse"},"OutputArtifactResultReadResponse":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata":{"type":"object","title":"Metadata"},"download_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Download Url"}},"type":"object","required":["output_artifact_id","name","mime_type","metadata","download_url"],"title":"OutputArtifactResultReadResponse"},"OutputArtifactSchemaCreationRequest":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"},"visibility":{"$ref":"#/components/schemas/OutputArtifactVisibility"},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","scope","visibility","metadata_schema"],"title":"OutputArtifactSchemaCreationRequest"},"OutputArtifactScope":{"type":"string","enum":["item","global"],"title":"OutputArtifactScope"},"OutputArtifactVisibility":{"type":"string","enum":["internal","external"],"title":"OutputArtifactVisibility"},"PayloadInputArtifact":{"properties":{"input_artifact_id":{"type":"string","format":"uuid","title":"Input Artifact Id"},"metadata":{"type":"object","title":"Metadata"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["input_artifact_id","metadata","download_url"],"title":"PayloadInputArtifact"},"PayloadItem":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"input_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadInputArtifact"},"type":"object","title":"Input Artifacts"},"output_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object","title":"Output Artifacts"}},"type":"object","required":["item_id","input_artifacts","output_artifacts"],"title":"PayloadItem"},"PayloadOutputArtifact":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"data":{"$ref":"#/components/schemas/TransferUrls"},"metadata":{"$ref":"#/components/schemas/TransferUrls"}},"type":"object","required":["output_artifact_id","data","metadata"],"title":"PayloadOutputArtifact"},"QuotaName":{"type":"string","enum":["max_users","max_organizations","max_users_per_organization","max_applications","max_application_versions","max_slides_per_run","max_parallel_runs","max_parallel_runs_per_organization","max_parallel_runs_per_user"],"title":"QuotaName","description":"Global, API-level, and slide-level quotas for Samia API."},"QuotaReadResponse":{"properties":{"name":{"$ref":"#/components/schemas/QuotaName"},"quota":{"type":"integer","title":"Quota"}},"type":"object","required":["name","quota"],"title":"QuotaReadResponse","description":"GET response payload for quota read."},"QuotaUpdateRequest":{"properties":{"name":{"$ref":"#/components/schemas/QuotaName"},"quota":{"type":"integer","exclusiveMinimum":0.0,"title":"Quota"}},"type":"object","required":["name","quota"],"title":"QuotaUpdateRequest","description":"PATCH request payload for quota update."},"QuotaUpdateResponse":{"properties":{"name":{"$ref":"#/components/schemas/QuotaName"},"quota":{"type":"integer","title":"Quota"}},"type":"object","required":["name","quota"],"title":"QuotaUpdateResponse","description":"PATCH response payload for quota update."},"QuotasReadResponse":{"properties":{"quotas":{"items":{"$ref":"#/components/schemas/QuotaReadResponse"},"type":"array","title":"Quotas"}},"type":"object","required":["quotas"],"title":"QuotasReadResponse","description":"GET response payload for multiple quota reads."},"QuotasUpdateRequest":{"properties":{"quotas":{"items":{"$ref":"#/components/schemas/QuotaUpdateRequest"},"type":"array","title":"Quotas"}},"type":"object","required":["quotas"],"title":"QuotasUpdateRequest","description":"PATCH request payload for quota updates."},"QuotasUpdateResponse":{"properties":{"updated_quotas":{"items":{"$ref":"#/components/schemas/QuotaUpdateResponse"},"type":"array","title":"Updated Quotas"}},"type":"object","required":["updated_quotas"],"title":"QuotasUpdateResponse","description":"PATCH response payload for quota updates."},"RunCreationRequest":{"properties":{"application_version":{"anyOf":[{"type":"string","format":"uuid"},{"$ref":"#/components/schemas/SlugVersionRequest"}],"title":"Application Version","examples":["efbf9822-a1e5-4045-a283-dbf26e8064a9"]},"items":{"items":{"$ref":"#/components/schemas/ItemCreationRequest"},"type":"array","title":"Items"}},"type":"object","required":["application_version","items"],"title":"RunCreationRequest"},"RunCreationResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"}},"type":"object","required":["application_run_id"],"title":"RunCreationResponse"},"RunReadResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"organization_id":{"type":"string","title":"Organization Id"},"user_payload":{"anyOf":[{"$ref":"#/components/schemas/UserPayload"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/ApplicationRunStatus"},"triggered_at":{"type":"string","format":"date-time","title":"Triggered At"},"triggered_by":{"type":"string","title":"Triggered By"}},"type":"object","required":["application_run_id","application_version_id","organization_id","status","triggered_at","triggered_by"],"title":"RunReadResponse"},"SlugVersionRequest":{"properties":{"application_slug":{"type":"string","pattern":"^[a-z](-?[a-z])*$","title":"Application Slug"},"version":{"type":"string","title":"Version"}},"type":"object","required":["application_slug","version"],"title":"SlugVersionRequest"},"TransferUrls":{"properties":{"upload_url":{"type":"string","minLength":1,"format":"uri","title":"Upload Url"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["upload_url","download_url"],"title":"TransferUrls"},"UserCreationRequest":{"properties":{"user_id":{"type":"string","title":"User Id"},"organization_id":{"type":"string","format":"uuid","title":"Organization Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["user_id","organization_id","email"],"title":"UserCreationRequest"},"UserPayload":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"global_output_artifacts":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object"},{"type":"null"}],"title":"Global Output Artifacts"},"items":{"items":{"$ref":"#/components/schemas/PayloadItem"},"type":"array","title":"Items"}},"type":"object","required":["application_id","application_run_id","global_output_artifacts","items"],"title":"UserPayload"},"UserQuota":{"properties":{"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"used":{"type":"integer","title":"Used"}},"type":"object","required":["total","used"],"title":"UserQuota"},"UserResponse":{"properties":{"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"slide_quota":{"$ref":"#/components/schemas/UserQuota"}},"type":"object","required":["user_id","organization_id","slide_quota"],"title":"UserResponse"},"UserUpdateRequest":{"properties":{"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"slide_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Slide Quota"}},"type":"object","title":"UserUpdateRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionCreationRequest":{"properties":{"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"type":"string","format":"uuid","title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactSchemaCreationRequest"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactSchemaCreationRequest"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["version","application_id","flow_id","changelog","input_artifacts","output_artifacts"],"title":"VersionCreationRequest"},"VersionCreationResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"}},"type":"object","required":["application_version_id"],"title":"VersionCreationResponse"},"VersionReadResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifact"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifact"},"type":"array","title":"Output Artifacts"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["application_version_id","version","application_id","changelog","input_artifacts","output_artifacts","created_at"],"title":"VersionReadResponse"}},"securitySchemes":{"OAuth2AuthorizationCodeBearer":{"type":"oauth2","flows":{"authorizationCode":{"scopes":{},"authorizationUrl":"https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize","tokenUrl":"https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token"}}}}},"tags":[{"name":"Externals","description":"Called by externals to interact with our API"},{"name":"Algorithms/Apps","description":"Called by the Algorithms and applications to update statuses"},{"name":"Scheduler","description":"Called by the Scheduler"},{"name":"Admins","description":"Called by Admins to manage and register entities"},{"name":"Infrastructure","description":"Called by other Infra"}]} \ No newline at end of file diff --git a/schema/config.json b/schema/config.json new file mode 100644 index 00000000..b3cc9010 --- /dev/null +++ b/schema/config.json @@ -0,0 +1,13 @@ +{ + "globalProperties": { + "models": "", + "modelTests": false, + "modelDocs": false, + "apis": "Externals", + "apiTests": false, + "apiDocs": true, + "supportingFiles": "configuration.py,rest.py,api_client.py,exceptions.py,api_response.py" + }, + "packageName": "aignx.codegen", + "library": "urllib3" +} diff --git a/schema/generate.sh b/schema/generate.sh new file mode 100755 index 00000000..8c7d0939 --- /dev/null +++ b/schema/generate.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# run from platform root +docker run --rm -u "$(id -u):$(id -g)" -v "${PWD}:/local" openapitools/openapi-generator-cli:v7.10.0 generate \ + -i "/local/schema/api.json" \ + -g python \ + -o /local/codegen \ + -c /local/schema/config.json \ +# Hotfix for https://github.com/OpenAPITools/openapi-generator/issues/18932 +ls codegen/aignx/codegen/models/ | awk -F . '/[a-z].py/ {print "from ."$1" import *"}' > codegen/aignx/codegen/models/__init__.py + + + +##!/bin/sh +## obtain token +#TOKEN=$(poetry run python src/aignx/platform/_authentication.py) +## run from platform root +#docker run --rm -u "$(id -u):$(id -g)" -v "${PWD}:/local" openapitools/openapi-generator-cli:v7.10.0 generate \ +# -i "https://platform-dev.aignostics.com/openapi.json" \ +# -g python \ +# -o /local/codegen \ +# -c /local/schema/config.json \ +# -a "Authorization:Bearer $TOKEN" +## Hotfix for https://github.com/OpenAPITools/openapi-generator/issues/18932 +#ls codegen/aignx/codegen/models/ | awk -F . '/[a-z].py/ {print "from ."$1" import *"}' > codegen/aignx/codegen/models/__init__.py diff --git a/src/aignx/platform/__init__.py b/src/aignx/platform/__init__.py new file mode 100644 index 00000000..cc4fa6c8 --- /dev/null +++ b/src/aignx/platform/__init__.py @@ -0,0 +1 @@ +from aignx.platform._client import Client as Client diff --git a/src/aignx/platform/__main__.py b/src/aignx/platform/__main__.py new file mode 100644 index 00000000..cf90b377 --- /dev/null +++ b/src/aignx/platform/__main__.py @@ -0,0 +1,95 @@ +from pathlib import Path + +import aignx.platform +from aignx.codegen.models import ( + ApplicationVersion, + InputArtifactCreationRequest, + ItemCreationRequest, + RunCreationRequest, +) +from aignx.platform.utils import _generate_signed_url + +DEMO_SLIDE_URL = "gs://platform-api-application-test-data/heta/slides/8c7b079e-8b8a-4036-bfde-5818352b503a.tiff" +DOWNLOAD_PATH = (Path(__file__) / "../../../../out").resolve() + + +def printall(list): + for i in list: + print(i) + + +def three_spots_payload(): + return [ + ItemCreationRequest( + reference="1", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", + download_url=_generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" + ), + metadata={ + "checksum_crc32c": "N+LWCg==", + "base_mpp": 0.46499982, + "width": 3728, + "height": 3640, + } + ) + ] + ), + ItemCreationRequest( + reference="2", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", + download_url=_generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/8c7b079e-8b8a-4036-bfde-5818352b503a.tiff" + ), + metadata={ + "checksum_crc32c": "w+ud3g==", + "base_mpp": 0.46499982, + "width": 3616, + "height": 3400, + } + ) + ] + ), + ItemCreationRequest( + reference="3", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", + download_url=_generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/1f4f366f-a2c5-4407-9f5e-23400b22d50e.tiff" + ), + metadata={ + "checksum_crc32c": "Zmx0wA==", + "base_mpp": 0.46499982, + "width": 4016, + "height": 3952, + } + ) + ] + ) + ] + + +def main(): + platform = aignx.platform.Client() + printall(platform.applications.list()) + printall(platform.versions.list(for_application="f7aa7f53-3b4c-476a-bc25-561ef9cfbf6d")) + # # heta v0.3.4 + application_version_id = "8fbd3a43-d08d-41c1-8ad7-90ee69743b9d" + application_run = platform.runs.create( + RunCreationRequest( + application_version=ApplicationVersion(application_version_id), + items=three_spots_payload() + ) + ) + print(application_run) + # run = ApplicationRun.for_application_run_id("0feb2cc6-c6c0-4c31-90ba-e452266f9195") + # run.download_to_folder("/Users/akunft/tmp/papi_pre_alpha") + + +if __name__ == "__main__": + main() diff --git a/src/aignx/platform/_authentication.py b/src/aignx/platform/_authentication.py new file mode 100644 index 00000000..f57440c3 --- /dev/null +++ b/src/aignx/platform/_authentication.py @@ -0,0 +1,208 @@ +import os +import time +import webbrowser +from datetime import datetime, timedelta +from http.server import BaseHTTPRequestHandler, HTTPServer +from pathlib import Path +from urllib import parse +from urllib.parse import urlparse + +import appdirs +import jwt +import requests +from dotenv import load_dotenv +from requests_oauthlib import OAuth2Session + +# load client ids +load_dotenv() + +CLIENT_ID_DEVICE = os.getenv("CLIENT_ID_DEVICE") +CLIENT_ID_INTERACTIVE = os.getenv("CLIENT_ID_INTERACTIVE") +SCOPE = ["offline_access"] # include a refresh token as well +REDIRECT_URI = "http://localhost:8080" # is configured in Auth0 - do not change + +AUDIENCE = "https://dev-8ouohmmrbuh2h4vu-samia" +AUTHORIZATION_BASE_URL = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize" +TOKEN_URL = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" +DEVICE_URL = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/device/code" + +# constants for token caching +CLIENT_APP_NAME = "python-sdk" +CACHE_DIR = appdirs.user_cache_dir(CLIENT_APP_NAME, "aignostics") +TOKEN_FILE = Path(CACHE_DIR) / ".token" + +AUTHORIZATION_BACKOFF_SECONDS = 3 + + +def get_token(store: bool = True): + if not store: + return _login() + + if TOKEN_FILE.exists(): + with open(TOKEN_FILE) as f: + stored_token = f.read() + # Parse stored string "token:expiry_timestamp" + parts = stored_token.split(":") + if len(parts) == 2: + token, expiry_str = parts + expiry = datetime.fromtimestamp(int(expiry_str)) + + # Check if token is still valid (with some buffer time) + if datetime.now() + timedelta(minutes=5) < expiry: + return token + + # If we got here, we need a new token + refresh_token = os.getenv("AIGNX_REFRESH_TOKEN") + if refresh_token: + new_token = _token_from_refresh_token(refresh_token) + else: + new_token = _login() + + # we do not need to verify as we just want to obtain the expiry date + claims = jwt.decode(new_token.encode("ascii"), options={"verify_signature": False}) + timestamp = claims["exp"] + + # Store new token with expiry + TOKEN_FILE.parent.mkdir(parents=True, exist_ok=True) + with open(TOKEN_FILE, "w") as f: + f.write(f"{new_token}:{timestamp}") + + return new_token + + +def _login() -> str: + """Allows the user to login, returns the JSON Web Token.""" + flow_type = "browser" if _can_open_browser() else "device" + if flow_type == "browser": + token = _perform_authorization_code_with_pkce_flow() + else: + token = _perform_device_flow() + assert token.count(".") == 2 + return token + + +def _can_open_browser() -> bool: + launch_browser = False + try: + _ = webbrowser.get() + launch_browser = True + except webbrowser.Error: + launch_browser = False + + return launch_browser + + +class _OAuthHttpServer(HTTPServer): + def __init__(self, *args, **kwargs): + HTTPServer.__init__(self, *args, **kwargs) + self.authorization_code = "" + + +class _OAuthHttpHandler(BaseHTTPRequestHandler): + def do_GET(self): + self.send_response(200) + self.send_header("Content-Type", "text/html") + self.end_headers() + + parsed = parse.urlparse(self.path) + qs = parse.parse_qs(parsed.query) + + response = """ + + {status} + """ + + # see if auth was successful + if "error" in qs: + self.server.error = qs["error"][0] + self.server.error_description = qs["error_description"][0] + status = b"Authentication error" + else: + self.server.error = None + self.server.authorization_code = qs["code"][0] + status = b"Authentication successful" + + # display status in browser and close tab after 2 seconds + response = b""" + + """ + self.wfile.write(response + status) + + def log_message(self, format, *args): + pass + + +def _perform_authorization_code_with_pkce_flow(): + parsed_redirect = urlparse(REDIRECT_URI) + with _OAuthHttpServer( + (parsed_redirect.hostname, parsed_redirect.port), _OAuthHttpHandler + ) as httpd: + # initialize flow (generate code_challenge and code_verifier) + session = OAuth2Session( + CLIENT_ID_INTERACTIVE, scope=SCOPE, redirect_uri=REDIRECT_URI, pkce="S256" + ) + authorization_url, state = session.authorization_url( + AUTHORIZATION_BASE_URL, access_type="offline", audience=AUDIENCE + ) + + # Call Auth0 with challenge and redirect to localhost with code after successful authN + webbrowser.open_new(authorization_url) + + # extract authorization_code from redirected request + httpd.handle_request() + + auth_code = httpd.authorization_code + + # exchange authorization_code against access token at Auth0 (prove identity with code_verifier) + token_response = session.fetch_token(TOKEN_URL, code=auth_code, include_client_id=True) + return token_response["access_token"] + + +def _perform_device_flow(): + resp = requests.post( + DEVICE_URL, data={"client_id": CLIENT_ID_DEVICE, "scope": SCOPE, "audience": AUDIENCE} + ) + device_code = resp.json()["device_code"] + print(f'Please visit: {resp.json()["verification_uri_complete"]}') + + # Polling for access token with received device code + while True: + resp = requests.post( + TOKEN_URL, + headers={"Accept": "application/json"}, + data={ + "grant_type": "urn:ietf:params:oauth:grant-type:device_code", + "device_code": device_code, + "client_id": CLIENT_ID_DEVICE, + }, + ).json() + + if "error" in resp: + if resp["error"] in ("authorization_pending", "slow_down"): + time.sleep(3) + continue + raise RuntimeError(resp["error"]) + return resp["access_token"] + + +def _token_from_refresh_token(refresh_token: str): + while True: + resp = requests.post( + TOKEN_URL, + headers={"Accept": "application/json"}, + data={ + "grant_type": "refresh_token", + "client_id": CLIENT_ID_INTERACTIVE, + "refresh_token": refresh_token, + }, + ).json() + if "error" in resp: + if resp["error"] in ("authorization_pending", "slow_down"): + time.sleep(AUTHORIZATION_BACKOFF_SECONDS) + continue + raise RuntimeError(resp["error"]) + return resp["access_token"] + + +if __name__ == "__main__": + print(get_token()) diff --git a/src/aignx/platform/_client.py b/src/aignx/platform/_client.py new file mode 100644 index 00000000..f8fb9d11 --- /dev/null +++ b/src/aignx/platform/_client.py @@ -0,0 +1,37 @@ +import httpx + +from aignx.codegen.api.externals_api import ExternalsApi +from aignx.codegen.api_client import ApiClient +from aignx.codegen.configuration import Configuration +from aignx.platform._authentication import get_token +from aignx.platform.resources.applications import Applications, Versions +from aignx.platform.resources.runs import Runs + +API_ROOT = "https://platform-dev.aignostics.com" + + +class Client: + def __init__(self): + self._api = Client._get_api_client() + self.applications: Applications = Applications(self._api) + self.versions: Versions = Versions(self._api) + self.runs: Runs = Runs(self._api) + + def _check_health(self): + httpx.get(str(API_ROOT) + "/health") + + @staticmethod + def _get_api_client() -> ExternalsApi: + token = get_token() + client = ApiClient( + Configuration( + host=API_ROOT, + # debug=True, + # the following can be used if the auth is set in the schema + # api_key={"Authorization": T}, + # api_key_prefix={"Authorization": "Bearer"}, + ), + header_name="Authorization", + header_value=f"Bearer {token}" + ) + return ExternalsApi(client) diff --git a/src/aignx/platform/resources/applications.py b/src/aignx/platform/resources/applications.py new file mode 100644 index 00000000..85cb4e30 --- /dev/null +++ b/src/aignx/platform/resources/applications.py @@ -0,0 +1,30 @@ +from aignx.codegen.api.externals_api import ExternalsApi +from aignx.codegen.models import ApplicationVersionReadResponse, VersionReadResponse +from codegen.aignx.codegen.models.application_read_response import ApplicationReadResponse + + +class Versions: + def __init__(self, api: ExternalsApi): + self._api = api + + def list(self, for_application: ApplicationReadResponse | str) -> list[ApplicationVersionReadResponse]: + if isinstance(for_application, ApplicationReadResponse): + application_id = for_application.application_id + else: + application_id = for_application + res = self._api.list_versions_by_application_id_v1_applications_application_id_versions_get(application_id=application_id) + return res + + def __call__(self, for_application_version_id: str) -> VersionReadResponse: + return self._api.get_version_v1_versions_application_version_id_get(application_version_id=for_application_version_id) + + +class Applications: + + def __init__(self, api: ExternalsApi): + self._api = api + self.versions = Versions(self._api) + + def list(self) -> list[ApplicationReadResponse]: + res = self._api.list_applications_v1_applications_get() + return res diff --git a/src/aignx/platform/resources/runs.py b/src/aignx/platform/resources/runs.py new file mode 100644 index 00000000..ecc5df6d --- /dev/null +++ b/src/aignx/platform/resources/runs.py @@ -0,0 +1,197 @@ +import json +from pathlib import Path +from time import sleep + +from jsf import JSF +from jsonschema.exceptions import ValidationError +from jsonschema.validators import validate + +from aignx.codegen.api.externals_api import ExternalsApi +from aignx.codegen.models import ( + ApplicationRunStatus, + ItemResultReadResponse, + ItemStatus, + RunCreationRequest, + RunCreationResponse, + RunReadResponse, +) +from aignx.platform.resources.applications import Versions +from aignx.platform.utils import _calculate_file_crc32c, _download_file, mime_type_to_file_ending + + +class ApplicationRun: + def __init__(self, api: ExternalsApi, application_run_id: str): + self._api = api + self.application_run_id = application_run_id + + @classmethod + def for_application_run_id(cls, application_run_id: str) -> "ApplicationRun": + from aignx.platform import Client + return cls(Client._get_api_client(), application_run_id) + + def status(self) -> RunReadResponse: + res = self._api.get_run_v1_runs_application_run_id_get(self.application_run_id, include=None) + return res + + def item_status(self) -> dict[str, ItemStatus]: + results = self.results() + item_status = {} + for item in results: + item_status[item.reference] = item.status + return item_status + + def cancel(self): + res = self._api.cancel_run_v1_runs_application_run_id_cancel_post(self.application_run_id) + + def results(self) -> list[ItemResultReadResponse]: + # TODO(andreas): paging, sorting + res = self._api.list_run_results_v1_runs_application_run_id_results_get(self.application_run_id) + return res + + def download_to_folder(self, download_base: Path | str): + # create application run base folder + download_base = Path(download_base) + if not download_base.is_dir(): + raise ValueError(f"{download_base} is not a directory") + application_run_dir = Path(download_base) / self.application_run_id + + # incrementally check for available results + application_run_status = self.status().status + while application_run_status == ApplicationRunStatus.RUNNING: + for item in self.results(): + if item.status == ItemStatus.SUCCEEDED: + self.ensure_artifacts_downloaded(application_run_dir, item) + sleep(5) + application_run_status = self.status().status + print(self) + + # check if last results have been downloaded yet and report on errors + for item in self.results(): + match item.status: + case ItemStatus.SUCCEEDED: + self.ensure_artifacts_downloaded(application_run_dir, item) + case ItemStatus.ERROR_SYSTEM | ItemStatus.ERROR_USER: + print(f"{item.reference} failed with {item.status.value}: {item.error}") + + @staticmethod + def ensure_artifacts_downloaded(base_folder: Path, item: ItemResultReadResponse): + item_dir = base_folder / item.reference + + downloaded_at_least_one_artifact = False + for artifact in item.output_artifacts: + if artifact.download_url: + item_dir.mkdir(exist_ok=True, parents=True) + file_ending = mime_type_to_file_ending(artifact.mime_type) + file_path = item_dir / f"{artifact.name}{file_ending}" + checksum = artifact.metadata["checksum_crc32c"] + + if file_path.exists(): + file_checksum = _calculate_file_crc32c(file_path) + if file_checksum != checksum: + print(f"> Resume download for {artifact.name} to {file_path}") + else: + continue + else: + downloaded_at_least_one_artifact = True + print(f"> Download for {artifact.name} to {file_path}") + + # if file is not there at all or only partially downloaded yet + _download_file(artifact.download_url, file_path, checksum) + + if downloaded_at_least_one_artifact: + print(f"Downloaded results for item: {item.reference} to {item_dir}") + else: + print(f"Results for item: {item.reference} already present in {item_dir}") + + def __str__(self): + app_status = self.status().status.value + item_status = self.item_status() + pending, succeeded, error = 0, 0, 0 + for item in item_status.values(): + match item: + case ItemStatus.PENDING: + pending += 1 + case ItemStatus.SUCCEEDED: + succeeded += 1 + case ItemStatus.ERROR_USER | ItemStatus.ERROR_SYSTEM: + error += 1 + + items = f"{len(item_status)} items - ({pending}/{succeeded}/{error}) [pending/succeeded/error]" + return f"Application run `{self.application_run_id}`: {app_status}, {items}" + + +class Runs: + def __init__(self, api: ExternalsApi): + self._api = api + + def __call__(self, application_run_id: str) -> ApplicationRun: + return ApplicationRun(self._api, application_run_id) + + def create(self, payload: RunCreationRequest) -> ApplicationRun: + self._validate_input_items(payload) + res: RunCreationResponse = self._api.create_application_run_v1_runs_post(payload) + return ApplicationRun(self._api, res.application_run_id) + + def generate_example_payload(self, application_version_id: str): + app_version = Versions(self._api)(for_application_version_id=application_version_id) + schema_idx = { + input_artifact.name: input_artifact.metadata_schema + for input_artifact in app_version.input_artifacts + } + schema = RunCreationRequest.model_json_schema() + faker = JSF(schema) + example = faker.generate() + print(json.dumps(example, indent=2)) + # schema = ItemCreationRequest.model_json_schema() + # example = jsonschema_default.create_from(schema) + # print(json.dumps(example, indent=2)) + # + # schema = InputArtifactCreationRequest.model_json_schema() + # example = jsonschema_default.create_from(schema) + # print(json.dumps(example, indent=2)) + # + # for artifact, schema in schema_idx.items(): + # s = jsonschema_default.create_from(schema) + # print(f"{artifact}:\n{json.dumps(s)}") + # validate(artifact.metadata, schema=schema_idx[artifact.name]) + + def list(self, for_application_version: str = None) -> list[ApplicationRun]: + # TODO(andreas): pagination + if not for_application_version: + res = self._api.list_application_runs_v1_runs_get() + else: + res = self._api.list_application_runs_v1_runs_get_with_http_info(for_application_version) + return [ + ApplicationRun(self._api, response.application_run_id) + for response in res + ] + + def _validate_input_items(self, payload: RunCreationRequest): + # validate metadata based on schema of application version + app_version = Versions(self._api)(for_application_version_id=payload.application_version.actual_instance) + schema_idx = { + input_artifact.name: input_artifact.metadata_schema + for input_artifact in app_version.input_artifacts + } + references = set() + for item in payload.items: + # verify references are unique + if item.reference in references: + raise ValueError(f"Duplicate reference `{item.reference}` in items.") + references.add(item.reference) + + schema_check = set(schema_idx.keys()) + for artifact in item.input_artifacts: + # check if artifact is in schema + if artifact.name not in schema_idx: + msg = f"Invalid artifact `{artifact.name}`, application version requires: {schema_idx.keys()}" + raise ValueError(msg) + try: + # validate metadata + validate(artifact.metadata, schema=schema_idx[artifact.name]) + schema_check.remove(artifact.name) + except ValidationError as e: + raise ValueError(f"Invalid metadata for artifact `{artifact.name}`: {e.message}") + # all artifacts set? + if len(schema_check) > 0: + raise ValueError(f"Missing artifact(s): {schema_check}") diff --git a/src/aignx/platform/utils.py b/src/aignx/platform/utils.py new file mode 100644 index 00000000..16348d62 --- /dev/null +++ b/src/aignx/platform/utils.py @@ -0,0 +1,87 @@ +import base64 +import contextlib +import datetime +import re +import tempfile +from collections.abc import Generator +from pathlib import Path +from typing import IO, Any + +import google_crc32c +import requests +from google.cloud import storage +from tqdm.auto import tqdm + +EIGHT_MB = 8_388_608 + + +def mime_type_to_file_ending(mime_type: str) -> str: + """ + Convert a mime type to a file ending. + """ + if mime_type == "image/png": + return ".png" + if mime_type == "image/tiff": + return ".tiff" + if mime_type == "application/vnd.apache.parquet": + return ".parquet" + if mime_type == "application/geo+json" or mime_type == "application/json": + return ".json" + if mime_type == "text/csv": + return ".csv" + raise ValueError(f"Unknown mime type: {mime_type}") + + +def _download_file(signed_url: str, file_path: str, verify_checksum: str) -> None: + checksum = google_crc32c.Checksum() + with requests.get(signed_url, stream=True) as stream: + stream.raise_for_status() + with open(file_path, "wb") as file: + total_size = int(stream.headers.get("content-length", 0)) + progress_bar = tqdm(total=total_size, unit="B", unit_scale=True) + for chunk in stream.iter_content(chunk_size=EIGHT_MB): + if chunk: + file.write(chunk) + checksum.update(chunk) + progress_bar.update(len(chunk)) + progress_bar.close() + downloaded_file = base64.b64encode(checksum.digest()).decode("ascii") + if downloaded_file != verify_checksum: + raise ValueError(f"Checksum mismatch: {downloaded_file} != {verify_checksum}") + + +def _generate_signed_url(fully_qualified_gs_path: str): + pattern = r"gs://(?P[^/]+)/(?P.*)" + m = re.fullmatch(pattern, fully_qualified_gs_path) + if not m: + raise ValueError("Invalid google storage URI") + bucket_name = m.group(1) + path = m.group(2) + + storage_client = storage.Client() + bucket = storage_client.bucket(bucket_name) + blob = bucket.blob(path) + if not blob.exists(): + raise ValueError(f"Blob does not exist: {fully_qualified_gs_path}") + + url = blob.generate_signed_url( + expiration=datetime.timedelta(hours=1), + method="GET", + version="v4" + ) + return url + + +def _calculate_file_crc32c(file: Path) -> str: + checksum = google_crc32c.Checksum() + with open(file, "rb") as file: + for _ in checksum.consume(file, EIGHT_MB): + pass + return base64.b64encode(checksum.digest()).decode("ascii") + + +@contextlib.contextmanager +def download_temporarily(signed_url: str, verify_checksum: str) -> Generator[IO[bytes], Any, None]: + with tempfile.NamedTemporaryFile() as file: + _download_file(signed_url, file.name, verify_checksum) + yield file diff --git a/tests/aignx/platform/applications_test.py b/tests/aignx/platform/applications_test.py new file mode 100644 index 00000000..71a4d7b1 --- /dev/null +++ b/tests/aignx/platform/applications_test.py @@ -0,0 +1,121 @@ +from unittest.mock import Mock + +import pytest + +from aignx.codegen.api.externals_api import ExternalsApi +from aignx.codegen.models import ApplicationVersionReadResponse +from aignx.platform.resources.applications import Applications, Versions +from codegen.aignx.codegen.models.application_read_response import ApplicationReadResponse + + +@pytest.fixture +def mock_api(): + return Mock(spec=ExternalsApi) + + +@pytest.fixture +def applications(mock_api): + return Applications(mock_api) + + +# @pytest.mark.specifications("SAM-56") +# @pytest.mark.labels("custom-label") +@pytest.mark.requirements("SAM-2") +@pytest.mark.description("Verifies that the applications list method returns an empty list when the API returns no applications") +def test_applications_list_returns_empty_list_when_no_applications(applications, mock_api): + # Arrange + mock_api.list_applications_v1_applications_get.return_value = [] + + # Act + result = applications.list() + + # Assert + assert isinstance(result, list) + assert len(result) == 0 + mock_api.list_applications_v1_applications_get.assert_called_once() + + +def test_applications_list_returns_applications_when_available(applications, mock_api): + # Arrange + mock_app1 = Mock(spec=ApplicationReadResponse) + mock_app2 = Mock(spec=ApplicationReadResponse) + mock_api.list_applications_v1_applications_get.return_value = [mock_app1, mock_app2] + + # Act + result = applications.list() + + # Assert + assert isinstance(result, list) + assert len(result) == 2 + assert result[0] == mock_app1 + assert result[1] == mock_app2 + mock_api.list_applications_v1_applications_get.assert_called_once() + + +def test_applications_list_passes_through_api_exception(applications, mock_api): + # Arrange + mock_api.list_applications_v1_applications_get.side_effect = Exception("API error") + + # Act & Assert + with pytest.raises(Exception, match="API error"): + applications.list() + mock_api.list_applications_v1_applications_get.assert_called_once() + + +def test_versions_property_returns_versions_instance(applications): + # Act + versions = applications.versions + + # Assert + assert isinstance(versions, Versions) + assert versions._api == applications._api + + +def test_versions_list_returns_versions_for_application(mock_api): + # Arrange + versions = Versions(mock_api) + mock_app = Mock(spec=ApplicationReadResponse) + mock_app.application_id = "test-app-id" + mock_version = Mock(spec=ApplicationVersionReadResponse) + mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.return_value = [mock_version] + + # Act + result = versions.list(for_application=mock_app) + + # Assert + assert isinstance(result, list) + assert len(result) == 1 + assert result[0] == mock_version + mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.assert_called_once_with( + application_id=mock_app.application_id + ) + + +def test_versions_list_returns_empty_list_when_no_versions(mock_api): + # Arrange + versions = Versions(mock_api) + mock_app = Mock(spec=ApplicationReadResponse) + mock_app.application_id = "test-app-id" + mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.return_value = [] + + # Act + result = versions.list(for_application=mock_app) + + # Assert + assert isinstance(result, list) + assert len(result) == 0 + mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.assert_called_once_with( + application_id=mock_app.application_id + ) + + +def test_versions_list_passes_through_api_exception(mock_api): + # Arrange + versions = Versions(mock_api) + mock_app = Mock(spec=ApplicationReadResponse) + mock_app.application_id = "test-app-id" + mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.side_effect = Exception("API error") + + # Act & Assert + with pytest.raises(Exception, match="API error"): + versions.list(for_application=mock_app) diff --git a/tests/aignx/platform/two_task_dummy_app_test.py b/tests/aignx/platform/two_task_dummy_app_test.py new file mode 100644 index 00000000..0d821ce6 --- /dev/null +++ b/tests/aignx/platform/two_task_dummy_app_test.py @@ -0,0 +1,113 @@ +import tempfile +from pathlib import Path + +import pytest + +import aignx.platform +from aignx.codegen.models import ( + ApplicationRunStatus, + ApplicationVersion, + InputArtifactCreationRequest, + ItemCreationRequest, + ItemStatus, + RunCreationRequest, +) +from aignx.platform.utils import _calculate_file_crc32c, _generate_signed_url, mime_type_to_file_ending + + +def three_spots_payload(): + return [ + ItemCreationRequest( + reference="1", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", + download_url=_generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" + ), + metadata={ + "checksum_crc32c": "N+LWCg==", + "base_mpp": 0.46499982, + "width": 3728, + "height": 3640, + } + ) + ] + ), + ItemCreationRequest( + reference="2", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", + download_url=_generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/8c7b079e-8b8a-4036-bfde-5818352b503a.tiff" + ), + metadata={ + "checksum_crc32c": "w+ud3g==", + "base_mpp": 0.46499982, + "width": 3616, + "height": 3400, + } + ) + ] + ), + ItemCreationRequest( + reference="3", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", + download_url=_generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/1f4f366f-a2c5-4407-9f5e-23400b22d50e.tiff" + ), + metadata={ + "checksum_crc32c": "Zmx0wA==", + "base_mpp": 0.46499982, + "width": 4016, + "height": 3952, + } + ) + ] + ) + ] + + +@pytest.mark.timeout(240) +def test_two_task_dummy_app(): + application_version = "60e7b441-307a-4b41-8a97-5b02e7bc73a4" + print(f"Create application run for application version: {application_version}") + platform = aignx.platform.Client() + application_run = platform.runs.create( + RunCreationRequest( + application_version=ApplicationVersion(application_version), + items=three_spots_payload() + ) + ) + + with tempfile.TemporaryDirectory() as dir: + dir = Path(dir) + application_run.download_to_folder(dir) + + assert application_run.status().status == ApplicationRunStatus.COMPLETED, "Application run did not finish in completed status" + + run_result_folder = dir / application_run.application_run_id + assert run_result_folder.exists(), "Application run result folder does not exist" + + run_results = application_run.results() + + for item in run_results: + # validate status + assert item.status == ItemStatus.SUCCEEDED + # validate results + item_dir = run_result_folder / item.reference + assert item_dir.exists(), f"Result folder for item {item.reference} does not exist" + + for artifact in item.output_artifacts: + assert artifact.download_url is not None, f"{artifact} should provide an download url" + # check if file exists + file_ending = mime_type_to_file_ending(artifact.mime_type) + file_path = item_dir / f"{artifact.name}{file_ending}" + assert file_path.exists(), f"Artifact {artifact} was not downloaded" + # validate checksum + checksum = artifact.metadata["checksum_crc32c"] + file_checksum = _calculate_file_crc32c(file_path) + assert file_checksum == checksum, f"Metadata checksum != file checksum {checksum} <> {file_checksum}" From e36561e6a67409d26ce3c3682fbed9b24796fc3e Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 09:14:32 +0200 Subject: [PATCH 002/110] chore: prep for bump --- ATTRIBUTIONS.md | 2 +- pyproject.toml | 27 +++- uv.lock | 376 +++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 400 insertions(+), 5 deletions(-) diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index ad87801e..c1861643 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -337,7 +337,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## aignostics (0.0.10) - MIT License +## aignostics (0.0.9) - MIT License 🔬 Python SDK providing access to Aignostics AI services. diff --git a/pyproject.toml b/pyproject.toml index 902909e8..eee48884 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,10 +62,27 @@ classifiers = [ requires-python = ">=3.11, <4.0" dependencies = [ + # From template "fastapi[standard,all]>=0.115.12", "pydantic>=2.10.6", "pydantic-settings>=2.8.1", "typer>=0.15.1", + # Custom + "appdirs>=1.4.4", + "google-cloud-storage>=3.1.0", + "google-crc32c>=1.7.1", + "httpx>=0.28.1", + "jsf>=0.11.2", + "jsonschema>=4.23.0", + "pyjwt>=2.10.1", + "pyrfc6266>=1.0.2", + "python-dateutil>=2.9.0.post0", + "python-dotenv>=1.1.0", # Can be removed later + "requests>=2.32.3", + "requests-oauthlib>=2.0.0", + "tifffile>=2025.1.10", + "tqdm>=4.67.1", + "urllib3>=2.2.3", ] [project.scripts] @@ -236,10 +253,18 @@ asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" env = ["COVERAGE_FILE=.coverage", "COVERAGE_PROCESS_START=pyproject.toml"] markers = [ - "sequential: exclude from parallel test execution", + # From Template "no_extras: tests that do require no extras installed", + "sequential: exclude from parallel test execution", + # Custom + # Nothing yet + "description: textual description what the test does, goes in `description` field in the Jira ticket - optional", + "labels: mark test with labels that are attached to the test tickets in Jira - optional; comma-separated", + "requirements: mark tests with ids (e.g., PAPI-123, HETA-123) of requirements in Jira. The test will be linked to them - optional; comma-separated", + "specifications: mark test with ids (e.g., PAPI-123, HETA-123) of specifications in Jira. The test will be linked to them - optional; comma-separated", ] + [tool.coverage.run] sigterm = true relative_files = true diff --git a/uv.lock b/uv.lock index cdbd3a65..501ce559 100644 --- a/uv.lock +++ b/uv.lock @@ -15,10 +15,25 @@ name = "aignostics" version = "0.0.10" source = { editable = "." } dependencies = [ + { name = "appdirs" }, { name = "fastapi", extra = ["all", "standard"] }, + { name = "google-cloud-storage" }, + { name = "google-crc32c" }, + { name = "httpx" }, + { name = "jsf" }, + { name = "jsonschema" }, { name = "pydantic" }, { name = "pydantic-settings" }, + { name = "pyjwt" }, + { name = "pyrfc6266" }, + { name = "python-dateutil" }, + { name = "python-dotenv" }, + { name = "requests" }, + { name = "requests-oauthlib" }, + { name = "tifffile" }, + { name = "tqdm" }, { name = "typer" }, + { name = "urllib3" }, ] [package.optional-dependencies] @@ -71,14 +86,29 @@ dev = [ [package.metadata] requires-dist = [ + { name = "appdirs", specifier = ">=1.4.4" }, { name = "fastapi", extras = ["standard", "all"], specifier = ">=0.115.12" }, + { name = "google-cloud-storage", specifier = ">=3.1.0" }, + { name = "google-crc32c", specifier = ">=1.7.1" }, + { name = "httpx", specifier = ">=0.28.1" }, { name = "jinja2", marker = "extra == 'examples'", specifier = ">=3.1.6" }, + { name = "jsf", specifier = ">=0.11.2" }, + { name = "jsonschema", specifier = ">=4.23.0" }, { name = "jupyter", marker = "extra == 'examples'", specifier = ">=1.1.1" }, { name = "marimo", marker = "extra == 'examples'", specifier = ">=0.11.28" }, { name = "pydantic", specifier = ">=2.10.6" }, { name = "pydantic-settings", specifier = ">=2.8.1" }, + { name = "pyjwt", specifier = ">=2.10.1" }, + { name = "pyrfc6266", specifier = ">=1.0.2" }, + { name = "python-dateutil", specifier = ">=2.9.0.post0" }, + { name = "python-dotenv", specifier = ">=1.1.0" }, + { name = "requests", specifier = ">=2.32.3" }, + { name = "requests-oauthlib", specifier = ">=2.0.0" }, { name = "streamlit", marker = "extra == 'examples'", specifier = ">=1.44.0" }, + { name = "tifffile", specifier = ">=2025.1.10" }, + { name = "tqdm", specifier = ">=4.67.1" }, { name = "typer", specifier = ">=0.15.1" }, + { name = "urllib3", specifier = ">=2.2.3" }, ] provides-extras = ["examples"] @@ -198,6 +228,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/9f/fa9971d2a0c6fef64c87ba362a493a4f230eff4ea8dfb9f4c7cbdf71892e/apeye_core-1.1.5-py3-none-any.whl", hash = "sha256:dc27a93f8c9e246b3b238c5ea51edf6115ab2618ef029b9f2d9a190ec8228fbf", size = 99286 }, ] +[[package]] +name = "appdirs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 }, +] + [[package]] name = "appnope" version = "0.1.4" @@ -929,6 +968,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 }, ] +[[package]] +name = "faker" +version = "37.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/a6/b77f42021308ec8b134502343da882c0905d725a4d661c7adeaf7acaf515/faker-37.1.0.tar.gz", hash = "sha256:ad9dc66a3b84888b837ca729e85299a96b58fdaef0323ed0baace93c9614af06", size = 1875707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/a1/8936bc8e79af80ca38288dd93ed44ed1f9d63beb25447a4c59e746e01f8d/faker-37.1.0-py3-none-any.whl", hash = "sha256:dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c", size = 1918783 }, +] + [[package]] name = "fastapi" version = "0.115.12" @@ -1102,6 +1153,117 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599 }, ] +[[package]] +name = "google-api-core" +version = "2.24.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "googleapis-common-protos" }, + { name = "proto-plus" }, + { name = "protobuf" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/5c/085bcb872556934bb119e5e09de54daa07873f6866b8f0303c49e72287f7/google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696", size = 163516 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/95/f472d85adab6e538da2025dfca9e976a0d125cc0af2301f190e77b76e51c/google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9", size = 160061 }, +] + +[[package]] +name = "google-auth" +version = "2.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachetools" }, + { name = "pyasn1-modules" }, + { name = "rsa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/eb/d504ba1daf190af6b204a9d4714d457462b486043744901a6eeea711f913/google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4", size = 270866 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/47/603554949a37bca5b7f894d51896a9c534b9eab808e2520a748e081669d0/google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a", size = 210770 }, +] + +[[package]] +name = "google-cloud-core" +version = "2.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core" }, + { name = "google-auth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/b8/2b53838d2acd6ec6168fd284a990c76695e84c65deee79c9f3a4276f6b4f/google_cloud_core-2.4.3.tar.gz", hash = "sha256:1fab62d7102844b278fe6dead3af32408b1df3eb06f5c7e8634cbd40edc4da53", size = 35861 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/86/bda7241a8da2d28a754aad2ba0f6776e35b67e37c36ae0c45d49370f1014/google_cloud_core-2.4.3-py2.py3-none-any.whl", hash = "sha256:5130f9f4c14b4fafdff75c79448f9495cfade0d8775facf1b09c3bf67e027f6e", size = 29348 }, +] + +[[package]] +name = "google-cloud-storage" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core" }, + { name = "google-auth" }, + { name = "google-cloud-core" }, + { name = "google-crc32c" }, + { name = "google-resumable-media" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/08/52143124415a889bbab60a8ecede1e31ea0e8d992ca078317886f26dc3be/google_cloud_storage-3.1.0.tar.gz", hash = "sha256:944273179897c7c8a07ee15f2e6466a02da0c7c4b9ecceac2a26017cb2972049", size = 7666527 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/b8/c99c965659f45efa73080477c49ffddf7b9aecb00806be8422560bb5b824/google_cloud_storage-3.1.0-py2.py3-none-any.whl", hash = "sha256:eaf36966b68660a9633f03b067e4a10ce09f1377cae3ff9f2c699f69a81c66c6", size = 174861 }, +] + +[[package]] +name = "google-crc32c" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/ae/87802e6d9f9d69adfaedfcfd599266bf386a54d0be058b532d04c794f76d/google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472", size = 14495 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/94/220139ea87822b6fdfdab4fb9ba81b3fff7ea2c82e2af34adc726085bffc/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06", size = 30468 }, + { url = "https://files.pythonhosted.org/packages/94/97/789b23bdeeb9d15dc2904660463ad539d0318286d7633fe2760c10ed0c1c/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9", size = 30313 }, + { url = "https://files.pythonhosted.org/packages/81/b8/976a2b843610c211e7ccb3e248996a61e87dbb2c09b1499847e295080aec/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77", size = 33048 }, + { url = "https://files.pythonhosted.org/packages/c9/16/a3842c2cf591093b111d4a5e2bfb478ac6692d02f1b386d2a33283a19dc9/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53", size = 32669 }, + { url = "https://files.pythonhosted.org/packages/04/17/ed9aba495916fcf5fe4ecb2267ceb851fc5f273c4e4625ae453350cfd564/google_crc32c-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d", size = 33476 }, + { url = "https://files.pythonhosted.org/packages/dd/b7/787e2453cf8639c94b3d06c9d61f512234a82e1d12d13d18584bd3049904/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194", size = 30470 }, + { url = "https://files.pythonhosted.org/packages/ed/b4/6042c2b0cbac3ec3a69bb4c49b28d2f517b7a0f4a0232603c42c58e22b44/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e", size = 30315 }, + { url = "https://files.pythonhosted.org/packages/29/ad/01e7a61a5d059bc57b702d9ff6a18b2585ad97f720bd0a0dbe215df1ab0e/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337", size = 33180 }, + { url = "https://files.pythonhosted.org/packages/3b/a5/7279055cf004561894ed3a7bfdf5bf90a53f28fadd01af7cd166e88ddf16/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65", size = 32794 }, + { url = "https://files.pythonhosted.org/packages/0f/d6/77060dbd140c624e42ae3ece3df53b9d811000729a5c821b9fd671ceaac6/google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6", size = 33477 }, + { url = "https://files.pythonhosted.org/packages/8b/72/b8d785e9184ba6297a8620c8a37cf6e39b81a8ca01bb0796d7cbb28b3386/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35", size = 30467 }, + { url = "https://files.pythonhosted.org/packages/34/25/5f18076968212067c4e8ea95bf3b69669f9fc698476e5f5eb97d5b37999f/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638", size = 30309 }, + { url = "https://files.pythonhosted.org/packages/92/83/9228fe65bf70e93e419f38bdf6c5ca5083fc6d32886ee79b450ceefd1dbd/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb", size = 33133 }, + { url = "https://files.pythonhosted.org/packages/c3/ca/1ea2fd13ff9f8955b85e7956872fdb7050c4ace8a2306a6d177edb9cf7fe/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6", size = 32773 }, + { url = "https://files.pythonhosted.org/packages/89/32/a22a281806e3ef21b72db16f948cad22ec68e4bdd384139291e00ff82fe2/google_crc32c-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db", size = 33475 }, + { url = "https://files.pythonhosted.org/packages/b8/c5/002975aff514e57fc084ba155697a049b3f9b52225ec3bc0f542871dd524/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3", size = 33243 }, + { url = "https://files.pythonhosted.org/packages/61/cb/c585282a03a0cea70fcaa1bf55d5d702d0f2351094d663ec3be1c6c67c52/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9", size = 32870 }, + { url = "https://files.pythonhosted.org/packages/16/1b/1693372bf423ada422f80fd88260dbfd140754adb15cbc4d7e9a68b1cb8e/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48", size = 28241 }, + { url = "https://files.pythonhosted.org/packages/fd/3c/2a19a60a473de48717b4efb19398c3f914795b64a96cf3fbe82588044f78/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82", size = 28048 }, +] + +[[package]] +name = "google-resumable-media" +version = "2.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-crc32c" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/5a/0efdc02665dca14e0837b62c8a1a93132c264bd02054a15abb2218afe0ae/google_resumable_media-2.7.2.tar.gz", hash = "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0", size = 2163099 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/35/b8d3baf8c46695858cb9d8835a53baa1eeb9906ddaf2f728a5f5b640fd1e/google_resumable_media-2.7.2-py2.py3-none-any.whl", hash = "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa", size = 81251 }, +] + +[[package]] +name = "googleapis-common-protos" +version = "1.69.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1b/d7/ee9d56af4e6dbe958562b5020f46263c8a4628e7952070241fc0e9b182ae/googleapis_common_protos-1.69.2.tar.gz", hash = "sha256:3e1b904a27a33c821b4b749fd31d334c0c9c30e6113023d495e48979a3dc9c5f", size = 144496 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/53/d35476d547a286506f0a6a634ccf1e5d288fffd53d48f0bd5fef61d68684/googleapis_common_protos-1.69.2-py3-none-any.whl", hash = "sha256:0b30452ff9c7a27d80bfc5718954063e8ab53dd3697093d3bc99581f5fd24212", size = 293215 }, +] + [[package]] name = "h11" version = "0.14.0" @@ -1336,6 +1498,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, ] +[[package]] +name = "jsf" +version = "0.11.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "faker" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "rstr" }, + { name = "smart-open", extra = ["http"] }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/34/cf272dfe4277ce03b275bb9f5e99001b31db01b21c290fd262333c96e34a/jsf-0.11.2.tar.gz", hash = "sha256:07055b363281d38ce871a9256a00587d8472802c5108721a7fe5884465104b5d", size = 29837 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/ae/7435288ab8b3059823afa48508ddf658c27d96deb8a978498103ccd71ca8/jsf-0.11.2-py3-none-any.whl", hash = "sha256:b4472c8c2d776eb3e0bb08368caa6ae0ead7ea78b20653facc07b6d93768612c", size = 49322 }, +] + [[package]] name = "json5" version = "0.10.0" @@ -2189,6 +2368,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3e/05/eb7eec66b95cf697f08c754ef26c3549d03ebd682819f794cb039574a0a6/numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", size = 12739119 }, ] +[[package]] +name = "oauthlib" +version = "3.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918", size = 177352 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688 }, +] + [[package]] name = "orjson" version = "3.10.15" @@ -2513,6 +2701,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 }, ] +[[package]] +name = "proto-plus" +version = "1.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163 }, +] + [[package]] name = "protobuf" version = "5.29.4" @@ -2607,6 +2807,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ed/bd/54907846383dcc7ee28772d7e646f6c34276a17da740002a5cefe90f04f7/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8", size = 42085744 }, ] +[[package]] +name = "pyasn1" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135 }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259 }, +] + [[package]] name = "pycparser" version = "2.22" @@ -2769,6 +2990,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, ] +[[package]] +name = "pyjwt" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997 }, +] + [[package]] name = "pymdown-extensions" version = "10.14.3" @@ -2784,11 +3014,23 @@ wheels = [ [[package]] name = "pyparsing" -version = "3.2.1" +version = "3.0.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8b/1a/3544f4f299a47911c2ab3710f534e52fea62a633c96806995da5d25be4b2/pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a", size = 1067694 } +sdist = { url = "https://files.pythonhosted.org/packages/71/22/207523d16464c40a0310d2d4d8926daffa00ac1f5b1576170a32db749636/pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", size = 1999906 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/a7/c8a2d361bf89c0d9577c934ebb7421b25dc84bf3a8e3ac0a40aed9acc547/pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", size = 107716 }, + { url = "https://files.pythonhosted.org/packages/6c/10/a7d0fa5baea8fe7b50f448ab742f26f52b80bfca85ac2be9d35cdd9a3246/pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc", size = 98338 }, +] + +[[package]] +name = "pyrfc6266" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/ef/693fe33d34317facaf26a5716f965dac492d0f47e56e90bf310d7d4e74df/pyrfc6266-1.0.2.tar.gz", hash = "sha256:3c41616b6a1f2e9a26df7f005fbaa634f960121769ccc4445acfb404e9f8fd4c", size = 4454 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/fc/d416c1bfb54f86259f631fd9ff6a9b813f7050129a377d94c43500109479/pyrfc6266-1.0.2-py3-none-any.whl", hash = "sha256:0532307f319566f337dba97577dfaefe493c3e0c40ab211449ba4566fc2cf73d", size = 4729 }, ] [[package]] @@ -3134,6 +3376,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, ] +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "oauthlib" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179 }, +] + [[package]] name = "rfc3339-validator" version = "0.1.4" @@ -3274,6 +3529,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/68/15/6d22d07e063ce5e9bfbd96db9ec2fbb4693591b4503e3a76996639474d02/rpds_py-0.23.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d6f6512a90bd5cd9030a6237f5346f046c6f0e40af98657568fa45695d4de59d", size = 235415 }, ] +[[package]] +name = "rsa" +version = "4.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/65/7d973b89c4d2351d7fb232c2e452547ddfa243e93131e7cfa766da627b52/rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21", size = 29711 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", size = 34315 }, +] + +[[package]] +name = "rstr" +version = "3.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/80/d7449656d45a776b7a443ce3af4eb97c4debe416a1a80f60311c7cfd02ff/rstr-3.2.2.tar.gz", hash = "sha256:c4a564d4dfb4472d931d145c43d1cf1ad78c24592142e7755b8866179eeac012", size = 13560 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/8c/a0f14f2fcdd846839c478048032b2fc93293deaa936ff6751f27dcf50995/rstr-3.2.2-py3-none-any.whl", hash = "sha256:f39195d38da1748331eeec52f1276e71eb6295e7949beea91a5e9af2340d7b3b", size = 10030 }, +] + [[package]] name = "ruamel-yaml" version = "0.18.10" @@ -3382,6 +3658,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, ] +[[package]] +name = "smart-open" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/30/1f41c3d3b8cec82024b4b277bfd4e5b18b765ae7279eb9871fa25c503778/smart_open-7.1.0.tar.gz", hash = "sha256:a4f09f84f0f6d3637c6543aca7b5487438877a21360e7368ccf1f704789752ba", size = 72044 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/18/9a8d9f01957aa1f8bbc5676d54c2e33102d247e146c1a3679d3bd5cc2e3a/smart_open-7.1.0-py3-none-any.whl", hash = "sha256:4b8489bb6058196258bafe901730c7db0dcf4f083f316e97269c66f45502055b", size = 61746 }, +] + +[package.optional-dependencies] +http = [ + { name = "requests" }, +] + [[package]] name = "smmap" version = "5.0.2" @@ -3816,6 +4109,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154 }, ] +[[package]] +name = "tifffile" +version = "2025.3.30" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3c/54/d5ebe66a9de349b833e570e87bdbd9eec76ec54bd505c24b0591a15783ad/tifffile-2025.3.30.tar.gz", hash = "sha256:3cdee47fe06cd75367c16bc3ff34523713156dae6cd498e3a392e5b39a51b789", size = 366039 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/be/10d23cfd4078fbec6aba768a357eff9e70c0b6d2a07398425985c524ad2a/tifffile-2025.3.30-py3-none-any.whl", hash = "sha256:0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c", size = 226837 }, +] + [[package]] name = "tinycss2" version = "1.4.0" @@ -3903,6 +4208,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, ] +[[package]] +name = "tqdm" +version = "4.67.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, +] + [[package]] name = "traitlets" version = "5.14.3" @@ -4282,3 +4599,56 @@ sdist = { url = "https://files.pythonhosted.org/packages/56/fc/238c424fd7f4ebb25 wheels = [ { url = "https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71", size = 2335872 }, ] + +[[package]] +name = "wrapt" +version = "1.17.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/f7/a2aab2cbc7a665efab072344a8949a71081eed1d2f451f7f7d2b966594a2/wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58", size = 53308 }, + { url = "https://files.pythonhosted.org/packages/50/ff/149aba8365fdacef52b31a258c4dc1c57c79759c335eff0b3316a2664a64/wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda", size = 38488 }, + { url = "https://files.pythonhosted.org/packages/65/46/5a917ce85b5c3b490d35c02bf71aedaa9f2f63f2d15d9949cc4ba56e8ba9/wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438", size = 38776 }, + { url = "https://files.pythonhosted.org/packages/ca/74/336c918d2915a4943501c77566db41d1bd6e9f4dbc317f356b9a244dfe83/wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a", size = 83776 }, + { url = "https://files.pythonhosted.org/packages/09/99/c0c844a5ccde0fe5761d4305485297f91d67cf2a1a824c5f282e661ec7ff/wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000", size = 75420 }, + { url = "https://files.pythonhosted.org/packages/b4/b0/9fc566b0fe08b282c850063591a756057c3247b2362b9286429ec5bf1721/wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6", size = 83199 }, + { url = "https://files.pythonhosted.org/packages/9d/4b/71996e62d543b0a0bd95dda485219856def3347e3e9380cc0d6cf10cfb2f/wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b", size = 82307 }, + { url = "https://files.pythonhosted.org/packages/39/35/0282c0d8789c0dc9bcc738911776c762a701f95cfe113fb8f0b40e45c2b9/wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662", size = 75025 }, + { url = "https://files.pythonhosted.org/packages/4f/6d/90c9fd2c3c6fee181feecb620d95105370198b6b98a0770cba090441a828/wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72", size = 81879 }, + { url = "https://files.pythonhosted.org/packages/8f/fa/9fb6e594f2ce03ef03eddbdb5f4f90acb1452221a5351116c7c4708ac865/wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317", size = 36419 }, + { url = "https://files.pythonhosted.org/packages/47/f8/fb1773491a253cbc123c5d5dc15c86041f746ed30416535f2a8df1f4a392/wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3", size = 38773 }, + { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799 }, + { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821 }, + { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919 }, + { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721 }, + { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899 }, + { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222 }, + { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707 }, + { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685 }, + { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567 }, + { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672 }, + { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865 }, + { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 }, + { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 }, + { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 }, + { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 }, + { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 }, + { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 }, + { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 }, + { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 }, + { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 }, + { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 }, + { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 }, + { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 }, + { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 }, + { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 }, + { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 }, + { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 }, + { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 }, + { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 }, + { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 }, + { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 }, + { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 }, + { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 }, + { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, +] From 72d0553b9e14c1c6c3632b4e7cad9dd46c0197ff Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 09:56:41 +0200 Subject: [PATCH 003/110] feat: integration spike --- .copier-answers.yml | 2 +- docs/source/_static/openapi_v1.yaml | 45 ++--- docs/source/_static/openapi_v2.yaml | 45 ++--- install.sh | 1 + pyproject.toml | 24 +-- src/aignostics/cli.py | 10 ++ src/aignx/platform/_client.py | 2 +- src/aignx/platform/resources/applications.py | 11 +- .../aignx/platform/two_task_dummy_app_test.py | 25 ++- uv.lock | 169 +++++++++++------- 10 files changed, 180 insertions(+), 154 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 304a1f67..da7c4593 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.8.9 +_commit: v0.8.16 _src_path: gh:helmut-hoffer-von-ankershoffen/oe-python-template attestations_enabled: false author_email: helmut@aignostics.com diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index ddfbea07..c1fbc081 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -90,10 +90,8 @@ openapi: 3.1.0 paths: /echo/{text}: get: - description: "Echo back the provided text.\n\nArgs:\n text (str): The -text\ - \ to echo.\n\nReturns:\n Echo: The echo.\n\nRaises:\n 422 -Unprocessable\ + description: "Echo back the provided text.\n\nArgs:\n text (str): The text\ + \ to echo.\n\nReturns:\n Echo: The echo.\n\nRaises:\n 422 Unprocessable\ \ Entity: If text is not provided or empty." operationId: echo_echo__text__get parameters: @@ -121,18 +119,12 @@ Unprocessable\ - Basics /health: get: - description: "Check the health of the service.\n\nThis endpoint returns -the\ - \ health status of the service.\nThe health status can be either UP or -DOWN.\n\ - If the service is healthy, the status will be UP.\nIf the service is -unhealthy,\ - \ the status will be DOWN and a reason will be provided.\nThe response -will\ - \ have a 200 OK status code if the service is healthy,\nand a 500 -Internal\ - \ Server Error status code if the service is unhealthy.\n\nReturns:\n -Health:\ + description: "Check the health of the service.\n\nThis endpoint returns the\ + \ health status of the service.\nThe health status can be either UP or DOWN.\n\ + If the service is healthy, the status will be UP.\nIf the service is unhealthy,\ + \ the status will be DOWN and a reason will be provided.\nThe response will\ + \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\ + \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\ \ The health status of the service." operationId: health_health_get responses: @@ -147,18 +139,12 @@ Health:\ - Observability /healthz: get: - description: "Check the health of the service.\n\nThis endpoint returns -the\ - \ health status of the service.\nThe health status can be either UP or -DOWN.\n\ - If the service is healthy, the status will be UP.\nIf the service is -unhealthy,\ - \ the status will be DOWN and a reason will be provided.\nThe response -will\ - \ have a 200 OK status code if the service is healthy,\nand a 500 -Internal\ - \ Server Error status code if the service is unhealthy.\n\nReturns:\n -Health:\ + description: "Check the health of the service.\n\nThis endpoint returns the\ + \ health status of the service.\nThe health status can be either UP or DOWN.\n\ + If the service is healthy, the status will be UP.\nIf the service is unhealthy,\ + \ the status will be DOWN and a reason will be provided.\nThe response will\ + \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\ + \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\ \ The health status of the service." operationId: health_healthz_get responses: @@ -173,8 +159,7 @@ Health:\ - Observability /hello-world: get: - description: "Return a hello world message.\n\nReturns:\n -_HelloWorldResponse:\ + description: "Return a hello world message.\n\nReturns:\n _HelloWorldResponse:\ \ A response containing the hello world message." operationId: hello_world_hello_world_get responses: diff --git a/docs/source/_static/openapi_v2.yaml b/docs/source/_static/openapi_v2.yaml index 720a9462..91e1e607 100644 --- a/docs/source/_static/openapi_v2.yaml +++ b/docs/source/_static/openapi_v2.yaml @@ -104,10 +104,8 @@ openapi: 3.1.0 paths: /echo: post: - description: "Echo back the provided utterance.\n\nArgs:\n request -(Utterance):\ - \ The utterance to echo back.\n\nReturns:\n Echo: The -echo.\n\nRaises:\n\ + description: "Echo back the provided utterance.\n\nArgs:\n request (Utterance):\ + \ The utterance to echo back.\n\nReturns:\n Echo: The echo.\n\nRaises:\n\ \ 422 Unprocessable Entity: If utterance is not provided or empty." operationId: echo_v2_echo_post requestBody: @@ -134,18 +132,12 @@ echo.\n\nRaises:\n\ - Basics /health: get: - description: "Check the health of the service.\n\nThis endpoint returns -the\ - \ health status of the service.\nThe health status can be either UP or -DOWN.\n\ - If the service is healthy, the status will be UP.\nIf the service is -unhealthy,\ - \ the status will be DOWN and a reason will be provided.\nThe response -will\ - \ have a 200 OK status code if the service is healthy,\nand a 500 -Internal\ - \ Server Error status code if the service is unhealthy.\n\nReturns:\n -Health:\ + description: "Check the health of the service.\n\nThis endpoint returns the\ + \ health status of the service.\nThe health status can be either UP or DOWN.\n\ + If the service is healthy, the status will be UP.\nIf the service is unhealthy,\ + \ the status will be DOWN and a reason will be provided.\nThe response will\ + \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\ + \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\ \ The health status of the service." operationId: health_health_get responses: @@ -160,18 +152,12 @@ Health:\ - Observability /healthz: get: - description: "Check the health of the service.\n\nThis endpoint returns -the\ - \ health status of the service.\nThe health status can be either UP or -DOWN.\n\ - If the service is healthy, the status will be UP.\nIf the service is -unhealthy,\ - \ the status will be DOWN and a reason will be provided.\nThe response -will\ - \ have a 200 OK status code if the service is healthy,\nand a 500 -Internal\ - \ Server Error status code if the service is unhealthy.\n\nReturns:\n -Health:\ + description: "Check the health of the service.\n\nThis endpoint returns the\ + \ health status of the service.\nThe health status can be either UP or DOWN.\n\ + If the service is healthy, the status will be UP.\nIf the service is unhealthy,\ + \ the status will be DOWN and a reason will be provided.\nThe response will\ + \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\ + \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\ \ The health status of the service." operationId: health_healthz_get responses: @@ -186,8 +172,7 @@ Health:\ - Observability /hello-world: get: - description: "Return a hello world message.\n\nReturns:\n -_HelloWorldResponse:\ + description: "Return a hello world message.\n\nReturns:\n _HelloWorldResponse:\ \ A response containing the hello world message." operationId: hello_world_hello_world_get responses: diff --git a/install.sh b/install.sh index 758c309f..c2e68788 100755 --- a/install.sh +++ b/install.sh @@ -17,6 +17,7 @@ BREW_TOOLS=( "act;act;https://nektosact.com/" "pinact;pinact;https://github.com/suzuki-shunsuke/pinact" "trivy;trivy;https://trivy.dev/latest/" + "pnpm;pnpm;https://pnpm.io/" ) MAC_BREW_TOOLS=( diff --git a/pyproject.toml b/pyproject.toml index eee48884..a4c5a31e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,9 +62,9 @@ classifiers = [ requires-python = ">=3.11, <4.0" dependencies = [ - # From template + # From Template "fastapi[standard,all]>=0.115.12", - "pydantic>=2.10.6", + "pydantic>=2.11.1", "pydantic-settings>=2.8.1", "typer>=0.15.1", # Custom @@ -100,15 +100,18 @@ requires = ["hatchling==1.27.0"] build-backend = "hatchling.build" [tool.hatch.build] -include = ["src/*"] +include = ["src/*", "codegen/*"] [tool.hatch.build.targets.wheel] -packages = ["src/aignostics"] +packages = ["src/aignostics", "codegen/aignx", "src/aignx"] + +[tool.hatch.build.targets.wheel.force-include] +"codegen" = "codegen" [project.optional-dependencies] examples = [ - "streamlit>=1.44.0", - "marimo>=0.11.28", + "streamlit>=1.44.1", + "marimo>=0.12.2", "jupyter>=1.1.1", "jinja2>=3.1.6", ] @@ -131,11 +134,12 @@ dev = [ "pyright>=1.1.398", "pytest>=8.3.5", "pytest-asyncio>=0.26.0", - "pytest-cov>=6.0.0", + "pytest-cov>=6.1.0", "pytest-docker>=3.2.0", "pytest-env>=1.1.5", "pytest-regressions>=2.7.0", "pytest-subprocess>=1.5.3", + "pytest-timeout>=2.3.1", "pytest-xdist[psutil]>=3.6.1", "ruff>=0.11.2", "sphinx>=8.2.3", @@ -149,7 +153,7 @@ dev = [ "sphinxext.opengraph>=0.9.1", "swagger-plugin-for-sphinx>=5.1.0", "tomli>=2.1.0", - "types-pyyaml>=6.0.12.20250326", + "types-pyyaml>=6.0.12.20250402", "watchdog>=6.0.0", ] @@ -246,9 +250,10 @@ warn_required_dynamic_aliases = true warn_untyped_fields = true [tool.pytest.ini_options] -addopts = "-v --cov=aignostics --cov-report=term-missing --cov-report=xml:reports/coverage.xml --cov-report=html:reports/coverage_html" +addopts = "-v --strict-markers --cov=aignostics --cov=aignx --cov-report=term-missing --cov-report=xml:reports/coverage.xml --cov-report=html:reports/coverage_html" testpaths = ["tests"] python_files = ["*_test.py"] +pythonpath = [".", "src", "codegen"] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" env = ["COVERAGE_FILE=.coverage", "COVERAGE_PROCESS_START=pyproject.toml"] @@ -264,7 +269,6 @@ markers = [ "specifications: mark test with ids (e.g., PAPI-123, HETA-123) of specifications in Jira. The test will be linked to them - optional; comma-separated", ] - [tool.coverage.run] sigterm = true relative_files = true diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index 470c1bce..261a0865 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -9,6 +9,8 @@ import yaml from rich.console import Console +import aignx.platform + from . import Service, Utterance, __version__ from .api import api_v1, api_v2 @@ -73,6 +75,14 @@ def serve( ) +@cli.command() +def papi_applications_list() -> None: + """Check PAPI health.""" + papi_client = aignx.platform.Client() + applications = papi_client.applications.list() + _console.print(applications) + + class APIVersion(StrEnum): """ Enum representing the API versions. diff --git a/src/aignx/platform/_client.py b/src/aignx/platform/_client.py index f8fb9d11..53c55870 100644 --- a/src/aignx/platform/_client.py +++ b/src/aignx/platform/_client.py @@ -32,6 +32,6 @@ def _get_api_client() -> ExternalsApi: # api_key_prefix={"Authorization": "Bearer"}, ), header_name="Authorization", - header_value=f"Bearer {token}" + header_value=f"Bearer {token}", ) return ExternalsApi(client) diff --git a/src/aignx/platform/resources/applications.py b/src/aignx/platform/resources/applications.py index 85cb4e30..c8fcc914 100644 --- a/src/aignx/platform/resources/applications.py +++ b/src/aignx/platform/resources/applications.py @@ -1,6 +1,6 @@ from aignx.codegen.api.externals_api import ExternalsApi from aignx.codegen.models import ApplicationVersionReadResponse, VersionReadResponse -from codegen.aignx.codegen.models.application_read_response import ApplicationReadResponse +from aignx.codegen.models.application_read_response import ApplicationReadResponse class Versions: @@ -12,15 +12,18 @@ def list(self, for_application: ApplicationReadResponse | str) -> list[Applicati application_id = for_application.application_id else: application_id = for_application - res = self._api.list_versions_by_application_id_v1_applications_application_id_versions_get(application_id=application_id) + res = self._api.list_versions_by_application_id_v1_applications_application_id_versions_get( + application_id=application_id + ) return res def __call__(self, for_application_version_id: str) -> VersionReadResponse: - return self._api.get_version_v1_versions_application_version_id_get(application_version_id=for_application_version_id) + return self._api.get_version_v1_versions_application_version_id_get( + application_version_id=for_application_version_id + ) class Applications: - def __init__(self, api: ExternalsApi): self._api = api self.versions = Versions(self._api) diff --git a/tests/aignx/platform/two_task_dummy_app_test.py b/tests/aignx/platform/two_task_dummy_app_test.py index 0d821ce6..69d5ccbe 100644 --- a/tests/aignx/platform/two_task_dummy_app_test.py +++ b/tests/aignx/platform/two_task_dummy_app_test.py @@ -30,9 +30,9 @@ def three_spots_payload(): "base_mpp": 0.46499982, "width": 3728, "height": 3640, - } + }, ) - ] + ], ), ItemCreationRequest( reference="2", @@ -47,9 +47,9 @@ def three_spots_payload(): "base_mpp": 0.46499982, "width": 3616, "height": 3400, - } + }, ) - ] + ], ), ItemCreationRequest( reference="3", @@ -64,30 +64,29 @@ def three_spots_payload(): "base_mpp": 0.46499982, "width": 4016, "height": 3952, - } + }, ) - ] - ) + ], + ), ] -@pytest.mark.timeout(240) +@pytest.mark.timeout(2) def test_two_task_dummy_app(): application_version = "60e7b441-307a-4b41-8a97-5b02e7bc73a4" print(f"Create application run for application version: {application_version}") platform = aignx.platform.Client() application_run = platform.runs.create( - RunCreationRequest( - application_version=ApplicationVersion(application_version), - items=three_spots_payload() - ) + RunCreationRequest(application_version=ApplicationVersion(application_version), items=three_spots_payload()) ) with tempfile.TemporaryDirectory() as dir: dir = Path(dir) application_run.download_to_folder(dir) - assert application_run.status().status == ApplicationRunStatus.COMPLETED, "Application run did not finish in completed status" + assert application_run.status().status == ApplicationRunStatus.COMPLETED, ( + "Application run did not finish in completed status" + ) run_result_folder = dir / application_run.application_run_id assert run_result_folder.exists(), "Application run result folder does not exist" diff --git a/uv.lock b/uv.lock index 501ce559..99af9852 100644 --- a/uv.lock +++ b/uv.lock @@ -67,6 +67,7 @@ dev = [ { name = "pytest-env" }, { name = "pytest-regressions" }, { name = "pytest-subprocess" }, + { name = "pytest-timeout" }, { name = "pytest-xdist", extra = ["psutil"] }, { name = "ruff" }, { name = "sphinx" }, @@ -95,8 +96,8 @@ requires-dist = [ { name = "jsf", specifier = ">=0.11.2" }, { name = "jsonschema", specifier = ">=4.23.0" }, { name = "jupyter", marker = "extra == 'examples'", specifier = ">=1.1.1" }, - { name = "marimo", marker = "extra == 'examples'", specifier = ">=0.11.28" }, - { name = "pydantic", specifier = ">=2.10.6" }, + { name = "marimo", marker = "extra == 'examples'", specifier = ">=0.12.2" }, + { name = "pydantic", specifier = ">=2.11.1" }, { name = "pydantic-settings", specifier = ">=2.8.1" }, { name = "pyjwt", specifier = ">=2.10.1" }, { name = "pyrfc6266", specifier = ">=1.0.2" }, @@ -104,7 +105,7 @@ requires-dist = [ { name = "python-dotenv", specifier = ">=1.1.0" }, { name = "requests", specifier = ">=2.32.3" }, { name = "requests-oauthlib", specifier = ">=2.0.0" }, - { name = "streamlit", marker = "extra == 'examples'", specifier = ">=1.44.0" }, + { name = "streamlit", marker = "extra == 'examples'", specifier = ">=1.44.1" }, { name = "tifffile", specifier = ">=2025.1.10" }, { name = "tqdm", specifier = ">=4.67.1" }, { name = "typer", specifier = ">=0.15.1" }, @@ -130,11 +131,12 @@ dev = [ { name = "pyright", specifier = ">=1.1.398" }, { name = "pytest", specifier = ">=8.3.5" }, { name = "pytest-asyncio", specifier = ">=0.26.0" }, - { name = "pytest-cov", specifier = ">=6.0.0" }, + { name = "pytest-cov", specifier = ">=6.1.0" }, { name = "pytest-docker", specifier = ">=3.2.0" }, { name = "pytest-env", specifier = ">=1.1.5" }, { name = "pytest-regressions", specifier = ">=2.7.0" }, { name = "pytest-subprocess", specifier = ">=1.5.3" }, + { name = "pytest-timeout", specifier = ">=2.3.1" }, { name = "pytest-xdist", extras = ["psutil"], specifier = ">=3.6.1" }, { name = "ruff", specifier = ">=0.11.2" }, { name = "sphinx", specifier = ">=8.2.3" }, @@ -148,7 +150,7 @@ dev = [ { name = "sphinxext-opengraph", specifier = ">=0.9.1" }, { name = "swagger-plugin-for-sphinx", specifier = ">=5.1.0" }, { name = "tomli", specifier = ">=2.1.0" }, - { name = "types-pyyaml", specifier = ">=6.0.12.20250326" }, + { name = "types-pyyaml", specifier = ">=6.0.12.20250402" }, { name = "watchdog", specifier = ">=6.0.0" }, ] @@ -1921,7 +1923,7 @@ wheels = [ [[package]] name = "marimo" -version = "0.11.28" +version = "0.12.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1942,9 +1944,9 @@ dependencies = [ { name = "uvicorn" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/91/b9385f8b831cbc4e326e54029d8f1955c00dfbdbb5ff205c903303e8cf58/marimo-0.11.28.tar.gz", hash = "sha256:ab5783ebd36157877b524985e29ca483c2c50e9b77e8ce5f29924af41377eaf6", size = 10692210 } +sdist = { url = "https://files.pythonhosted.org/packages/2e/61/6093f0e4e412581d9b9fba72b9275ae065a8e3fe7f47744807479705e3e9/marimo-0.12.2.tar.gz", hash = "sha256:16b3aeba33b46149de41841d9d528acc9206a9f714a070d6a5fdbc48994080e6", size = 10710457 } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/d1/f0bca00b90d89234697158be35a0ccddaff72ee9ded9072b80053b8b8076/marimo-0.11.28-py3-none-any.whl", hash = "sha256:e0b347ae0298e578b361b29cd95c1f52e9a1b147ddee213530d6e117f0fd1898", size = 11041124 }, + { url = "https://files.pythonhosted.org/packages/0c/12/62850693a4dc87a20622b0df75ede358a209dea3bcb8a64f791963d39c76/marimo-0.12.2-py3-none-any.whl", hash = "sha256:8c2cc494c72e1f9bdb0e42676fb22d32c752968cc4a40a15622481aeb8a460ea", size = 11067064 }, ] [[package]] @@ -2877,69 +2879,82 @@ wheels = [ [[package]] name = "pydantic" -version = "2.10.6" +version = "2.11.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } +sdist = { url = "https://files.pythonhosted.org/packages/93/a3/698b87a4d4d303d7c5f62ea5fbf7a79cab236ccfbd0a17847b7f77f8163e/pydantic-2.11.1.tar.gz", hash = "sha256:442557d2910e75c991c39f4b4ab18963d57b9b55122c8b2a9cd176d8c29ce968", size = 782817 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, + { url = "https://files.pythonhosted.org/packages/cc/12/f9221a949f2419e2e23847303c002476c26fbcfd62dc7f3d25d0bec5ca99/pydantic-2.11.1-py3-none-any.whl", hash = "sha256:5b6c415eee9f8123a14d859be0c84363fec6b1feb6b688d6435801230b56e0b8", size = 442648 }, ] [[package]] name = "pydantic-core" -version = "2.27.2" +version = "2.33.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, - { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, - { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, - { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, - { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, - { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, - { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, - { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, - { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, - { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, - { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, - { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, - { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, - { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, - { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, - { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, - { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, - { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, - { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, - { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, - { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, - { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, - { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, - { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, - { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, - { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, - { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, - { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, - { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, - { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, - { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, - { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, - { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, - { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, - { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, - { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, - { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, - { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, - { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, - { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, - { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, - { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, +sdist = { url = "https://files.pythonhosted.org/packages/b9/05/91ce14dfd5a3a99555fce436318cc0fd1f08c4daa32b3248ad63669ea8b4/pydantic_core-2.33.0.tar.gz", hash = "sha256:40eb8af662ba409c3cbf4a8150ad32ae73514cd7cb1f1a2113af39763dd616b3", size = 434080 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/93/9e97af2619b4026596487a79133e425c7d3c374f0a7f100f3d76bcdf9c83/pydantic_core-2.33.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a608a75846804271cf9c83e40bbb4dab2ac614d33c6fd5b0c6187f53f5c593ef", size = 2042784 }, + { url = "https://files.pythonhosted.org/packages/42/b4/0bba8412fd242729feeb80e7152e24f0e1a1c19f4121ca3d4a307f4e6222/pydantic_core-2.33.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e1c69aa459f5609dec2fa0652d495353accf3eda5bdb18782bc5a2ae45c9273a", size = 1858179 }, + { url = "https://files.pythonhosted.org/packages/69/1f/c1c40305d929bd08af863df64b0a26203b70b352a1962d86f3bcd52950fe/pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9ec80eb5a5f45a2211793f1c4aeddff0c3761d1c70d684965c1807e923a588b", size = 1909396 }, + { url = "https://files.pythonhosted.org/packages/0f/99/d2e727375c329c1e652b5d450fbb9d56e8c3933a397e4bd46e67c68c2cd5/pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e925819a98318d17251776bd3d6aa9f3ff77b965762155bdad15d1a9265c4cfd", size = 1998264 }, + { url = "https://files.pythonhosted.org/packages/9c/2e/3119a33931278d96ecc2e9e1b9d50c240636cfeb0c49951746ae34e4de74/pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bf68bb859799e9cec3d9dd8323c40c00a254aabb56fe08f907e437005932f2b", size = 2140588 }, + { url = "https://files.pythonhosted.org/packages/35/bd/9267bd1ba55f17c80ef6cb7e07b3890b4acbe8eb6014f3102092d53d9300/pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b2ea72dea0825949a045fa4071f6d5b3d7620d2a208335207793cf29c5a182d", size = 2746296 }, + { url = "https://files.pythonhosted.org/packages/6f/ed/ef37de6478a412ee627cbebd73e7b72a680f45bfacce9ff1199de6e17e88/pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1583539533160186ac546b49f5cde9ffc928062c96920f58bd95de32ffd7bffd", size = 2005555 }, + { url = "https://files.pythonhosted.org/packages/dd/84/72c8d1439585d8ee7bc35eb8f88a04a4d302ee4018871f1f85ae1b0c6625/pydantic_core-2.33.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23c3e77bf8a7317612e5c26a3b084c7edeb9552d645742a54a5867635b4f2453", size = 2124452 }, + { url = "https://files.pythonhosted.org/packages/a7/8f/cb13de30c6a3e303423751a529a3d1271c2effee4b98cf3e397a66ae8498/pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7a7f2a3f628d2f7ef11cb6188bcf0b9e1558151d511b974dfea10a49afe192b", size = 2087001 }, + { url = "https://files.pythonhosted.org/packages/83/d0/e93dc8884bf288a63fedeb8040ac8f29cb71ca52e755f48e5170bb63e55b/pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:f1fb026c575e16f673c61c7b86144517705865173f3d0907040ac30c4f9f5915", size = 2261663 }, + { url = "https://files.pythonhosted.org/packages/4c/ba/4b7739c95efa0b542ee45fd872c8f6b1884ab808cf04ce7ac6621b6df76e/pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:635702b2fed997e0ac256b2cfbdb4dd0bf7c56b5d8fba8ef03489c03b3eb40e2", size = 2257786 }, + { url = "https://files.pythonhosted.org/packages/cc/98/73cbca1d2360c27752cfa2fcdcf14d96230e92d7d48ecd50499865c56bf7/pydantic_core-2.33.0-cp311-cp311-win32.whl", hash = "sha256:07b4ced28fccae3f00626eaa0c4001aa9ec140a29501770a88dbbb0966019a86", size = 1925697 }, + { url = "https://files.pythonhosted.org/packages/9a/26/d85a40edeca5d8830ffc33667d6fef329fd0f4bc0c5181b8b0e206cfe488/pydantic_core-2.33.0-cp311-cp311-win_amd64.whl", hash = "sha256:4927564be53239a87770a5f86bdc272b8d1fbb87ab7783ad70255b4ab01aa25b", size = 1949859 }, + { url = "https://files.pythonhosted.org/packages/7e/0b/5a381605f0b9870465b805f2c86c06b0a7c191668ebe4117777306c2c1e5/pydantic_core-2.33.0-cp311-cp311-win_arm64.whl", hash = "sha256:69297418ad644d521ea3e1aa2e14a2a422726167e9ad22b89e8f1130d68e1e9a", size = 1907978 }, + { url = "https://files.pythonhosted.org/packages/a9/c4/c9381323cbdc1bb26d352bc184422ce77c4bc2f2312b782761093a59fafc/pydantic_core-2.33.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6c32a40712e3662bebe524abe8abb757f2fa2000028d64cc5a1006016c06af43", size = 2025127 }, + { url = "https://files.pythonhosted.org/packages/6f/bd/af35278080716ecab8f57e84515c7dc535ed95d1c7f52c1c6f7b313a9dab/pydantic_core-2.33.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ec86b5baa36f0a0bfb37db86c7d52652f8e8aa076ab745ef7725784183c3fdd", size = 1851687 }, + { url = "https://files.pythonhosted.org/packages/12/e4/a01461225809c3533c23bd1916b1e8c2e21727f0fea60ab1acbffc4e2fca/pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4deac83a8cc1d09e40683be0bc6d1fa4cde8df0a9bf0cda5693f9b0569ac01b6", size = 1892232 }, + { url = "https://files.pythonhosted.org/packages/51/17/3d53d62a328fb0a49911c2962036b9e7a4f781b7d15e9093c26299e5f76d/pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:175ab598fb457a9aee63206a1993874badf3ed9a456e0654273e56f00747bbd6", size = 1977896 }, + { url = "https://files.pythonhosted.org/packages/30/98/01f9d86e02ec4a38f4b02086acf067f2c776b845d43f901bd1ee1c21bc4b/pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f36afd0d56a6c42cf4e8465b6441cf546ed69d3a4ec92724cc9c8c61bd6ecf4", size = 2127717 }, + { url = "https://files.pythonhosted.org/packages/3c/43/6f381575c61b7c58b0fd0b92134c5a1897deea4cdfc3d47567b3ff460a4e/pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a98257451164666afafc7cbf5fb00d613e33f7e7ebb322fbcd99345695a9a61", size = 2680287 }, + { url = "https://files.pythonhosted.org/packages/01/42/c0d10d1451d161a9a0da9bbef023b8005aa26e9993a8cc24dc9e3aa96c93/pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecc6d02d69b54a2eb83ebcc6f29df04957f734bcf309d346b4f83354d8376862", size = 2008276 }, + { url = "https://files.pythonhosted.org/packages/20/ca/e08df9dba546905c70bae44ced9f3bea25432e34448d95618d41968f40b7/pydantic_core-2.33.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a69b7596c6603afd049ce7f3835bcf57dd3892fc7279f0ddf987bebed8caa5a", size = 2115305 }, + { url = "https://files.pythonhosted.org/packages/03/1f/9b01d990730a98833113581a78e595fd40ed4c20f9693f5a658fb5f91eff/pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea30239c148b6ef41364c6f51d103c2988965b643d62e10b233b5efdca8c0099", size = 2068999 }, + { url = "https://files.pythonhosted.org/packages/20/18/fe752476a709191148e8b1e1139147841ea5d2b22adcde6ee6abb6c8e7cf/pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:abfa44cf2f7f7d7a199be6c6ec141c9024063205545aa09304349781b9a125e6", size = 2241488 }, + { url = "https://files.pythonhosted.org/packages/81/22/14738ad0a0bf484b928c9e52004f5e0b81dd8dabbdf23b843717b37a71d1/pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20d4275f3c4659d92048c70797e5fdc396c6e4446caf517ba5cad2db60cd39d3", size = 2248430 }, + { url = "https://files.pythonhosted.org/packages/e8/27/be7571e215ac8d321712f2433c445b03dbcd645366a18f67b334df8912bc/pydantic_core-2.33.0-cp312-cp312-win32.whl", hash = "sha256:918f2013d7eadea1d88d1a35fd4a1e16aaf90343eb446f91cb091ce7f9b431a2", size = 1908353 }, + { url = "https://files.pythonhosted.org/packages/be/3a/be78f28732f93128bd0e3944bdd4b3970b389a1fbd44907c97291c8dcdec/pydantic_core-2.33.0-cp312-cp312-win_amd64.whl", hash = "sha256:aec79acc183865bad120b0190afac467c20b15289050648b876b07777e67ea48", size = 1955956 }, + { url = "https://files.pythonhosted.org/packages/21/26/b8911ac74faa994694b76ee6a22875cc7a4abea3c381fdba4edc6c6bef84/pydantic_core-2.33.0-cp312-cp312-win_arm64.whl", hash = "sha256:5461934e895968655225dfa8b3be79e7e927e95d4bd6c2d40edd2fa7052e71b6", size = 1903259 }, + { url = "https://files.pythonhosted.org/packages/79/20/de2ad03ce8f5b3accf2196ea9b44f31b0cd16ac6e8cfc6b21976ed45ec35/pydantic_core-2.33.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f00e8b59e1fc8f09d05594aa7d2b726f1b277ca6155fc84c0396db1b373c4555", size = 2032214 }, + { url = "https://files.pythonhosted.org/packages/f9/af/6817dfda9aac4958d8b516cbb94af507eb171c997ea66453d4d162ae8948/pydantic_core-2.33.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a73be93ecef45786d7d95b0c5e9b294faf35629d03d5b145b09b81258c7cd6d", size = 1852338 }, + { url = "https://files.pythonhosted.org/packages/44/f3/49193a312d9c49314f2b953fb55740b7c530710977cabe7183b8ef111b7f/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff48a55be9da6930254565ff5238d71d5e9cd8c5487a191cb85df3bdb8c77365", size = 1896913 }, + { url = "https://files.pythonhosted.org/packages/06/e0/c746677825b2e29a2fa02122a8991c83cdd5b4c5f638f0664d4e35edd4b2/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a4ea04195638dcd8c53dadb545d70badba51735b1594810e9768c2c0b4a5da", size = 1986046 }, + { url = "https://files.pythonhosted.org/packages/11/ec/44914e7ff78cef16afb5e5273d480c136725acd73d894affdbe2a1bbaad5/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41d698dcbe12b60661f0632b543dbb119e6ba088103b364ff65e951610cb7ce0", size = 2128097 }, + { url = "https://files.pythonhosted.org/packages/fe/f5/c6247d424d01f605ed2e3802f338691cae17137cee6484dce9f1ac0b872b/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae62032ef513fe6281ef0009e30838a01057b832dc265da32c10469622613885", size = 2681062 }, + { url = "https://files.pythonhosted.org/packages/f0/85/114a2113b126fdd7cf9a9443b1b1fe1b572e5bd259d50ba9d5d3e1927fa9/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f225f3a3995dbbc26affc191d0443c6c4aa71b83358fd4c2b7d63e2f6f0336f9", size = 2007487 }, + { url = "https://files.pythonhosted.org/packages/e6/40/3c05ed28d225c7a9acd2b34c5c8010c279683a870219b97e9f164a5a8af0/pydantic_core-2.33.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bdd36b362f419c78d09630cbaebc64913f66f62bda6d42d5fbb08da8cc4f181", size = 2121382 }, + { url = "https://files.pythonhosted.org/packages/8a/22/e70c086f41eebd323e6baa92cc906c3f38ddce7486007eb2bdb3b11c8f64/pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a0147c0bef783fd9abc9f016d66edb6cac466dc54a17ec5f5ada08ff65caf5d", size = 2072473 }, + { url = "https://files.pythonhosted.org/packages/3e/84/d1614dedd8fe5114f6a0e348bcd1535f97d76c038d6102f271433cd1361d/pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:c860773a0f205926172c6644c394e02c25421dc9a456deff16f64c0e299487d3", size = 2249468 }, + { url = "https://files.pythonhosted.org/packages/b0/c0/787061eef44135e00fddb4b56b387a06c303bfd3884a6df9bea5cb730230/pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:138d31e3f90087f42aa6286fb640f3c7a8eb7bdae829418265e7e7474bd2574b", size = 2254716 }, + { url = "https://files.pythonhosted.org/packages/ae/e2/27262eb04963201e89f9c280f1e10c493a7a37bc877e023f31aa72d2f911/pydantic_core-2.33.0-cp313-cp313-win32.whl", hash = "sha256:d20cbb9d3e95114325780f3cfe990f3ecae24de7a2d75f978783878cce2ad585", size = 1916450 }, + { url = "https://files.pythonhosted.org/packages/13/8d/25ff96f1e89b19e0b70b3cd607c9ea7ca27e1dcb810a9cd4255ed6abf869/pydantic_core-2.33.0-cp313-cp313-win_amd64.whl", hash = "sha256:ca1103d70306489e3d006b0f79db8ca5dd3c977f6f13b2c59ff745249431a606", size = 1956092 }, + { url = "https://files.pythonhosted.org/packages/1b/64/66a2efeff657b04323ffcd7b898cb0354d36dae3a561049e092134a83e9c/pydantic_core-2.33.0-cp313-cp313-win_arm64.whl", hash = "sha256:6291797cad239285275558e0a27872da735b05c75d5237bbade8736f80e4c225", size = 1908367 }, + { url = "https://files.pythonhosted.org/packages/52/54/295e38769133363d7ec4a5863a4d579f331728c71a6644ff1024ee529315/pydantic_core-2.33.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7b79af799630af263eca9ec87db519426d8c9b3be35016eddad1832bac812d87", size = 1813331 }, + { url = "https://files.pythonhosted.org/packages/4c/9c/0c8ea02db8d682aa1ef48938abae833c1d69bdfa6e5ec13b21734b01ae70/pydantic_core-2.33.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eabf946a4739b5237f4f56d77fa6668263bc466d06a8036c055587c130a46f7b", size = 1986653 }, + { url = "https://files.pythonhosted.org/packages/8e/4f/3fb47d6cbc08c7e00f92300e64ba655428c05c56b8ab6723bd290bae6458/pydantic_core-2.33.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8a1d581e8cdbb857b0e0e81df98603376c1a5c34dc5e54039dcc00f043df81e7", size = 1931234 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/553e42762e7b08771fca41c0230c1ac276f9e79e78f57628e1b7d328551d/pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d8dc9f63a26f7259b57f46a7aab5af86b2ad6fbe48487500bb1f4b27e051e4c", size = 2041207 }, + { url = "https://files.pythonhosted.org/packages/85/81/a91a57bbf3efe53525ab75f65944b8950e6ef84fe3b9a26c1ec173363263/pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30369e54d6d0113d2aa5aee7a90d17f225c13d87902ace8fcd7bbf99b19124db", size = 1873736 }, + { url = "https://files.pythonhosted.org/packages/9c/d2/5ab52e9f551cdcbc1ee99a0b3ef595f56d031f66f88e5ca6726c49f9ce65/pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3eb479354c62067afa62f53bb387827bee2f75c9c79ef25eef6ab84d4b1ae3b", size = 1903794 }, + { url = "https://files.pythonhosted.org/packages/2f/5f/a81742d3f3821b16f1265f057d6e0b68a3ab13a814fe4bffac536a1f26fd/pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0310524c833d91403c960b8a3cf9f46c282eadd6afd276c8c5edc617bd705dc9", size = 2083457 }, + { url = "https://files.pythonhosted.org/packages/b5/2f/e872005bc0fc47f9c036b67b12349a8522d32e3bda928e82d676e2a594d1/pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eddb18a00bbb855325db27b4c2a89a4ba491cd6a0bd6d852b225172a1f54b36c", size = 2119537 }, + { url = "https://files.pythonhosted.org/packages/d3/13/183f13ce647202eaf3dada9e42cdfc59cbb95faedd44d25f22b931115c7f/pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ade5dbcf8d9ef8f4b28e682d0b29f3008df9842bb5ac48ac2c17bc55771cc976", size = 2080069 }, + { url = "https://files.pythonhosted.org/packages/23/8b/b6be91243da44a26558d9c3a9007043b3750334136c6550551e8092d6d96/pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2c0afd34f928383e3fd25740f2050dbac9d077e7ba5adbaa2227f4d4f3c8da5c", size = 2251618 }, + { url = "https://files.pythonhosted.org/packages/aa/c5/fbcf1977035b834f63eb542e74cd6c807177f383386175b468f0865bcac4/pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7da333f21cd9df51d5731513a6d39319892947604924ddf2e24a4612975fb936", size = 2255374 }, + { url = "https://files.pythonhosted.org/packages/2f/f8/66f328e411f1c9574b13c2c28ab01f308b53688bbbe6ca8fb981e6cabc42/pydantic_core-2.33.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b6d77c75a57f041c5ee915ff0b0bb58eabb78728b69ed967bc5b780e8f701b8", size = 2082099 }, ] [[package]] @@ -3075,15 +3090,15 @@ wheels = [ [[package]] name = "pytest-cov" -version = "6.0.0" +version = "6.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coverage", extra = ["toml"] }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/be/45/9b538de8cef30e17c7b45ef42f538a94889ed6a16f2387a6c89e73220651/pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0", size = 66945 } +sdist = { url = "https://files.pythonhosted.org/packages/34/8c/039a7793f23f5cb666c834da9e944123f498ccc0753bed5fbfb2e2c11f87/pytest_cov-6.1.0.tar.gz", hash = "sha256:ec55e828c66755e5b74a21bd7cc03c303a9f928389c0563e50ba454a6dbe71db", size = 66651 } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 }, + { url = "https://files.pythonhosted.org/packages/e1/c5/8d6ffe9fc8f7f57b3662156ae8a34f2b8e7a754c73b48e689ce43145e98c/pytest_cov-6.1.0-py3-none-any.whl", hash = "sha256:cd7e1d54981d5185ef2b8d64b50172ce97e6f357e6df5cb103e828c7f993e201", size = 23743 }, ] [[package]] @@ -3149,6 +3164,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1b/82/a038e8fdb86d5494a39b8730547ec79767731d02ecb556121e40c0892803/pytest_subprocess-1.5.3-py3-none-any.whl", hash = "sha256:b62580f5a84335fb9f2ec65d49e56a3c93f4722c148fe1771a002835d310a75b", size = 21759 }, ] +[[package]] +name = "pytest-timeout" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/0d/04719abc7a4bdb3a7a1f968f24b0f5253d698c9cc94975330e9d3145befb/pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9", size = 17697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/27/14af9ef8321f5edc7527e47def2a21d8118c6f329a9342cc61387a0c0599/pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e", size = 14148 }, +] + [[package]] name = "pytest-xdist" version = "3.6.1" @@ -4036,7 +4063,7 @@ wheels = [ [[package]] name = "streamlit" -version = "1.44.0" +version = "1.44.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "altair" }, @@ -4058,9 +4085,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "watchdog", marker = "sys_platform != 'darwin'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/86/764e2079c58790f232bb5882853fe8a68302dfdd0e29a5cf6efeb3bbcd17/streamlit-1.44.0.tar.gz", hash = "sha256:da75933bae94595167f43822dea43fcdde0d747433f7d04989266d78967951bb", size = 9422437 } +sdist = { url = "https://files.pythonhosted.org/packages/3e/c0/7286284567e5045f0c587c426d0c41aee5d10c0a2e360e627a83037e9f0c/streamlit-1.44.1.tar.gz", hash = "sha256:c6914ed6d5b76870b461510476806db370f36425ae0e6654d227c988288198d3", size = 9423685 } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/9e/e51e34f504940da00145795b9e8be9c129704708b071f672f3626a37d842/streamlit-1.44.0-py3-none-any.whl", hash = "sha256:98510d03e53622bba8f0e9f2fd4f1191b3b55e5c7e55abbbaa0289cb9e21cdea", size = 9812034 }, + { url = "https://files.pythonhosted.org/packages/eb/17/fc425e1d4d86e31b2aaf0812a2ef2163763a0670d671720c7c36e8679323/streamlit-1.44.1-py3-none-any.whl", hash = "sha256:9fe355f58b11f4eb71e74f115ce1f38c4c9eaff2733e6bcffb510ac1298a5990", size = 9812242 }, ] [[package]] @@ -4255,11 +4282,11 @@ wheels = [ [[package]] name = "types-pyyaml" -version = "6.0.12.20250326" +version = "6.0.12.20250402" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/66/f58e386be67589d5c3c9c0a368600783ac1321b7e6ee213c8f51848dbf0c/types_pyyaml-6.0.12.20250326.tar.gz", hash = "sha256:5e2d86d8706697803f361ba0b8188eef2999e1c372cd4faee4ebb0844b8a4190", size = 17346 } +sdist = { url = "https://files.pythonhosted.org/packages/2d/68/609eed7402f87c9874af39d35942744e39646d1ea9011765ec87b01b2a3c/types_pyyaml-6.0.12.20250402.tar.gz", hash = "sha256:d7c13c3e6d335b6af4b0122a01ff1d270aba84ab96d1a1a1063ecba3e13ec075", size = 17282 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/1e/5609fea65117db83cc060342d4f6810f3cf1d3453b9f81bfe5f03f679633/types_pyyaml-6.0.12.20250326-py3-none-any.whl", hash = "sha256:961871cfbdc1ad8ae3cb6ae3f13007262bcfc168adc513119755a6e4d5d7ed65", size = 20398 }, + { url = "https://files.pythonhosted.org/packages/ed/56/1fe61db05685fbb512c07ea9323f06ea727125951f1eb4dff110b3311da3/types_pyyaml-6.0.12.20250402-py3-none-any.whl", hash = "sha256:652348fa9e7a203d4b0d21066dfb00760d3cbd5a15ebb7cf8d33c88a49546681", size = 20329 }, ] [[package]] @@ -4271,6 +4298,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, ] +[[package]] +name = "typing-inspection" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, +] + [[package]] name = "tzdata" version = "2025.1" From 59bcd8683072d7188930f566a1ee291794b3167f Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 19:03:58 +0200 Subject: [PATCH 004/110] chore: scheduled --- .github/workflows/scheduled-test.yml | 59 ++++++ client_configs/pyproject.toml | 2 +- docs/source/_static/openapi_v1.yaml | 181 +--------------- docs/source/_static/openapi_v2.yaml | 194 +----------------- src/aignostics/cli.py | 2 + src/aignx/platform/_authentication.py | 18 +- .../aignx/platform/two_task_dummy_app_test.py | 2 +- 7 files changed, 85 insertions(+), 373 deletions(-) create mode 100644 .github/workflows/scheduled-test.yml diff --git a/.github/workflows/scheduled-test.yml b/.github/workflows/scheduled-test.yml new file mode 100644 index 00000000..c737e3c9 --- /dev/null +++ b/.github/workflows/scheduled-test.yml @@ -0,0 +1,59 @@ +name: "CI" + +on: + schedule: + # * is a special character in YAML so you have to quote this string + - cron: '30 5,17 * * *' + push: + branches: + - "**" + pull_request: + branches: [main] + +jobs: + test: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + + - name: Install dev tools + run: | + wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add - + echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list + sudo apt-get update + sudo apt-get install -y curl jq xsltproc gnupg2 trivy + + - name: Install uv (python package manager) + uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1 + with: + version: "0.6.3" + enable-cache: true + cache-dependency-glob: uv.lock + + - name: Install Python, venv and dependencies + run: | + uv sync --all-extras --frozen --link-mode=copy + + - name: Print development version info + if: ${{ !startsWith(github.ref, 'refs/tags/v') }} + run: | + TOML_VERSION=$(uv run python -c "import tomli; print(tomli.load(open('pyproject.toml', 'rb'))['project']['version'])") + echo "Development build - Current version in pyproject.toml: $TOML_VERSION" + + - name: Create .env file + uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 + with: + envkey_CLIENT_ID: ${{ secrets.CLIENT_ID }} + envkey_CLIENT_ID2: ${{ secrets.CLIENT_ID2 }} + fail_on_empty: true + + # https://nox.thea.codes/en/stable/usage.html + - name: Run unit tests, measure coverage, lint, and check vulnerabilities + run: | + uv run --all-extras nox -t "scheduled" \ No newline at end of file diff --git a/client_configs/pyproject.toml b/client_configs/pyproject.toml index 8763bff9..522d9769 100644 --- a/client_configs/pyproject.toml +++ b/client_configs/pyproject.toml @@ -56,5 +56,5 @@ markers = [ "requirements: mark tests with ids (e.g., PAPI-123, HETA-123) of requirements in Jira. The test will be linked to them - optional; comma-separated", "specifications: mark test with ids (e.g., PAPI-123, HETA-123) of specifications in Jira. The test will be linked to them - optional; comma-separated", "labels: mark test with labels that are attached to the test tickets in Jira - optional; comma-separated", - "description: textual description what the test does, goes in `description` field in the Jira ticket - optional" + "description: textual description what the test does, goes in `description` field in the Jira ticket - optional", ] diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index c1fbc081..d2873d84 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -1,174 +1,7 @@ -components: - schemas: - Echo: - description: Response model for echo endpoint. - properties: - text: - description: The echo - examples: - - HELLO, WORLD! - minLength: 1 - title: Text - type: string - required: - - text - title: Echo - type: object - HTTPValidationError: - properties: - detail: - items: - $ref: '#/components/schemas/ValidationError' - title: Detail - type: array - title: HTTPValidationError - type: object - Health: - description: Health status model. - properties: - reason: - anyOf: - - type: string - - type: 'null' - title: Reason - status: - $ref: '#/components/schemas/HealthStatus' - required: - - status - title: Health - type: object - HealthStatus: - description: Health status enumeration. - enum: - - UP - - DOWN - title: HealthStatus - type: string - ValidationError: - properties: - loc: - items: - anyOf: - - type: string - - type: integer - title: Location - type: array - msg: - title: Message - type: string - type: - title: Error Type - type: string - required: - - loc - - msg - - type - title: ValidationError - type: object - _HelloWorldResponse: - description: Response model for hello-world endpoint. - properties: - message: - description: The hello world message - examples: - - Hello, world! - title: Message - type: string - required: - - message - title: _HelloWorldResponse - type: object -info: - contact: - email: support@aignostics.com - name: Aignostics GmbH - url: https://github.com/aignostics - termsOfService: https://aignostics.readthedocs.io/en/latest/ - title: Aignostics Python SDK - version: 1.0.0 -openapi: 3.1.0 -paths: - /echo/{text}: - get: - description: "Echo back the provided text.\n\nArgs:\n text (str): The text\ - \ to echo.\n\nReturns:\n Echo: The echo.\n\nRaises:\n 422 Unprocessable\ - \ Entity: If text is not provided or empty." - operationId: echo_echo__text__get - parameters: - - in: path - name: text - required: true - schema: - title: Text - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/Echo' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Echo - tags: - - Basics - /health: - get: - description: "Check the health of the service.\n\nThis endpoint returns the\ - \ health status of the service.\nThe health status can be either UP or DOWN.\n\ - If the service is healthy, the status will be UP.\nIf the service is unhealthy,\ - \ the status will be DOWN and a reason will be provided.\nThe response will\ - \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\ - \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\ - \ The health status of the service." - operationId: health_health_get - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/Health' - description: Successful Response - summary: Health - tags: - - Observability - /healthz: - get: - description: "Check the health of the service.\n\nThis endpoint returns the\ - \ health status of the service.\nThe health status can be either UP or DOWN.\n\ - If the service is healthy, the status will be UP.\nIf the service is unhealthy,\ - \ the status will be DOWN and a reason will be provided.\nThe response will\ - \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\ - \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\ - \ The health status of the service." - operationId: health_healthz_get - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/Health' - description: Successful Response - summary: Health - tags: - - Observability - /hello-world: - get: - description: "Return a hello world message.\n\nReturns:\n _HelloWorldResponse:\ - \ A response containing the hello world message." - operationId: hello_world_hello_world_get - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/_HelloWorldResponse' - description: Successful Response - summary: Hello World - tags: - - Basics +Traceback (most recent call last): + File "/Users/helmut/Code/opt/.nox/docs-3-13/bin/aignostics", line 4, in + from aignostics.cli import cli + File "/Users/helmut/Code/opt/src/aignostics/cli.py", line 85 + uvx aignostics applications list + ^^^^^^^^^^ +SyntaxError: invalid syntax diff --git a/docs/source/_static/openapi_v2.yaml b/docs/source/_static/openapi_v2.yaml index 91e1e607..d2873d84 100644 --- a/docs/source/_static/openapi_v2.yaml +++ b/docs/source/_static/openapi_v2.yaml @@ -1,187 +1,7 @@ -components: - schemas: - Echo: - description: Response model for echo endpoint. - properties: - text: - description: The echo - examples: - - HELLO, WORLD! - minLength: 1 - title: Text - type: string - required: - - text - title: Echo - type: object - HTTPValidationError: - properties: - detail: - items: - $ref: '#/components/schemas/ValidationError' - title: Detail - type: array - title: HTTPValidationError - type: object - Health: - description: Health status model. - properties: - reason: - anyOf: - - type: string - - type: 'null' - title: Reason - status: - $ref: '#/components/schemas/HealthStatus' - required: - - status - title: Health - type: object - HealthStatus: - description: Health status enumeration. - enum: - - UP - - DOWN - title: HealthStatus - type: string - Utterance: - description: Model representing a text utterance. - properties: - text: - description: The utterance to echo back - examples: - - Hello, world! - minLength: 1 - title: Text - type: string - required: - - text - title: Utterance - type: object - ValidationError: - properties: - loc: - items: - anyOf: - - type: string - - type: integer - title: Location - type: array - msg: - title: Message - type: string - type: - title: Error Type - type: string - required: - - loc - - msg - - type - title: ValidationError - type: object - _HelloWorldResponse: - description: Response model for hello-world endpoint. - properties: - message: - description: The hello world message - examples: - - Hello, world! - title: Message - type: string - required: - - message - title: _HelloWorldResponse - type: object -info: - contact: - email: support@aignostics.com - name: Aignostics GmbH - url: https://github.com/aignostics - termsOfService: https://aignostics.readthedocs.io/en/latest/ - title: Aignostics Python SDK - version: 2.0.0 -openapi: 3.1.0 -paths: - /echo: - post: - description: "Echo back the provided utterance.\n\nArgs:\n request (Utterance):\ - \ The utterance to echo back.\n\nReturns:\n Echo: The echo.\n\nRaises:\n\ - \ 422 Unprocessable Entity: If utterance is not provided or empty." - operationId: echo_v2_echo_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/Utterance' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/Echo' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Echo V2 - tags: - - Basics - /health: - get: - description: "Check the health of the service.\n\nThis endpoint returns the\ - \ health status of the service.\nThe health status can be either UP or DOWN.\n\ - If the service is healthy, the status will be UP.\nIf the service is unhealthy,\ - \ the status will be DOWN and a reason will be provided.\nThe response will\ - \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\ - \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\ - \ The health status of the service." - operationId: health_health_get - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/Health' - description: Successful Response - summary: Health - tags: - - Observability - /healthz: - get: - description: "Check the health of the service.\n\nThis endpoint returns the\ - \ health status of the service.\nThe health status can be either UP or DOWN.\n\ - If the service is healthy, the status will be UP.\nIf the service is unhealthy,\ - \ the status will be DOWN and a reason will be provided.\nThe response will\ - \ have a 200 OK status code if the service is healthy,\nand a 500 Internal\ - \ Server Error status code if the service is unhealthy.\n\nReturns:\n Health:\ - \ The health status of the service." - operationId: health_healthz_get - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/Health' - description: Successful Response - summary: Health - tags: - - Observability - /hello-world: - get: - description: "Return a hello world message.\n\nReturns:\n _HelloWorldResponse:\ - \ A response containing the hello world message." - operationId: hello_world_hello_world_get - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/_HelloWorldResponse' - description: Successful Response - summary: Hello World - tags: - - Basics +Traceback (most recent call last): + File "/Users/helmut/Code/opt/.nox/docs-3-13/bin/aignostics", line 4, in + from aignostics.cli import cli + File "/Users/helmut/Code/opt/src/aignostics/cli.py", line 85 + uvx aignostics applications list + ^^^^^^^^^^ +SyntaxError: invalid syntax diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index 261a0865..697b0a5a 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -82,6 +82,8 @@ def papi_applications_list() -> None: applications = papi_client.applications.list() _console.print(applications) +uvx aignostics applications list +uvx aignostics run poll class APIVersion(StrEnum): """ diff --git a/src/aignx/platform/_authentication.py b/src/aignx/platform/_authentication.py index f57440c3..023162af 100644 --- a/src/aignx/platform/_authentication.py +++ b/src/aignx/platform/_authentication.py @@ -21,6 +21,10 @@ SCOPE = ["offline_access"] # include a refresh token as well REDIRECT_URI = "http://localhost:8080" # is configured in Auth0 - do not change +print(CLIENT_ID_DEVICE) +print(CLIENT_ID_INTERACTIVE) +exit + AUDIENCE = "https://dev-8ouohmmrbuh2h4vu-samia" AUTHORIZATION_BASE_URL = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize" TOKEN_URL = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" @@ -134,13 +138,9 @@ def log_message(self, format, *args): def _perform_authorization_code_with_pkce_flow(): parsed_redirect = urlparse(REDIRECT_URI) - with _OAuthHttpServer( - (parsed_redirect.hostname, parsed_redirect.port), _OAuthHttpHandler - ) as httpd: + with _OAuthHttpServer((parsed_redirect.hostname, parsed_redirect.port), _OAuthHttpHandler) as httpd: # initialize flow (generate code_challenge and code_verifier) - session = OAuth2Session( - CLIENT_ID_INTERACTIVE, scope=SCOPE, redirect_uri=REDIRECT_URI, pkce="S256" - ) + session = OAuth2Session(CLIENT_ID_INTERACTIVE, scope=SCOPE, redirect_uri=REDIRECT_URI, pkce="S256") authorization_url, state = session.authorization_url( AUTHORIZATION_BASE_URL, access_type="offline", audience=AUDIENCE ) @@ -159,11 +159,9 @@ def _perform_authorization_code_with_pkce_flow(): def _perform_device_flow(): - resp = requests.post( - DEVICE_URL, data={"client_id": CLIENT_ID_DEVICE, "scope": SCOPE, "audience": AUDIENCE} - ) + resp = requests.post(DEVICE_URL, data={"client_id": CLIENT_ID_DEVICE, "scope": SCOPE, "audience": AUDIENCE}) device_code = resp.json()["device_code"] - print(f'Please visit: {resp.json()["verification_uri_complete"]}') + print(f"Please visit: {resp.json()['verification_uri_complete']}") # Polling for access token with received device code while True: diff --git a/tests/aignx/platform/two_task_dummy_app_test.py b/tests/aignx/platform/two_task_dummy_app_test.py index 69d5ccbe..3a0fbca4 100644 --- a/tests/aignx/platform/two_task_dummy_app_test.py +++ b/tests/aignx/platform/two_task_dummy_app_test.py @@ -71,7 +71,7 @@ def three_spots_payload(): ] -@pytest.mark.timeout(2) +@pytest.mark.timeout(2) # TODO (Helmut): Revert to 240 def test_two_task_dummy_app(): application_version = "60e7b441-307a-4b41-8a97-5b02e7bc73a4" print(f"Create application run for application version: {application_version}") From a81f0a51ddc059048a9d47d1acda85970242d1a3 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 19:04:32 +0200 Subject: [PATCH 005/110] chore: scheduled --- src/aignostics/cli.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index 697b0a5a..261a0865 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -82,8 +82,6 @@ def papi_applications_list() -> None: applications = papi_client.applications.list() _console.print(applications) -uvx aignostics applications list -uvx aignostics run poll class APIVersion(StrEnum): """ From fe0c6f284a0d7f6c85affe3d20f61444721b8817 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 20:48:28 +0200 Subject: [PATCH 006/110] refactor: (a) openapi schema dump from file / can be later switched to pull from web, thereby full reuse of doc generation pipe; (b) removed hello world, echo, and api server --- docs/source/_static/openapi_v1.json | 3326 ++++++++++++++++++++++++- docs/source/_static/openapi_v1.yaml | 2147 +++++++++++++++- docs/source/_static/openapi_v2.json | 262 -- docs/source/_static/openapi_v2.yaml | 7 - docs/source/api_v2.rst | 9 - docs/source/index.rst | 1 - noxfile.py | 17 - src/aignostics/__init__.py | 9 +- src/aignostics/api.py | 181 -- src/aignostics/cli.py | 97 +- src/aignostics/exceptions.py | 9 + src/aignostics/models.py | 27 +- src/aignostics/service.py | 41 +- src/aignostics/types.py | 36 + src/aignx/platform/_authentication.py | 4 - tests/api_test.py | 129 - tests/cli_test.py | 61 - 17 files changed, 5407 insertions(+), 956 deletions(-) delete mode 100644 docs/source/_static/openapi_v2.json delete mode 100644 docs/source/_static/openapi_v2.yaml delete mode 100644 docs/source/api_v2.rst delete mode 100644 src/aignostics/api.py create mode 100644 src/aignostics/exceptions.py create mode 100644 src/aignostics/types.py delete mode 100644 tests/api_test.py diff --git a/docs/source/_static/openapi_v1.json b/docs/source/_static/openapi_v1.json index 44a8f286..f9182b03 100644 --- a/docs/source/_static/openapi_v1.json +++ b/docs/source/_static/openapi_v1.json @@ -1,53 +1,133 @@ { "openapi": "3.1.0", "info": { - "title": "Aignostics Python SDK", - "termsOfService": "https://aignostics.readthedocs.io/en/latest/", - "contact": { - "name": "Aignostics GmbH", - "url": "https://github.com/aignostics", - "email": "support@aignostics.com" - }, - "version": "1.0.0" + "title": "Aignostics Platform API", + "summary": "Interact with Aignostics' Application Platform", + "description": "Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`.", + "version": "0.1.0" }, "paths": { - "/health": { - "get": { + "/v1/applications": { + "post": { "tags": [ - "Observability" + "Admins" ], - "summary": "Health", - "description": "Check the health of the service.\n\nThis endpoint returns the health status of the service.\nThe health status can be either UP or DOWN.\nIf the service is healthy, the status will be UP.\nIf the service is unhealthy, the status will be DOWN and a reason will be provided.\nThe response will have a 200 OK status code if the service is healthy,\nand a 500 Internal Server Error status code if the service is unhealthy.\n\nReturns:\n Health: The health status of the service.", - "operationId": "health_health_get", + "summary": "Register Application", + "operationId": "register_application_v1_applications_post", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApplicationCreationRequest" + } + } + } + }, "responses": { - "200": { + "201": { "description": "Successful Response", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Health" + "$ref": "#/components/schemas/ApplicationCreationResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } } } } } - } - }, - "/healthz": { + }, "get": { "tags": [ - "Observability" + "Externals" + ], + "summary": "List Applications", + "operationId": "list_applications_v1_applications_get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "default": 1, + "title": "Page" + } + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 5, + "default": 50, + "title": "Page Size" + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "title": "Sort" + } + } ], - "summary": "Health", - "description": "Check the health of the service.\n\nThis endpoint returns the health status of the service.\nThe health status can be either UP or DOWN.\nIf the service is healthy, the status will be UP.\nIf the service is unhealthy, the status will be DOWN and a reason will be provided.\nThe response will have a 200 OK status code if the service is healthy,\nand a 500 Internal Server Error status code if the service is unhealthy.\n\nReturns:\n Health: The health status of the service.", - "operationId": "health_healthz_get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Health" + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationReadResponse" + }, + "title": "Response List Applications V1 Applications Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } } } @@ -55,21 +135,47 @@ } } }, - "/hello-world": { + "/v1/applications/{application_id}": { "get": { "tags": [ - "Basics" + "Externals" + ], + "summary": "Read Application By Id", + "operationId": "read_application_by_id_v1_applications__application_id__get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "application_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Application Id" + } + } ], - "summary": "Hello World", - "description": "Return a hello world message.\n\nReturns:\n _HelloWorldResponse: A response containing the hello world message.", - "operationId": "hello_world_hello_world_get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/_HelloWorldResponse" + "$ref": "#/components/schemas/ApplicationReadResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } } } @@ -77,22 +183,26 @@ } } }, - "/echo/{text}": { + "/v1/applications/{application_slug}": { "get": { "tags": [ - "Basics" + "Externals" + ], + "summary": "Read Application By Slug", + "operationId": "read_application_by_slug_v1_applications__application_slug__get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } ], - "summary": "Echo", - "description": "Echo back the provided text.\n\nArgs:\n text (str): The text to echo.\n\nReturns:\n Echo: The echo.\n\nRaises:\n 422 Unprocessable Entity: If text is not provided or empty.", - "operationId": "echo_echo__text__get", "parameters": [ { - "name": "text", + "name": "application_slug", "in": "path", "required": true, "schema": { "type": "string", - "title": "Text" + "title": "Application Slug" } } ], @@ -102,7 +212,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Echo" + "$ref": "#/components/schemas/ApplicationReadResponse" } } } @@ -119,126 +229,3078 @@ } } } - } - }, - "components": { - "schemas": { - "Echo": { - "properties": { - "text": { - "type": "string", - "minLength": 1, - "title": "Text", - "description": "The echo", - "examples": [ - "HELLO, WORLD!" - ] + }, + "/v1/applications/{application_id}/versions": { + "get": { + "tags": [ + "Externals" + ], + "summary": "List Versions By Application Id", + "operationId": "list_versions_by_application_id_v1_applications__application_id__versions_get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] } - }, - "type": "object", - "required": [ - "text" ], - "title": "Echo", - "description": "Response model for echo endpoint." - }, - "HTTPValidationError": { - "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Detail" + "parameters": [ + { + "name": "application_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Application Id" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "default": 1, + "title": "Page" + } + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 5, + "default": 50, + "title": "Page Size" + } + }, + { + "name": "version", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version" + } + }, + { + "name": "include", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "prefixItems": [ + { + "type": "string" + } + ], + "minItems": 1, + "maxItems": 1 + }, + { + "type": "null" + } + ], + "title": "Include" + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "title": "Sort" + } } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "Health": { - "properties": { - "status": { - "$ref": "#/components/schemas/HealthStatus" + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationVersionReadResponse" + }, + "title": "Response List Versions By Application Id V1 Applications Application Id Versions Get" + } + } + } }, - "reason": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } - ], - "title": "Reason" + } } - }, - "type": "object", - "required": [ - "status" + } + } + }, + "/v1/applications/{application_slug}/versions": { + "get": { + "tags": [ + "Externals" ], - "title": "Health", - "description": "Health status model." - }, - "HealthStatus": { - "type": "string", - "enum": [ - "UP", - "DOWN" + "summary": "List Versions By Application Slug", + "operationId": "list_versions_by_application_slug_v1_applications__application_slug__versions_get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } ], - "title": "HealthStatus", - "description": "Health status enumeration." - }, - "ValidationError": { - "properties": { - "loc": { - "items": { + "parameters": [ + { + "name": "application_slug", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z](-?[a-z])*$", + "title": "Application Slug" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "default": 1, + "title": "Page" + } + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 5, + "default": 50, + "title": "Page Size" + } + }, + { + "name": "version", + "in": "query", + "required": false, + "schema": { "anyOf": [ { "type": "string" }, { - "type": "integer" + "type": "null" } - ] - }, - "type": "array", - "title": "Location" + ], + "title": "Version" + } }, - "msg": { - "type": "string", - "title": "Message" + { + "name": "include", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "prefixItems": [ + { + "type": "string" + } + ], + "minItems": 1, + "maxItems": 1 + }, + { + "type": "null" + } + ], + "title": "Include" + } }, - "type": { - "type": "string", - "title": "Error Type" + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "title": "Sort" + } } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" ], - "title": "ValidationError" - }, - "_HelloWorldResponse": { + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationVersionReadResponse" + }, + "title": "Response List Versions By Application Slug V1 Applications Application Slug Versions Get" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/artifacts/{output_artifact_id}/event": { + "post": { + "tags": [ + "Algorithms/Apps" + ], + "summary": "Trigger Artifact Event", + "operationId": "trigger_artifact_event_v1_artifacts__output_artifact_id__event_post", + "parameters": [ + { + "name": "output_artifact_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Output Artifact Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OutputArtifactEventTriggerRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OutputArtifactEventTriggerResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/items/{item_id}": { + "get": { + "tags": [ + "Scheduler" + ], + "summary": "Get Item", + "operationId": "get_item_v1_items__item_id__get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Item Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ItemReadResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/items/{item_id}/event": { + "post": { + "tags": [ + "Scheduler" + ], + "summary": "Register Item Event", + "operationId": "register_item_event_v1_items__item_id__event_post", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "item_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Item Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ItemEventCreationRequest" + } + } + } + }, + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ItemEventCreationResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/organizations": { + "post": { + "tags": [ + "Organizations" + ], + "summary": "Create Organization", + "operationId": "create_organization_v1_organizations_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationCreationRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ] + } + }, + "/v1/organizations/{organization_id}": { + "patch": { + "tags": [ + "Organizations" + ], + "summary": "Update Organization", + "operationId": "update_organization_v1_organizations__organization_id__patch", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "organization_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Organization Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "Organizations" + ], + "summary": "Get Organization", + "operationId": "get_organization_v1_organizations__organization_id__get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "organization_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Organization Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/quotas": { + "get": { + "tags": [ + "Admins", + "Admins" + ], + "summary": "List Quotas", + "operationId": "list_quotas_v1_quotas_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QuotasReadResponse" + } + } + } + } + }, + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ] + }, + "patch": { + "tags": [ + "Admins", + "Admins" + ], + "summary": "Update Quotas", + "operationId": "update_quotas_v1_quotas_patch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QuotasUpdateRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QuotasUpdateResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ] + } + }, + "/v1/runs": { + "get": { + "tags": [ + "Externals" + ], + "summary": "List Application Runs", + "operationId": "list_application_runs_v1_runs_get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "application_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Application Id" + } + }, + { + "name": "application_version_id", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Application Version Id" + } + }, + { + "name": "include", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "prefixItems": [ + { + "type": "string" + } + ], + "minItems": 1, + "maxItems": 1 + }, + { + "type": "null" + } + ], + "title": "Include" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "default": 1, + "title": "Page" + } + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 5, + "default": 50, + "title": "Page Size" + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "title": "Sort" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RunReadResponse" + }, + "title": "Response List Application Runs V1 Runs Get" + } + } + } + }, + "404": { + "description": "Application run not found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "post": { + "tags": [ + "Externals" + ], + "summary": "Create Application Run", + "operationId": "create_application_run_v1_runs_post", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RunCreationRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RunCreationResponse" + } + } + } + }, + "404": { + "description": "Application run not found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/runs/{application_run_id}": { + "get": { + "tags": [ + "Externals", + "Scheduler" + ], + "summary": "Get Run", + "operationId": "get_run_v1_runs__application_run_id__get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "application_run_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Application Run Id" + } + }, + { + "name": "include", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "prefixItems": [ + { + "type": "string" + } + ], + "minItems": 1, + "maxItems": 1 + }, + { + "type": "null" + } + ], + "title": "Include" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RunReadResponse" + } + } + } + }, + "404": { + "description": "Application run not found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/runs/{application_run_id}/cancel": { + "post": { + "tags": [ + "Externals" + ], + "summary": "Cancel Run", + "operationId": "cancel_run_v1_runs__application_run_id__cancel_post", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "application_run_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Application Run Id" + } + } + ], + "responses": { + "202": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "404": { + "description": "Application run not found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/runs/{application_run_id}/results": { + "get": { + "tags": [ + "Externals" + ], + "summary": "List Run Results", + "operationId": "list_run_results_v1_runs__application_run_id__results_get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "application_run_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Application Run Id" + } + }, + { + "name": "item_id__in", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string", + "format": "uuid" + } + }, + { + "type": "null" + } + ], + "title": "Item Id In" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "default": 1, + "title": "Page" + } + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 5, + "default": 50, + "title": "Page Size" + } + }, + { + "name": "reference__in", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "title": "Reference In" + } + }, + { + "name": "status__in", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/components/schemas/ItemStatus" + } + }, + { + "type": "null" + } + ], + "title": "Status In" + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "title": "Sort" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ItemResultReadResponse" + }, + "title": "Response List Run Results V1 Runs Application Run Id Results Get" + } + } + } + }, + "404": { + "description": "Application run not found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Externals" + ], + "summary": "Delete Run Results", + "operationId": "delete_run_results_v1_runs__application_run_id__results_delete", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "application_run_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Application Run Id" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "404": { + "description": "Application run not found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/users/": { + "post": { + "tags": [ + "Externals" + ], + "summary": "Create User", + "operationId": "create_user_v1_users__post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserCreationRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserResponse" + } + } + } + }, + "404": { + "description": "User not found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ] + } + }, + "/v1/users/{user_id}": { + "patch": { + "tags": [ + "Externals" + ], + "summary": "Update User", + "operationId": "update_user_v1_users__user_id__patch", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "User Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserUpdateRequest" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserResponse" + } + } + } + }, + "404": { + "description": "User not found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "Externals" + ], + "summary": "Get User", + "operationId": "get_user_v1_users__user_id__get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "user_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "User Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserResponse" + } + } + } + }, + "404": { + "description": "User not found" + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/v1/versions": { + "post": { + "tags": [ + "Externals", + "Scheduler", + "Admins" + ], + "summary": "Register Version", + "operationId": "register_version_v1_versions_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionCreationRequest" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionCreationResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ] + } + }, + "/v1/versions/{application_version_id}": { + "get": { + "tags": [ + "Externals", + "Scheduler" + ], + "summary": "Get Version", + "operationId": "get_version_v1_versions__application_version_id__get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], + "parameters": [ + { + "name": "application_version_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Application Version Id" + } + }, + { + "name": "include", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "prefixItems": [ + { + "type": "string" + } + ], + "minItems": 1, + "maxItems": 1 + }, + { + "type": "null" + } + ], + "title": "Include" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionReadResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/liveness": { + "get": { + "tags": [ + "Infrastructure" + ], + "summary": "Liveness", + "description": "Check that the API application is alive and responsive.", + "operationId": "liveness_liveness_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/readiness": { + "get": { + "tags": [ + "Infrastructure" + ], + "summary": "Readiness", + "description": "Check that the API application is ready to serve.", + "operationId": "readiness_readiness_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/health": { + "get": { + "tags": [ + "Infrastructure" + ], + "summary": "Health", + "description": "Check that the API application is alive and responsive.", + "operationId": "health_health_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + }, + "/docs": { + "get": { + "summary": "Get Documentation", + "operationId": "get_documentation_docs_get", + "parameters": [ + { + "name": "access_token", + "in": "cookie", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Access Token" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "ApplicationCreationRequest": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "examples": [ + "HETA" + ] + }, + "description": { + "type": "string", + "title": "Description", + "examples": [ + "H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, cell detection and cell classfication" + ] + }, + "regulatory_classes": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Regulatory Classes", + "examples": [ + [ + "RuO" + ] + ] + } + }, + "type": "object", + "required": [ + "name", + "description", + "regulatory_classes" + ], + "title": "ApplicationCreationRequest" + }, + "ApplicationCreationResponse": { + "properties": { + "application_id": { + "type": "string", + "format": "uuid", + "title": "Application Id" + } + }, + "type": "object", + "required": [ + "application_id" + ], + "title": "ApplicationCreationResponse" + }, + "ApplicationReadResponse": { + "properties": { + "application_id": { + "type": "string", + "format": "uuid", + "title": "Application Id" + }, + "name": { + "type": "string", + "title": "Name", + "examples": [ + "HETA" + ] + }, + "slug": { + "type": "string", + "title": "Slug", + "examples": [ + "heta" + ] + }, + "regulatory_classes": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Regulatory Classes", + "examples": [ + [ + "RuO" + ] + ] + }, + "description": { + "type": "string", + "title": "Description", + "examples": [ + "Aignostics H&E TME application" + ] + } + }, + "type": "object", + "required": [ + "application_id", + "name", + "slug", + "regulatory_classes", + "description" + ], + "title": "ApplicationReadResponse" + }, + "ApplicationRunStatus": { + "type": "string", + "enum": [ + "canceled_system", + "canceled_user", + "completed", + "completed_with_error", + "received", + "rejected", + "running", + "scheduled" + ], + "title": "ApplicationRunStatus" + }, + "ApplicationVersionReadResponse": { + "properties": { + "application_version_id": { + "type": "string", + "format": "uuid", + "title": "Application Version Id" + }, + "application_version_slug": { + "type": "string", + "pattern": "^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$", + "title": "Application Version Slug", + "examples": [ + "tissue-segmentation-qc:v0.0.1" + ] + }, + "version": { + "type": "string", + "title": "Version" + }, + "application_id": { + "type": "string", + "format": "uuid", + "title": "Application Id" + }, + "flow_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Flow Id" + }, + "changelog": { + "type": "string", + "title": "Changelog" + }, + "input_artifacts": { + "items": { + "$ref": "#/components/schemas/InputArtifactReadResponse" + }, + "type": "array", + "title": "Input Artifacts" + }, + "output_artifacts": { + "items": { + "$ref": "#/components/schemas/OutputArtifactReadResponse" + }, + "type": "array", + "title": "Output Artifacts" + } + }, + "type": "object", + "required": [ + "application_version_id", + "application_version_slug", + "version", + "application_id", + "changelog", + "input_artifacts", + "output_artifacts" + ], + "title": "ApplicationVersionReadResponse" + }, + "ArtifactEvent": { + "type": "string", + "enum": [ + "succeeded", + "failed_with_user_error", + "failed_with_system_error" + ], + "title": "ArtifactEvent", + "description": "This is a subset of the OutputArtifactEvent used by the state machine.\nOnly the variants defined below are allowed to be submitted from the Algorithms/Applications." + }, + "ArtifactStatus": { + "type": "string", + "enum": [ + "pending", + "canceled_user", + "canceled_system", + "error_user", + "error_system_fatal", + "error_system_recoverable", + "skipped", + "succeeded" + ], + "title": "ArtifactStatus" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "InputArtifact": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "mime_type": { + "type": "string", + "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", + "title": "Mime Type", + "examples": [ + "image/tiff" + ] + }, + "metadata_schema": { + "type": "object", + "title": "Metadata Schema" + } + }, + "type": "object", + "required": [ + "name", + "mime_type", + "metadata_schema" + ], + "title": "InputArtifact" + }, + "InputArtifactCreationRequest": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "examples": [ + "slide" + ] + }, + "download_url": { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri", + "title": "Download Url", + "examples": [ + "https://example.com/case-no-1-slide.tiff" + ] + }, + "metadata": { + "type": "object", + "title": "Metadata", + "examples": [ + { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + } + ] + } + }, + "type": "object", + "required": [ + "name", + "download_url", + "metadata" + ], + "title": "InputArtifactCreationRequest" + }, + "InputArtifactReadResponse": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "mime_type": { + "type": "string", + "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", + "title": "Mime Type", + "examples": [ + "image/tiff" + ] + }, + "metadata_schema": { + "type": "object", + "title": "Metadata Schema" + } + }, + "type": "object", + "required": [ + "name", + "mime_type", + "metadata_schema" + ], + "title": "InputArtifactReadResponse" + }, + "InputArtifactSchemaCreationRequest": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "mime_type": { + "type": "string", + "title": "Mime Type", + "examples": [ + "application/vnd.apache.parquet" + ] + }, + "metadata_schema": { + "type": "object", + "title": "Metadata Schema" + } + }, + "type": "object", + "required": [ + "name", + "mime_type", + "metadata_schema" + ], + "title": "InputArtifactSchemaCreationRequest" + }, + "ItemCreationRequest": { + "properties": { + "reference": { + "type": "string", + "title": "Reference", + "examples": [ + "case-no-1" + ] + }, + "input_artifacts": { + "items": { + "$ref": "#/components/schemas/InputArtifactCreationRequest" + }, + "type": "array", + "title": "Input Artifacts" + } + }, + "type": "object", + "required": [ + "reference", + "input_artifacts" + ], + "title": "ItemCreationRequest" + }, + "ItemEvent": { + "type": "string", + "enum": [ + "failed_with_system_error", + "failed_recoverable" + ], + "title": "ItemEvent" + }, + "ItemEventCreationRequest": { + "properties": { + "event": { + "$ref": "#/components/schemas/ItemEvent" + }, + "error": { + "type": "string", + "title": "Error" + } + }, + "type": "object", + "required": [ + "event", + "error" + ], + "title": "ItemEventCreationRequest" + }, + "ItemEventCreationResponse": { + "properties": { + "item_id": { + "type": "string", + "format": "uuid", + "title": "Item Id" + }, + "status": { + "$ref": "#/components/schemas/ItemStatus" + } + }, + "type": "object", + "required": [ + "item_id", + "status" + ], + "title": "ItemEventCreationResponse" + }, + "ItemReadResponse": { + "properties": { + "item_id": { + "type": "string", + "format": "uuid", + "title": "Item Id" + }, + "application_run_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Application Run Id" + }, + "reference": { + "type": "string", + "title": "Reference" + }, + "status": { + "$ref": "#/components/schemas/ItemStatus" + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error" + } + }, + "type": "object", + "required": [ + "item_id", + "reference", + "status", + "error" + ], + "title": "ItemReadResponse" + }, + "ItemResultReadResponse": { + "properties": { + "item_id": { + "type": "string", + "format": "uuid", + "title": "Item Id" + }, + "application_run_id": { + "type": "string", + "format": "uuid", + "title": "Application Run Id" + }, + "reference": { + "type": "string", + "title": "Reference" + }, + "status": { + "$ref": "#/components/schemas/ItemStatus" + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error" + }, + "output_artifacts": { + "items": { + "$ref": "#/components/schemas/OutputArtifactResultReadResponse" + }, + "type": "array", + "title": "Output Artifacts" + } + }, + "type": "object", + "required": [ + "item_id", + "application_run_id", + "reference", + "status", + "error", + "output_artifacts" + ], + "title": "ItemResultReadResponse" + }, + "ItemStatus": { + "type": "string", + "enum": [ + "pending", + "canceled_user", + "canceled_system", + "error_user", + "error_system", + "succeeded" + ], + "title": "ItemStatus" + }, + "OrganizationCreationRequest": { + "properties": { + "organization_id": { + "type": "string", + "title": "Organization Id" + }, + "owner_email": { + "type": "string", + "title": "Owner Email" + }, + "slide_quota": { + "type": "integer", + "title": "Slide Quota" + }, + "batch_size": { + "type": "integer", + "title": "Batch Size" + } + }, + "type": "object", + "required": [ + "organization_id", + "owner_email", + "slide_quota", + "batch_size" + ], + "title": "OrganizationCreationRequest" + }, + "OrganizationQuota": { + "properties": { + "total": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Total" + }, + "used": { + "type": "integer", + "title": "Used" + } + }, + "type": "object", + "required": [ + "total", + "used" + ], + "title": "OrganizationQuota" + }, + "OrganizationResponse": { + "properties": { + "organization_id": { + "type": "string", + "title": "Organization Id" + }, + "owner_id": { + "type": "string", + "format": "uuid", + "title": "Owner Id" + }, + "slide_quota": { + "$ref": "#/components/schemas/OrganizationQuota" + }, + "batch_size": { + "type": "integer", + "title": "Batch Size" + } + }, + "type": "object", + "required": [ + "organization_id", + "owner_id", + "slide_quota", + "batch_size" + ], + "title": "OrganizationResponse" + }, + "OrganizationUpdateRequest": { + "properties": { + "slide_quota": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Slide Quota" + }, + "batch_size": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Batch Size" + } + }, + "type": "object", + "title": "OrganizationUpdateRequest" + }, + "OutputArtifact": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "mime_type": { + "type": "string", + "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", + "title": "Mime Type", + "examples": [ + "application/vnd.apache.parquet" + ] + }, + "metadata_schema": { + "type": "object", + "title": "Metadata Schema" + }, + "scope": { + "$ref": "#/components/schemas/OutputArtifactScope" + }, + "visibility": { + "$ref": "#/components/schemas/OutputArtifactVisibility" + } + }, + "type": "object", + "required": [ + "name", + "mime_type", + "metadata_schema", + "scope", + "visibility" + ], + "title": "OutputArtifact" + }, + "OutputArtifactEventTriggerRequest": { + "properties": { + "event": { + "$ref": "#/components/schemas/ArtifactEvent" + }, + "metadata": { + "type": "object", + "title": "Metadata" + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error" + } + }, + "type": "object", + "required": [ + "event", + "metadata" + ], + "title": "OutputArtifactEventTriggerRequest" + }, + "OutputArtifactEventTriggerResponse": { + "properties": { + "output_artifact_id": { + "type": "string", + "format": "uuid", + "title": "Output Artifact Id" + }, + "status": { + "$ref": "#/components/schemas/ArtifactStatus" + } + }, + "type": "object", + "required": [ + "output_artifact_id", + "status" + ], + "title": "OutputArtifactEventTriggerResponse" + }, + "OutputArtifactReadResponse": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "mime_type": { + "type": "string", + "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", + "title": "Mime Type", + "examples": [ + "application/vnd.apache.parquet" + ] + }, + "metadata_schema": { + "type": "object", + "title": "Metadata Schema" + }, + "scope": { + "$ref": "#/components/schemas/OutputArtifactScope" + } + }, + "type": "object", + "required": [ + "name", + "mime_type", + "metadata_schema", + "scope" + ], + "title": "OutputArtifactReadResponse" + }, + "OutputArtifactResultReadResponse": { + "properties": { + "output_artifact_id": { + "type": "string", + "format": "uuid", + "title": "Output Artifact Id" + }, + "name": { + "type": "string", + "title": "Name" + }, + "mime_type": { + "type": "string", + "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", + "title": "Mime Type", + "examples": [ + "application/vnd.apache.parquet" + ] + }, + "metadata": { + "type": "object", + "title": "Metadata" + }, + "download_url": { + "anyOf": [ + { + "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri" + }, + { + "type": "null" + } + ], + "title": "Download Url" + } + }, + "type": "object", + "required": [ + "output_artifact_id", + "name", + "mime_type", + "metadata", + "download_url" + ], + "title": "OutputArtifactResultReadResponse" + }, + "OutputArtifactSchemaCreationRequest": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "mime_type": { + "type": "string", + "title": "Mime Type", + "examples": [ + "application/vnd.apache.parquet" + ] + }, + "scope": { + "$ref": "#/components/schemas/OutputArtifactScope" + }, + "visibility": { + "$ref": "#/components/schemas/OutputArtifactVisibility" + }, + "metadata_schema": { + "type": "object", + "title": "Metadata Schema" + } + }, + "type": "object", + "required": [ + "name", + "mime_type", + "scope", + "visibility", + "metadata_schema" + ], + "title": "OutputArtifactSchemaCreationRequest" + }, + "OutputArtifactScope": { + "type": "string", + "enum": [ + "item", + "global" + ], + "title": "OutputArtifactScope" + }, + "OutputArtifactVisibility": { + "type": "string", + "enum": [ + "internal", + "external" + ], + "title": "OutputArtifactVisibility" + }, + "PayloadInputArtifact": { + "properties": { + "input_artifact_id": { + "type": "string", + "format": "uuid", + "title": "Input Artifact Id" + }, + "metadata": { + "type": "object", + "title": "Metadata" + }, + "download_url": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Download Url" + } + }, + "type": "object", + "required": [ + "input_artifact_id", + "metadata", + "download_url" + ], + "title": "PayloadInputArtifact" + }, + "PayloadItem": { + "properties": { + "item_id": { + "type": "string", + "format": "uuid", + "title": "Item Id" + }, + "input_artifacts": { + "additionalProperties": { + "$ref": "#/components/schemas/PayloadInputArtifact" + }, + "type": "object", + "title": "Input Artifacts" + }, + "output_artifacts": { + "additionalProperties": { + "$ref": "#/components/schemas/PayloadOutputArtifact" + }, + "type": "object", + "title": "Output Artifacts" + } + }, + "type": "object", + "required": [ + "item_id", + "input_artifacts", + "output_artifacts" + ], + "title": "PayloadItem" + }, + "PayloadOutputArtifact": { + "properties": { + "output_artifact_id": { + "type": "string", + "format": "uuid", + "title": "Output Artifact Id" + }, + "data": { + "$ref": "#/components/schemas/TransferUrls" + }, + "metadata": { + "$ref": "#/components/schemas/TransferUrls" + } + }, + "type": "object", + "required": [ + "output_artifact_id", + "data", + "metadata" + ], + "title": "PayloadOutputArtifact" + }, + "QuotaName": { + "type": "string", + "enum": [ + "max_users", + "max_organizations", + "max_users_per_organization", + "max_applications", + "max_application_versions", + "max_slides_per_run", + "max_parallel_runs", + "max_parallel_runs_per_organization", + "max_parallel_runs_per_user" + ], + "title": "QuotaName", + "description": "Global, API-level, and slide-level quotas for Samia API." + }, + "QuotaReadResponse": { + "properties": { + "name": { + "$ref": "#/components/schemas/QuotaName" + }, + "quota": { + "type": "integer", + "title": "Quota" + } + }, + "type": "object", + "required": [ + "name", + "quota" + ], + "title": "QuotaReadResponse", + "description": "GET response payload for quota read." + }, + "QuotaUpdateRequest": { + "properties": { + "name": { + "$ref": "#/components/schemas/QuotaName" + }, + "quota": { + "type": "integer", + "exclusiveMinimum": 0.0, + "title": "Quota" + } + }, + "type": "object", + "required": [ + "name", + "quota" + ], + "title": "QuotaUpdateRequest", + "description": "PATCH request payload for quota update." + }, + "QuotaUpdateResponse": { + "properties": { + "name": { + "$ref": "#/components/schemas/QuotaName" + }, + "quota": { + "type": "integer", + "title": "Quota" + } + }, + "type": "object", + "required": [ + "name", + "quota" + ], + "title": "QuotaUpdateResponse", + "description": "PATCH response payload for quota update." + }, + "QuotasReadResponse": { + "properties": { + "quotas": { + "items": { + "$ref": "#/components/schemas/QuotaReadResponse" + }, + "type": "array", + "title": "Quotas" + } + }, + "type": "object", + "required": [ + "quotas" + ], + "title": "QuotasReadResponse", + "description": "GET response payload for multiple quota reads." + }, + "QuotasUpdateRequest": { + "properties": { + "quotas": { + "items": { + "$ref": "#/components/schemas/QuotaUpdateRequest" + }, + "type": "array", + "title": "Quotas" + } + }, + "type": "object", + "required": [ + "quotas" + ], + "title": "QuotasUpdateRequest", + "description": "PATCH request payload for quota updates." + }, + "QuotasUpdateResponse": { + "properties": { + "updated_quotas": { + "items": { + "$ref": "#/components/schemas/QuotaUpdateResponse" + }, + "type": "array", + "title": "Updated Quotas" + } + }, + "type": "object", + "required": [ + "updated_quotas" + ], + "title": "QuotasUpdateResponse", + "description": "PATCH response payload for quota updates." + }, + "RunCreationRequest": { + "properties": { + "application_version": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "$ref": "#/components/schemas/SlugVersionRequest" + } + ], + "title": "Application Version", + "examples": [ + "efbf9822-a1e5-4045-a283-dbf26e8064a9" + ] + }, + "items": { + "items": { + "$ref": "#/components/schemas/ItemCreationRequest" + }, + "type": "array", + "title": "Items" + } + }, + "type": "object", + "required": [ + "application_version", + "items" + ], + "title": "RunCreationRequest" + }, + "RunCreationResponse": { "properties": { - "message": { + "application_run_id": { "type": "string", - "title": "Message", - "description": "The hello world message", - "examples": [ - "Hello, world!" + "format": "uuid", + "title": "Application Run Id" + } + }, + "type": "object", + "required": [ + "application_run_id" + ], + "title": "RunCreationResponse" + }, + "RunReadResponse": { + "properties": { + "application_run_id": { + "type": "string", + "format": "uuid", + "title": "Application Run Id" + }, + "application_version_id": { + "type": "string", + "format": "uuid", + "title": "Application Version Id" + }, + "organization_id": { + "type": "string", + "title": "Organization Id" + }, + "user_payload": { + "anyOf": [ + { + "$ref": "#/components/schemas/UserPayload" + }, + { + "type": "null" + } ] + }, + "status": { + "$ref": "#/components/schemas/ApplicationRunStatus" + }, + "triggered_at": { + "type": "string", + "format": "date-time", + "title": "Triggered At" + }, + "triggered_by": { + "type": "string", + "title": "Triggered By" + } + }, + "type": "object", + "required": [ + "application_run_id", + "application_version_id", + "organization_id", + "status", + "triggered_at", + "triggered_by" + ], + "title": "RunReadResponse" + }, + "SlugVersionRequest": { + "properties": { + "application_slug": { + "type": "string", + "pattern": "^[a-z](-?[a-z])*$", + "title": "Application Slug" + }, + "version": { + "type": "string", + "title": "Version" + } + }, + "type": "object", + "required": [ + "application_slug", + "version" + ], + "title": "SlugVersionRequest" + }, + "TransferUrls": { + "properties": { + "upload_url": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Upload Url" + }, + "download_url": { + "type": "string", + "minLength": 1, + "format": "uri", + "title": "Download Url" + } + }, + "type": "object", + "required": [ + "upload_url", + "download_url" + ], + "title": "TransferUrls" + }, + "UserCreationRequest": { + "properties": { + "user_id": { + "type": "string", + "title": "User Id" + }, + "organization_id": { + "type": "string", + "format": "uuid", + "title": "Organization Id" + }, + "email": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Email" + } + }, + "type": "object", + "required": [ + "user_id", + "organization_id", + "email" + ], + "title": "UserCreationRequest" + }, + "UserPayload": { + "properties": { + "application_id": { + "type": "string", + "format": "uuid", + "title": "Application Id" + }, + "application_run_id": { + "type": "string", + "format": "uuid", + "title": "Application Run Id" + }, + "global_output_artifacts": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/PayloadOutputArtifact" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Global Output Artifacts" + }, + "items": { + "items": { + "$ref": "#/components/schemas/PayloadItem" + }, + "type": "array", + "title": "Items" + } + }, + "type": "object", + "required": [ + "application_id", + "application_run_id", + "global_output_artifacts", + "items" + ], + "title": "UserPayload" + }, + "UserQuota": { + "properties": { + "total": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Total" + }, + "used": { + "type": "integer", + "title": "Used" + } + }, + "type": "object", + "required": [ + "total", + "used" + ], + "title": "UserQuota" + }, + "UserResponse": { + "properties": { + "user_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User Id" + }, + "organization_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Organization Id" + }, + "slide_quota": { + "$ref": "#/components/schemas/UserQuota" + } + }, + "type": "object", + "required": [ + "user_id", + "organization_id", + "slide_quota" + ], + "title": "UserResponse" + }, + "UserUpdateRequest": { + "properties": { + "user_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User Id" + }, + "slide_quota": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Slide Quota" + } + }, + "type": "object", + "title": "UserUpdateRequest" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + }, + "VersionCreationRequest": { + "properties": { + "version": { + "type": "string", + "title": "Version" + }, + "application_id": { + "type": "string", + "format": "uuid", + "title": "Application Id" + }, + "flow_id": { + "type": "string", + "format": "uuid", + "title": "Flow Id" + }, + "changelog": { + "type": "string", + "title": "Changelog" + }, + "input_artifacts": { + "items": { + "$ref": "#/components/schemas/InputArtifactSchemaCreationRequest" + }, + "type": "array", + "title": "Input Artifacts" + }, + "output_artifacts": { + "items": { + "$ref": "#/components/schemas/OutputArtifactSchemaCreationRequest" + }, + "type": "array", + "title": "Output Artifacts" + } + }, + "type": "object", + "required": [ + "version", + "application_id", + "flow_id", + "changelog", + "input_artifacts", + "output_artifacts" + ], + "title": "VersionCreationRequest" + }, + "VersionCreationResponse": { + "properties": { + "application_version_id": { + "type": "string", + "format": "uuid", + "title": "Application Version Id" + } + }, + "type": "object", + "required": [ + "application_version_id" + ], + "title": "VersionCreationResponse" + }, + "VersionReadResponse": { + "properties": { + "application_version_id": { + "type": "string", + "format": "uuid", + "title": "Application Version Id" + }, + "version": { + "type": "string", + "title": "Version" + }, + "application_id": { + "type": "string", + "format": "uuid", + "title": "Application Id" + }, + "flow_id": { + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Flow Id" + }, + "changelog": { + "type": "string", + "title": "Changelog" + }, + "input_artifacts": { + "items": { + "$ref": "#/components/schemas/InputArtifact" + }, + "type": "array", + "title": "Input Artifacts" + }, + "output_artifacts": { + "items": { + "$ref": "#/components/schemas/OutputArtifact" + }, + "type": "array", + "title": "Output Artifacts" + }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" } }, "type": "object", "required": [ - "message" + "application_version_id", + "version", + "application_id", + "changelog", + "input_artifacts", + "output_artifacts", + "created_at" ], - "title": "_HelloWorldResponse", - "description": "Response model for hello-world endpoint." + "title": "VersionReadResponse" + } + }, + "securitySchemes": { + "OAuth2AuthorizationCodeBearer": { + "type": "oauth2", + "flows": { + "authorizationCode": { + "scopes": {}, + "authorizationUrl": "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize", + "tokenUrl": "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" + } + } } } - } + }, + "tags": [ + { + "name": "Externals", + "description": "Called by externals to interact with our API" + }, + { + "name": "Algorithms/Apps", + "description": "Called by the Algorithms and applications to update statuses" + }, + { + "name": "Scheduler", + "description": "Called by the Scheduler" + }, + { + "name": "Admins", + "description": "Called by Admins to manage and register entities" + }, + { + "name": "Infrastructure", + "description": "Called by other Infra" + } + ] } diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index d2873d84..f1a167fb 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -1,7 +1,2140 @@ -Traceback (most recent call last): - File "/Users/helmut/Code/opt/.nox/docs-3-13/bin/aignostics", line 4, in - from aignostics.cli import cli - File "/Users/helmut/Code/opt/src/aignostics/cli.py", line 85 - uvx aignostics applications list - ^^^^^^^^^^ -SyntaxError: invalid syntax +components: + schemas: + ApplicationCreationRequest: + properties: + description: + examples: + - 'H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, + cell detection and cell classfication' + title: Description + type: string + name: + examples: + - HETA + title: Name + type: string + regulatory_classes: + examples: + - - RuO + items: + type: string + title: Regulatory Classes + type: array + required: + - name + - description + - regulatory_classes + title: ApplicationCreationRequest + type: object + ApplicationCreationResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + required: + - application_id + title: ApplicationCreationResponse + type: object + ApplicationReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + description: + examples: + - Aignostics H&E TME application + title: Description + type: string + name: + examples: + - HETA + title: Name + type: string + regulatory_classes: + examples: + - - RuO + items: + type: string + title: Regulatory Classes + type: array + slug: + examples: + - heta + title: Slug + type: string + required: + - application_id + - name + - slug + - regulatory_classes + - description + title: ApplicationReadResponse + type: object + ApplicationRunStatus: + enum: + - canceled_system + - canceled_user + - completed + - completed_with_error + - received + - rejected + - running + - scheduled + title: ApplicationRunStatus + type: string + ApplicationVersionReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + application_version_slug: + examples: + - tissue-segmentation-qc:v0.0.1 + pattern: ^(?:|-)*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ + title: Application Version Slug + type: string + changelog: + title: Changelog + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Flow Id + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactReadResponse' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactReadResponse' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - application_version_id + - application_version_slug + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + title: ApplicationVersionReadResponse + type: object + ArtifactEvent: + description: 'This is a subset of the OutputArtifactEvent used by the state + machine. + + Only the variants defined below are allowed to be submitted from the Algorithms/Applications.' + enum: + - succeeded + - failed_with_user_error + - failed_with_system_error + title: ArtifactEvent + type: string + ArtifactStatus: + enum: + - pending + - canceled_user + - canceled_system + - error_user + - error_system_fatal + - error_system_recoverable + - skipped + - succeeded + title: ArtifactStatus + type: string + HTTPValidationError: + properties: + detail: + items: + $ref: '#/components/schemas/ValidationError' + title: Detail + type: array + title: HTTPValidationError + type: object + InputArtifact: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifact + type: object + InputArtifactCreationRequest: + properties: + download_url: + examples: + - https://example.com/case-no-1-slide.tiff + format: uri + maxLength: 2083 + minLength: 1 + title: Download Url + type: string + metadata: + examples: + - checksum_crc32c: 752f9554 + height: 2000 + height_mpp: 0.5 + width: 10000 + width_mpp: 0.5 + title: Metadata + type: object + name: + examples: + - slide + title: Name + type: string + required: + - name + - download_url + - metadata + title: InputArtifactCreationRequest + type: object + InputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactReadResponse + type: object + InputArtifactSchemaCreationRequest: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactSchemaCreationRequest + type: object + ItemCreationRequest: + properties: + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactCreationRequest' + title: Input Artifacts + type: array + reference: + examples: + - case-no-1 + title: Reference + type: string + required: + - reference + - input_artifacts + title: ItemCreationRequest + type: object + ItemEvent: + enum: + - failed_with_system_error + - failed_recoverable + title: ItemEvent + type: string + ItemEventCreationRequest: + properties: + error: + title: Error + type: string + event: + $ref: '#/components/schemas/ItemEvent' + required: + - event + - error + title: ItemEventCreationRequest + type: object + ItemEventCreationResponse: + properties: + item_id: + format: uuid + title: Item Id + type: string + status: + $ref: '#/components/schemas/ItemStatus' + required: + - item_id + - status + title: ItemEventCreationResponse + type: object + ItemReadResponse: + properties: + application_run_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Run Id + error: + anyOf: + - type: string + - type: 'null' + title: Error + item_id: + format: uuid + title: Item Id + type: string + reference: + title: Reference + type: string + status: + $ref: '#/components/schemas/ItemStatus' + required: + - item_id + - reference + - status + - error + title: ItemReadResponse + type: object + ItemResultReadResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + error: + anyOf: + - type: string + - type: 'null' + title: Error + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactResultReadResponse' + title: Output Artifacts + type: array + reference: + title: Reference + type: string + status: + $ref: '#/components/schemas/ItemStatus' + required: + - item_id + - application_run_id + - reference + - status + - error + - output_artifacts + title: ItemResultReadResponse + type: object + ItemStatus: + enum: + - pending + - canceled_user + - canceled_system + - error_user + - error_system + - succeeded + title: ItemStatus + type: string + OrganizationCreationRequest: + properties: + batch_size: + title: Batch Size + type: integer + organization_id: + title: Organization Id + type: string + owner_email: + title: Owner Email + type: string + slide_quota: + title: Slide Quota + type: integer + required: + - organization_id + - owner_email + - slide_quota + - batch_size + title: OrganizationCreationRequest + type: object + OrganizationQuota: + properties: + total: + anyOf: + - type: integer + - type: 'null' + title: Total + used: + title: Used + type: integer + required: + - total + - used + title: OrganizationQuota + type: object + OrganizationResponse: + properties: + batch_size: + title: Batch Size + type: integer + organization_id: + title: Organization Id + type: string + owner_id: + format: uuid + title: Owner Id + type: string + slide_quota: + $ref: '#/components/schemas/OrganizationQuota' + required: + - organization_id + - owner_id + - slide_quota + - batch_size + title: OrganizationResponse + type: object + OrganizationUpdateRequest: + properties: + batch_size: + anyOf: + - type: integer + - type: 'null' + title: Batch Size + slide_quota: + anyOf: + - type: integer + - type: 'null' + title: Slide Quota + title: OrganizationUpdateRequest + type: object + OutputArtifact: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + visibility: + $ref: '#/components/schemas/OutputArtifactVisibility' + required: + - name + - mime_type + - metadata_schema + - scope + - visibility + title: OutputArtifact + type: object + OutputArtifactEventTriggerRequest: + properties: + error: + anyOf: + - type: string + - type: 'null' + title: Error + event: + $ref: '#/components/schemas/ArtifactEvent' + metadata: + title: Metadata + type: object + required: + - event + - metadata + title: OutputArtifactEventTriggerRequest + type: object + OutputArtifactEventTriggerResponse: + properties: + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + status: + $ref: '#/components/schemas/ArtifactStatus' + required: + - output_artifact_id + - status + title: OutputArtifactEventTriggerResponse + type: object + OutputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + required: + - name + - mime_type + - metadata_schema + - scope + title: OutputArtifactReadResponse + type: object + OutputArtifactResultReadResponse: + properties: + download_url: + anyOf: + - format: uri + maxLength: 2083 + minLength: 1 + type: string + - type: 'null' + title: Download Url + metadata: + title: Metadata + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - name + - mime_type + - metadata + - download_url + title: OutputArtifactResultReadResponse + type: object + OutputArtifactSchemaCreationRequest: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + visibility: + $ref: '#/components/schemas/OutputArtifactVisibility' + required: + - name + - mime_type + - scope + - visibility + - metadata_schema + title: OutputArtifactSchemaCreationRequest + type: object + OutputArtifactScope: + enum: + - item + - global + title: OutputArtifactScope + type: string + OutputArtifactVisibility: + enum: + - internal + - external + title: OutputArtifactVisibility + type: string + PayloadInputArtifact: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + input_artifact_id: + format: uuid + title: Input Artifact Id + type: string + metadata: + title: Metadata + type: object + required: + - input_artifact_id + - metadata + - download_url + title: PayloadInputArtifact + type: object + PayloadItem: + properties: + input_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadInputArtifact' + title: Input Artifacts + type: object + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + title: Output Artifacts + type: object + required: + - item_id + - input_artifacts + - output_artifacts + title: PayloadItem + type: object + PayloadOutputArtifact: + properties: + data: + $ref: '#/components/schemas/TransferUrls' + metadata: + $ref: '#/components/schemas/TransferUrls' + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - data + - metadata + title: PayloadOutputArtifact + type: object + QuotaName: + description: Global, API-level, and slide-level quotas for Samia API. + enum: + - max_users + - max_organizations + - max_users_per_organization + - max_applications + - max_application_versions + - max_slides_per_run + - max_parallel_runs + - max_parallel_runs_per_organization + - max_parallel_runs_per_user + title: QuotaName + type: string + QuotaReadResponse: + description: GET response payload for quota read. + properties: + name: + $ref: '#/components/schemas/QuotaName' + quota: + title: Quota + type: integer + required: + - name + - quota + title: QuotaReadResponse + type: object + QuotaUpdateRequest: + description: PATCH request payload for quota update. + properties: + name: + $ref: '#/components/schemas/QuotaName' + quota: + exclusiveMinimum: 0.0 + title: Quota + type: integer + required: + - name + - quota + title: QuotaUpdateRequest + type: object + QuotaUpdateResponse: + description: PATCH response payload for quota update. + properties: + name: + $ref: '#/components/schemas/QuotaName' + quota: + title: Quota + type: integer + required: + - name + - quota + title: QuotaUpdateResponse + type: object + QuotasReadResponse: + description: GET response payload for multiple quota reads. + properties: + quotas: + items: + $ref: '#/components/schemas/QuotaReadResponse' + title: Quotas + type: array + required: + - quotas + title: QuotasReadResponse + type: object + QuotasUpdateRequest: + description: PATCH request payload for quota updates. + properties: + quotas: + items: + $ref: '#/components/schemas/QuotaUpdateRequest' + title: Quotas + type: array + required: + - quotas + title: QuotasUpdateRequest + type: object + QuotasUpdateResponse: + description: PATCH response payload for quota updates. + properties: + updated_quotas: + items: + $ref: '#/components/schemas/QuotaUpdateResponse' + title: Updated Quotas + type: array + required: + - updated_quotas + title: QuotasUpdateResponse + type: object + RunCreationRequest: + properties: + application_version: + anyOf: + - format: uuid + type: string + - $ref: '#/components/schemas/SlugVersionRequest' + examples: + - efbf9822-a1e5-4045-a283-dbf26e8064a9 + title: Application Version + items: + items: + $ref: '#/components/schemas/ItemCreationRequest' + title: Items + type: array + required: + - application_version + - items + title: RunCreationRequest + type: object + RunCreationResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + required: + - application_run_id + title: RunCreationResponse + type: object + RunReadResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + organization_id: + title: Organization Id + type: string + status: + $ref: '#/components/schemas/ApplicationRunStatus' + triggered_at: + format: date-time + title: Triggered At + type: string + triggered_by: + title: Triggered By + type: string + user_payload: + anyOf: + - $ref: '#/components/schemas/UserPayload' + - type: 'null' + required: + - application_run_id + - application_version_id + - organization_id + - status + - triggered_at + - triggered_by + title: RunReadResponse + type: object + SlugVersionRequest: + properties: + application_slug: + pattern: ^(-?)*$ + title: Application Slug + type: string + version: + title: Version + type: string + required: + - application_slug + - version + title: SlugVersionRequest + type: object + TransferUrls: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + upload_url: + format: uri + minLength: 1 + title: Upload Url + type: string + required: + - upload_url + - download_url + title: TransferUrls + type: object + UserCreationRequest: + properties: + email: + anyOf: + - type: string + - type: 'null' + title: Email + organization_id: + format: uuid + title: Organization Id + type: string + user_id: + title: User Id + type: string + required: + - user_id + - organization_id + - email + title: UserCreationRequest + type: object + UserPayload: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_run_id: + format: uuid + title: Application Run Id + type: string + global_output_artifacts: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + type: object + - type: 'null' + title: Global Output Artifacts + items: + items: + $ref: '#/components/schemas/PayloadItem' + title: Items + type: array + required: + - application_id + - application_run_id + - global_output_artifacts + - items + title: UserPayload + type: object + UserQuota: + properties: + total: + anyOf: + - type: integer + - type: 'null' + title: Total + used: + title: Used + type: integer + required: + - total + - used + title: UserQuota + type: object + UserResponse: + properties: + organization_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Organization Id + slide_quota: + $ref: '#/components/schemas/UserQuota' + user_id: + anyOf: + - type: string + - type: 'null' + title: User Id + required: + - user_id + - organization_id + - slide_quota + title: UserResponse + type: object + UserUpdateRequest: + properties: + slide_quota: + anyOf: + - type: integer + - type: 'null' + title: Slide Quota + user_id: + anyOf: + - type: string + - type: 'null' + title: User Id + title: UserUpdateRequest + type: object + ValidationError: + properties: + loc: + items: + anyOf: + - type: string + - type: integer + title: Location + type: array + msg: + title: Message + type: string + type: + title: Error Type + type: string + required: + - loc + - msg + - type + title: ValidationError + type: object + VersionCreationRequest: + properties: + application_id: + format: uuid + title: Application Id + type: string + changelog: + title: Changelog + type: string + flow_id: + format: uuid + title: Flow Id + type: string + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactSchemaCreationRequest' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactSchemaCreationRequest' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - version + - application_id + - flow_id + - changelog + - input_artifacts + - output_artifacts + title: VersionCreationRequest + type: object + VersionCreationResponse: + properties: + application_version_id: + format: uuid + title: Application Version Id + type: string + required: + - application_version_id + title: VersionCreationResponse + type: object + VersionReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + changelog: + title: Changelog + type: string + created_at: + format: date-time + title: Created At + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Flow Id + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifact' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifact' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - application_version_id + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + - created_at + title: VersionReadResponse + type: object + securitySchemes: + OAuth2AuthorizationCodeBearer: + flows: + authorizationCode: + authorizationUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize + scopes: {} + tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token + type: oauth2 +info: + description: Pagination is done via `page` and `page_size`. Sorting via `sort` query + parameter. sort is a comma-separated list of field names. The sorting direction + can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + summary: Interact with Aignostics' Application Platform + title: Aignostics Platform API + version: 0.1.0 +openapi: 3.1.0 +paths: + /docs: + get: + operationId: get_documentation_docs_get + parameters: + - in: cookie + name: access_token + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Access Token + responses: + '200': + content: + application/json: + schema: {} + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Get Documentation + /health: + get: + description: Check that the API application is alive and responsive. + operationId: health_health_get + responses: + '200': + content: + application/json: + schema: {} + description: Successful Response + summary: Health + tags: + - Infrastructure + /liveness: + get: + description: Check that the API application is alive and responsive. + operationId: liveness_liveness_get + responses: + '200': + content: + application/json: + schema: {} + description: Successful Response + summary: Liveness + tags: + - Infrastructure + /readiness: + get: + description: Check that the API application is ready to serve. + operationId: readiness_readiness_get + responses: + '200': + content: + application/json: + schema: {} + description: Successful Response + summary: Readiness + tags: + - Infrastructure + /v1/applications: + get: + operationId: list_applications_v1_applications_get + parameters: + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationReadResponse' + title: Response List Applications V1 Applications Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Applications + tags: + - Externals + post: + operationId: register_application_v1_applications_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationCreationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Register Application + tags: + - Admins + /v1/applications/{application_id}: + get: + operationId: read_application_by_id_v1_applications__application_id__get + parameters: + - in: path + name: application_id + required: true + schema: + format: uuid + title: Application Id + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Read Application By Id + tags: + - Externals + /v1/applications/{application_id}/versions: + get: + operationId: list_versions_by_application_id_v1_applications__application_id__versions_get + parameters: + - in: path + name: application_id + required: true + schema: + format: uuid + title: Application Id + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Id V1 Applications Application + Id Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Versions By Application Id + tags: + - Externals + /v1/applications/{application_slug}: + get: + operationId: read_application_by_slug_v1_applications__application_slug__get + parameters: + - in: path + name: application_slug + required: true + schema: + title: Application Slug + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Read Application By Slug + tags: + - Externals + /v1/applications/{application_slug}/versions: + get: + operationId: list_versions_by_application_slug_v1_applications__application_slug__versions_get + parameters: + - in: path + name: application_slug + required: true + schema: + pattern: ^(-?)*$ + title: Application Slug + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Slug V1 Applications Application + Slug Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Versions By Application Slug + tags: + - Externals + /v1/artifacts/{output_artifact_id}/event: + post: + operationId: trigger_artifact_event_v1_artifacts__output_artifact_id__event_post + parameters: + - in: path + name: output_artifact_id + required: true + schema: + format: uuid + title: Output Artifact Id + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OutputArtifactEventTriggerRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/OutputArtifactEventTriggerResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Trigger Artifact Event + tags: + - Algorithms/Apps + /v1/items/{item_id}: + get: + operationId: get_item_v1_items__item_id__get + parameters: + - in: path + name: item_id + required: true + schema: + format: uuid + title: Item Id + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ItemReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Item + tags: + - Scheduler + /v1/items/{item_id}/event: + post: + operationId: register_item_event_v1_items__item_id__event_post + parameters: + - in: path + name: item_id + required: true + schema: + format: uuid + title: Item Id + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ItemEventCreationRequest' + required: true + responses: + '202': + content: + application/json: + schema: + $ref: '#/components/schemas/ItemEventCreationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Register Item Event + tags: + - Scheduler + /v1/organizations: + post: + operationId: create_organization_v1_organizations_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Create Organization + tags: + - Organizations + /v1/organizations/{organization_id}: + get: + operationId: get_organization_v1_organizations__organization_id__get + parameters: + - in: path + name: organization_id + required: true + schema: + format: uuid + title: Organization Id + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Organization + tags: + - Organizations + patch: + operationId: update_organization_v1_organizations__organization_id__patch + parameters: + - in: path + name: organization_id + required: true + schema: + title: Organization Id + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationUpdateRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Update Organization + tags: + - Organizations + /v1/quotas: + get: + operationId: list_quotas_v1_quotas_get + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/QuotasReadResponse' + description: Successful Response + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Quotas + tags: + - Admins + - Admins + patch: + operationId: update_quotas_v1_quotas_patch + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/QuotasUpdateRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/QuotasUpdateResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Update Quotas + tags: + - Admins + - Admins + /v1/runs: + get: + operationId: list_application_runs_v1_runs_get + parameters: + - in: query + name: application_id + required: false + schema: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Id + - in: query + name: application_version_id + required: false + schema: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Version Id + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/RunReadResponse' + title: Response List Application Runs V1 Runs Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Application Runs + tags: + - Externals + post: + operationId: create_application_run_v1_runs_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Create Application Run + tags: + - Externals + /v1/runs/{application_run_id}: + get: + operationId: get_run_v1_runs__application_run_id__get + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RunReadResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Run + tags: + - Externals + - Scheduler + /v1/runs/{application_run_id}/cancel: + post: + operationId: cancel_run_v1_runs__application_run_id__cancel_post + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + responses: + '202': + content: + application/json: + schema: {} + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Cancel Run + tags: + - Externals + /v1/runs/{application_run_id}/results: + delete: + operationId: delete_run_results_v1_runs__application_run_id__results_delete + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + responses: + '204': + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Delete Run Results + tags: + - Externals + get: + operationId: list_run_results_v1_runs__application_run_id__results_get + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + - in: query + name: item_id__in + required: false + schema: + anyOf: + - items: + format: uuid + type: string + type: array + - type: 'null' + title: Item Id In + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: reference__in + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Reference In + - in: query + name: status__in + required: false + schema: + anyOf: + - items: + $ref: '#/components/schemas/ItemStatus' + type: array + - type: 'null' + title: Status In + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ItemResultReadResponse' + title: Response List Run Results V1 Runs Application Run Id Results + Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Run Results + tags: + - Externals + /v1/users/: + post: + operationId: create_user_v1_users__post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserCreationRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponse' + description: Successful Response + '404': + description: User not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Create User + tags: + - Externals + /v1/users/{user_id}: + get: + operationId: get_user_v1_users__user_id__get + parameters: + - in: path + name: user_id + required: true + schema: + format: uuid + title: User Id + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponse' + description: Successful Response + '404': + description: User not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get User + tags: + - Externals + patch: + operationId: update_user_v1_users__user_id__patch + parameters: + - in: path + name: user_id + required: true + schema: + format: uuid + title: User Id + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserUpdateRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponse' + description: Successful Response + '404': + description: User not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Update User + tags: + - Externals + /v1/versions: + post: + operationId: register_version_v1_versions_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VersionCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/VersionCreationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Register Version + tags: + - Externals + - Scheduler + - Admins + /v1/versions/{application_version_id}: + get: + operationId: get_version_v1_versions__application_version_id__get + parameters: + - in: path + name: application_version_id + required: true + schema: + format: uuid + title: Application Version Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VersionReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Version + tags: + - Externals + - Scheduler +tags: +- description: Called by externals to interact with our API + name: Externals +- description: Called by the Algorithms and applications to update statuses + name: Algorithms/Apps +- description: Called by the Scheduler + name: Scheduler +- description: Called by Admins to manage and register entities + name: Admins +- description: Called by other Infra + name: Infrastructure diff --git a/docs/source/_static/openapi_v2.json b/docs/source/_static/openapi_v2.json deleted file mode 100644 index 14ae8eac..00000000 --- a/docs/source/_static/openapi_v2.json +++ /dev/null @@ -1,262 +0,0 @@ -{ - "openapi": "3.1.0", - "info": { - "title": "Aignostics Python SDK", - "termsOfService": "https://aignostics.readthedocs.io/en/latest/", - "contact": { - "name": "Aignostics GmbH", - "url": "https://github.com/aignostics", - "email": "support@aignostics.com" - }, - "version": "2.0.0" - }, - "paths": { - "/health": { - "get": { - "tags": [ - "Observability" - ], - "summary": "Health", - "description": "Check the health of the service.\n\nThis endpoint returns the health status of the service.\nThe health status can be either UP or DOWN.\nIf the service is healthy, the status will be UP.\nIf the service is unhealthy, the status will be DOWN and a reason will be provided.\nThe response will have a 200 OK status code if the service is healthy,\nand a 500 Internal Server Error status code if the service is unhealthy.\n\nReturns:\n Health: The health status of the service.", - "operationId": "health_health_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Health" - } - } - } - } - } - } - }, - "/healthz": { - "get": { - "tags": [ - "Observability" - ], - "summary": "Health", - "description": "Check the health of the service.\n\nThis endpoint returns the health status of the service.\nThe health status can be either UP or DOWN.\nIf the service is healthy, the status will be UP.\nIf the service is unhealthy, the status will be DOWN and a reason will be provided.\nThe response will have a 200 OK status code if the service is healthy,\nand a 500 Internal Server Error status code if the service is unhealthy.\n\nReturns:\n Health: The health status of the service.", - "operationId": "health_healthz_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Health" - } - } - } - } - } - } - }, - "/hello-world": { - "get": { - "tags": [ - "Basics" - ], - "summary": "Hello World", - "description": "Return a hello world message.\n\nReturns:\n _HelloWorldResponse: A response containing the hello world message.", - "operationId": "hello_world_hello_world_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/_HelloWorldResponse" - } - } - } - } - } - } - }, - "/echo": { - "post": { - "tags": [ - "Basics" - ], - "summary": "Echo V2", - "description": "Echo back the provided utterance.\n\nArgs:\n request (Utterance): The utterance to echo back.\n\nReturns:\n Echo: The echo.\n\nRaises:\n 422 Unprocessable Entity: If utterance is not provided or empty.", - "operationId": "echo_v2_echo_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Utterance" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Echo" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "Echo": { - "properties": { - "text": { - "type": "string", - "minLength": 1, - "title": "Text", - "description": "The echo", - "examples": [ - "HELLO, WORLD!" - ] - } - }, - "type": "object", - "required": [ - "text" - ], - "title": "Echo", - "description": "Response model for echo endpoint." - }, - "HTTPValidationError": { - "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Detail" - } - }, - "type": "object", - "title": "HTTPValidationError" - }, - "Health": { - "properties": { - "status": { - "$ref": "#/components/schemas/HealthStatus" - }, - "reason": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Reason" - } - }, - "type": "object", - "required": [ - "status" - ], - "title": "Health", - "description": "Health status model." - }, - "HealthStatus": { - "type": "string", - "enum": [ - "UP", - "DOWN" - ], - "title": "HealthStatus", - "description": "Health status enumeration." - }, - "Utterance": { - "properties": { - "text": { - "type": "string", - "minLength": 1, - "title": "Text", - "description": "The utterance to echo back", - "examples": [ - "Hello, world!" - ] - } - }, - "type": "object", - "required": [ - "text" - ], - "title": "Utterance", - "description": "Model representing a text utterance." - }, - "ValidationError": { - "properties": { - "loc": { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "integer" - } - ] - }, - "type": "array", - "title": "Location" - }, - "msg": { - "type": "string", - "title": "Message" - }, - "type": { - "type": "string", - "title": "Error Type" - } - }, - "type": "object", - "required": [ - "loc", - "msg", - "type" - ], - "title": "ValidationError" - }, - "_HelloWorldResponse": { - "properties": { - "message": { - "type": "string", - "title": "Message", - "description": "The hello world message", - "examples": [ - "Hello, world!" - ] - } - }, - "type": "object", - "required": [ - "message" - ], - "title": "_HelloWorldResponse", - "description": "Response model for hello-world endpoint." - } - } - } -} diff --git a/docs/source/_static/openapi_v2.yaml b/docs/source/_static/openapi_v2.yaml deleted file mode 100644 index d2873d84..00000000 --- a/docs/source/_static/openapi_v2.yaml +++ /dev/null @@ -1,7 +0,0 @@ -Traceback (most recent call last): - File "/Users/helmut/Code/opt/.nox/docs-3-13/bin/aignostics", line 4, in - from aignostics.cli import cli - File "/Users/helmut/Code/opt/src/aignostics/cli.py", line 85 - uvx aignostics applications list - ^^^^^^^^^^ -SyntaxError: invalid syntax diff --git a/docs/source/api_v2.rst b/docs/source/api_v2.rst deleted file mode 100644 index 050c51a2..00000000 --- a/docs/source/api_v2.rst +++ /dev/null @@ -1,9 +0,0 @@ -API V2 -====== - -.. only:: html - - .. swagger-plugin:: _static/openapi_v2.yaml - :full-page: - -Visit the `Interactive API Documentation `_ diff --git a/docs/source/index.rst b/docs/source/index.rst index 6954dc1a..609c3e24 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -12,7 +12,6 @@ main api_v1 - api_v2 reference security release-notes diff --git a/noxfile.py b/noxfile.py index b8c74c6c..5ebaee87 100644 --- a/noxfile.py +++ b/noxfile.py @@ -249,23 +249,6 @@ def _dump_openapi_schemas(session: nox.Session) -> None: except CommandFailed: session.log("Failed to generate API v1 OpenAPI schemas - command may not be supported") - # Generate API v2 schemas - try: - with Path("docs/source/_static/openapi_v2.yaml").open("w", encoding="utf-8") as f: - session.run("aignostics", "openapi", "--api-version=v2", stdout=f, external=True) - with Path("docs/source/_static/openapi_v2.json").open("w", encoding="utf-8") as f: - session.run( - "aignostics", - "openapi", - "--api-version=v2", - "--output-format=json", - stdout=f, - external=True, - ) - session.log("Generated API v2 OpenAPI schemas") - except CommandFailed: - session.log("Failed to generate API v2 OpenAPI schemas - command may not be supported") - session.log("OpenAPI schema generation completed") except Exception as e: # noqa: BLE001 session.log(f"Warning: Could not generate OpenAPI schemas: {e}") diff --git a/src/aignostics/__init__.py b/src/aignostics/__init__.py index 7d31ba99..6622a0e4 100644 --- a/src/aignostics/__init__.py +++ b/src/aignostics/__init__.py @@ -5,15 +5,18 @@ __project_path__, __version__, ) -from .models import Echo, Health, HealthStatus, Utterance +from .exceptions import OpenAPISchemaError +from .models import Health, HealthStatus from .service import Service +from .types import APIVersion, OpenAPIOutputFormat __all__ = [ - "Echo", + "APIVersion", "Health", "HealthStatus", + "OpenAPIOutputFormat", + "OpenAPISchemaError", "Service", - "Utterance", "__project_name__", "__project_path__", "__version__", diff --git a/src/aignostics/api.py b/src/aignostics/api.py deleted file mode 100644 index 985dc8dc..00000000 --- a/src/aignostics/api.py +++ /dev/null @@ -1,181 +0,0 @@ -"""Webservice API of Aignostics Python SDK. - -This module provides a webservice API with several endpoints: -- A health/healthz endpoint that returns the health status of the service -- A hello-world endpoint that returns a greeting message -- An echo endpoint that echoes back the provided text - -The endpoints use Pydantic models for request and response validation. -""" - -import os -from collections.abc import Generator -from typing import Annotated - -from fastapi import Depends, FastAPI, Response, status -from pydantic import BaseModel, Field - -from . import Echo, Health, HealthStatus, Service, Utterance - -TITLE = "Aignostics Python SDK" -HELLO_WORLD_EXAMPLE = "Hello, world!" -UVICORN_HOST = os.environ.get("UVICORN_HOST", "127.0.0.1") -UVICORN_PORT = os.environ.get("UVICORN_PORT", "8000") -CONTACT_NAME = "Aignostics GmbH" -CONTACT_EMAIL = "support@aignostics.com" -CONTACT_URL = "https://github.com/aignostics" -TERMS_OF_SERVICE_URL = "https://aignostics.readthedocs.io/en/latest/" - - -def get_service() -> Generator[Service, None, None]: - """Get the service instance. - - Yields: - Service: The service instance. - """ - service = Service() - try: - yield service - finally: - # Cleanup code if needed - pass - - -app = FastAPI( - root_path="/api", - title=TITLE, - contact={ - "name": CONTACT_NAME, - "email": CONTACT_EMAIL, - "url": CONTACT_URL, - }, - terms_of_service=TERMS_OF_SERVICE_URL, - openapi_tags=[ - { - "name": "v1", - "description": "API version 1, check link on the right", - "externalDocs": { - "description": "sub-docs", - "url": f"http://{UVICORN_HOST}:{UVICORN_PORT}/api/v1/docs", - }, - }, - { - "name": "v2", - "description": "API version 2, check link on the right", - "externalDocs": { - "description": "sub-docs", - "url": f"http://{UVICORN_HOST}:{UVICORN_PORT}/api/v2/docs", - }, - }, - ], -) - -api_v1 = FastAPI( - version="1.0.0", - title=TITLE, - contact={ - "name": CONTACT_NAME, - "email": CONTACT_EMAIL, - "url": CONTACT_URL, - }, - terms_of_service=TERMS_OF_SERVICE_URL, -) - -api_v2 = FastAPI( - version="2.0.0", - title=TITLE, - contact={ - "name": CONTACT_NAME, - "email": CONTACT_EMAIL, - "url": CONTACT_URL, - }, - terms_of_service=TERMS_OF_SERVICE_URL, -) - - -@api_v1.get("/healthz", tags=["Observability"]) -@api_v1.get("/health", tags=["Observability"]) -@api_v2.get("/healthz", tags=["Observability"]) -@api_v2.get("/health", tags=["Observability"]) -async def health(service: Annotated[Service, Depends(get_service)], response: Response) -> Health: - """Check the health of the service. - - This endpoint returns the health status of the service. - The health status can be either UP or DOWN. - If the service is healthy, the status will be UP. - If the service is unhealthy, the status will be DOWN and a reason will be provided. - The response will have a 200 OK status code if the service is healthy, - and a 500 Internal Server Error status code if the service is unhealthy. - - Returns: - Health: The health status of the service. - """ - if service.healthy(): - health_result = Health(status=HealthStatus.UP) - else: - health_result = Health(status=HealthStatus.DOWN, reason="Service is unhealthy") - - if health_result.status == HealthStatus.DOWN: - response.status_code = status.HTTP_500_INTERNAL_SERVER_ERROR - - return health_result - - -class _HelloWorldResponse(BaseModel): - """Response model for hello-world endpoint.""" - - message: str = Field( - ..., - description="The hello world message", - examples=[HELLO_WORLD_EXAMPLE], - ) - - -@api_v1.get("/hello-world", tags=["Basics"]) -@api_v2.get("/hello-world", tags=["Basics"]) -async def hello_world(service: Annotated[Service, Depends(get_service)]) -> _HelloWorldResponse: - """ - Return a hello world message. - - Returns: - _HelloWorldResponse: A response containing the hello world message. - """ - return _HelloWorldResponse(message=service.get_hello_world()) - - -@api_v1.get("/echo/{text}", tags=["Basics"]) -async def echo(text: str) -> Echo: - """ - Echo back the provided text. - - Args: - text (str): The text to echo. - - Returns: - Echo: The echo. - - Raises: - 422 Unprocessable Entity: If text is not provided or empty. - """ - return Service.echo(Utterance(text=text)) - - -@api_v2.post("/echo", tags=["Basics"]) -async def echo_v2(request: Utterance) -> Echo: - """ - Echo back the provided utterance. - - Args: - request (Utterance): The utterance to echo back. - - Returns: - Echo: The echo. - - Raises: - 422 Unprocessable Entity: If utterance is not provided or empty. - """ - return Service.echo(request) - - -app.mount("/v1", api_v1) -app.mount("/v2", api_v2) diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index 261a0865..6be0f7b7 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -1,18 +1,14 @@ """CLI (Command Line Interface) of Aignostics Python SDK.""" -import os -from enum import StrEnum from typing import Annotated import typer -import uvicorn import yaml from rich.console import Console import aignx.platform -from . import Service, Utterance, __version__ -from .api import api_v1, api_v2 +from . import APIVersion, OpenAPIOutputFormat, Service, __version__ cli = typer.Typer(name="Command Line Interface of Aignostics Python SDK") _service = Service() @@ -31,50 +27,6 @@ def info() -> None: _console.print(_service.info()) -@cli.command() -def echo( - text: Annotated[ - str, typer.Argument(help="The text to echo") - ] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", - json: Annotated[ - bool, - typer.Option( - help=("Print as JSON"), - ), - ] = False, -) -> None: - """Echo the text.""" - echo = Service.echo(Utterance(text=text)) - if json: - _console.print_json(data={"text": echo.text}) - else: - _console.print(echo.text) - - -@cli.command() -def hello_world() -> None: - """Print hello world message and what's in the environment variable THE_VAR.""" - _console.print(_service.get_hello_world()) - - -@cli.command() -def serve( - host: Annotated[str, typer.Option(help="Host to bind the server to")] = "127.0.0.1", - port: Annotated[int, typer.Option(help="Port to bind the server to")] = 8000, - watch: Annotated[bool, typer.Option(help="Enable auto-reload")] = True, -) -> None: - """Start the API server.""" - _console.print(f"Starting API server at http://{host}:{port}") - os.environ["UVICORN_HOST"] = host - os.environ["UVICORN_PORT"] = str(port) - uvicorn.run( - "aignostics.api:app", - host=host, - port=port, - reload=watch, - ) - - @cli.command() def papi_applications_list() -> None: """Check PAPI health.""" @@ -83,58 +35,21 @@ def papi_applications_list() -> None: _console.print(applications) -class APIVersion(StrEnum): - """ - Enum representing the API versions. - - This enum defines the supported API verions: - - V1: Output doc for v1 API - - V2: Output doc for v2 API - - Usage: - version = APIVersion.V1 - print(f"Using {version} version") - - """ - - V1 = "v1" - V2 = "v2" - - -class OutputFormat(StrEnum): - """ - Enum representing the supported output formats. - - This enum defines the possible formats for output data: - - YAML: Output data in YAML format - - JSON: Output data in JSON format - - Usage: - format = OutputFormat.YAML - print(f"Using {format} format") - """ - - YAML = "yaml" - JSON = "json" - - @cli.command() def openapi( api_version: Annotated[APIVersion, typer.Option(help="API Version", case_sensitive=False)] = APIVersion.V1, output_format: Annotated[ - OutputFormat, typer.Option(help="Output format", case_sensitive=False) - ] = OutputFormat.YAML, + OpenAPIOutputFormat, typer.Option(help="Output format", case_sensitive=False) + ] = OpenAPIOutputFormat.YAML, ) -> None: """Dump the OpenAPI specification to stdout (YAML by default).""" match api_version: case APIVersion.V1: - schema = api_v1.openapi() - case APIVersion.V2: - schema = api_v2.openapi() + schema = Service.openapi_schema() match output_format: - case OutputFormat.JSON: + case OpenAPIOutputFormat.JSON: _console.print_json(data=schema) - case OutputFormat.YAML: + case OpenAPIOutputFormat.YAML: _console.print(yaml.dump(schema, default_flow_style=False), end="") diff --git a/src/aignostics/exceptions.py b/src/aignostics/exceptions.py new file mode 100644 index 00000000..f4912724 --- /dev/null +++ b/src/aignostics/exceptions.py @@ -0,0 +1,9 @@ +"""Exceptions of Aignostics Python SDK.""" + + +class OpenAPISchemaError(ValueError): + """Exception raised when OpenAPI schema cannot be loaded.""" + + def __init__(self, error: Exception) -> None: + """Initialize exception with the underlying error.""" + super().__init__(f"Failed to load OpenAPI schema: {error}") diff --git a/src/aignostics/models.py b/src/aignostics/models.py index ec04f7a7..089d7c36 100644 --- a/src/aignostics/models.py +++ b/src/aignostics/models.py @@ -2,32 +2,7 @@ from enum import StrEnum -from pydantic import BaseModel, Field - -UTTERANCE_EXAMPLE = "Hello, world!" -ECHO_EXAMPLE = "HELLO, WORLD!" - - -class Utterance(BaseModel): - """Model representing a text utterance.""" - - text: str = Field( - ..., - min_length=1, - description="The utterance to echo back", - examples=[UTTERANCE_EXAMPLE], - ) - - -class Echo(BaseModel): - """Response model for echo endpoint.""" - - text: str = Field( - ..., - min_length=1, - description="The echo", - examples=[ECHO_EXAMPLE], - ) +from pydantic import BaseModel class HealthStatus(StrEnum): diff --git a/src/aignostics/service.py b/src/aignostics/service.py index 8b89b00c..cbcd6552 100644 --- a/src/aignostics/service.py +++ b/src/aignostics/service.py @@ -1,14 +1,14 @@ """Service of Aignostics Python SDK.""" -import os +import json +from pathlib import Path from dotenv import load_dotenv -from .models import Echo, Utterance -from .settings import Language, Settings +from . import OpenAPISchemaError +from .settings import Settings load_dotenv() -THE_VAR = os.getenv("THE_VAR", "not defined") class Service: @@ -39,31 +39,20 @@ def info(self) -> str: """ return self._settings.model_dump_json() - def get_hello_world(self) -> str: - """ - Get a hello world message. - - Returns: - str: Hello world message. - """ - match self._settings.language: - case Language.GERMAN: - return "Hallo, Welt!" - case _: - return "Hello, world!" - @staticmethod - def echo(utterance: Utterance) -> Echo: + def openapi_schema() -> dict: """ - Loudly echo utterance. - - Args: - utterance (Utterance): The utterance to echo. + Get OpenAPI schema. Returns: - Echo: The loudly echoed utterance. + dict: OpenAPI schema. Raises: - ValueError: If the utterance is empty or contains only whitespace. - """ - return Echo(text=utterance.text.upper()) + OpenAPISchemaError: If the OpenAPI schema file cannot be found or is not valid JSON. + """ + schema_path = Path(__file__).parent.parent.parent / "schema" / "api.json" + try: + with schema_path.open(encoding="utf-8") as f: + return json.load(f) + except (FileNotFoundError, json.JSONDecodeError) as e: + raise OpenAPISchemaError(e) from e diff --git a/src/aignostics/types.py b/src/aignostics/types.py new file mode 100644 index 00000000..47cc4e27 --- /dev/null +++ b/src/aignostics/types.py @@ -0,0 +1,36 @@ +"""Types of Aignostics Python SDK.""" + +from enum import StrEnum + + +class APIVersion(StrEnum): + """ + Enum representing the API versions. + + This enum defines the supported API verions: + - V1: Output doc for v1 API + + Usage: + version = APIVersion.V1 + print(f"Using {version} version") + + """ + + V1 = "v1" + + +class OpenAPIOutputFormat(StrEnum): + """ + Enum representing the supported output formats. + + This enum defines the possible formats for output data: + - YAML: Output data in YAML format + - JSON: Output data in JSON format + + Usage: + format = OpenAPIOutputFormat.YAML + print(f"Using {format} format") + """ + + YAML = "yaml" + JSON = "json" diff --git a/src/aignx/platform/_authentication.py b/src/aignx/platform/_authentication.py index 023162af..958c0ec1 100644 --- a/src/aignx/platform/_authentication.py +++ b/src/aignx/platform/_authentication.py @@ -21,10 +21,6 @@ SCOPE = ["offline_access"] # include a refresh token as well REDIRECT_URI = "http://localhost:8080" # is configured in Auth0 - do not change -print(CLIENT_ID_DEVICE) -print(CLIENT_ID_INTERACTIVE) -exit - AUDIENCE = "https://dev-8ouohmmrbuh2h4vu-samia" AUTHORIZATION_BASE_URL = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize" TOKEN_URL = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" diff --git a/tests/api_test.py b/tests/api_test.py deleted file mode 100644 index 5838ab3c..00000000 --- a/tests/api_test.py +++ /dev/null @@ -1,129 +0,0 @@ -"""Tests to verify the API functionality of Aignostics Python SDK.""" - -from unittest.mock import patch - -import pytest -from fastapi.testclient import TestClient - -from aignostics.api import app - -HELLO_WORLD_PATH_V1 = "/api/v1/hello-world" -HELLO_WORLD_PATH_V2 = "/api/v2/hello-world" - -ECHO_PATH_V1 = "/api/v1/echo" -ECHO_PATH_V2 = "/api/v2/echo" - -HEALTH_PATH_V1 = "/api/v1/health" -HEALTH_PATH_V2 = "/api/v2/health" - -HEALTHZ_PATH_V1 = "/api/v1/healthz" -HEALTHZ_PATH_V2 = "/api/v2/healthz" - -HELLO_WORLD = "Hello, world!" - -SERVICE_UP = "UP" -SERVICE_DOWN = "DOWN" -SERVICE_IS_UNHEALTHY = "Service is unhealthy" - - -@pytest.fixture -def client() -> TestClient: - """Provide a FastAPI test client fixture.""" - return TestClient(app) - - -def test_root_endpoint_returns_404(client: TestClient) -> None: - """Test that the root endpoint returns a 404 status code.""" - response = client.get("/") - assert response.status_code == 404 - assert "Not Found" in response.json()["detail"] - - -def test_hello_world_endpoint(client: TestClient) -> None: - """Test that the hello-world endpoint returns the expected message.""" - response = client.get(HELLO_WORLD_PATH_V1) - assert response.status_code == 200 - assert response.json()["message"].startswith(HELLO_WORLD) - - response = client.get(HELLO_WORLD_PATH_V2) - assert response.status_code == 200 - assert response.json()["message"].startswith(HELLO_WORLD) - - -def test_echo_endpoint_valid_input(client: TestClient) -> None: - """Test that the echo endpoint returns the input text.""" - test_text = "Test message" - - response = client.get(f"{ECHO_PATH_V1}/{test_text}") - assert response.status_code == 200 - assert response.json() == {"text": test_text.upper()} - - response = client.post(ECHO_PATH_V2, json={"text": test_text}) - assert response.status_code == 200 - assert response.json() == {"text": test_text.upper()} - - -def test_echo_endpoint_empty_text(client: TestClient) -> None: - """Test that the echo endpoint validates empty text.""" - response = client.post(ECHO_PATH_V2, json={"text": ""}) - assert response.status_code == 422 # Validation error - - -def test_echo_endpoint_missing_text(client: TestClient) -> None: - """Test that the echo endpoint validates missing text field.""" - response = client.get(ECHO_PATH_V1) - assert response.status_code == 404 # Not found - - response = client.post(ECHO_PATH_V2, json={}) - assert response.status_code == 422 # Validation error - - -def test_health_endpoint(client: TestClient) -> None: - """Test that the health endpoint returns UP status.""" - response = client.get(HEALTH_PATH_V1) - assert response.status_code == 200 - assert response.json()["status"] == SERVICE_UP - assert response.json()["reason"] is None - - response = client.get(HEALTH_PATH_V2) - assert response.status_code == 200 - assert response.json()["status"] == SERVICE_UP - assert response.json()["reason"] is None - - response = client.get(HEALTHZ_PATH_V1) - assert response.status_code == 200 - assert response.json()["status"] == SERVICE_UP - assert response.json()["reason"] is None - - response = client.get(HEALTHZ_PATH_V2) - assert response.status_code == 200 - assert response.json()["status"] == SERVICE_UP - assert response.json()["reason"] is None - - -@patch("aignostics.api.Service") -def test_health_endpoint_down(mock_service, client: TestClient) -> None: - """Test that the health endpoint returns 500 status when service is unhealthy.""" - # Configure the mock to return unhealthy status - mock_service_instance = mock_service.return_value - mock_service_instance.healthy.return_value = False - - response = client.get(HEALTH_PATH_V1) - assert response.status_code == 500 - assert response.json()["status"] == SERVICE_DOWN - assert response.json()["reason"] == SERVICE_IS_UNHEALTHY - - response = client.get(HEALTH_PATH_V2) - assert response.status_code == 500 - assert response.json()["status"] == SERVICE_DOWN - assert response.json()["reason"] == SERVICE_IS_UNHEALTHY - - response = client.get(HEALTHZ_PATH_V1) - assert response.status_code == 500 - assert response.json()["status"] == SERVICE_DOWN - assert response.json()["reason"] == SERVICE_IS_UNHEALTHY - - response = client.get(HEALTHZ_PATH_V2) - assert response.status_code == 500 - assert response.json()["status"] == SERVICE_DOWN - assert response.json()["reason"] == SERVICE_IS_UNHEALTHY diff --git a/tests/cli_test.py b/tests/cli_test.py index 4293db37..ec30e6bc 100644 --- a/tests/cli_test.py +++ b/tests/cli_test.py @@ -2,7 +2,6 @@ import os import subprocess -from unittest.mock import patch import pytest from typer.testing import CliRunner @@ -52,55 +51,6 @@ def test_cli_info_de() -> None: assert completed_process.stdout == b'{"language":"de_DE"}\n' -def test_cli_echo(runner: CliRunner) -> None: - """Check hello world printed.""" - result = runner.invoke(cli, ["echo", "hello"]) - assert result.exit_code == 0 - assert "HELLO" in result.output - - -def test_cli_echo_fails_on_silence(runner: CliRunner) -> None: - """Check hello world printed.""" - result = runner.invoke(cli, ["echo", ""]) - assert result.exit_code == 1 - - -def test_cli_echo_json(runner: CliRunner) -> None: - """Check hello world printed.""" - result = runner.invoke(cli, ["echo", "hello", "--json"]) - assert result.exit_code == 0 - assert '{\n "text": "HELLO"\n}\n' in result.output - - -def test_cli_hello_world(runner: CliRunner) -> None: - """Check hello world printed.""" - result = runner.invoke(cli, ["hello-world"]) - assert result.exit_code == 0 - assert "Hello, world!" in result.output - - -def test_cli_hello_world_german() -> None: - """Check hello world printed.""" - env_de = os.environ.copy() - env_de.update({"AIGNOSTICS_LANGUAGE": "de_DE"}) - completed_process = subprocess.run(["aignostics", "hello-world"], capture_output=True, check=False, env=env_de) - assert completed_process.stdout == b"Hallo, Welt!\n" - - -@patch("uvicorn.run") -def test_cli_serve(mock_uvicorn_run, runner: CliRunner) -> None: - """Check serve command starts the server.""" - result = runner.invoke(cli, ["serve", "--host", "127.0.0.1", "--port", "8000", "--no-watch"]) - assert result.exit_code == 0 - assert "Starting API server at http://127.0.0.1:8000" in result.output - mock_uvicorn_run.assert_called_once_with( - "aignostics.api:app", - host="127.0.0.1", - port=8000, - reload=False, - ) - - def test_cli_openapi_yaml(runner: CliRunner) -> None: """Check openapi command outputs YAML schema.""" result = runner.invoke(cli, ["openapi"]) @@ -109,17 +59,6 @@ def test_cli_openapi_yaml(runner: CliRunner) -> None: assert "openapi:" in result.output assert "info:" in result.output assert "paths:" in result.output - # Check for specific v1 elements - assert "Echo:" in result.output - - result = runner.invoke(cli, ["openapi", "--api-version", "v2"]) - assert result.exit_code == 0 - # Check for common OpenAPI YAML elements - assert "openapi:" in result.output - assert "info:" in result.output - assert "paths:" in result.output - # Check for specific v2 elements - assert "Utterance:" in result.output def test_cli_openapi_json(runner: CliRunner) -> None: From 27e341c6a7a617c37c507452290ae44a9e8ba74c Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 21:22:25 +0200 Subject: [PATCH 007/110] feat(cli,service): basic diagnostics --- src/aignostics/cli.py | 33 ++++++++++++++++-- src/aignostics/constants.py | 2 -- src/aignostics/service.py | 69 ++++++++++++++++++++++++++++++++++--- tests/cli_test.py | 14 +------- 4 files changed, 97 insertions(+), 21 deletions(-) diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index 6be0f7b7..82e543dc 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -1,5 +1,6 @@ """CLI (Command Line Interface) of Aignostics Python SDK.""" +from enum import StrEnum from typing import Annotated import typer @@ -21,10 +22,38 @@ def health() -> None: _console.print(_service.healthy()) +class InfoOutputFormat(StrEnum): + """ + Enum representing the supported output formats. + + This enum defines the possible formats for output data: + - YAML: Output data in YAML format + - JSON: Output data in JSON format + + Usage: + format = InfoOutputFormat.YAML + print(f"Using {format} format") + """ + + YAML = "yaml" + JSON = "json" + + @cli.command() -def info() -> None: +def info( + output_format: Annotated[ + InfoOutputFormat, typer.Option(help="Output format", case_sensitive=False) + ] = InfoOutputFormat.YAML, + env: Annotated[bool, typer.Option(help="Include environment variables in output")] = False, + filter_secrets: Annotated[bool, typer.Option(help="Filter out secret values from environment variables")] = True, +) -> None: """Print info about service configuration.""" - _console.print(_service.info()) + info = _service.info(env=env, filter_secrets=filter_secrets) + match output_format: + case InfoOutputFormat.JSON: + _console.print_json(data=info) + case InfoOutputFormat.YAML: + _console.print(yaml.dump(info, default_flow_style=False), end="") @cli.command() diff --git a/src/aignostics/constants.py b/src/aignostics/constants.py index 4b0a858d..f4fd1aaf 100644 --- a/src/aignostics/constants.py +++ b/src/aignostics/constants.py @@ -6,5 +6,3 @@ __project_name__ = __name__.split(".")[0] __project_path__ = str(pathlib.Path(__file__).parent.parent.parent) __version__ = importlib.metadata.version(__project_name__) - -LOREM_IPSUM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit." diff --git a/src/aignostics/service.py b/src/aignostics/service.py index cbcd6552..5a13417e 100644 --- a/src/aignostics/service.py +++ b/src/aignostics/service.py @@ -1,11 +1,15 @@ """Service of Aignostics Python SDK.""" import json +import os +import platform +import sys from pathlib import Path from dotenv import load_dotenv from . import OpenAPISchemaError +from .constants import __project_name__, __project_path__, __version__ from .settings import Settings load_dotenv() @@ -30,14 +34,71 @@ def healthy(self) -> bool: """ return self.is_healthy - def info(self) -> str: + def info(self, env: bool = True, filter_secrets: bool = True) -> dict: """ - Get info about configuration of service. + For diagnostics compile info about local and remote environment. Returns: - str: Service configuration. + dict: Info about local and remote environment """ - return self._settings.model_dump_json() + info_dict = { + "local": { + "sdk": { + "version": __version__, + "name": __project_name__, + "path": __project_path__, + }, + "execution": { + "interpreter_path": sys.executable, + "command_line": " ".join(sys.argv), + "entry_point": sys.argv[0] if sys.argv else None, + }, + "platform": { + "os": { + "system": platform.system(), + "release": platform.release(), + "version": platform.version(), + "machine": platform.machine(), + "processor": platform.processor(), + }, + "python": { + "version": platform.python_version(), + "compiler": platform.python_compiler(), + "implementation": platform.python_implementation(), + }, + }, + "settings": self._settings.model_dump_json(), + }, + "remote": { + "dev": { + "url": "https://api.dev.aignostics.com", + }, + "staging": { + "url": "https://api.staging.aignostics.com", + }, + "production": { + "url": "https://api.aignostics.com", + }, + }, + } + + if env: + if filter_secrets: + info_dict["local"]["execution"]["env"] = { + k: v + for k, v in os.environ.items() + if not ( + "token" in k.lower() + or "key" in k.lower() + or "secret" in k.lower() + or "password" in k.lower() + or "auth" in k.lower() + ) + } + else: + info_dict["local"]["execution"]["env"] = dict(os.environ) + + return info_dict @staticmethod def openapi_schema() -> dict: diff --git a/tests/cli_test.py b/tests/cli_test.py index ec30e6bc..e8b80311 100644 --- a/tests/cli_test.py +++ b/tests/cli_test.py @@ -1,8 +1,5 @@ """Tests to verify the CLI functionality of Aignostics Python SDK.""" -import os -import subprocess - import pytest from typer.testing import CliRunner @@ -39,16 +36,7 @@ def test_cli_info(runner: CliRunner) -> None: """Check health is true.""" result = runner.invoke(cli, ["info"]) assert result.exit_code == 0 - assert "en_US" in result.output - - -def test_cli_info_de() -> None: - """Check hello world printed.""" - env_de = os.environ.copy() - env_de.update({"AIGNOSTICS_LANGUAGE": "de_DE"}) - cli = "aignostics" - completed_process = subprocess.run([cli, "info"], capture_output=True, check=False, env=env_de) - assert completed_process.stdout == b'{"language":"de_DE"}\n' + assert "CPython" in result.output def test_cli_openapi_yaml(runner: CliRunner) -> None: From 40a96a48838e97438928c19fff585c02663af0d2 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 21:43:46 +0200 Subject: [PATCH 008/110] feat(cli): applications, runs, and system sub-apps --- noxfile.py | 3 +- src/aignostics/__init__.py | 3 +- src/aignostics/cli.py | 70 +++++++++++++------------------- src/aignostics/types.py | 17 ++++++++ src/aignostics/utils/__init__.py | 11 +++++ src/aignostics/utils/cli.py | 60 +++++++++++++++++++++++++++ src/aignostics/utils/console.py | 14 +++++++ src/aignostics/utils/process.py | 42 +++++++++++++++++++ tests/cli_test.py | 8 ++-- 9 files changed, 180 insertions(+), 48 deletions(-) create mode 100644 src/aignostics/utils/__init__.py create mode 100644 src/aignostics/utils/cli.py create mode 100644 src/aignostics/utils/console.py create mode 100644 src/aignostics/utils/process.py diff --git a/noxfile.py b/noxfile.py index 5ebaee87..50f7a18a 100644 --- a/noxfile.py +++ b/noxfile.py @@ -235,10 +235,11 @@ def _dump_openapi_schemas(session: nox.Session) -> None: # Generate API v1 schemas try: with Path("docs/source/_static/openapi_v1.yaml").open("w", encoding="utf-8") as f: - session.run("aignostics", "openapi", "--api-version=v1", stdout=f, external=True) + session.run("aignostics", "system", "openapi", "--api-version=v1", stdout=f, external=True) with Path("docs/source/_static/openapi_v1.json").open("w", encoding="utf-8") as f: session.run( "aignostics", + "system", "openapi", "--api-version=v1", "--output-format=json", diff --git a/src/aignostics/__init__.py b/src/aignostics/__init__.py index 6622a0e4..29018aea 100644 --- a/src/aignostics/__init__.py +++ b/src/aignostics/__init__.py @@ -8,12 +8,13 @@ from .exceptions import OpenAPISchemaError from .models import Health, HealthStatus from .service import Service -from .types import APIVersion, OpenAPIOutputFormat +from .types import APIVersion, InfoOutputFormat, OpenAPIOutputFormat __all__ = [ "APIVersion", "Health", "HealthStatus", + "InfoOutputFormat", "OpenAPIOutputFormat", "OpenAPISchemaError", "Service", diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index 82e543dc..60ecfe19 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -1,6 +1,5 @@ """CLI (Command Line Interface) of Aignostics Python SDK.""" -from enum import StrEnum from typing import Annotated import typer @@ -9,37 +8,44 @@ import aignx.platform -from . import APIVersion, OpenAPIOutputFormat, Service, __version__ +from . import APIVersion, InfoOutputFormat, OpenAPIOutputFormat, Service, __version__ +from .utils import prepare_cli cli = typer.Typer(name="Command Line Interface of Aignostics Python SDK") +applications_app = typer.Typer() +cli.add_typer(applications_app, name="applications", help="Manage AI applications") +runs_app = typer.Typer() +cli.add_typer(runs_app, name="runs", help="Manage AI runs") +diagnostics_app = typer.Typer() +cli.add_typer(diagnostics_app, name="system", help="System diagnostics") + _service = Service() _console = Console() -@cli.command() -def health() -> None: - """Indicate if service is healthy.""" - _console.print(_service.healthy()) - +@applications_app.command("list") +def applications_list() -> None: + """List AI applications.""" + papi_client = aignx.platform.Client() + applications = papi_client.applications.list() + _console.print(applications) -class InfoOutputFormat(StrEnum): - """ - Enum representing the supported output formats. - This enum defines the possible formats for output data: - - YAML: Output data in YAML format - - JSON: Output data in JSON format +@runs_app.command("list") +def runs_list() -> None: + """List runs.""" + papi_client = aignx.platform.Client() + runs = papi_client.runs.list() + _console.print(runs) - Usage: - format = InfoOutputFormat.YAML - print(f"Using {format} format") - """ - YAML = "yaml" - JSON = "json" +@diagnostics_app.command("health") +def health() -> None: + """Indicate if service is healthy.""" + _console.print(_service.healthy()) -@cli.command() +@diagnostics_app.command("info") def info( output_format: Annotated[ InfoOutputFormat, typer.Option(help="Output format", case_sensitive=False) @@ -56,15 +62,7 @@ def info( _console.print(yaml.dump(info, default_flow_style=False), end="") -@cli.command() -def papi_applications_list() -> None: - """Check PAPI health.""" - papi_client = aignx.platform.Client() - applications = papi_client.applications.list() - _console.print(applications) - - -@cli.command() +@diagnostics_app.command("openapi") def openapi( api_version: Annotated[APIVersion, typer.Option(help="API Version", case_sensitive=False)] = APIVersion.V1, output_format: Annotated[ @@ -82,19 +80,7 @@ def openapi( _console.print(yaml.dump(schema, default_flow_style=False), end="") -def _apply_cli_settings(cli: typer.Typer, epilog: str) -> None: - """Add epilog to all typers in the tree and configure default behavior.""" - cli.info.epilog = epilog - cli.info.no_args_is_help = True - for command in cli.registered_commands: - command.epilog = cli.info.epilog - - -_apply_cli_settings( - cli, - f"🔬 Aignostics Python SDK v{__version__} - built with love in Berlin 🐻", -) - +prepare_cli(cli, f"🔬 Aignostics Python SDK v{__version__} - built with love in Berlin 🐻") if __name__ == "__main__": cli() diff --git a/src/aignostics/types.py b/src/aignostics/types.py index 47cc4e27..120afa04 100644 --- a/src/aignostics/types.py +++ b/src/aignostics/types.py @@ -34,3 +34,20 @@ class OpenAPIOutputFormat(StrEnum): YAML = "yaml" JSON = "json" + + +class InfoOutputFormat(StrEnum): + """ + Enum representing the supported output formats. + + This enum defines the possible formats for output data: + - YAML: Output data in YAML format + - JSON: Output data in JSON format + + Usage: + format = InfoOutputFormat.YAML + print(f"Using {format} format") + """ + + YAML = "yaml" + JSON = "json" diff --git a/src/aignostics/utils/__init__.py b/src/aignostics/utils/__init__.py new file mode 100644 index 00000000..f8d3a371 --- /dev/null +++ b/src/aignostics/utils/__init__.py @@ -0,0 +1,11 @@ +"""Utility functions and classes for the starbridge package.""" + +from .cli import prepare_cli +from .console import console +from .process import get_process_info + +__all__ = [ + "console", + "get_process_info", + "prepare_cli", +] diff --git a/src/aignostics/utils/cli.py b/src/aignostics/utils/cli.py new file mode 100644 index 00000000..4e747eac --- /dev/null +++ b/src/aignostics/utils/cli.py @@ -0,0 +1,60 @@ +"""Command-line interface utilities.""" + +import typer + + +def prepare_cli(cli: typer.Typer, epilog: str) -> None: + """ + Dynamically locate, register and prepare subcommands. + + Args: + cli (typer.Typer): Typer instance + epilog (str): Epilog to add + + """ + cli.info.epilog = epilog + cli.info.no_args_is_help = True + for command in cli.registered_commands: + command.epilog = cli.info.epilog + + # add epilog for all subcommands + _add_epilog_recursively(cli, epilog) + + # add no_args_is_help for all subcommands + _no_args_is_help_recursively(cli) + + +def _add_epilog_recursively(cli: typer.Typer, epilog: str) -> None: + """ + Add epilog to all typers in the tree. + + Args: + cli (typer.Typer): Typer instance + epilog (str): Epilog to add + + """ + cli.info.epilog = epilog + for group in cli.registered_groups: + if isinstance(group, typer.models.TyperInfo): + typer_instance = group.typer_instance + if (typer_instance is not cli) and typer_instance: + _add_epilog_recursively(typer_instance, epilog) + for command in cli.registered_commands: + if isinstance(command, typer.models.CommandInfo): + command.epilog = cli.info.epilog + + +def _no_args_is_help_recursively(cli: typer.Typer) -> None: + """ + Add epilog to all typers in the tree. + + Args: + cli (typer.Typer): Typer instance + + """ + for group in cli.registered_groups: + if isinstance(group, typer.models.TyperInfo): + group.no_args_is_help = True + typer_instance = group.typer_instance + if (typer_instance is not cli) and typer_instance: + _no_args_is_help_recursively(typer_instance) diff --git a/src/aignostics/utils/console.py b/src/aignostics/utils/console.py new file mode 100644 index 00000000..9349c5e9 --- /dev/null +++ b/src/aignostics/utils/console.py @@ -0,0 +1,14 @@ +"""Define styling for typer, overriding defaults.""" + +from rich.console import Console +from rich.theme import Theme + +console = Console( + theme=Theme({ + "logging.level.info": "purple4", + "debug": "light_cyan3", + "info": "purple4", + "warning": "yellow1", + "error": "red1", + }), +) diff --git a/src/aignostics/utils/process.py b/src/aignostics/utils/process.py new file mode 100644 index 00000000..e20cc20a --- /dev/null +++ b/src/aignostics/utils/process.py @@ -0,0 +1,42 @@ +"""Process related utilities.""" + +from pathlib import Path + +import psutil +from pydantic import BaseModel + + +class ParentProcessInfo(BaseModel): + """Information about a parent process.""" + + name: str | None = None + pid: int | None = None + + +class ProcessInfo(BaseModel): + """Information about the current process.""" + + project_root: str + pid: int + parent: ParentProcessInfo + + +def get_process_info() -> ProcessInfo: + """ + Get information about the current process and its parent. + + Returns: + ProcessInfo: Object containing process information. + + """ + current_process = psutil.Process() + parent = current_process.parent() + + return ProcessInfo( + project_root=str(Path(__file__).parent.parent.parent.parent), + pid=current_process.pid, + parent=ParentProcessInfo( + name=parent.name() if parent else None, + pid=parent.pid if parent else None, + ), + ) diff --git a/tests/cli_test.py b/tests/cli_test.py index e8b80311..798af9c3 100644 --- a/tests/cli_test.py +++ b/tests/cli_test.py @@ -27,21 +27,21 @@ def test_cli_built_with_love(runner) -> None: def test_cli_health(runner: CliRunner) -> None: """Check health is true.""" - result = runner.invoke(cli, ["health"]) + result = runner.invoke(cli, ["system", "health"]) assert result.exit_code == 0 assert "True" in result.output def test_cli_info(runner: CliRunner) -> None: """Check health is true.""" - result = runner.invoke(cli, ["info"]) + result = runner.invoke(cli, ["system", "info"]) assert result.exit_code == 0 assert "CPython" in result.output def test_cli_openapi_yaml(runner: CliRunner) -> None: """Check openapi command outputs YAML schema.""" - result = runner.invoke(cli, ["openapi"]) + result = runner.invoke(cli, ["system", "openapi"]) assert result.exit_code == 0 # Check for common OpenAPI YAML elements assert "openapi:" in result.output @@ -51,7 +51,7 @@ def test_cli_openapi_yaml(runner: CliRunner) -> None: def test_cli_openapi_json(runner: CliRunner) -> None: """Check openapi command outputs JSON schema.""" - result = runner.invoke(cli, ["openapi", "--output-format", "json"]) + result = runner.invoke(cli, ["system", "openapi", "--output-format", "json"]) assert result.exit_code == 0 # Check for common OpenAPI JSON elements assert '"openapi":' in result.output From d07fe779a68a93b74d0d34574705aa5711660da2 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 21:48:50 +0200 Subject: [PATCH 009/110] chore(cicd): introduce CLIENT_ID_DEVICE and CLIENT_ID_INTERACTIVE as secrets in scheduled and regular test and report. --- .github/workflows/scheduled-test.yml | 6 +++--- .github/workflows/test-and-report.yml | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/scheduled-test.yml b/.github/workflows/scheduled-test.yml index c737e3c9..fcb02a9c 100644 --- a/.github/workflows/scheduled-test.yml +++ b/.github/workflows/scheduled-test.yml @@ -49,11 +49,11 @@ jobs: - name: Create .env file uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 with: - envkey_CLIENT_ID: ${{ secrets.CLIENT_ID }} - envkey_CLIENT_ID2: ${{ secrets.CLIENT_ID2 }} + envkey_CLIENT_ID_DEVICE: ${{ secrets.CLIENT_ID_DEVICE }} + envkey_CLIENT_ID_INTERACTIVE: ${{ secrets.CLIENT_ID_INTERACTIVE }} fail_on_empty: true # https://nox.thea.codes/en/stable/usage.html - name: Run unit tests, measure coverage, lint, and check vulnerabilities run: | - uv run --all-extras nox -t "scheduled" \ No newline at end of file + uv run --all-extras nox -t "scheduled" diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 045c0304..56d6a593 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -62,7 +62,8 @@ jobs: - name: Create .env file uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 with: - envkey_ENV_KEY: "ENV_VALUE" + envkey_CLIENT_ID_DEVICE: ${{ secrets.CLIENT_ID_DEVICE }} + envkey_CLIENT_ID_INTERACTIVE: ${{ secrets.CLIENT_ID_INTERACTIVE }} fail_on_empty: true - name: Validate installation @@ -75,7 +76,7 @@ jobs: - name: Smoke tests run: | - uv run --no-dev aignostics hello-world + uv run --no-dev aignostics system health - name: Run unit tests, measure coverage, lint, and check vulnerabilities run: | From 4f9c17dbcdce13c7197583e39dd668a7fd284769 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 22:10:34 +0200 Subject: [PATCH 010/110] chore(scheduled): now working, just mark a test with pytest.mark.scheduled, and it runs once an hour --- .github/workflows/scheduled-test.yml | 6 +++--- noxfile.py | 5 +++++ pyproject.toml | 1 + tests/cli_test.py | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/scheduled-test.yml b/.github/workflows/scheduled-test.yml index fcb02a9c..1545a72d 100644 --- a/.github/workflows/scheduled-test.yml +++ b/.github/workflows/scheduled-test.yml @@ -3,8 +3,8 @@ name: "CI" on: schedule: # * is a special character in YAML so you have to quote this string - - cron: '30 5,17 * * *' - push: + - cron: '0 * * * *' + push: branches: - "**" pull_request: @@ -56,4 +56,4 @@ jobs: # https://nox.thea.codes/en/stable/usage.html - name: Run unit tests, measure coverage, lint, and check vulnerabilities run: | - uv run --all-extras nox -t "scheduled" + uv run --all-extras nox -s test -- -m scheduled diff --git a/noxfile.py b/noxfile.py index 50f7a18a..352de0f5 100644 --- a/noxfile.py +++ b/noxfile.py @@ -364,8 +364,13 @@ def test(session: nox.Session) -> None: """Run tests with pytest.""" _setup_venv(session) pytest_args = ["pytest", "--disable-warnings", "--junitxml=reports/junit.xml", "-n", "auto", "--dist", "loadgroup"] + if _is_act_environment(): pytest_args.extend(["-k", NOT_SKIP_WITH_ACT]) + + # Pass any additional arguments to pytest (like -m for markers) + pytest_args.extend(session.posargs) + session.run(*pytest_args) diff --git a/pyproject.toml b/pyproject.toml index a4c5a31e..cf36ff72 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -263,6 +263,7 @@ markers = [ "sequential: exclude from parallel test execution", # Custom # Nothing yet + "scheduled", "description: textual description what the test does, goes in `description` field in the Jira ticket - optional", "labels: mark test with labels that are attached to the test tickets in Jira - optional; comma-separated", "requirements: mark tests with ids (e.g., PAPI-123, HETA-123) of requirements in Jira. The test will be linked to them - optional; comma-separated", diff --git a/tests/cli_test.py b/tests/cli_test.py index 798af9c3..7ffc34fa 100644 --- a/tests/cli_test.py +++ b/tests/cli_test.py @@ -25,6 +25,7 @@ def test_cli_built_with_love(runner) -> None: assert __version__ in result.output +@pytest.mark.scheduled def test_cli_health(runner: CliRunner) -> None: """Check health is true.""" result = runner.invoke(cli, ["system", "health"]) From 0cac5760dd30f0c650ea144c8ef53bcc20b76428 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 22:14:41 +0200 Subject: [PATCH 011/110] fix(scheduled): typo --- .github/workflows/scheduled-test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/scheduled-test.yml b/.github/workflows/scheduled-test.yml index 1545a72d..8170a382 100644 --- a/.github/workflows/scheduled-test.yml +++ b/.github/workflows/scheduled-test.yml @@ -2,9 +2,8 @@ name: "CI" on: schedule: - # * is a special character in YAML so you have to quote this string - cron: '0 * * * *' - push: + push: branches: - "**" pull_request: From 94e823fd250f1be0bde76a04b4fda730281e22f8 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 22:15:46 +0200 Subject: [PATCH 012/110] fix(scheduled): typo --- .github/workflows/scheduled-test.yml | 5 +++-- .github/workflows/test-and-report.yml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/scheduled-test.yml b/.github/workflows/scheduled-test.yml index 8170a382..ae71c644 100644 --- a/.github/workflows/scheduled-test.yml +++ b/.github/workflows/scheduled-test.yml @@ -1,7 +1,8 @@ -name: "CI" +name: "CI Scheduled" on: schedule: + # * is a special character in YAML so you have to quote this string - cron: '0 * * * *' push: branches: @@ -10,7 +11,7 @@ on: branches: [main] jobs: - test: + test-scheduled: runs-on: ubuntu-latest permissions: contents: read diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 56d6a593..7f2be896 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -8,7 +8,7 @@ on: branches: [main] jobs: - test: + test-scheduled: runs-on: ubuntu-latest permissions: packages: write From f1b759116ec0ec2fc2ade7c6fd004dd3bf085766 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 22:16:05 +0200 Subject: [PATCH 013/110] fix(scheduled): typo --- .github/workflows/test-and-report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 7f2be896..56d6a593 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -8,7 +8,7 @@ on: branches: [main] jobs: - test-scheduled: + test: runs-on: ubuntu-latest permissions: packages: write From 10667d5e10f9f0783a6f509d6d0bb49a5c331c23 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 23:00:32 +0200 Subject: [PATCH 014/110] refactor(scheduled): simplify workflow --- .github/workflows/scheduled-test.yml | 15 --------------- noxfile.py | 1 - 2 files changed, 16 deletions(-) diff --git a/.github/workflows/scheduled-test.yml b/.github/workflows/scheduled-test.yml index ae71c644..3e9278f4 100644 --- a/.github/workflows/scheduled-test.yml +++ b/.github/workflows/scheduled-test.yml @@ -2,7 +2,6 @@ name: "CI Scheduled" on: schedule: - # * is a special character in YAML so you have to quote this string - cron: '0 * * * *' push: branches: @@ -22,13 +21,6 @@ jobs: with: fetch-depth: 0 - - name: Install dev tools - run: | - wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add - - echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list - sudo apt-get update - sudo apt-get install -y curl jq xsltproc gnupg2 trivy - - name: Install uv (python package manager) uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1 with: @@ -40,12 +32,6 @@ jobs: run: | uv sync --all-extras --frozen --link-mode=copy - - name: Print development version info - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} - run: | - TOML_VERSION=$(uv run python -c "import tomli; print(tomli.load(open('pyproject.toml', 'rb'))['project']['version'])") - echo "Development build - Current version in pyproject.toml: $TOML_VERSION" - - name: Create .env file uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 with: @@ -53,7 +39,6 @@ jobs: envkey_CLIENT_ID_INTERACTIVE: ${{ secrets.CLIENT_ID_INTERACTIVE }} fail_on_empty: true - # https://nox.thea.codes/en/stable/usage.html - name: Run unit tests, measure coverage, lint, and check vulnerabilities run: | uv run --all-extras nox -s test -- -m scheduled diff --git a/noxfile.py b/noxfile.py index 352de0f5..adfa740b 100644 --- a/noxfile.py +++ b/noxfile.py @@ -368,7 +368,6 @@ def test(session: nox.Session) -> None: if _is_act_environment(): pytest_args.extend(["-k", NOT_SKIP_WITH_ACT]) - # Pass any additional arguments to pytest (like -m for markers) pytest_args.extend(session.posargs) session.run(*pytest_args) From 1492306f9e5337c05302336c8ad6065c63e50a19 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 23:05:44 +0200 Subject: [PATCH 015/110] chore(scheduled): run only with one python version --- .github/workflows/scheduled-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scheduled-test.yml b/.github/workflows/scheduled-test.yml index 3e9278f4..1de6c9f5 100644 --- a/.github/workflows/scheduled-test.yml +++ b/.github/workflows/scheduled-test.yml @@ -41,4 +41,4 @@ jobs: - name: Run unit tests, measure coverage, lint, and check vulnerabilities run: | - uv run --all-extras nox -s test -- -m scheduled + uv run --all-extras nox -s test -p 3.11 -- -m scheduled From 2e7c57f626f9f0c86ba5280c9c2f942eddff037e Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 23:06:47 +0200 Subject: [PATCH 016/110] docs(scheduled): polish --- .github/workflows/{scheduled-test.yml => test-scheduled.yml} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename .github/workflows/{scheduled-test.yml => test-scheduled.yml} (89%) diff --git a/.github/workflows/scheduled-test.yml b/.github/workflows/test-scheduled.yml similarity index 89% rename from .github/workflows/scheduled-test.yml rename to .github/workflows/test-scheduled.yml index 1de6c9f5..61fb65a8 100644 --- a/.github/workflows/scheduled-test.yml +++ b/.github/workflows/test-scheduled.yml @@ -21,7 +21,7 @@ jobs: with: fetch-depth: 0 - - name: Install uv (python package manager) + - name: Install uv uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1 with: version: "0.6.3" @@ -39,6 +39,6 @@ jobs: envkey_CLIENT_ID_INTERACTIVE: ${{ secrets.CLIENT_ID_INTERACTIVE }} fail_on_empty: true - - name: Run unit tests, measure coverage, lint, and check vulnerabilities + - name: Run tests marked as scheduled run: | uv run --all-extras nox -s test -p 3.11 -- -m scheduled From 617aa528dc4be451aa81857626535da3342900aa Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Thu, 3 Apr 2025 23:33:37 +0200 Subject: [PATCH 017/110] feat(test_scheduled): make test_scheduled for local checks --- .github/workflows/test-scheduled.yml | 5 ----- Makefile | 7 ++++++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index 61fb65a8..915206b3 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -3,11 +3,6 @@ name: "CI Scheduled" on: schedule: - cron: '0 * * * *' - push: - branches: - - "**" - pull_request: - branches: [main] jobs: test-scheduled: diff --git a/Makefile b/Makefile index ce403f45..8b99b9ea 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # Makefile for running common development tasks # Define all PHONY targets -.PHONY: all act audit bump clean dist docs docker_build lint setup setup test update_from_template +.PHONY: all act audit bump clean dist docs docker_build lint setup setup test test_scheduledupdate_from_template # Main target i.e. default sessions defined in noxfile.py all: @@ -30,6 +30,10 @@ act audit bump dist docs lint setup test update_from_template: # Standalone targets +## Scheduled tests +test_scheduled: + uv run nox -s test -p 3.11 -- -m scheduled + ## Clean build artifacts and caches clean: rm -rf .mypy_cache @@ -68,6 +72,7 @@ help: @echo " lint - Run linting and formatting checks" @echo " setup - Setup development environment" @echo " test [3.11|3.12|3.13] - Run tests (for specific Python version)" + @echo " test_scheduled - Run scheduled tests (with Python version 3.11)" @echo " update_from_template - Update from template using copier" @echo "" @echo "Built with love in Berlin 🐻" From ea4577e7eb45394879723430e74a79b4d11f424b Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Thu, 3 Apr 2025 22:30:50 +0200 Subject: [PATCH 018/110] chore(client): Update client & package structure --- .gitignore | 2 + ATTRIBUTIONS.md | 13859 +++++++++------- client_configs/Dockerfile | 38 - client_configs/README.md | 15 - client_configs/_pyproject_uv.toml | 22 - client_configs/conftest.py | 29 - client_configs/poetry.lock | 1520 -- client_configs/pyproject.toml | 60 - codegen/test/test_externals_api.py | 126 + docs/source/_static/openapi_v1.yaml | 43 +- examples/playbook.py | 141 + noxfile.py | 2 +- pyproject.toml | 5 +- schema/config.json | 2 +- schema/generate.sh | 3 +- src/aignostics/cli.py | 4 +- src/aignostics/client/__init__.py | 1 + .../client}/_authentication.py | 112 +- src/aignostics/client/_client.py | 58 + .../client/resources/applications.py | 78 + .../client}/resources/runs.py | 147 +- .../client/samples/input_samples.py} | 41 +- .../platform => aignostics/client}/utils.py | 55 +- src/aignx/platform/__init__.py | 1 - src/aignx/platform/_client.py | 37 - src/aignx/platform/resources/applications.py | 33 - .../client}/applications_test.py | 4 +- tests/aignostics/client/scheduled_test.py | 51 + .../aignx/platform/two_task_dummy_app_test.py | 112 - uv.lock | 30 - 30 files changed, 8861 insertions(+), 7770 deletions(-) delete mode 100644 client_configs/Dockerfile delete mode 100644 client_configs/README.md delete mode 100644 client_configs/_pyproject_uv.toml delete mode 100644 client_configs/conftest.py delete mode 100644 client_configs/poetry.lock delete mode 100644 client_configs/pyproject.toml create mode 100644 codegen/test/test_externals_api.py create mode 100644 examples/playbook.py create mode 100644 src/aignostics/client/__init__.py rename src/{aignx/platform => aignostics/client}/_authentication.py (63%) create mode 100644 src/aignostics/client/_client.py create mode 100644 src/aignostics/client/resources/applications.py rename src/{aignx/platform => aignostics/client}/resources/runs.py (63%) rename src/{aignx/platform/__main__.py => aignostics/client/samples/input_samples.py} (62%) rename src/{aignx/platform => aignostics/client}/utils.py (62%) delete mode 100644 src/aignx/platform/__init__.py delete mode 100644 src/aignx/platform/_client.py delete mode 100644 src/aignx/platform/resources/applications.py rename tests/{aignx/platform => aignostics/client}/applications_test.py (95%) create mode 100644 tests/aignostics/client/scheduled_test.py delete mode 100644 tests/aignx/platform/two_task_dummy_app_test.py diff --git a/.gitignore b/.gitignore index 219ad586..5987242e 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,5 @@ node_modules/ # Application specific + +**/__marimo__ diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index c1861643..400a7932 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -30,6 +30,38 @@ limitations under the License. ``` +## Faker (37.1.0) - MIT License + +Faker is a Python package that generates fake data for you. + +* URL: https://github.com/joke2k/faker +* Author(s): joke2k + +### License Text + +``` +Copyright (c) 2012 Daniele Faraglia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## GitPython (3.1.44) - BSD License GitPython is a Python library used to interact with Git repositories @@ -198,6 +230,40 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## PyJWT (2.10.1) - MIT License + +JSON Web Token implementation in Python + +* URL: https://github.com/jpadilla/pyjwt +* Author(s): Jose Padilla + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2015-2022 José Padilla + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## PyYAML (6.0.2) - MIT License YAML parser and emitter for Python @@ -337,7 +403,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## aignostics (0.0.9) - MIT License +## aignostics (0.0.10) - MIT License 🔬 Python SDK providing access to Aignostics AI services. @@ -730,6 +796,43 @@ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +## appdirs (1.4.4) - MIT License + +A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". + +* URL: http://github.com/ActiveState/appdirs +* Author(s): Trent Mick +* Maintainer(s): Jeff Rouse + +### License Text + +``` +# This is the MIT license + +Copyright (c) 2010 ActiveState Software Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ``` ## appnope (0.1.4) - BSD License @@ -5685,613 +5788,877 @@ in the distribution package. ``` -## h11 (0.14.0) - MIT License +## google-api-core (2.24.2) - Apache Software License -A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +Google API client core library -* URL: https://github.com/python-hyper/h11 -* Author(s): Nathaniel J. Smith +* URL: https://github.com/googleapis/python-api-core +* Author(s): Google LLC ### License Text ``` -The MIT License (MIT) -Copyright (c) 2016 Nathaniel J. Smith and other contributors + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + 1. Definitions. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -``` + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -## html5lib (1.1) - MIT License + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -HTML parser based on the WHATWG HTML specification + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -* URL: https://github.com/html5lib/html5lib-python -* Maintainer(s): James Graham + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -### License Text + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -``` -Copyright (c) 2006-2013 James Graham and other contributors + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -``` + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -## httpcore (1.0.7) - BSD License + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -A minimal low-level HTTP client. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -* URL: https://www.encode.io/httpcore/ -* Author(s): Tom Christie + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -### License Text + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -``` -Copyright © 2020, [Encode OSS Ltd](https://www.encode.io/). -All rights reserved. + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -``` + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -## httptools (0.6.4) - MIT License + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -A collection of framework independent HTTP protocol utils. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -* URL: https://github.com/MagicStack/httptools -* Author(s): Yury Selivanov + END OF TERMS AND CONDITIONS -### License Text + APPENDIX: How to apply the Apache License to your work. -``` -The MIT License + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright (c) 2015 MagicStack Inc. http://magic.io + Copyright [yyyy] [name of copyright owner] -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## httpx (0.28.1) - BSD License +## google-auth (2.38.0) - Apache Software License -The next generation HTTP client. +Google Authentication Library -* URL: https://github.com/encode/httpx -* Author(s): Tom Christie +* URL: https://github.com/googleapis/google-auth-library-python +* Author(s): Google Cloud Platform ### License Text ``` -Copyright © 2019, [Encode OSS Ltd](https://www.encode.io/). -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -* Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + 1. Definitions. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -``` + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -## identify (2.6.9) - MIT License + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -File identification library for Python + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -* URL: https://github.com/pre-commit/identify -* Author(s): Chris Kuehl + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -### License Text + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -``` -Copyright (c) 2017 Chris Kuehl, Anthony Sottile + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -``` + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -## idna (3.10) - BSD License + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -Internationalized Domain Names in Applications (IDNA) + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -* URL: https://github.com/kjd/idna -* Author(s): Kim Davies + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -### License Text + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -``` -BSD 3-Clause License + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -Copyright (c) 2013-2024, Kim Davies and contributors. -All rights reserved. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -``` + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -## imagesize (1.4.1) - MIT License + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -Getting image size from png/jpeg/jpeg2000/gif file + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -* URL: https://github.com/shibukawa/imagesize_py -* Author(s): Yoshiki Shibukawa + END OF TERMS AND CONDITIONS -### License Text + APPENDIX: How to apply the Apache License to your work. -``` -The MIT License (MIT) ----------------------------- + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright © 2016 Yoshiki Shibukawa + Copyright [yyyy] [name of copyright owner] -Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the “Software”), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT -NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH -THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## iniconfig (2.1.0) - MIT License +## google-cloud-core (2.4.3) - Apache Software License -brain-dead simple config-ini parsing +Google Cloud API client core library -* URL: https://github.com/pytest-dev/iniconfig -* Author(s): Ronny Pfannschmidt , Holger Krekel +* URL: https://github.com/googleapis/python-cloud-core +* Author(s): Google LLC ### License Text ``` -The MIT License (MIT) - -Copyright (c) 2010 - 2023 Holger Krekel and others - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -## ipykernel (6.29.5) - BSD License + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -IPython Kernel for Jupyter + 1. Definitions. -* URL: https://ipython.org -* Author(s): IPython Development Team + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -### License Text + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -``` -BSD 3-Clause License + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Copyright (c) 2015, IPython Development Team + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -All rights reserved. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -``` + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -## ipython (9.0.2) - BSD License + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -IPython: Productive Interactive Computing + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -* URL: https://ipython.org -* Author(s): The IPython Development Team + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -### License Text + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -``` -============================= - The IPython licensing terms -============================= + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -IPython is licensed under the terms of the Modified BSD License (also known as -New or Revised or 3-Clause BSD). See the LICENSE file. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -About the IPython Development Team ----------------------------------- + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -Fernando Perez began IPython in 2001 based on code from Janko Hauser - and Nathaniel Gray . Fernando is still -the project lead. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -The IPython Development Team is the set of all contributors to the IPython -project. This includes all of the IPython subprojects. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -The core team that coordinates development on GitHub can be found here: -https://github.com/ipython/. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -Our Copyright Policy --------------------- + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -IPython uses a shared copyright model. Each contributor maintains copyright -over their contributions to IPython. But, it is important to note that these -contributions are typically only changes to the repositories. Thus, the IPython -source code, in its entirety is not the copyright of any single person or -institution. Instead, it is the collective copyright of the entire IPython -Development Team. If individual contributors want to maintain a record of what -changes/contributions they have specific copyright on, they should indicate -their copyright in the commit message of the change, when they commit the -change to one of the IPython repositories. + END OF TERMS AND CONDITIONS -With this in mind, the following banner should be used in any source code file -to indicate the copyright and license terms: + APPENDIX: How to apply the Apache License to your work. -:: + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - # Copyright (c) IPython Development Team. - # Distributed under the terms of the Modified BSD License. + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## ipython_pygments_lexers (1.1.1) - BSD License +## google-cloud-storage (3.1.0) - Apache Software License -Defines a variety of Pygments lexers for highlighting IPython code. +Google Cloud Storage API client library -* URL: https://github.com/ipython/ipython-pygments-lexers -* Author(s): The IPython Development Team +* URL: https://github.com/googleapis/python-storage +* Author(s): Google LLC ### License Text ``` -BSD 3-Clause License -- Copyright (c) 2012-Present, IPython Development Team + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -All rights reserved. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: + 1. Definitions. -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -``` + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -## ipywidgets (8.1.5) - BSD License + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -Jupyter interactive widgets + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -* URL: http://jupyter.org -* Author(s): Jupyter Development Team + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -### License Text + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -``` -Copyright (c) 2015 Project Jupyter Contributors -All rights reserved. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -``` + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -## isoduration (20.11.0) - ISC License (ISCL) - -Operations with ISO 8601 durations - -* URL: https://github.com/bolsote/isoduration -* Author(s): Víctor Muñoz - -### License Text - -``` -Copyright (c) 2020 Víctor Muñoz - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -``` - -## itsdangerous (2.2.0) - BSD License - -Safely pass data to untrusted environments and back. - -* URL: https://github.com/pallets/itsdangerous/ -* Maintainer(s): Pallets - -### License Text - -``` -Copyright 2011 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -``` + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -## jedi (0.19.2) - MIT License + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -An autocompletion tool for Python that can be used for text editors. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -* URL: https://github.com/davidhalter/jedi -* Author(s): David Halter -* Maintainer(s): David Halter + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -### License Text + END OF TERMS AND CONDITIONS -``` -All contributions towards Jedi are MIT licensed. + APPENDIX: How to apply the Apache License to your work. -------------------------------------------------------------------------------- -The MIT License (MIT) + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright (c) <2013> + Copyright [yyyy] [name of copyright owner] -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## json5 (0.10.0) - Apache Software License +## google-crc32c (1.7.1) - Apache 2.0 -A Python implementation of the JSON5 data format. +A python wrapper of the C library 'Google CRC32C' -* URL: https://github.com/dpranke/pyjson5 -* Author(s): Dirk Pranke +* URL: https://github.com/googleapis/python-crc32c +* Author(s): Google LLC ### License Text ``` -Files: Everything except for the benchmarks/*.json files. -Apache License + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -6471,7 +6838,7 @@ Apache License APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -6479,7 +6846,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -6493,432 +6860,532 @@ Apache License See the License for the specific language governing permissions and limitations under the License. ---- - -File: benchmarks/64KB-min.json +``` -MIT License +## google-resumable-media (2.7.2) - Apache Software License -Copyright (c) Microsoft Corporation. +Utilities for Google Media Downloads and Resumable Uploads -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +* URL: https://github.com/googleapis/google-resumable-media-python +* Author(s): Google Cloud Platform -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +### License Text -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE +``` ---- + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -File: benchmarks/bitly-usa-gov.json + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -The MIT License (MIT) + 1. Definitions. -Copyright (c) 2017 Wes McKinney + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. ---- + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -File: benchmarks/twitter.json + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -The MIT License (MIT) + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -Copyright (c) 2014 Milo Yip + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -``` + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -## jsonpointer (3.0.0) - BSD License + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -Identify specific nodes in a JSON document (RFC 6901) + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -* URL: https://github.com/stefankoegl/python-json-pointer -* Author(s): Stefan Kögl + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -### License Text + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -``` -Copyright (c) 2011 Stefan Kögl -All rights reserved. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -``` + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -## jsonschema (4.23.0) - MIT License + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -An implementation of JSON Schema validation for Python + END OF TERMS AND CONDITIONS -* URL: https://github.com/python-jsonschema/jsonschema -* Author(s): Julian Berman + APPENDIX: How to apply the Apache License to your work. -### License Text + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -``` -Copyright (c) 2013 Julian Berman + Copyright [yyyy] [name of copyright owner] -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## jsonschema-specifications (2024.10.1) - MIT License +## googleapis-common-protos (1.69.2) - Apache Software License -The JSON Schema meta-schemas and vocabularies, exposed as a Registry +Common protobufs used in Google APIs -* URL: https://github.com/python-jsonschema/jsonschema-specifications -* Author(s): Julian Berman +* URL: https://github.com/googleapis/google-cloud-python/tree/main/packages/googleapis-common-protos +* Author(s): Google LLC ### License Text ``` -Copyright (c) 2022 Julian Berman -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + 1. Definitions. -``` + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -## jupyter (1.1.1) - BSD License + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -Jupyter metapackage. Install all the Jupyter components in one go. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -* URL: https://jupyter.org -* Author(s): Jupyter Development Team + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -### License Text + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -``` -BSD 3-Clause License - -Copyright (c) 2017, Project Jupyter Contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -``` - -## jupyter-console (6.6.3) - BSD License + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -Jupyter terminal console + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -* URL: https://jupyter.org -* Author(s): Jupyter Development Team + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -### License Text + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -``` -BSD 3-Clause License + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -- Copyright (c) 2001-2015, IPython Development Team -- Copyright (c) 2015-, Jupyter Development Team + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -All rights reserved. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -``` + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -## jupyter-events (0.12.0) - BSD License + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -Jupyter Event System library + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -* URL: http://jupyter.org -* Author(s): Jupyter Development Team + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -### License Text + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -``` -BSD 3-Clause License + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -Copyright (c) 2022-, Jupyter Development Team + END OF TERMS AND CONDITIONS -All rights reserved. + APPENDIX: How to apply the Apache License to your work. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. + Copyright [yyyy] [name of copyright owner] -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + http://www.apache.org/licenses/LICENSE-2.0 -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## jupyter-lsp (2.2.5) - BSD License +## h11 (0.14.0) - MIT License -Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 -* URL: https://github.com/jupyter-lsp/jupyterlab-lsp/issues -* Author(s): jupyter-lsp Contributors +* URL: https://github.com/python-hyper/h11 +* Author(s): Nathaniel J. Smith ### License Text ``` -BSD 3-Clause License - -Copyright (c) 2022, jupyter-lsp contributors -All rights reserved. +The MIT License (MIT) -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Copyright (c) 2016 Nathaniel J. Smith and other contributors -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## jupyter_client (8.6.3) - BSD License +## html5lib (1.1) - MIT License -Jupyter protocol implementation and client libraries +HTML parser based on the WHATWG HTML specification -* URL: https://jupyter.org -* Author(s): Jupyter Development Team +* URL: https://github.com/html5lib/html5lib-python +* Maintainer(s): James Graham ### License Text ``` -BSD 3-Clause License - -- Copyright (c) 2001-2015, IPython Development Team -- Copyright (c) 2015-, Jupyter Development Team - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +Copyright (c) 2006-2013 James Graham and other contributors -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## jupyter_core (5.7.2) - BSD License +## httpcore (1.0.7) - BSD License -Jupyter core package. A base package on which Jupyter projects rely. +A minimal low-level HTTP client. -* URL: https://jupyter.org -* Author(s): Jupyter Development Team +* URL: https://www.encode.io/httpcore/ +* Author(s): Tom Christie ### License Text ``` -BSD 3-Clause License - -- Copyright (c) 2015-, Jupyter Development Team - +Copyright © 2020, [Encode OSS Ltd](https://www.encode.io/). All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -6933,150 +7400,221 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## jupyter_server (2.15.0) - BSD License +## httptools (0.6.4) - MIT License -The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +A collection of framework independent HTTP protocol utils. -* URL: https://jupyter-server.readthedocs.io -* Author(s): Jupyter Development Team +* URL: https://github.com/MagicStack/httptools +* Author(s): Yury Selivanov ### License Text ``` -BSD 3-Clause License +The MIT License -- Copyright (c) 2001-2015, IPython Development Team -- Copyright (c) 2015-, Jupyter Development Team +Copyright (c) 2015 MagicStack Inc. http://magic.io -All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +``` -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +## httpx (0.28.1) - BSD License -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +The next generation HTTP client. + +* URL: https://github.com/encode/httpx +* Author(s): Tom Christie + +### License Text ``` +Copyright © 2019, [Encode OSS Ltd](https://www.encode.io/). +All rights reserved. -## jupyter_server_terminals (0.5.3) - BSD License +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -A Jupyter Server Extension Providing Terminals. +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -* URL: https://jupyter.org -* Author(s): Jupyter Development Team +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -### License Text +* Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -BSD 3-Clause License -- Copyright (c) 2021-, Jupyter Development Team +## identify (2.6.9) - MIT License -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +File identification library for Python -All rights reserved. +* URL: https://github.com/pre-commit/identify +* Author(s): Chris Kuehl -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +### License Text -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +``` +Copyright (c) 2017 Chris Kuehl, Anthony Sottile -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ``` -## jupyterlab (4.3.6) - BSD License +## idna (3.10) - BSD License -JupyterLab computational environment +Internationalized Domain Names in Applications (IDNA) -* URL: https://jupyter.org -* Author(s): Jupyter Development Team +* URL: https://github.com/kjd/idna +* Author(s): Kim Davies ### License Text ``` -Copyright (c) 2015-2024 Project Jupyter Contributors +BSD 3-Clause License + +Copyright (c) 2013-2024, Kim Davies and contributors. All rights reserved. Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +modification, are permitted provided that the following conditions are +met: -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. -3. Neither the name of the copyright holder nor the names of its +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Semver File License -=================== +``` -The semver.py file is from https://github.com/podhmo/python-semver -which is licensed under the "MIT" license. See the semver.py file for details. +## imagesize (1.4.1) - MIT License + +Getting image size from png/jpeg/jpeg2000/gif file + +* URL: https://github.com/shibukawa/imagesize_py +* Author(s): Yoshiki Shibukawa + +### License Text ``` +The MIT License (MIT) +---------------------------- -## jupyterlab_pygments (0.3.0) - BSD License +Copyright © 2016 Yoshiki Shibukawa -Pygments theme using JupyterLab CSS variables +Permission is hereby granted, free of charge, to any person obtaining a copy of this software +and associated documentation files (the “Software”), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -* URL: https://github.com/jupyterlab/jupyterlab_pygments -* Author(s): Jupyter Development Team +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH +THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + +## iniconfig (2.1.0) - MIT License + +brain-dead simple config-ini parsing + +* URL: https://github.com/pytest-dev/iniconfig +* Author(s): Ronny Pfannschmidt , Holger Krekel ### License Text ``` -Copyright (c) 2015 Project Jupyter Contributors +The MIT License (MIT) + +Copyright (c) 2010 - 2023 Holger Krekel and others + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## ipykernel (6.29.5) - BSD License + +IPython Kernel for Jupyter + +* URL: https://ipython.org +* Author(s): IPython Development Team + +### License Text + +``` +BSD 3-Clause License + +Copyright (c) 2015, IPython Development Team + All rights reserved. Redistribution and use in source and binary forms, with or without @@ -7106,32 +7644,89 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## jupyterlab_server (2.27.3) - BSD License +## ipython (9.0.2) - BSD License -A set of server components for JupyterLab and JupyterLab like applications. +IPython: Productive Interactive Computing -* URL: https://jupyterlab-server.readthedocs.io -* Author(s): Jupyter Development Team +* URL: https://ipython.org +* Author(s): The IPython Development Team ### License Text ``` -Copyright (c) 2015-2017, Project Jupyter Contributors +============================= + The IPython licensing terms +============================= + +IPython is licensed under the terms of the Modified BSD License (also known as +New or Revised or 3-Clause BSD). See the LICENSE file. + + +About the IPython Development Team +---------------------------------- + +Fernando Perez began IPython in 2001 based on code from Janko Hauser + and Nathaniel Gray . Fernando is still +the project lead. + +The IPython Development Team is the set of all contributors to the IPython +project. This includes all of the IPython subprojects. + +The core team that coordinates development on GitHub can be found here: +https://github.com/ipython/. + +Our Copyright Policy +-------------------- + +IPython uses a shared copyright model. Each contributor maintains copyright +over their contributions to IPython. But, it is important to note that these +contributions are typically only changes to the repositories. Thus, the IPython +source code, in its entirety is not the copyright of any single person or +institution. Instead, it is the collective copyright of the entire IPython +Development Team. If individual contributors want to maintain a record of what +changes/contributions they have specific copyright on, they should indicate +their copyright in the commit message of the change, when they commit the +change to one of the IPython repositories. + +With this in mind, the following banner should be used in any source code file +to indicate the copyright and license terms: + +:: + + # Copyright (c) IPython Development Team. + # Distributed under the terms of the Modified BSD License. + +``` + +## ipython_pygments_lexers (1.1.1) - BSD License + +Defines a variety of Pygments lexers for highlighting IPython code. + +* URL: https://github.com/ipython/ipython-pygments-lexers +* Author(s): The IPython Development Team + +### License Text + +``` +BSD 3-Clause License + +- Copyright (c) 2012-Present, IPython Development Team + All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -7146,11 +7741,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## jupyterlab_widgets (3.0.13) - BSD License +## ipywidgets (8.1.5) - BSD License -Jupyter interactive widgets for JupyterLab +Jupyter interactive widgets -* URL: https://github.com/jupyter-widgets/ipywidgets +* URL: http://jupyter.org * Author(s): Jupyter Development Team ### License Text @@ -7184,75 +7779,92 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------- +``` -This package bundles several JavaScript npm packages in the -jupyterlab_widgets/static directory. Their licenses (as packaged in their -distributions in the node_modules package installation directory) are copied -below. +## isoduration (20.11.0) - ISC License (ISCL) ------------------------------------------------------------------------------- -From css-loader/LICENSE: +Operations with ISO 8601 durations -Copyright JS Foundation and other contributors +* URL: https://github.com/bolsote/isoduration +* Author(s): Víctor Muñoz -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +### License Text -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +``` +Copyright (c) 2020 Víctor Muñoz -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. ------------------------------------------------------------------------------- -From style-loader/LICENSE: +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -Copyright JS Foundation and other contributors +``` -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +## itsdangerous (2.2.0) - BSD License -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +Safely pass data to untrusted environments and back. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* URL: https://github.com/pallets/itsdangerous/ +* Maintainer(s): Pallets ------------------------------------------------------------------------------- -From backbone/backbone.js +### License Text -// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors -// Backbone may be freely distributed under the MIT license. -// For all details and documentation: -// http://backbonejs.org +``` +Copyright 2011 Pallets ------------------------------------------------------------------------------- -From base-64/LICENSE +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## jedi (0.19.2) - MIT License + +An autocompletion tool for Python that can be used for text editors. + +* URL: https://github.com/davidhalter/jedi +* Author(s): David Halter +* Maintainer(s): David Halter + +### License Text + +``` +All contributions towards Jedi are MIT licensed. +------------------------------------------------------------------------------- The MIT License (MIT) -Copyright (c) 2014 Jameson Little +Copyright (c) <2013> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -7272,94 +7884,23 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -From lodash/LICENSE - -Copyright OpenJS Foundation and other contributors - -Based on Underscore.js, copyright Jeremy Ashkenas, -DocumentCloud and Investigative Reporters & Editors - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/lodash/lodash - -The following license applies to all parts of this software except as -documented below: - -==== - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -==== - -Copyright and related rights for sample code are waived via CC0. Sample -code is defined as all source code displayed within the prose of the -documentation. - -CC0: http://creativecommons.org/publicdomain/zero/1.0/ - -==== - -Files located in the node_modules and vendor directories are externally -maintained libraries used by this software which have their own -licenses; we recommend you read them, as their terms may differ from the -terms above. - ------------------------------------------------------------------------------- -From d3-format/LICENSE: - -Copyright 2010-2015 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +``` -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +## jsf (0.11.2) - MIT License -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. +Creates fake JSON files from a JSON schema -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* URL: https://github.com/ghandic/jsf +* Author(s): ghandic ------------------------------------------------------------------------------- -From noUISlider/LICENSE.md (https://github.com/leongersen/noUiSlider/blob/eca62f9e56aaf02f0841b36e7993adf8db3721d5/LICENSE.md) +### License Text -MIT License +``` +The MIT License (MIT) +================================== -Copyright (c) 2019 Léon Gersen +Copyright (c) 2020 Andy Challis +------------------------------- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -7378,313 +7919,66 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` ------------------------------------------------------------------- -From jquery/LICENSE.txt - -Copyright JS Foundation and other contributors, https://js.foundation/ - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +## json5 (0.10.0) - Apache Software License -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +A Python implementation of the JSON5 data format. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* URL: https://github.com/dpranke/pyjson5 +* Author(s): Dirk Pranke ------------------------------------------------------------------- -From semver/LICENSE: +### License Text -The ISC License +``` +Files: Everything except for the benchmarks/*.json files. -Copyright (c) Isaac Z. Schlueter and Contributors +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + 1. Definitions. ------------------------------------------------------------------- -From underscore/LICENSE + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -Copyright (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative -Reporters & Editors + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -``` + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -## kiwisolver (1.4.8) - BSD License + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -A fast implementation of the Cassowary constraint solver - -* URL: https://github.com/nucleic/kiwi -* Author(s): The Nucleic Development Team -* Maintainer(s): "Matthieu C. Dartiailh" - -### License Text - -``` -========================= - The Kiwi licensing terms -========================= -Kiwi is licensed under the terms of the Modified BSD License (also known as -New or Revised BSD), as follows: - -Copyright (c) 2013-2024, Nucleic Development Team - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -Neither the name of the Nucleic Development Team nor the names of its -contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -About Kiwi ----------- -Chris Colbert began the Kiwi project in December 2013 in an effort to -create a blisteringly fast UI constraint solver. Chris is still the -project lead. - -The Nucleic Development Team is the set of all contributors to the Nucleic -project and its subprojects. - -The core team that coordinates development on GitHub can be found here: -http://github.com/nucleic. The current team consists of: - -* Chris Colbert - -Our Copyright Policy --------------------- -Nucleic uses a shared copyright model. Each contributor maintains copyright -over their contributions to Nucleic. But, it is important to note that these -contributions are typically only changes to the repositories. Thus, the Nucleic -source code, in its entirety is not the copyright of any single person or -institution. Instead, it is the collective copyright of the entire Nucleic -Development Team. If individual contributors want to maintain a record of what -changes/contributions they have specific copyright on, they should indicate -their copyright in the commit message of the change, when they commit the -change to one of the Nucleic repositories. - -With this in mind, the following banner should be used in any source code file -to indicate the copyright and license terms: - -#------------------------------------------------------------------------------ -# Copyright (c) 2013-2024, Nucleic Development Team. -# -# Distributed under the terms of the Modified BSD License. -# -# The full license is in the file LICENSE, distributed with this software. -#------------------------------------------------------------------------------ - -``` - -## license-expression (30.4.1) - Apache-2.0 - -license-expression is a comprehensive utility library to parse, compare, simplify and normalize license expressions (such as SPDX license expressions) using boolean logic. - -* URL: https://github.com/aboutcode-org/license-expression -* Author(s): nexB. Inc. and others - -### Notice - -``` -# - -# Copyright (c) nexB Inc. and others. - -# SPDX-License-Identifier: Apache-2.0 - -# - -# Visit https://aboutcode.org and https://github.com/aboutcode-org/license-expression - -# for support and download. - -# - -# Licensed under the Apache License, Version 2.0 (the "License"); - -# you may not use this file except in compliance with the License. - -# You may obtain a copy of the License at - -# - -# http://www.apache.org/licenses/LICENSE-2.0 - -# - -# Unless required by applicable law or agreed to in writing, software - -# distributed under the License is distributed on an "AS IS" BASIS, - -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -# See the License for the specific language governing permissions and - -# limitations under the License. - -# - -``` - -## lxml (5.3.1) - BSD License - -Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. - -* URL: https://lxml.de/ -* Author(s): lxml dev team -* Maintainer(s): lxml dev team - -### License Text - -``` -Copyright (c) 2004 Infrae. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - 3. Neither the name of Infrae nor the names of its contributors may - be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INFRAE OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -``` - -## marimo (0.11.28) - Apache Software License - -A library for making reactive notebooks and apps - -* URL: https://github.com/marimo-team/marimo - -### License Text - -``` - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions @@ -7819,7 +8113,7 @@ A library for making reactive notebooks and apps APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -7827,7 +8121,7 @@ A library for making reactive notebooks and apps same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -7841,21 +8135,13 @@ A library for making reactive notebooks and apps See the License for the specific language governing permissions and limitations under the License. -``` - -## markdown-it-py (3.0.0) - MIT License - -Python port of markdown-it. Markdown parsing, done right! - -* URL: https://github.com/executablebooks/markdown-it-py -* Author(s): Chris Sewell +--- -### License Text +File: benchmarks/64KB-min.json -``` MIT License -Copyright (c) 2020 ExecutableBookProject +Copyright (c) Microsoft Corporation. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -7873,207 +8159,118 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +SOFTWARE -``` +--- -## matplotlib (3.10.1) - Python Software Foundation License +File: benchmarks/bitly-usa-gov.json -Python plotting package +The MIT License (MIT) -* URL: https://matplotlib.org -* Author(s): John D. Hunter, Michael Droettboom +Copyright (c) 2017 Wes McKinney -### License Text - -``` -License agreement for matplotlib versions 1.3.0 and later -========================================================= - -1. This LICENSE AGREEMENT is between the Matplotlib Development Team -("MDT"), and the Individual or Organization ("Licensee") accessing and -otherwise using matplotlib software in source or binary form and its -associated documentation. - -2. Subject to the terms and conditions of this License Agreement, MDT -hereby grants Licensee a nonexclusive, royalty-free, world-wide license -to reproduce, analyze, test, perform and/or display publicly, prepare -derivative works, distribute, and otherwise use matplotlib -alone or in any derivative version, provided, however, that MDT's -License Agreement and MDT's notice of copyright, i.e., "Copyright (c) -2012- Matplotlib Development Team; All Rights Reserved" are retained in -matplotlib alone or in any derivative version prepared by -Licensee. - -3. In the event Licensee prepares a derivative work that is based on or -incorporates matplotlib or any part thereof, and wants to -make the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to matplotlib . - -4. MDT is making matplotlib available to Licensee on an "AS -IS" basis. MDT MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, MDT MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB -WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. - -5. MDT SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB - FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR -LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING -MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF -THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between MDT and -Licensee. This License Agreement does not grant permission to use MDT -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -8. By copying, installing or otherwise using matplotlib , -Licensee agrees to be bound by the terms and conditions of this License -Agreement. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -License agreement for matplotlib versions prior to 1.3.0 -======================================================== +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -1. This LICENSE AGREEMENT is between John D. Hunter ("JDH"), and the -Individual or Organization ("Licensee") accessing and otherwise using -matplotlib software in source or binary form and its associated -documentation. +--- -2. Subject to the terms and conditions of this License Agreement, JDH -hereby grants Licensee a nonexclusive, royalty-free, world-wide license -to reproduce, analyze, test, perform and/or display publicly, prepare -derivative works, distribute, and otherwise use matplotlib -alone or in any derivative version, provided, however, that JDH's -License Agreement and JDH's notice of copyright, i.e., "Copyright (c) -2002-2011 John D. Hunter; All Rights Reserved" are retained in -matplotlib alone or in any derivative version prepared by -Licensee. +File: benchmarks/twitter.json -3. In the event Licensee prepares a derivative work that is based on or -incorporates matplotlib or any part thereof, and wants to -make the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to matplotlib. +The MIT License (MIT) -4. JDH is making matplotlib available to Licensee on an "AS -IS" basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB -WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. +Copyright (c) 2014 Milo Yip -5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB - FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR -LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING -MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF -THE POSSIBILITY THEREOF. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between JDH and -Licensee. This License Agreement does not grant permission to use JDH -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -8. By copying, installing or otherwise using matplotlib, -Licensee agrees to be bound by the terms and conditions of this License -Agreement. ``` -## matplotlib-inline (0.1.7) - BSD License +## jsonpointer (3.0.0) - BSD License -Inline Matplotlib backend for Jupyter +Identify specific nodes in a JSON document (RFC 6901) -* URL: https://github.com/ipython/matplotlib-inline -* Author(s): IPython Development Team +* URL: https://github.com/stefankoegl/python-json-pointer +* Author(s): Stefan Kögl ### License Text ``` -BSD 3-Clause License - -Copyright (c) 2019-2022, IPython Development Team. +Copyright (c) 2011 Stefan Kögl All rights reserved. Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +modification, are permitted provided that the following conditions +are met: -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## mdurl (0.1.2) - MIT License +## jsonschema (4.23.0) - MIT License -Markdown URL utilities +An implementation of JSON Schema validation for Python -* URL: https://github.com/executablebooks/mdurl -* Author(s): Taneli Hukkinen +* URL: https://github.com/python-jsonschema/jsonschema +* Author(s): Julian Berman ### License Text ``` -Copyright (c) 2015 Vitaly Puzrin, Alex Kocharin. -Copyright (c) 2021 Taneli Hukkinen - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------------------- - -.parse() is based on Joyent's node.js `url` code: +Copyright (c) 2013 Julian Berman -Copyright Joyent, Inc. and other Node contributors. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in @@ -8083,459 +8280,228 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ``` -## mistune (3.1.3) - BSD License +## jsonschema-specifications (2024.10.1) - MIT License -A sane and fast Markdown parser with useful plugins and renderers +The JSON Schema meta-schemas and vocabularies, exposed as a Registry -* URL: https://github.com/lepture/mistune -* Author(s): Hsiaoming Yang +* URL: https://github.com/python-jsonschema/jsonschema-specifications +* Author(s): Julian Berman ### License Text ``` -Copyright (c) 2014, Hsiaoming Yang +Copyright (c) 2022 Julian Berman -All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -* Neither the name of the creator nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ``` -## more-itertools (10.6.0) - MIT License +## jupyter (1.1.1) - BSD License -More routines for operating on iterables, beyond itertools +Jupyter metapackage. Install all the Jupyter components in one go. -* URL: https://github.com/more-itertools/more-itertools -* Author(s): Erik Rose +* URL: https://jupyter.org +* Author(s): Jupyter Development Team ### License Text ``` -Copyright (c) 2012 Erik Rose +BSD 3-Clause License -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +Copyright (c) 2017, Project Jupyter Contributors +All rights reserved. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## msgpack (1.1.0) - Apache Software License +## jupyter-console (6.6.3) - BSD License -MessagePack serializer +Jupyter terminal console -* URL: https://msgpack.org/ -* Author(s): Inada Naoki +* URL: https://jupyter.org +* Author(s): Jupyter Development Team ### License Text ``` -Copyright (C) 2008-2011 INADA Naoki +BSD 3-Clause License - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +- Copyright (c) 2001-2015, IPython Development Team +- Copyright (c) 2015-, Jupyter Development Team - http://www.apache.org/licenses/LICENSE-2.0 +All rights reserved. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## mypy (1.15.0) - MIT License +## jupyter-events (0.12.0) - BSD License -Optional static typing for Python +Jupyter Event System library -* URL: https://www.mypy-lang.org/ -* Author(s): Jukka Lehtosalo +* URL: http://jupyter.org +* Author(s): Jupyter Development Team ### License Text ``` -Mypy (and mypyc) are licensed under the terms of the MIT license, reproduced below. +BSD 3-Clause License -= = = = = +Copyright (c) 2022-, Jupyter Development Team -The MIT License +All rights reserved. -Copyright (c) 2012-2023 Jukka Lehtosalo and contributors -Copyright (c) 2015-2023 Dropbox, Inc. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. -= = = = = +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Portions of mypy and mypyc are licensed under different licenses. -The files -mypyc/lib-rt/pythonsupport.h, mypyc/lib-rt/getargs.c and -mypyc/lib-rt/getargsfast.c are licensed under the PSF 2 License, reproduced -below. +``` -= = = = = +## jupyter-lsp (2.2.5) - BSD License -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- +Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. +* URL: https://github.com/jupyter-lsp/jupyterlab-lsp/issues +* Author(s): jupyter-lsp Contributors -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012 Python Software Foundation; All Rights Reserved" are retained in Python -alone or in any derivative version prepared by Licensee. +### License Text -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. +``` +BSD 3-Clause License -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. +Copyright (c) 2022, jupyter-lsp contributors +All rights reserved. -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -------------------------------------------- +``` -BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 +## jupyter_client (8.6.3) - BSD License -1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization ("Licensee") accessing and otherwise using -this software in source or binary form and its associated -documentation ("the Software"). +Jupyter protocol implementation and client libraries -2. Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. +* URL: https://jupyter.org +* Author(s): Jupyter Development Team -3. BeOpen is making the Software available to Licensee on an "AS IS" -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -5. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -6. This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. - -7. By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 ---------------------------------------- - -1. This LICENSE AGREEMENT is between the Corporation for National -Research Initiatives, having an office at 1895 Preston White Drive, -Reston, VA 20191 ("CNRI"), and the Individual or Organization -("Licensee") accessing and otherwise using Python 1.6.1 software in -source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, CNRI -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python 1.6.1 -alone or in any derivative version, provided, however, that CNRI's -License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -1995-2001 Corporation for National Research Initiatives; All Rights -Reserved" are retained in Python 1.6.1 alone or in any derivative -version prepared by Licensee. Alternately, in lieu of CNRI's License -Agreement, Licensee may substitute the following text (omitting the -quotes): "Python 1.6.1 is made available subject to the terms and -conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the Internet using the following -unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the Internet -using the following URL: http://hdl.handle.net/1895.22/1013". - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python 1.6.1 or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python 1.6.1. - -4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. This License Agreement shall be governed by the federal -intellectual property law of the United States, including without -limitation the federal copyright law, and, to the extent such -U.S. federal law does not apply, by the law of the Commonwealth of -Virginia, excluding Virginia's conflict of law provisions. -Notwithstanding the foregoing, with regard to derivative works based -on Python 1.6.1 that incorporate non-separable material that was -previously distributed under the GNU General Public License (GPL), the -law of the Commonwealth of Virginia shall govern this License -Agreement only as to issues arising under or with respect to -Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -License Agreement shall be deemed to create any relationship of -agency, partnership, or joint venture between CNRI and Licensee. This -License Agreement does not grant permission to use CNRI trademarks or -trade name in a trademark sense to endorse or promote products or -services of Licensee, or any third party. - -8. By clicking on the "ACCEPT" button where indicated, or by copying, -installing or otherwise using Python 1.6.1, Licensee agrees to be -bound by the terms and conditions of this License Agreement. - - ACCEPT - - -CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 --------------------------------------------------- - -Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -The Netherlands. All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -``` - -## mypy-extensions (1.0.0) - MIT License - -Type system extensions for programs checked with the mypy type checker. - -* URL: https://github.com/python/mypy_extensions -* Author(s): The mypy developers - -### License Text - -``` -Mypy extensions are licensed under the terms of the MIT license, reproduced below. - -= = = = = - -The MIT License - -Copyright (c) 2016-2017 Jukka Lehtosalo and contributors - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - -= = = = = - -``` - -## narwhals (1.31.0) - MIT License - -Extremely lightweight compatibility layer between dataframe libraries - -* URL: https://github.com/narwhals-dev/narwhals -* Author(s): Marco Gorelli <33491632+MarcoGorelli@users.noreply.github.com> - -### License Text - -``` -MIT License - -Copyright (c) 2024, Marco Gorelli - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - -## natsort (8.4.0) - MIT License - -Simple yet flexible natural sorting in Python. - -* URL: https://github.com/SethMMorton/natsort -* Author(s): Seth M. Morton - -### License Text - -``` -Copyright (c) 2012-2023 Seth M. Morton - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - -## nbclient (0.10.2) - BSD License - -A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. - -* URL: https://jupyter.org -* Author(s): Jupyter Development Team - -### License Text +### License Text ``` BSD 3-Clause License -Copyright (c) 2020-, Jupyter Development Team +- Copyright (c) 2001-2015, IPython Development Team +- Copyright (c) 2015-, Jupyter Development Team All rights reserved. @@ -8566,19 +8532,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## nbconvert (7.16.6) - BSD License +## jupyter_core (5.7.2) - BSD License -Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`). +Jupyter core package. A base package on which Jupyter projects rely. * URL: https://jupyter.org -* Author(s): Jupyter Development Team +* Author(s): Jupyter Development Team ### License Text ``` BSD 3-Clause License -- Copyright (c) 2001-2015, IPython Development Team - Copyright (c) 2015-, Jupyter Development Team All rights reserved. @@ -8610,11 +8575,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## nbformat (5.10.4) - BSD License +## jupyter_server (2.15.0) - BSD License -The Jupyter Notebook format +The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. -* URL: https://jupyter.org +* URL: https://jupyter-server.readthedocs.io * Author(s): Jupyter Development Team ### License Text @@ -8654,30 +8619,35 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## nest-asyncio (1.6.0) - BSD License +## jupyter_server_terminals (0.5.3) - BSD License -Patch asyncio to allow nested event loops +A Jupyter Server Extension Providing Terminals. -* URL: https://github.com/erdewit/nest_asyncio -* Author(s): Ewald R. de Wit +* URL: https://jupyter.org +* Author(s): Jupyter Development Team ### License Text ``` -BSD 2-Clause License +BSD 3-Clause License -Copyright (c) 2018-2020, Ewald de Wit -All rights reserved. +- Copyright (c) 2021-, Jupyter Development Team Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +All rights reserved. -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -8692,66 +8662,63 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## nodeenv (1.9.1) - BSD License +## jupyterlab (4.3.6) - BSD License -Node.js virtual environment builder +JupyterLab computational environment -* URL: https://github.com/ekalinin/nodeenv -* Author(s): Eugene Kalinin +* URL: https://jupyter.org +* Author(s): Jupyter Development Team ### License Text ``` -Copyright (c) 2011, Eugene Kalinin. +Copyright (c) 2015-2024 Project Jupyter Contributors +All rights reserved. -Some rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -Redistribution and use in source and binary forms of the software as well -as documentation, with or without modification, are permitted provided -that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. -* The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. +Semver File License +=================== + +The semver.py file is from https://github.com/podhmo/python-semver +which is licensed under the "MIT" license. See the semver.py file for details. ``` -## notebook (7.3.3) - BSD License +## jupyterlab_pygments (0.3.0) - BSD License -Jupyter Notebook - A web-based notebook environment for interactive computing +Pygments theme using JupyterLab CSS variables -* URL: https://github.com/jupyter/notebook +* URL: https://github.com/jupyterlab/jupyterlab_pygments * Author(s): Jupyter Development Team ### License Text ``` -BSD 3-Clause License - -- Copyright (c) 2001-2015, IPython Development Team -- Copyright (c) 2015-, Jupyter Development Team - +Copyright (c) 2015 Project Jupyter Contributors All rights reserved. Redistribution and use in source and binary forms, with or without @@ -8781,19 +8748,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## notebook_shim (0.2.4) - BSD License +## jupyterlab_server (2.27.3) - BSD License -A shim layer for notebook traits and config +A set of server components for JupyterLab and JupyterLab like applications. -* URL: UNKNOWN +* URL: https://jupyterlab-server.readthedocs.io * Author(s): Jupyter Development Team ### License Text ``` -BSD 3-Clause License - -Copyright (c) 2022 Project Jupyter Contributors +Copyright (c) 2015-2017, Project Jupyter Contributors All rights reserved. Redistribution and use in source and binary forms, with or without @@ -8823,1777 +8788,1330 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## nox (2025.2.9) - Apache Software License +## jupyterlab_widgets (3.0.13) - BSD License -Flexible test automation. +Jupyter interactive widgets for JupyterLab -* URL: https://github.com/wntrblm/nox -* Author(s): Alethea Katherine Flowers +* URL: https://github.com/jupyter-widgets/ipywidgets +* Author(s): Jupyter Development Team ### License Text ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Copyright (c) 2015 Project Jupyter Contributors +All rights reserved. - 1. Definitions. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +------------------------------------------------------------------------------ - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +This package bundles several JavaScript npm packages in the +jupyterlab_widgets/static directory. Their licenses (as packaged in their +distributions in the node_modules package installation directory) are copied +below. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +------------------------------------------------------------------------------ +From css-loader/LICENSE: - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +Copyright JS Foundation and other contributors - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +------------------------------------------------------------------------------ +From style-loader/LICENSE: - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +Copyright JS Foundation and other contributors - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +------------------------------------------------------------------------------ +From backbone/backbone.js - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Backbone may be freely distributed under the MIT license. +// For all details and documentation: +// http://backbonejs.org - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +------------------------------------------------------------------------------ +From base-64/LICENSE - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +The MIT License (MIT) - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +Copyright (c) 2014 Jameson Little - END OF TERMS AND CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - APPENDIX: How to apply the Apache License to your work. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. - Copyright [yyyy] [name of copyright owner] +------------------------------------------------------------------------------ +From lodash/LICENSE - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Copyright OpenJS Foundation and other contributors - http://www.apache.org/licenses/LICENSE-2.0 +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash -``` +The following license applies to all parts of this software except as +documented below: -## numpy (2.2.4) - BSD License +==== -Fundamental package for array computing in Python +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -* URL: https://numpy.org -* Author(s): Travis E. Oliphant et al. -* Maintainer(s): NumPy Developers +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -### License Text +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` -Copyright (c) 2005-2024, NumPy Developers. -All rights reserved. +==== -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. +CC0: http://creativecommons.org/publicdomain/zero/1.0/ - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. +==== - * Neither the name of the NumPy Developers nor the names of any - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +------------------------------------------------------------------------------ +From d3-format/LICENSE: ----- +Copyright 2010-2015 Mike Bostock +All rights reserved. -The NumPy repository and source distributions bundle several libraries that are -compatibly licensed. We list these here. +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: -Name: lapack-lite -Files: numpy/linalg/lapack_lite/* -License: BSD-3-Clause - For details, see numpy/linalg/lapack_lite/LICENSE.txt +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -Name: dragon4 -Files: numpy/_core/src/multiarray/dragon4.c -License: MIT - For license text, see numpy/_core/src/multiarray/dragon4.c +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -Name: libdivide -Files: numpy/_core/include/numpy/libdivide/* -License: Zlib - For license text, see numpy/_core/include/numpy/libdivide/LICENSE.txt +* Neither the name of the author nor the names of contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Note that the following files are vendored in the repository and sdist but not -installed in built numpy packages: +------------------------------------------------------------------------------ +From noUISlider/LICENSE.md (https://github.com/leongersen/noUiSlider/blob/eca62f9e56aaf02f0841b36e7993adf8db3721d5/LICENSE.md) -Name: Meson -Files: vendored-meson/meson/* -License: Apache 2.0 - For license text, see vendored-meson/meson/COPYING +MIT License -Name: spin -Files: .spin/cmds.py -License: BSD-3 - For license text, see .spin/LICENSE +Copyright (c) 2019 Léon Gersen -Name: tempita -Files: numpy/_build_utils/tempita/* -License: MIT - For details, see numpy/_build_utils/tempita/LICENCE.txt +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: ----- +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -This binary distribution of NumPy also bundles the following software: +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -Name: OpenBLAS -Files: numpy/.dylibs/libscipy_openblas*.so -Description: bundled as a dynamically linked library -Availability: https://github.com/OpenMathLib/OpenBLAS/ -License: BSD-3-Clause - Copyright (c) 2011-2014, The OpenBLAS Project - All rights reserved. +------------------------------------------------------------------ +From jquery/LICENSE.txt - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: +Copyright JS Foundation and other contributors, https://js.foundation/ - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - 3. Neither the name of the OpenBLAS project nor the names of - its contributors may be used to endorse or promote products - derived from this software without specific prior written - permission. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------ +From semver/LICENSE: -Name: LAPACK -Files: numpy/.dylibs/libscipy_openblas*.so -Description: bundled in OpenBLAS -Availability: https://github.com/OpenMathLib/OpenBLAS/ -License: BSD-3-Clause-Attribution - Copyright (c) 1992-2013 The University of Tennessee and The University - of Tennessee Research Foundation. All rights - reserved. - Copyright (c) 2000-2013 The University of California Berkeley. All - rights reserved. - Copyright (c) 2006-2013 The University of Colorado Denver. All rights - reserved. +The ISC License - $COPYRIGHT$ +Copyright (c) Isaac Z. Schlueter and Contributors - Additional copyrights may follow +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. - $HEADER$ +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: +------------------------------------------------------------------ +From underscore/LICENSE - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. +Copyright (c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer listed - in this license in the documentation and/or other materials - provided with the distribution. +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: - - Neither the name of the copyright holders nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - The copyright holders provide no reassurances that the source code - provided does not infringe any patent, copyright, or any other - intellectual property rights of third parties. The copyright holders - disclaim any liability to any recipient for claims brought against - recipient by any third party for infringement of that parties - intellectual property rights. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` +## kiwisolver (1.4.8) - BSD License -Name: GCC runtime library -Files: numpy/.dylibs/libgfortran*, numpy/.dylibs/libgcc* -Description: dynamically linked to files compiled with gcc -Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libgfortran -License: GPL-3.0-with-GCC-exception - Copyright (C) 2002-2017 Free Software Foundation, Inc. +A fast implementation of the Cassowary constraint solver - Libgfortran is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3, or (at your option) - any later version. +* URL: https://github.com/nucleic/kiwi +* Author(s): The Nucleic Development Team +* Maintainer(s): "Matthieu C. Dartiailh" - Libgfortran is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +### License Text - Under Section 7 of GPL version 3, you are granted additional - permissions described in the GCC Runtime Library Exception, version - 3.1, as published by the Free Software Foundation. +``` +========================= + The Kiwi licensing terms +========================= +Kiwi is licensed under the terms of the Modified BSD License (also known as +New or Revised BSD), as follows: - You should have received a copy of the GNU General Public License and - a copy of the GCC Runtime Library Exception along with this program; - see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - . +Copyright (c) 2013-2024, Nucleic Development Team ----- +All rights reserved. -Full text of license texts referred to above follows (that they are -listed below does not necessarily imply the conditions apply to the -present binary release): +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: ----- +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. -GCC RUNTIME LIBRARY EXCEPTION +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. -Version 3.1, 31 March 2009 +Neither the name of the Nucleic Development Team nor the names of its +contributors may be used to endorse or promote products derived from this +software without specific prior written permission. -Copyright (C) 2009 Free Software Foundation, Inc. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. +About Kiwi +---------- +Chris Colbert began the Kiwi project in December 2013 in an effort to +create a blisteringly fast UI constraint solver. Chris is still the +project lead. -This GCC Runtime Library Exception ("Exception") is an additional -permission under section 7 of the GNU General Public License, version -3 ("GPLv3"). It applies to a given file (the "Runtime Library") that -bears a notice placed by the copyright holder of the file stating that -the file is governed by GPLv3 along with this Exception. +The Nucleic Development Team is the set of all contributors to the Nucleic +project and its subprojects. -When you use GCC to compile a program, GCC may combine portions of -certain GCC header files and runtime libraries with the compiled -program. The purpose of this Exception is to allow compilation of -non-GPL (including proprietary) programs to use, in this way, the -header files and runtime libraries covered by this Exception. +The core team that coordinates development on GitHub can be found here: +http://github.com/nucleic. The current team consists of: -0. Definitions. +* Chris Colbert -A file is an "Independent Module" if it either requires the Runtime -Library for execution after a Compilation Process, or makes use of an -interface provided by the Runtime Library, but is not otherwise based -on the Runtime Library. +Our Copyright Policy +-------------------- +Nucleic uses a shared copyright model. Each contributor maintains copyright +over their contributions to Nucleic. But, it is important to note that these +contributions are typically only changes to the repositories. Thus, the Nucleic +source code, in its entirety is not the copyright of any single person or +institution. Instead, it is the collective copyright of the entire Nucleic +Development Team. If individual contributors want to maintain a record of what +changes/contributions they have specific copyright on, they should indicate +their copyright in the commit message of the change, when they commit the +change to one of the Nucleic repositories. -"GCC" means a version of the GNU Compiler Collection, with or without -modifications, governed by version 3 (or a specified later version) of -the GNU General Public License (GPL) with the option of using any -subsequent versions published by the FSF. +With this in mind, the following banner should be used in any source code file +to indicate the copyright and license terms: -"GPL-compatible Software" is software whose conditions of propagation, -modification and use would permit combination with GCC in accord with -the license of GCC. +#------------------------------------------------------------------------------ +# Copyright (c) 2013-2024, Nucleic Development Team. +# +# Distributed under the terms of the Modified BSD License. +# +# The full license is in the file LICENSE, distributed with this software. +#------------------------------------------------------------------------------ -"Target Code" refers to output from any compiler for a real or virtual -target processor architecture, in executable form or suitable for -input to an assembler, loader, linker and/or execution -phase. Notwithstanding that, Target Code does not include data in any -format that is used as a compiler intermediate representation, or used -for producing a compiler intermediate representation. +``` -The "Compilation Process" transforms code entirely represented in -non-intermediate languages designed for human-written code, and/or in -Java Virtual Machine byte code, into Target Code. Thus, for example, -use of source code generators and preprocessors need not be considered -part of the Compilation Process, since the Compilation Process can be -understood as starting with the output of the generators or -preprocessors. +## license-expression (30.4.1) - Apache-2.0 -A Compilation Process is "Eligible" if it is done using GCC, alone or -with other GPL-compatible software, or if it is done without using any -work based on GCC. For example, using non-GPL-compatible Software to -optimize any GCC intermediate representations would not qualify as an -Eligible Compilation Process. +license-expression is a comprehensive utility library to parse, compare, simplify and normalize license expressions (such as SPDX license expressions) using boolean logic. -1. Grant of Additional Permission. +* URL: https://github.com/aboutcode-org/license-expression +* Author(s): nexB. Inc. and others -You have permission to propagate a work of Target Code formed by -combining the Runtime Library with Independent Modules, even if such -propagation would otherwise violate the terms of GPLv3, provided that -all Target Code was generated by Eligible Compilation Processes. You -may then convey such a combination under terms of your choice, -consistent with the licensing of the Independent Modules. +### Notice -2. No Weakening of GCC Copyleft. +``` +# -The availability of this Exception does not imply any general -presumption that third-party software is unaffected by the copyleft -requirements of the license of GCC. +# Copyright (c) nexB Inc. and others. ----- +# SPDX-License-Identifier: Apache-2.0 - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 +# - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. +# Visit https://aboutcode.org and https://github.com/aboutcode-org/license-expression - Preamble +# for support and download. - The GNU General Public License is a free, copyleft license for -software and other kinds of works. +# - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. +# Licensed under the Apache License, Version 2.0 (the "License"); - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. +# you may not use this file except in compliance with the License. - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. +# You may obtain a copy of the License at - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. +# - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. +# http://www.apache.org/licenses/LICENSE-2.0 - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. +# - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. +# Unless required by applicable law or agreed to in writing, software - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. +# distributed under the License is distributed on an "AS IS" BASIS, - The precise terms and conditions for copying, distribution and -modification follow. +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - TERMS AND CONDITIONS +# See the License for the specific language governing permissions and - 0. Definitions. +# limitations under the License. - "This License" refers to version 3 of the GNU General Public License. +# - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. +``` - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. +## lxml (5.3.1) - BSD License - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. +Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. - A "covered work" means either the unmodified Program or a work based -on the Program. +* URL: https://lxml.de/ +* Author(s): lxml dev team +* Maintainer(s): lxml dev team - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. +### License Text - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. +``` +Copyright (c) 2004 Infrae. All rights reserved. - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: - 1. Source Code. + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. + 3. Neither the name of Infrae nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INFRAE OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. +``` - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. +## marimo (0.12.2) - Apache Software License - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. +A library for making reactive notebooks and apps - The Corresponding Source for a work in source code form is that -same work. +* URL: https://github.com/marimo-team/marimo - 2. Basic Permissions. +### License Text - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. +``` - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + 1. Definitions. - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. - 4. Conveying Verbatim Copies. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. - 5. Conveying Modified Source Versions. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. - 6. Conveying Non-Source Forms. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. + END OF TERMS AND CONDITIONS - 7. Additional Terms. + APPENDIX: How to apply the Apache License to your work. - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. + Copyright [yyyy] [name of copyright owner] - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or + http://www.apache.org/licenses/LICENSE-2.0 - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or +``` - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or +## markdown-it-py (3.0.0) - MIT License - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or +Python port of markdown-it. Markdown parsing, done right! - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. +* URL: https://github.com/executablebooks/markdown-it-py +* Author(s): Chris Sewell - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. +### License Text - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. +``` +MIT License - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. +Copyright (c) 2020 ExecutableBookProject - 8. Termination. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. +``` - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. +## matplotlib (3.10.1) - Python Software Foundation License - 9. Acceptance Not Required for Having Copies. +Python plotting package - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. +* URL: https://matplotlib.org +* Author(s): John D. Hunter, Michael Droettboom - 10. Automatic Licensing of Downstream Recipients. +### License Text - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. +``` +License agreement for matplotlib versions 1.3.0 and later +========================================================= - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. +1. This LICENSE AGREEMENT is between the Matplotlib Development Team +("MDT"), and the Individual or Organization ("Licensee") accessing and +otherwise using matplotlib software in source or binary form and its +associated documentation. - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. +2. Subject to the terms and conditions of this License Agreement, MDT +hereby grants Licensee a nonexclusive, royalty-free, world-wide license +to reproduce, analyze, test, perform and/or display publicly, prepare +derivative works, distribute, and otherwise use matplotlib +alone or in any derivative version, provided, however, that MDT's +License Agreement and MDT's notice of copyright, i.e., "Copyright (c) +2012- Matplotlib Development Team; All Rights Reserved" are retained in +matplotlib alone or in any derivative version prepared by +Licensee. - 11. Patents. +3. In the event Licensee prepares a derivative work that is based on or +incorporates matplotlib or any part thereof, and wants to +make the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to matplotlib . - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". +4. MDT is making matplotlib available to Licensee on an "AS +IS" basis. MDT MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, MDT MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB +WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. +5. MDT SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB + FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR +LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING +MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF +THE POSSIBILITY THEREOF. - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between MDT and +Licensee. This License Agreement does not grant permission to use MDT +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. +8. By copying, installing or otherwise using matplotlib , +Licensee agrees to be bound by the terms and conditions of this License +Agreement. - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. +License agreement for matplotlib versions prior to 1.3.0 +======================================================== - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. +1. This LICENSE AGREEMENT is between John D. Hunter ("JDH"), and the +Individual or Organization ("Licensee") accessing and otherwise using +matplotlib software in source or binary form and its associated +documentation. - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. +2. Subject to the terms and conditions of this License Agreement, JDH +hereby grants Licensee a nonexclusive, royalty-free, world-wide license +to reproduce, analyze, test, perform and/or display publicly, prepare +derivative works, distribute, and otherwise use matplotlib +alone or in any derivative version, provided, however, that JDH's +License Agreement and JDH's notice of copyright, i.e., "Copyright (c) +2002-2011 John D. Hunter; All Rights Reserved" are retained in +matplotlib alone or in any derivative version prepared by +Licensee. - 13. Use with the GNU Affero General Public License. +3. In the event Licensee prepares a derivative work that is based on or +incorporates matplotlib or any part thereof, and wants to +make the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to matplotlib. - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. +4. JDH is making matplotlib available to Licensee on an "AS +IS" basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB +WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. - 14. Revised Versions of this License. +5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB + FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR +LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING +MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF +THE POSSIBILITY THEREOF. - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between JDH and +Licensee. This License Agreement does not grant permission to use JDH +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. +8. By copying, installing or otherwise using matplotlib, +Licensee agrees to be bound by the terms and conditions of this License +Agreement. +``` - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. +## matplotlib-inline (0.1.7) - BSD License - 15. Disclaimer of Warranty. +Inline Matplotlib backend for Jupyter - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. +* URL: https://github.com/ipython/matplotlib-inline +* Author(s): IPython Development Team - 16. Limitation of Liability. +### License Text - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. +``` +BSD 3-Clause License - 17. Interpretation of Sections 15 and 16. +Copyright (c) 2019-2022, IPython Development Team. +All rights reserved. - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: - END OF TERMS AND CONDITIONS +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. - How to Apply These Terms to Your New Programs +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Copyright (C) +``` - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. +## mdurl (0.1.2) - MIT License - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +Markdown URL utilities - You should have received a copy of the GNU General Public License - along with this program. If not, see . +* URL: https://github.com/executablebooks/mdurl +* Author(s): Taneli Hukkinen -Also add information on how to contact you by electronic and paper mail. +### License Text - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: +``` +Copyright (c) 2015 Vitaly Puzrin, Alex Kocharin. +Copyright (c) 2021 Taneli Hukkinen - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. +-------------------------------------------------------------------------------- -Name: libquadmath -Files: numpy/.dylibs/libquadmath*.so -Description: dynamically linked to files compiled with gcc -Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libquadmath -License: LGPL-2.1-or-later +.parse() is based on Joyent's node.js `url` code: - GCC Quad-Precision Math Library - Copyright (C) 2010-2019 Free Software Foundation, Inc. - Written by Francois-Xavier Coudert +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - This file is part of the libquadmath library. - Libquadmath is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - Libquadmath is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. ``` -## orjson (3.10.15) - Apache Software License; MIT License +## mistune (3.1.3) - BSD License -Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +A sane and fast Markdown parser with useful plugins and renderers -* URL: https://github.com/ijl/orjson -* Author(s): ijl +* URL: https://github.com/lepture/mistune +* Author(s): Hsiaoming Yang ### License Text ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +Copyright (c) 2014, Hsiaoming Yang - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +All rights reserved. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +* Neither the name of the creator nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +``` -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +## more-itertools (10.6.0) - MIT License - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +More routines for operating on iterables, beyond itertools - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +* URL: https://github.com/more-itertools/more-itertools +* Author(s): Erik Rose - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +### License Text - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +``` +Copyright (c) 2012 Erik Rose - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +``` -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +## msgpack (1.1.0) - Apache Software License -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +MessagePack serializer -END OF TERMS AND CONDITIONS +* URL: https://msgpack.org/ +* Author(s): Inada Naoki -APPENDIX: How to apply the Apache License to your work. +### License Text - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +``` +Copyright (C) 2008-2011 INADA Naoki -Copyright [yyyy] [name of copyright owner] + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 - http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. ``` -## overrides (7.7.0) - Apache License, Version 2.0 +## mypy (1.15.0) - MIT License -A decorator to automatically detect mismatch when overriding a method. +Optional static typing for Python -* URL: https://github.com/mkorpela/overrides -* Author(s): Mikko Korpela +* URL: https://www.mypy-lang.org/ +* Author(s): Jukka Lehtosalo ### License Text ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Mypy (and mypyc) are licensed under the terms of the MIT license, reproduced below. - 1. Definitions. += = = = = - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +The MIT License - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +Copyright (c) 2012-2023 Jukka Lehtosalo and contributors +Copyright (c) 2015-2023 Dropbox, Inc. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. += = = = = - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +Portions of mypy and mypyc are licensed under different licenses. +The files +mypyc/lib-rt/pythonsupport.h, mypyc/lib-rt/getargs.c and +mypyc/lib-rt/getargsfast.c are licensed under the PSF 2 License, reproduced +below. - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. += = = = = - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012 Python Software Foundation; All Rights Reserved" are retained in Python +alone or in any derivative version prepared by Licensee. - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. - END OF TERMS AND CONDITIONS +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - APPENDIX: How to apply the Apache License to your work. +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. - Copyright {yyyy} {name of copyright owner} +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -``` +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. -## packageurl-python (0.16.0) - MIT License +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the Internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the Internet +using the following URL: http://hdl.handle.net/1895.22/1013". -A purl aka. Package URL parser and builder +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. -* URL: https://github.com/package-url/packageurl-python -* Author(s): the purl authors +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. -## packaging (24.2) - Apache Software License; BSD License +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. -Core utilities for Python packages +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. -* URL: https://github.com/pypa/packaging -* Author(s): Donald Stufft +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. -### License Text +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. -``` -This software is made available under the terms of *either* of the licenses -found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made -under the terms of *both* these licenses. + ACCEPT -``` -## pandas (2.2.3) - BSD License +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- -Powerful data structures for data analysis, time series, and statistics +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. -* URL: https://pandas.pydata.org -* Author(s): The Pandas Development Team +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. -### License Text +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` -BSD 3-Clause License - -Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team -All rights reserved. - -Copyright (c) 2011-2023, Open source contributors. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +## mypy-extensions (1.0.0) - MIT License -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +Type system extensions for programs checked with the mypy type checker. -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +* URL: https://github.com/python/mypy_extensions +* Author(s): The mypy developers -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Copyright (c) 2010-2019 Keith Goodman -Copyright (c) 2019 Bottleneck Developers -All rights reserved. +### License Text -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +``` +Mypy extensions are licensed under the terms of the MIT license, reproduced below. - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. += = = = = - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +The MIT License -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE.Copyright 2017- Paul Ganssle -Copyright 2017- dateutil contributors (see AUTHORS file) +Copyright (c) 2016-2017 Jukka Lehtosalo and contributors - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. -The above license applies to all contributions after 2017-12-01, as well as -all contributions that have been re-licensed (see AUTHORS file for the list of -contributors who have re-licensed their code). --------------------------------------------------------------------------------- -dateutil - Extensions to the standard Python datetime module. += = = = = -Copyright (c) 2003-2011 - Gustavo Niemeyer -Copyright (c) 2012-2014 - Tomi Pieviläinen -Copyright (c) 2014-2016 - Yaron de Leeuw -Copyright (c) 2015- - Paul Ganssle -Copyright (c) 2015- - dateutil contributors (see AUTHORS file) +``` -All rights reserved. +## narwhals (1.31.0) - MIT License -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +Extremely lightweight compatibility layer between dataframe libraries - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +* URL: https://github.com/narwhals-dev/narwhals +* Author(s): Marco Gorelli <33491632+MarcoGorelli@users.noreply.github.com> -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +### License Text -The above BSD License Applies to all code, even that also covered by Apache 2.0.# MIT License +``` +MIT License -Copyright (c) 2019 Hadley Wickham; RStudio; and Evan Miller +Copyright (c) 2024, Marco Gorelli Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -10612,30 +10130,2195 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Based on http://opensource.org/licenses/MIT - -This is a template. Complete and ship as file LICENSE the following 2 -lines (only) -YEAR: -COPYRIGHT HOLDER: +``` -and specify as +## natsort (8.4.0) - MIT License -License: MIT + file LICENSE +Simple yet flexible natural sorting in Python. -Copyright (c) , +* URL: https://github.com/SethMMorton/natsort +* Author(s): Seth M. Morton -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +### License Text -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +``` +Copyright (c) 2012-2023 Seth M. Morton + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## nbclient (0.10.2) - BSD License + +A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. + +* URL: https://jupyter.org +* Author(s): Jupyter Development Team + +### License Text + +``` +BSD 3-Clause License + +Copyright (c) 2020-, Jupyter Development Team + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## nbconvert (7.16.6) - BSD License + +Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`). + +* URL: https://jupyter.org +* Author(s): Jupyter Development Team + +### License Text + +``` +BSD 3-Clause License + +- Copyright (c) 2001-2015, IPython Development Team +- Copyright (c) 2015-, Jupyter Development Team + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## nbformat (5.10.4) - BSD License + +The Jupyter Notebook format + +* URL: https://jupyter.org +* Author(s): Jupyter Development Team + +### License Text + +``` +BSD 3-Clause License + +- Copyright (c) 2001-2015, IPython Development Team +- Copyright (c) 2015-, Jupyter Development Team + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## nest-asyncio (1.6.0) - BSD License + +Patch asyncio to allow nested event loops + +* URL: https://github.com/erdewit/nest_asyncio +* Author(s): Ewald R. de Wit + +### License Text + +``` +BSD 2-Clause License + +Copyright (c) 2018-2020, Ewald de Wit +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## nodeenv (1.9.1) - BSD License + +Node.js virtual environment builder + +* URL: https://github.com/ekalinin/nodeenv +* Author(s): Eugene Kalinin + +### License Text + +``` +Copyright (c) 2011, Eugene Kalinin. + +Some rights reserved. + +Redistribution and use in source and binary forms of the software as well +as documentation, with or without modification, are permitted provided +that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +* The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +``` + +## notebook (7.3.3) - BSD License + +Jupyter Notebook - A web-based notebook environment for interactive computing + +* URL: https://github.com/jupyter/notebook +* Author(s): Jupyter Development Team + +### License Text + +``` +BSD 3-Clause License + +- Copyright (c) 2001-2015, IPython Development Team +- Copyright (c) 2015-, Jupyter Development Team + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## notebook_shim (0.2.4) - BSD License + +A shim layer for notebook traits and config + +* URL: UNKNOWN +* Author(s): Jupyter Development Team + +### License Text + +``` +BSD 3-Clause License + +Copyright (c) 2022 Project Jupyter Contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## nox (2025.2.9) - Apache Software License + +Flexible test automation. + +* URL: https://github.com/wntrblm/nox +* Author(s): Alethea Katherine Flowers + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## numpy (2.2.4) - BSD License + +Fundamental package for array computing in Python + +* URL: https://numpy.org +* Author(s): Travis E. Oliphant et al. +* Maintainer(s): NumPy Developers + +### License Text + +``` +Copyright (c) 2005-2024, NumPy Developers. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the NumPy Developers nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---- + +The NumPy repository and source distributions bundle several libraries that are +compatibly licensed. We list these here. + +Name: lapack-lite +Files: numpy/linalg/lapack_lite/* +License: BSD-3-Clause + For details, see numpy/linalg/lapack_lite/LICENSE.txt + +Name: dragon4 +Files: numpy/_core/src/multiarray/dragon4.c +License: MIT + For license text, see numpy/_core/src/multiarray/dragon4.c + +Name: libdivide +Files: numpy/_core/include/numpy/libdivide/* +License: Zlib + For license text, see numpy/_core/include/numpy/libdivide/LICENSE.txt + + +Note that the following files are vendored in the repository and sdist but not +installed in built numpy packages: + +Name: Meson +Files: vendored-meson/meson/* +License: Apache 2.0 + For license text, see vendored-meson/meson/COPYING + +Name: spin +Files: .spin/cmds.py +License: BSD-3 + For license text, see .spin/LICENSE + +Name: tempita +Files: numpy/_build_utils/tempita/* +License: MIT + For details, see numpy/_build_utils/tempita/LICENCE.txt + +---- + +This binary distribution of NumPy also bundles the following software: + +Name: OpenBLAS +Files: numpy/.dylibs/libscipy_openblas*.so +Description: bundled as a dynamically linked library +Availability: https://github.com/OpenMathLib/OpenBLAS/ +License: BSD-3-Clause + Copyright (c) 2011-2014, The OpenBLAS Project + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. Neither the name of the OpenBLAS project nor the names of + its contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Name: LAPACK +Files: numpy/.dylibs/libscipy_openblas*.so +Description: bundled in OpenBLAS +Availability: https://github.com/OpenMathLib/OpenBLAS/ +License: BSD-3-Clause-Attribution + Copyright (c) 1992-2013 The University of Tennessee and The University + of Tennessee Research Foundation. All rights + reserved. + Copyright (c) 2000-2013 The University of California Berkeley. All + rights reserved. + Copyright (c) 2006-2013 The University of Colorado Denver. All rights + reserved. + + $COPYRIGHT$ + + Additional copyrights may follow + + $HEADER$ + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer listed + in this license in the documentation and/or other materials + provided with the distribution. + + - Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + The copyright holders provide no reassurances that the source code + provided does not infringe any patent, copyright, or any other + intellectual property rights of third parties. The copyright holders + disclaim any liability to any recipient for claims brought against + recipient by any third party for infringement of that parties + intellectual property rights. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Name: GCC runtime library +Files: numpy/.dylibs/libgfortran*, numpy/.dylibs/libgcc* +Description: dynamically linked to files compiled with gcc +Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libgfortran +License: GPL-3.0-with-GCC-exception + Copyright (C) 2002-2017 Free Software Foundation, Inc. + + Libgfortran is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Libgfortran is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + Under Section 7 of GPL version 3, you are granted additional + permissions described in the GCC Runtime Library Exception, version + 3.1, as published by the Free Software Foundation. + + You should have received a copy of the GNU General Public License and + a copy of the GCC Runtime Library Exception along with this program; + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + . + +---- + +Full text of license texts referred to above follows (that they are +listed below does not necessarily imply the conditions apply to the +present binary release): + +---- + +GCC RUNTIME LIBRARY EXCEPTION + +Version 3.1, 31 March 2009 + +Copyright (C) 2009 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +This GCC Runtime Library Exception ("Exception") is an additional +permission under section 7 of the GNU General Public License, version +3 ("GPLv3"). It applies to a given file (the "Runtime Library") that +bears a notice placed by the copyright holder of the file stating that +the file is governed by GPLv3 along with this Exception. + +When you use GCC to compile a program, GCC may combine portions of +certain GCC header files and runtime libraries with the compiled +program. The purpose of this Exception is to allow compilation of +non-GPL (including proprietary) programs to use, in this way, the +header files and runtime libraries covered by this Exception. + +0. Definitions. + +A file is an "Independent Module" if it either requires the Runtime +Library for execution after a Compilation Process, or makes use of an +interface provided by the Runtime Library, but is not otherwise based +on the Runtime Library. + +"GCC" means a version of the GNU Compiler Collection, with or without +modifications, governed by version 3 (or a specified later version) of +the GNU General Public License (GPL) with the option of using any +subsequent versions published by the FSF. + +"GPL-compatible Software" is software whose conditions of propagation, +modification and use would permit combination with GCC in accord with +the license of GCC. + +"Target Code" refers to output from any compiler for a real or virtual +target processor architecture, in executable form or suitable for +input to an assembler, loader, linker and/or execution +phase. Notwithstanding that, Target Code does not include data in any +format that is used as a compiler intermediate representation, or used +for producing a compiler intermediate representation. + +The "Compilation Process" transforms code entirely represented in +non-intermediate languages designed for human-written code, and/or in +Java Virtual Machine byte code, into Target Code. Thus, for example, +use of source code generators and preprocessors need not be considered +part of the Compilation Process, since the Compilation Process can be +understood as starting with the output of the generators or +preprocessors. + +A Compilation Process is "Eligible" if it is done using GCC, alone or +with other GPL-compatible software, or if it is done without using any +work based on GCC. For example, using non-GPL-compatible Software to +optimize any GCC intermediate representations would not qualify as an +Eligible Compilation Process. + +1. Grant of Additional Permission. + +You have permission to propagate a work of Target Code formed by +combining the Runtime Library with Independent Modules, even if such +propagation would otherwise violate the terms of GPLv3, provided that +all Target Code was generated by Eligible Compilation Processes. You +may then convey such a combination under terms of your choice, +consistent with the licensing of the Independent Modules. + +2. No Weakening of GCC Copyleft. + +The availability of this Exception does not imply any general +presumption that third-party software is unaffected by the copyleft +requirements of the license of GCC. + +---- + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + +Name: libquadmath +Files: numpy/.dylibs/libquadmath*.so +Description: dynamically linked to files compiled with gcc +Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libquadmath +License: LGPL-2.1-or-later + + GCC Quad-Precision Math Library + Copyright (C) 2010-2019 Free Software Foundation, Inc. + Written by Francois-Xavier Coudert + + This file is part of the libquadmath library. + Libquadmath is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + Libquadmath is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + +``` + +## oauthlib (3.2.2) - BSD License + +A generic, spec-compliant, thorough implementation of the OAuth request-signing logic + +* URL: https://github.com/oauthlib/oauthlib +* Author(s): The OAuthlib Community +* Maintainer(s): Ib Lundgren + +### License Text + +``` +Copyright (c) 2019 The OAuthlib Community +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of this project nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## orjson (3.10.15) - Apache Software License; MIT License + +Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy + +* URL: https://github.com/ijl/orjson +* Author(s): ijl + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +``` + +## overrides (7.7.0) - Apache License, Version 2.0 + +A decorator to automatically detect mismatch when overriding a method. + +* URL: https://github.com/mkorpela/overrides +* Author(s): Mikko Korpela + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +``` + +## packageurl-python (0.16.0) - MIT License + +A purl aka. Package URL parser and builder + +* URL: https://github.com/package-url/packageurl-python +* Author(s): the purl authors + +## packaging (24.2) - Apache Software License; BSD License + +Core utilities for Python packages + +* URL: https://github.com/pypa/packaging +* Author(s): Donald Stufft + +### License Text + +``` +This software is made available under the terms of *either* of the licenses +found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made +under the terms of *both* these licenses. + +``` + +## pandas (2.2.3) - BSD License + +Powerful data structures for data analysis, time series, and statistics + +* URL: https://pandas.pydata.org +* Author(s): The Pandas Development Team + +### License Text + +``` +BSD 3-Clause License + +Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team +All rights reserved. + +Copyright (c) 2011-2023, Open source contributors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2010-2019 Keith Goodman +Copyright (c) 2019 Bottleneck Developers +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE.Copyright 2017- Paul Ganssle +Copyright 2017- dateutil contributors (see AUTHORS file) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +The above license applies to all contributions after 2017-12-01, as well as +all contributions that have been re-licensed (see AUTHORS file for the list of +contributors who have re-licensed their code). +-------------------------------------------------------------------------------- +dateutil - Extensions to the standard Python datetime module. + +Copyright (c) 2003-2011 - Gustavo Niemeyer +Copyright (c) 2012-2014 - Tomi Pieviläinen +Copyright (c) 2014-2016 - Yaron de Leeuw +Copyright (c) 2015- - Paul Ganssle +Copyright (c) 2015- - dateutil contributors (see AUTHORS file) + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The above BSD License Applies to all code, even that also covered by Apache 2.0.# MIT License + +Copyright (c) 2019 Hadley Wickham; RStudio; and Evan Miller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +Based on http://opensource.org/licenses/MIT + +This is a template. Complete and ship as file LICENSE the following 2 +lines (only) + +YEAR: +COPYRIGHT HOLDER: + +and specify as + +License: MIT + file LICENSE + +Copyright (c) , + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF @@ -10646,754 +12329,1164 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. The MIT License -Copyright (c) 2008- Attractive Chaos +Copyright (c) 2008- Attractive Chaos + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.musl as a whole is licensed under the following standard MIT license: + +---------------------------------------------------------------------- +Copyright © 2005-2020 Rich Felker, et al. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +---------------------------------------------------------------------- + +Authors/contributors include: + +A. Wilcox +Ada Worcester +Alex Dowad +Alex Suykov +Alexander Monakov +Andre McCurdy +Andrew Kelley +Anthony G. Basile +Aric Belsito +Arvid Picciani +Bartosz Brachaczek +Benjamin Peterson +Bobby Bingham +Boris Brezillon +Brent Cook +Chris Spiegel +Clément Vasseur +Daniel Micay +Daniel Sabogal +Daurnimator +David Carlier +David Edelsohn +Denys Vlasenko +Dmitry Ivanov +Dmitry V. Levin +Drew DeVault +Emil Renner Berthing +Fangrui Song +Felix Fietkau +Felix Janda +Gianluca Anzolin +Hauke Mehrtens +He X +Hiltjo Posthuma +Isaac Dunham +Jaydeep Patil +Jens Gustedt +Jeremy Huntwork +Jo-Philipp Wich +Joakim Sindholt +John Spencer +Julien Ramseier +Justin Cormack +Kaarle Ritvanen +Khem Raj +Kylie McClain +Leah Neukirchen +Luca Barbato +Luka Perkov +M Farkas-Dyck (Strake) +Mahesh Bodapati +Markus Wichmann +Masanori Ogino +Michael Clark +Michael Forney +Mikhail Kremnyov +Natanael Copa +Nicholas J. Kain +orc +Pascal Cuoq +Patrick Oppenlander +Petr Hosek +Petr Skocik +Pierre Carrier +Reini Urban +Rich Felker +Richard Pennington +Ryan Fairfax +Samuel Holland +Segev Finer +Shiz +sin +Solar Designer +Stefan Kristiansson +Stefan O'Rear +Szabolcs Nagy +Timo Teräs +Trutz Behn +Valentin Ochs +Will Dietz +William Haddon +William Pitcock + +Portions of this software are derived from third-party works licensed +under terms compatible with the above MIT license: + +The TRE regular expression implementation (src/regex/reg* and +src/regex/tre*) is Copyright © 2001-2008 Ville Laurikari and licensed +under a 2-clause BSD license (license text in the source files). The +included version has been heavily modified by Rich Felker in 2012, in +the interests of size, simplicity, and namespace cleanliness. + +Much of the math library code (src/math/* and src/complex/*) is +Copyright © 1993,2004 Sun Microsystems or +Copyright © 2003-2011 David Schultz or +Copyright © 2003-2009 Steven G. Kargl or +Copyright © 2003-2009 Bruce D. Evans or +Copyright © 2008 Stephen L. Moshier or +Copyright © 2017-2018 Arm Limited +and labelled as such in comments in the individual source files. All +have been licensed under extremely permissive terms. + +The ARM memcpy code (src/string/arm/memcpy.S) is Copyright © 2008 +The Android Open Source Project and is licensed under a two-clause BSD +license. It was taken from Bionic libc, used on Android. + +The AArch64 memcpy and memset code (src/string/aarch64/*) are +Copyright © 1999-2019, Arm Limited. + +The implementation of DES for crypt (src/crypt/crypt_des.c) is +Copyright © 1994 David Burren. It is licensed under a BSD license. + +The implementation of blowfish crypt (src/crypt/crypt_blowfish.c) was +originally written by Solar Designer and placed into the public +domain. The code also comes with a fallback permissive license for use +in jurisdictions that may not recognize the public domain. + +The smoothsort implementation (src/stdlib/qsort.c) is Copyright © 2011 +Valentin Ochs and is licensed under an MIT-style license. + +The x86_64 port was written by Nicholas J. Kain and is licensed under +the standard MIT terms. + +The mips and microblaze ports were originally written by Richard +Pennington for use in the ellcc project. The original code was adapted +by Rich Felker for build system and code conventions during upstream +integration. It is licensed under the standard MIT terms. + +The mips64 port was contributed by Imagination Technologies and is +licensed under the standard MIT terms. + +The powerpc port was also originally written by Richard Pennington, +and later supplemented and integrated by John Spencer. It is licensed +under the standard MIT terms. + +All other files which have no copyright comments are original works +produced specifically for use as part of this library, written either +by Rich Felker, the main author of the library, or by one or more +contibutors listed above. Details on authorship of individual files +can be found in the git version control history of the project. The +omission of copyright and license comments in each file is in the +interest of source tree size. + +In addition, permission is hereby granted for all public header files +(include/* and arch/*/bits/*) and crt files intended to be linked into +applications (crt/*, ldso/dlstart.c, and arch/*/crt_arch.h) to omit +the copyright notice and permission notice otherwise required by the +license, and to use these files without any requirement of +attribution. These files include substantial contributions from: + +Bobby Bingham +John Spencer +Nicholas J. Kain +Rich Felker +Richard Pennington +Stefan Kristiansson +Szabolcs Nagy + +all of whom have explicitly granted such permission. + +This file previously contained text expressing a belief that most of +the files covered by the above exception were sufficiently trivial not +to be subject to copyright, resulting in confusion over whether it +negated the permissions granted in the license. In the spirit of +permissive licensing, and of not having licensing issues being an +obstacle to adoption, that text has been removed.Copyright (c) 2005-2023, NumPy Developers. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the NumPy Developers nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.musl as a whole is licensed under the following standard MIT license: + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. ----------------------------------------------------------------------- -Copyright © 2005-2020 Rich Felker, et al. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -Authors/contributors include: + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -A. Wilcox -Ada Worcester -Alex Dowad -Alex Suykov -Alexander Monakov -Andre McCurdy -Andrew Kelley -Anthony G. Basile -Aric Belsito -Arvid Picciani -Bartosz Brachaczek -Benjamin Peterson -Bobby Bingham -Boris Brezillon -Brent Cook -Chris Spiegel -Clément Vasseur -Daniel Micay -Daniel Sabogal -Daurnimator -David Carlier -David Edelsohn -Denys Vlasenko -Dmitry Ivanov -Dmitry V. Levin -Drew DeVault -Emil Renner Berthing -Fangrui Song -Felix Fietkau -Felix Janda -Gianluca Anzolin -Hauke Mehrtens -He X -Hiltjo Posthuma -Isaac Dunham -Jaydeep Patil -Jens Gustedt -Jeremy Huntwork -Jo-Philipp Wich -Joakim Sindholt -John Spencer -Julien Ramseier -Justin Cormack -Kaarle Ritvanen -Khem Raj -Kylie McClain -Leah Neukirchen -Luca Barbato -Luka Perkov -M Farkas-Dyck (Strake) -Mahesh Bodapati -Markus Wichmann -Masanori Ogino -Michael Clark -Michael Forney -Mikhail Kremnyov -Natanael Copa -Nicholas J. Kain -orc -Pascal Cuoq -Patrick Oppenlander -Petr Hosek -Petr Skocik -Pierre Carrier -Reini Urban -Rich Felker -Richard Pennington -Ryan Fairfax -Samuel Holland -Segev Finer -Shiz -sin -Solar Designer -Stefan Kristiansson -Stefan O'Rear -Szabolcs Nagy -Timo Teräs -Trutz Behn -Valentin Ochs -Will Dietz -William Haddon -William Pitcock + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -Portions of this software are derived from third-party works licensed -under terms compatible with the above MIT license: + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -The TRE regular expression implementation (src/regex/reg* and -src/regex/tre*) is Copyright © 2001-2008 Ville Laurikari and licensed -under a 2-clause BSD license (license text in the source files). The -included version has been heavily modified by Rich Felker in 2012, in -the interests of size, simplicity, and namespace cleanliness. + END OF TERMS AND CONDITIONS -Much of the math library code (src/math/* and src/complex/*) is -Copyright © 1993,2004 Sun Microsystems or -Copyright © 2003-2011 David Schultz or -Copyright © 2003-2009 Steven G. Kargl or -Copyright © 2003-2009 Bruce D. Evans or -Copyright © 2008 Stephen L. Moshier or -Copyright © 2017-2018 Arm Limited -and labelled as such in comments in the individual source files. All -have been licensed under extremely permissive terms. -The ARM memcpy code (src/string/arm/memcpy.S) is Copyright © 2008 -The Android Open Source Project and is licensed under a two-clause BSD -license. It was taken from Bionic libc, used on Android. +Copyright (c) Donald Stufft and individual contributors. +All rights reserved. -The AArch64 memcpy and memset code (src/string/aarch64/*) are -Copyright © 1999-2019, Arm Limited. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -The implementation of DES for crypt (src/crypt/crypt_des.c) is -Copyright © 1994 David Burren. It is licensed under a BSD license. + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. -The implementation of blowfish crypt (src/crypt/crypt_blowfish.c) was -originally written by Solar Designer and placed into the public -domain. The code also comes with a fallback permissive license for use -in jurisdictions that may not recognize the public domain. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. -The smoothsort implementation (src/stdlib/qsort.c) is Copyright © 2011 -Valentin Ochs and is licensed under an MIT-style license. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.A. HISTORY OF THE SOFTWARE +========================== -The x86_64 port was written by Nicholas J. Kain and is licensed under -the standard MIT terms. +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. -The mips and microblaze ports were originally written by Richard -Pennington for use in the ellcc project. The original code was adapted -by Rich Felker for build system and code conventions during upstream -integration. It is licensed under the standard MIT terms. +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. -The mips64 port was contributed by Imagination Technologies and is -licensed under the standard MIT terms. +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. -The powerpc port was also originally written by Richard Pennington, -and later supplemented and integrated by John Spencer. It is licensed -under the standard MIT terms. +All Python releases are Open Source (see https://opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. -All other files which have no copyright comments are original works -produced specifically for use as part of this library, written either -by Rich Felker, the main author of the library, or by one or more -contibutors listed above. Details on authorship of individual files -can be found in the git version control history of the project. The -omission of copyright and license comments in each file is in the -interest of source tree size. + Release Derived Year Owner GPL- + from compatible? (1) -In addition, permission is hereby granted for all public header files -(include/* and arch/*/bits/*) and crt files intended to be linked into -applications (crt/*, ldso/dlstart.c, and arch/*/crt_arch.h) to omit -the copyright notice and permission notice otherwise required by the -license, and to use these files without any requirement of -attribution. These files include substantial contributions from: + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes -Bobby Bingham -John Spencer -Nicholas J. Kain -Rich Felker -Richard Pennington -Stefan Kristiansson -Szabolcs Nagy +Footnotes: -all of whom have explicitly granted such permission. +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. -This file previously contained text expressing a belief that most of -the files covered by the above exception were sufficiently trivial not -to be subject to copyright, resulting in confusion over whether it -negated the permissions granted in the license. In the spirit of -permissive licensing, and of not having licensing issues being an -obstacle to adoption, that text has been removed.Copyright (c) 2005-2023, NumPy Developers. -All rights reserved. +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== - * Neither the name of the NumPy Developers nor the names of any - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. +Python software and documentation are licensed under the +Python Software Foundation License Version 2. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. - 1. Definitions. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the internet +using the following URL: http://hdl.handle.net/1895.22/1013". - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. + ACCEPT - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - END OF TERMS AND CONDITIONS +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. -Copyright (c) Donald Stufft and individual contributors. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +Copyright (c) 2014, Al Sweigart All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* Neither the name of the {organization} nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.A. HISTORY OF THE SOFTWARE -========================== +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.Copyright (c) 2017 Anthony Sottile -Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands -as a successor of a language called ABC. Guido remains Python's -principal author, although it includes many contributions from others. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) -in Reston, Virginia where he released several versions of the -software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -In May 2000, Guido and the Python core development team moved to -BeOpen.com to form the BeOpen PythonLabs team. In October of the same -year, the PythonLabs team moved to Digital Creations, which became -Zope Corporation. In 2001, the Python Software Foundation (PSF, see -https://www.python.org/psf/) was formed, a non-profit organization -created specifically to own Python-related Intellectual Property. -Zope Corporation was a sponsoring member of the PSF. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.Copyright (c) 2015-2019 Jared Hobbs -All Python releases are Open Source (see https://opensource.org for -the Open Source Definition). Historically, most, but not all, Python -releases have also been GPL-compatible; the table below summarizes -the various releases. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: - Release Derived Year Owner GPL- - from compatible? (1) +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - 0.9.0 thru 1.2 1991-1995 CWI yes - 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - 1.6 1.5.2 2000 CNRI no - 2.0 1.6 2000 BeOpen.com no - 1.6.1 1.6 2001 CNRI yes (2) - 2.1 2.0+1.6.1 2001 PSF no - 2.0.1 2.0+1.6.1 2001 PSF yes - 2.1.1 2.1+2.0.1 2001 PSF yes - 2.1.2 2.1.1 2002 PSF yes - 2.1.3 2.1.2 2002 PSF yes - 2.2 and above 2.1.1 2001-now PSF yes +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.Developed by ESN, an Electronic Arts Inc. studio. +Copyright (c) 2014, Electronic Arts Inc. +All rights reserved. -Footnotes: +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of ESN, Electronic Arts Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. -(1) GPL-compatible doesn't mean that we're distributing Python under - the GPL. All Python licenses, unlike the GPL, let you distribute - a modified version without making your changes open source. The - GPL-compatible licenses make it possible to combine Python with - other software that is released under the GPL; the others don't. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ELECTRONIC ARTS INC. BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - because its license has a choice of law clause. According to - CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - is "not incompatible" with the GPL. +---- -Thanks to the many outside volunteers who have worked under Guido's -direction to make these releases possible. +Portions of code from MODP_ASCII - Ascii transformations (upper/lower, etc) +https://github.com/client9/stringencoders + + Copyright 2005, 2006, 2007 + Nick Galbreath -- nickg [at] modp [dot] com + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: -B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -=============================================================== + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. -Python software and documentation are licensed under the -Python Software Foundation License Version 2. + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. -Starting with Python 3.8.6, examples, recipes, and other code in -the documentation are dual licensed under the PSF License Version 2 -and the Zero-Clause BSD license. + Neither the name of the modp.com nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. -Some software incorporated into Python is under different licenses. -The licenses are listed with code falling under that license. + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + This is the standard "new" BSD license: + http://www.opensource.org/licenses/bsd-license.php -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- +https://github.com/client9/stringencoders/blob/cfd5c1507325ae497ea9bacdacba12c0ffd79d30/COPYING -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. +---- + +Numeric decoder derived from from TCL library +https://opensource.apple.com/source/tcl/tcl-14/tcl/license.terms + * Copyright (c) 1988-1993 The Regents of the University of California. + * Copyright (c) 1994 Sun Microsystems, Inc. + + This software is copyrighted by the Regents of the University of + California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState + Corporation and other parties. The following terms apply to all files + associated with the software unless explicitly disclaimed in + individual files. + + The authors hereby grant permission to use, copy, modify, distribute, + and license this software and its documentation for any purpose, provided + that existing copyright notices are retained in all copies and that this + notice is included verbatim in any distributions. No written agreement, + license, or royalty fee is required for any of the authorized uses. + Modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided that + the new terms are clearly indicated on the first page of each file where + they apply. + + IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY + FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY + DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE + IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE + NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. + + GOVERNMENT USE: If you are acquiring this software on behalf of the + U.S. government, the Government shall have only "Restricted Rights" + in the software and related documentation as defined in the Federal + Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you + are acquiring the software on behalf of the Department of Defense, the + software shall be classified as "Commercial Computer Software" and the + Government shall have only "Restricted Rights" as defined in Clause + 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the + authors grant the U.S. Government and others acting in its behalf + permission to use and distribute the software in accordance with the + terms specified in this license.Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; -All Rights Reserved" are retained in Python alone or in any derivative version -prepared by Licensee. +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. +2. Grant of Copyright License. -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. +3. Grant of Patent License. -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. +4. Redistribution. +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: -BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -------------------------------------------- +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. -BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 +5. Submission of Contributions. -1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization ("Licensee") accessing and otherwise using -this software in source or binary form and its associated -documentation ("the Software"). +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. -2. Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. +6. Trademarks. -3. BeOpen is making the Software available to Licensee on an "AS IS" -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. -4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. +7. Disclaimer of Warranty. -5. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. -6. This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. +8. Limitation of Liability. -7. By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. +9. Accepting Warranty or Additional Liability. -CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 ---------------------------------------- +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. -1. This LICENSE AGREEMENT is between the Corporation for National -Research Initiatives, having an office at 1895 Preston White Drive, -Reston, VA 20191 ("CNRI"), and the Individual or Organization -("Licensee") accessing and otherwise using Python 1.6.1 software in -source or binary form and its associated documentation. +END OF TERMS AND CONDITIONS -2. Subject to the terms and conditions of this License Agreement, CNRI -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python 1.6.1 -alone or in any derivative version, provided, however, that CNRI's -License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -1995-2001 Corporation for National Research Initiatives; All Rights -Reserved" are retained in Python 1.6.1 alone or in any derivative -version prepared by Licensee. Alternately, in lieu of CNRI's License -Agreement, Licensee may substitute the following text (omitting the -quotes): "Python 1.6.1 is made available subject to the terms and -conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the internet using the following -unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the internet -using the following URL: http://hdl.handle.net/1895.22/1013". +APPENDIX: How to apply the Apache License to your work -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python 1.6.1 or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python 1.6.1. +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. -4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. + Copyright [yyyy] [name of copyright owner] -5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. + http://www.apache.org/licenses/LICENSE-2.0 -7. This License Agreement shall be governed by the federal -intellectual property law of the United States, including without -limitation the federal copyright law, and, to the extent such -U.S. federal law does not apply, by the law of the Commonwealth of -Virginia, excluding Virginia's conflict of law provisions. -Notwithstanding the foregoing, with regard to derivative works based -on Python 1.6.1 that incorporate non-separable material that was -previously distributed under the GNU General Public License (GPL), the -law of the Commonwealth of Virginia shall govern this License -Agreement only as to issues arising under or with respect to -Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -License Agreement shall be deemed to create any relationship of -agency, partnership, or joint venture between CNRI and Licensee. This -License Agreement does not grant permission to use CNRI trademarks or -trade name in a trademark sense to endorse or promote products or -services of Licensee, or any third party. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +## pandocfilters (1.5.1) - BSD License -8. By clicking on the "ACCEPT" button where indicated, or by copying, -installing or otherwise using Python 1.6.1, Licensee agrees to be -bound by the terms and conditions of this License Agreement. +Utilities for writing pandoc filters in python - ACCEPT +* URL: http://github.com/jgm/pandocfilters +* Author(s): John MacFarlane +### License Text -CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 --------------------------------------------------- +``` +Copyright (c) 2013, John MacFarlane +All rights reserved. -Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -The Netherlands. All rights reserved. +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION ----------------------------------------------------------------------- + - Neither the name of John Macfarlane nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -Copyright (c) 2014, Al Sweigart -All rights reserved. +``` -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +## parso (0.8.4) - MIT License -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +A Python Parser -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +* URL: https://github.com/davidhalter/parso +* Author(s): David Halter +* Maintainer(s): David Halter -* Neither the name of the {organization} nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +### License Text -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.Copyright (c) 2017 Anthony Sottile +``` +All contributions towards parso are MIT licensed. + +Some Python files have been taken from the standard library and are therefore +PSF licensed. Modifications on these files are dual licensed (both MIT and +PSF). These files are: + +- parso/pgen2/* +- parso/tokenize.py +- parso/token.py +- test/test_pgen2.py + +Also some test files under test/normalizer_issue_files have been copied from +https://github.com/PyCQA/pycodestyle (Expat License == MIT License). + +------------------------------------------------------------------------------- +The MIT License (MIT) + +Copyright (c) <2013-2017> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -11411,1711 +13504,1682 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE.Copyright (c) 2015-2019 Jared Hobbs +THE SOFTWARE. -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +------------------------------------------------------------------------------- -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE.Developed by ESN, an Electronic Arts Inc. studio. -Copyright (c) 2014, Electronic Arts Inc. -All rights reserved. +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: -* Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -* Neither the name of ESN, Electronic Arts Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015 Python Software Foundation; All Rights Reserved" +are retained in Python alone or in any derivative version prepared by Licensee. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL ELECTRONIC ARTS INC. BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. ----- +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. -Portions of code from MODP_ASCII - Ascii transformations (upper/lower, etc) -https://github.com/client9/stringencoders +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - Copyright 2005, 2006, 2007 - Nick Galbreath -- nickg [at] modp [dot] com - All rights reserved. +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. +``` - Neither the name of the modp.com nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +## pexpect (4.9.0) - ISC License (ISCL) - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Pexpect allows easy control of interactive console applications. - This is the standard "new" BSD license: - http://www.opensource.org/licenses/bsd-license.php +* URL: https://pexpect.readthedocs.io/ +* Author(s): Noah Spurrier; Thomas Kluyver; Jeff Quast -https://github.com/client9/stringencoders/blob/cfd5c1507325ae497ea9bacdacba12c0ffd79d30/COPYING +### License Text ----- +``` +ISC LICENSE -Numeric decoder derived from from TCL library -https://opensource.apple.com/source/tcl/tcl-14/tcl/license.terms - * Copyright (c) 1988-1993 The Regents of the University of California. - * Copyright (c) 1994 Sun Microsystems, Inc. + This license is approved by the OSI and FSF as GPL-compatible. + http://opensource.org/licenses/isc-license.txt - This software is copyrighted by the Regents of the University of - California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState - Corporation and other parties. The following terms apply to all files - associated with the software unless explicitly disclaimed in - individual files. + Copyright (c) 2013-2014, Pexpect development team + Copyright (c) 2012, Noah Spurrier - The authors hereby grant permission to use, copy, modify, distribute, - and license this software and its documentation for any purpose, provided - that existing copyright notices are retained in all copies and that this - notice is included verbatim in any distributions. No written agreement, - license, or royalty fee is required for any of the authorized uses. - Modifications to this software may be copyrighted by their authors - and need not follow the licensing terms described here, provided that - the new terms are clearly indicated on the first page of each file where - they apply. + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY - FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY - DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE - IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE - NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR - MODIFICATIONS. +``` - GOVERNMENT USE: If you are acquiring this software on behalf of the - U.S. government, the Government shall have only "Restricted Rights" - in the software and related documentation as defined in the Federal - Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you - are acquiring the software on behalf of the Department of Defense, the - software shall be classified as "Commercial Computer Software" and the - Government shall have only "Restricted Rights" as defined in Clause - 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the - authors grant the U.S. Government and others acting in its behalf - permission to use and distribute the software in accordance with the - terms specified in this license.Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ +## pillow (11.1.0) - CMU License (MIT-CMU) -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Python Imaging Library (Fork) -1. Definitions. +* URL: https://python-pillow.github.io +* Author(s): "Jeffrey A. Clark" -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. +### License Text -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. +``` +The Python Imaging Library (PIL) is -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. + Copyright © 1997-2011 by Secret Labs AB + Copyright © 1995-2011 by Fredrik Lundh and contributors -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. +Pillow is the friendly PIL fork. It is -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. + Copyright © 2010 by Jeffrey A. Clark and contributors -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. +Like PIL, Pillow is licensed under the open source MIT-CMU License: -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). +By obtaining, using, and/or copying this software and/or its associated +documentation, you agree that you have read, understood, and will comply +with the following terms and conditions: -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. +Permission to use, copy, modify and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appears in all copies, and that +both that copyright notice and this permission notice appear in supporting +documentation, and that the name of Secret Labs AB or the author not be +used in advertising or publicity pertaining to distribution of the software +without specific, written prior permission. -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." +SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. -2. Grant of Copyright License. +---- -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. +BROTLI -3. Grant of Patent License. +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -4. Redistribution. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. -5. Submission of Contributions. +---- -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. +BZIP2 -6. Trademarks. -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. +-------------------------------------------------------------------------- -7. Disclaimer of Warranty. +This program, "bzip2", the associated library "libbzip2", and all +documentation, are copyright (C) 1996-2019 Julian R Seward. All +rights reserved. -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: -8. Limitation of Liability. +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. +2. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. -9. Accepting Warranty or Additional Liability. +3. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. +4. The name of the author may not be used to endorse or promote + products derived from this software without specific prior written + permission. -END OF TERMS AND CONDITIONS +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -APPENDIX: How to apply the Apache License to your work +Julian Seward, jseward@acm.org +bzip2/libbzip2 version 1.0.8 of 13 July 2019 -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. +-------------------------------------------------------------------------- + + +---- - Copyright [yyyy] [name of copyright owner] +FREETYPE2 - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +The FreeType 2 font engine is copyrighted work and cannot be used +legally without a software license. In order to make this project +usable to a vast majority of developers, we distribute it under two +mutually exclusive open-source licenses. - http://www.apache.org/licenses/LICENSE-2.0 +This means that *you* must choose *one* of the two licenses described +below, then obey all its terms and conditions when using FreeType 2 in +any of your projects or products. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -``` + - The FreeType License, found in the file `docs/FTL.TXT`, which is + similar to the original BSD license *with* an advertising clause + that forces you to explicitly cite the FreeType project in your + product's documentation. All details are in the license file. + This license is suited to products which don't use the GNU General + Public License. -## pandocfilters (1.5.1) - BSD License + Note that this license is compatible to the GNU General Public + License version 3, but not version 2. -Utilities for writing pandoc filters in python + - The GNU General Public License version 2, found in + `docs/GPLv2.TXT` (any later version can be used also), for + programs which already use the GPL. Note that the FTL is + incompatible with GPLv2 due to its advertisement clause. -* URL: http://github.com/jgm/pandocfilters -* Author(s): John MacFarlane +The contributed BDF and PCF drivers come with a license similar to +that of the X Window System. It is compatible to the above two +licenses (see files `src/bdf/README` and `src/pcf/README`). The same +holds for the source code files `src/base/fthash.c` and +`include/freetype/internal/fthash.h`; they were part of the BDF driver +in earlier FreeType versions. -### License Text +The gzip module uses the zlib license (see `src/gzip/zlib.h`) which +too is compatible to the above two licenses. -``` -Copyright (c) 2013, John MacFarlane -All rights reserved. +The files `src/autofit/ft-hb.c` and `src/autofit/ft-hb.h` contain code +taken almost verbatim from the HarfBuzz file `hb-ft.cc`, which uses +the 'Old MIT' license, compatible to the above two licenses. -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: +The MD5 checksum support (only used for debugging in development +builds) is in the public domain. - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. +-------------------------------------------------------------------------- - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + The FreeType Project LICENSE + ---------------------------- - - Neither the name of John Macfarlane nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. + 2006-Jan-27 -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg -``` -## parso (0.8.4) - MIT License -A Python Parser +Introduction +============ -* URL: https://github.com/davidhalter/parso -* Author(s): David Halter -* Maintainer(s): David Halter + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. -### License Text + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. -``` -All contributions towards parso are MIT licensed. + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: -Some Python files have been taken from the standard library and are therefore -PSF licensed. Modifications on these files are dual licensed (both MIT and -PSF). These files are: + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) -- parso/pgen2/* -- parso/tokenize.py -- parso/token.py -- test/test_pgen2.py + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) -Also some test files under test/normalizer_issue_files have been copied from -https://github.com/PyCQA/pycodestyle (Expat License == MIT License). + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') -------------------------------------------------------------------------------- -The MIT License (MIT) + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. -Copyright (c) <2013-2017> -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + Please replace with the value from the FreeType version you + actually use. -------------------------------------------------------------------------------- -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- +Legal Terms +=========== -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. +0. Definitions +-------------- -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015 Python Software Foundation; All Rights Reserved" -are retained in Python alone or in any derivative version prepared by Licensee. + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. +1. No Warranty +-------------- -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. +2. Redistribution +----------------- -``` + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: -## pexpect (4.9.0) - ISC License (ISCL) + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. -Pexpect allows easy control of interactive console applications. + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. -* URL: https://pexpect.readthedocs.io/ -* Author(s): Noah Spurrier; Thomas Kluyver; Jeff Quast + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. -### License Text + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. -``` -ISC LICENSE + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. - This license is approved by the OSI and FSF as GPL-compatible. - http://opensource.org/licenses/isc-license.txt +4. Contacts +----------- - Copyright (c) 2013-2014, Pexpect development team - Copyright (c) 2012, Noah Spurrier + There are two mailing lists related to FreeType: - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + o freetype@nongnu.org + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. -``` + o freetype-devel@nongnu.org -## pillow (11.1.0) - CMU License (MIT-CMU) + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. -Python Imaging Library (Fork) + Our home page can be found at -* URL: https://python-pillow.github.io -* Author(s): "Jeffrey A. Clark" + https://www.freetype.org -### License Text -``` -The Python Imaging Library (PIL) is +--- end of FTL.TXT --- - Copyright © 1997-2011 by Secret Labs AB - Copyright © 1995-2011 by Fredrik Lundh and contributors +-------------------------------------------------------------------------- -Pillow is the friendly PIL fork. It is + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 - Copyright © 2010 by Jeffrey A. Clark and contributors + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. -Like PIL, Pillow is licensed under the open source MIT-CMU License: + Preamble -By obtaining, using, and/or copying this software and/or its associated -documentation, you agree that you have read, understood, and will comply -with the following terms and conditions: + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. -Permission to use, copy, modify and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appears in all copies, and that -both that copyright notice and this permission notice appear in supporting -documentation, and that the name of Secret Labs AB or the author not be -used in advertising or publicity pertaining to distribution of the software -without specific, written prior permission. + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. -SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. -IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, -INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. ----- + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. -BROTLI + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. -Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + The precise terms and conditions for copying, distribution and +modification follow. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. ----- + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. -BZIP2 +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: --------------------------------------------------------------------------- + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. -This program, "bzip2", the associated library "libbzip2", and all -documentation, are copyright (C) 1996-2019 Julian R Seward. All -rights reserved. + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. -2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. -3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. -4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, -Julian Seward, jseward@acm.org -bzip2/libbzip2 version 1.0.8 of 13 July 2019 + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, --------------------------------------------------------------------------- + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. ----- +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. -FREETYPE2 + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. -The FreeType 2 font engine is copyrighted work and cannot be used -legally without a software license. In order to make this project -usable to a vast majority of developers, we distribute it under two -mutually exclusive open-source licenses. + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. -This means that *you* must choose *one* of the two licenses described -below, then obey all its terms and conditions when using FreeType 2 in -any of your projects or products. + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. - - The FreeType License, found in the file `docs/FTL.TXT`, which is - similar to the original BSD license *with* an advertising clause - that forces you to explicitly cite the FreeType project in your - product's documentation. All details are in the license file. - This license is suited to products which don't use the GNU General - Public License. + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. - Note that this license is compatible to the GNU General Public - License version 3, but not version 2. +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. - - The GNU General Public License version 2, found in - `docs/GPLv2.TXT` (any later version can be used also), for - programs which already use the GPL. Note that the FTL is - incompatible with GPLv2 due to its advertisement clause. +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. -The contributed BDF and PCF drivers come with a license similar to -that of the X Window System. It is compatible to the above two -licenses (see files `src/bdf/README` and `src/pcf/README`). The same -holds for the source code files `src/base/fthash.c` and -`include/freetype/internal/fthash.h`; they were part of the BDF driver -in earlier FreeType versions. +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. -The gzip module uses the zlib license (see `src/gzip/zlib.h`) which -too is compatible to the above two licenses. + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. -The files `src/autofit/ft-hb.c` and `src/autofit/ft-hb.h` contain code -taken almost verbatim from the HarfBuzz file `hb-ft.cc`, which uses -the 'Old MIT' license, compatible to the above two licenses. + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. -The MD5 checksum support (only used for debugging in development -builds) is in the public domain. +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. --------------------------------------------------------------------------- + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. - The FreeType Project LICENSE - ---------------------------- + NO WARRANTY - 2006-Jan-27 + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. - Copyright 1996-2002, 2006 by - David Turner, Robert Wilhelm, and Werner Lemberg + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + END OF TERMS AND CONDITIONS + How to Apply These Terms to Your New Programs -Introduction -============ + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. - The FreeType Project is distributed in several archive packages; - some of them may contain, in addition to the FreeType font engine, - various tools and contributions which rely on, or relate to, the - FreeType Project. + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. - This license applies to all files found in such packages, and - which do not fall under their own explicit license. The license - affects thus the FreeType font engine, the test programs, - documentation and makefiles, at the very least. + + Copyright (C) - This license was inspired by the BSD, Artistic, and IJG - (Independent JPEG Group) licenses, which all encourage inclusion - and use of free software in commercial and freeware products - alike. As a consequence, its main points are that: + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. - o We don't promise that this software works. However, we will be - interested in any kind of bug reports. (`as is' distribution) + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - o You can use this software for whatever you want, in parts or - full form, without having to pay us. (`royalty-free' usage) + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - o You may not pretend that you wrote this software. If you use - it, or only parts of it, in a program, you must acknowledge - somewhere in your documentation that you have used the - FreeType code. (`credits') - We specifically permit and encourage the inclusion of this - software, with or without modifications, in commercial products. - We disclaim all warranties covering The FreeType Project and - assume no liability related to The FreeType Project. +Also add information on how to contact you by electronic and paper mail. +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: - Finally, many people asked us for a preferred form for a - credit/disclaimer to use in compliance with this license. We thus - encourage you to use the following text: + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. - """ - Portions of this software are copyright © The FreeType - Project (www.freetype.org). All rights reserved. - """ +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. - Please replace with the value from the FreeType version you - actually use. +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. -Legal Terms -=========== + , 1 April 1989 + Ty Coon, President of Vice -0. Definitions --------------- +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. - Throughout this license, the terms `package', `FreeType Project', - and `FreeType archive' refer to the set of files originally - distributed by the authors (David Turner, Robert Wilhelm, and - Werner Lemberg) as the `FreeType Project', be they named as alpha, - beta or final release. +-------------------------------------------------------------------------- - `You' refers to the licensee, or person using the project, where - `using' is a generic term including compiling the project's source - code as well as linking it to form a `program' or `executable'. - This program is referred to as `a program using the FreeType - engine'. +The following license details are part of `src/bdf/README`: - This license applies to all files distributed in the original - FreeType Project, including all source code, binaries and - documentation, unless otherwise stated in the file in its - original, unmodified form as distributed in the original archive. - If you are unsure whether or not a particular file is covered by - this license, you must contact us to verify this. +~~~ +License +******* - The FreeType Project is copyright (C) 1996-2000 by David Turner, - Robert Wilhelm, and Werner Lemberg. All rights reserved except as - specified below. +Copyright (C) 2001-2002 by Francesco Zappa Nardelli -1. No Warranty --------------- +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY - KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS - BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO - USE, OF THE FREETYPE PROJECT. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -2. Redistribution ------------------ +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - This license grants a worldwide, royalty-free, perpetual and - irrevocable right and license to use, execute, perform, compile, - display, copy, create derivative works of, distribute and - sublicense the FreeType Project (in both source and object code - forms) and derivative works thereof for any purpose; and to - authorize others to exercise some or all of the rights granted - herein, subject to the following conditions: +*** Portions of the driver (that is, bdflib.c and bdf.h): - o Redistribution of source code must retain this license file - (`FTL.TXT') unaltered; any additions, deletions or changes to - the original files must be clearly indicated in accompanying - documentation. The copyright notices of the unaltered, - original files must be preserved in all copies of source - files. +Copyright 2000 Computing Research Labs, New Mexico State University +Copyright 2001-2002, 2011 Francesco Zappa Nardelli - o Redistribution in binary form must provide a disclaimer that - states that the software is based in part of the work of the - FreeType Team, in the distribution documentation. We also - encourage you to put an URL to the FreeType web page in your - documentation, though this isn't mandatory. +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: - These conditions apply to any software derived from or based on - the FreeType Project, not just the unmodified files. If you use - our work, you must acknowledge us. However, no fee need be paid - to us. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -3. Advertising --------------- +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR +THE USE OR OTHER DEALINGS IN THE SOFTWARE. - Neither the FreeType authors and contributors nor you shall use - the name of the other for commercial, advertising, or promotional - purposes without specific prior written permission. - We suggest, but do not require, that you use one or more of the - following phrases to refer to this software in your documentation - or advertising materials: `FreeType Project', `FreeType Engine', - `FreeType library', or `FreeType Distribution'. +Credits +******* - As you have not signed this license, you are not required to - accept it. However, as the FreeType Project is copyrighted - material, only this license, or another one contracted with the - authors, grants you the right to use, distribute, and modify it. - Therefore, by using, distributing, or modifying the FreeType - Project, you indicate that you understand and accept all the terms - of this license. +This driver is based on excellent Mark Leisher's bdf library. If you +find something good in this driver you should probably thank him, not +me. +~~~ -4. Contacts ------------ +The following license details are part of `src/pcf/README`: - There are two mailing lists related to FreeType: +~~~ +License +******* - o freetype@nongnu.org +Copyright (C) 2000 by Francesco Zappa Nardelli - Discusses general use and applications of FreeType, as well as - future and wanted additions to the library and distribution. - If you are looking for support, start in this list if you - haven't found anything to help you in the documentation. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: - o freetype-devel@nongnu.org +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. - Discusses bugs, as well as engine internals, design issues, - specific licenses, porting, etc. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - Our home page can be found at - https://www.freetype.org +Credits +******* +Keith Packard wrote the pcf driver found in XFree86. His work is at +the same time the specification and the sample implementation of the +PCF format. Undoubtedly, this driver is inspired from his work. +~~~ ---- end of FTL.TXT --- --------------------------------------------------------------------------- +---- - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 +HARFBUZZ - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. +HarfBuzz is licensed under the so-called "Old MIT" license. Details follow. +For parts of HarfBuzz that are licensed under different licenses see individual +files names COPYING in subdirectories where applicable. - Preamble +Copyright © 2010-2022 Google, Inc. +Copyright © 2015-2020 Ebrahim Byagowi +Copyright © 2019,2020 Facebook, Inc. +Copyright © 2012,2015 Mozilla Foundation +Copyright © 2011 Codethink Limited +Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies) +Copyright © 2009 Keith Stribley +Copyright © 2011 Martin Hosken and SIL International +Copyright © 2007 Chris Wilson +Copyright © 2005,2006,2020,2021,2022,2023 Behdad Esfahbod +Copyright © 2004,2007,2008,2009,2010,2013,2021,2022,2023 Red Hat, Inc. +Copyright © 1998-2005 David Turner and Werner Lemberg +Copyright © 2016 Igalia S.L. +Copyright © 2022 Matthias Clasen +Copyright © 2018,2021 Khaled Hosny +Copyright © 2018,2019,2020 Adobe, Inc +Copyright © 2013-2015 Alexei Podtelezhnikov - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. +For full copyright notices consult the individual files in the package. - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. +Permission is hereby granted, without written agreement and without +license or royalty fees, to use, copy, modify, and distribute this +software and its documentation for any purpose, provided that the +above copyright notice and the following two paragraphs appear in +all copies of this software. - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN +IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. +THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO +PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. +---- - The precise terms and conditions for copying, distribution and -modification follow. +LCMS2 - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +Little CMS +Copyright (c) 1998-2020 Marti Maria Saguer - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: +---- - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. +LIBJPEG - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) +In legalese: -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. +This software is copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding. +All Rights Reserved except as specified below. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. +---- -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. +LIBLZMA - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. +XZ Utils Licensing +================== - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. + Different licenses apply to different files in this package. Here + is a rough summary of which licenses apply to which parts of this + package (but check the individual files to be sure!): - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. + - liblzma is in the public domain. - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. + - xz, xzdec, and lzmadec command line tools are in the public + domain unless GNU getopt_long had to be compiled and linked + in from the lib directory. The getopt_long code is under + GNU LGPLv2.1+. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. + - The scripts to grep, diff, and view compressed files have been + adapted from gzip. These scripts and their documentation are + under GNU GPLv2+. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. + - All the documentation in the doc directory and most of the + XZ Utils specific documentation files in other directories + are in the public domain. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. + - Translated messages are in the public domain. - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. + - The build system contains public domain files, and files that + are under GNU GPLv2+ or GNU GPLv3+. None of these files end up + in the binaries being built. - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. + - Test files and test code in the tests directory, and debugging + utilities in the debug directory are in the public domain. -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. + - The extra directory may contain public domain files, and files + that are under various free software licenses. - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. + You can do whatever you want with the files that have been put into + the public domain. If you find public domain legally problematic, + take the previous sentence as a license grant. If you still find + the lack of copyright legally problematic, you have too many + lawyers. - NO WARRANTY + As usual, this software is provided "as is", without any warranty. - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. + If you copy significant amounts of public domain code from XZ Utils + into your project, acknowledging this somewhere in your software is + polite (especially if it is proprietary, non-free software), but + naturally it is not legally required. Here is an example of a good + notice to put into "about box" or into documentation: - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. + This software includes code from XZ Utils . - END OF TERMS AND CONDITIONS + The following license texts are included in the following files: + - COPYING.LGPLv2.1: GNU Lesser General Public License version 2.1 + - COPYING.GPLv2: GNU General Public License version 2 + - COPYING.GPLv3: GNU General Public License version 3 - How to Apply These Terms to Your New Programs + Note that the toolchain (compiler, linker etc.) may add some code + pieces that are copyrighted. Thus, it is possible that e.g. liblzma + binary wouldn't actually be in the public domain in its entirety + even though it contains no copyrighted code from the XZ Utils source + package. - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. + If you have questions, don't hesitate to ask the author(s) for more + information. - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - Copyright (C) +---- + +LIBPNG - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE +========================================= - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +PNG Reference Library License version 2 +--------------------------------------- - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * Copyright (c) 1995-2022 The PNG Reference Library Authors. + * Copyright (c) 2018-2022 Cosmin Truta. + * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. + * Copyright (c) 1996-1997 Andreas Dilger. + * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. +The software is supplied "as is", without warranty of any kind, +express or implied, including, without limitation, the warranties +of merchantability, fitness for a particular purpose, title, and +non-infringement. In no event shall the Copyright owners, or +anyone distributing the software, be liable for any damages or +other liability, whether in contract, tort or otherwise, arising +from, out of, or in connection with the software, or the use or +other dealings in the software, even if advised of the possibility +of such damage. -Also add information on how to contact you by electronic and paper mail. +Permission is hereby granted to use, copy, modify, and distribute +this software, or portions hereof, for any purpose, without fee, +subject to the following restrictions: -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: + 1. The origin of this software must not be misrepresented; you + must not claim that you wrote the original software. If you + use this software in a product, an acknowledgment in the product + documentation would be appreciated, but is not required. - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. + 2. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. +PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) +----------------------------------------------------------------------- - , 1 April 1989 - Ty Coon, President of Vice +libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are +Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are +derived from libpng-1.0.6, and are distributed according to the same +disclaimer and license as libpng-1.0.6 with the following individuals +added to the list of Contributing Authors: -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. + Simon-Pierre Cadieux + Eric S. Raymond + Mans Rullgard + Cosmin Truta + Gilles Vollant + James Yu + Mandar Sahastrabuddhe + Google Inc. + Vadim Barkov --------------------------------------------------------------------------- +and with the following additions to the disclaimer: -The following license details are part of `src/bdf/README`: + There is no warranty against interference with your enjoyment of + the library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is + with the user. -~~~ -License -******* +Some files in the "contrib" directory and some configure-generated +files that are distributed with libpng have other copyright owners, and +are released under other open source licenses. -Copyright (C) 2001-2002 by Francesco Zappa Nardelli +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from +libpng-0.96, and are distributed according to the same disclaimer and +license as libpng-0.96, with the following individuals added to the +list of Contributing Authors: -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, +and are distributed according to the same disclaimer and license as +libpng-0.88, with the following individuals added to the list of +Contributing Authors: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner -*** Portions of the driver (that is, bdflib.c and bdf.h): +Some files in the "scripts" directory have other copyright owners, +but are released under this license. -Copyright 2000 Computing Research Labs, New Mexico State University -Copyright 2001-2002, 2011 Francesco Zappa Nardelli +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT -OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The PNG Reference Library is supplied "AS IS". The Contributing +Authors and Group 42, Inc. disclaim all warranties, expressed or +implied, including, without limitation, the warranties of +merchantability and of fitness for any purpose. The Contributing +Authors and Group 42, Inc. assume no liability for direct, indirect, +incidental, special, exemplary, or consequential damages, which may +result from the use of the PNG Reference Library, even if advised of +the possibility of such damage. +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: -Credits -******* + 1. The origin of this source code must not be misrepresented. -This driver is based on excellent Mark Leisher's bdf library. If you -find something good in this driver you should probably thank him, not -me. -~~~ + 2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. -The following license details are part of `src/pcf/README`: + 3. This Copyright notice may not be removed or altered from any + source or altered source distribution. -~~~ -License -******* +The Contributing Authors and Group 42, Inc. specifically permit, +without fee, and encourage the use of this source code as a component +to supporting the PNG file format in commercial products. If you use +this source code in a product, acknowledgment is not required but would +be appreciated. -Copyright (C) 2000 by Francesco Zappa Nardelli -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: +---- -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +LIBTIFF -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Copyright (c) 1988-1997 Sam Leffler +Copyright (c) 1991-1997 Silicon Graphics, Inc. +Permission to use, copy, modify, distribute, and sell this software and +its documentation for any purpose is hereby granted without fee, provided +that (i) the above copyright notices and this permission notice appear in +all copies of the software and related documentation, and (ii) the names of +Sam Leffler and Silicon Graphics may not be used in any advertising or +publicity relating to the software without the specific, prior written +permission of Sam Leffler and Silicon Graphics. -Credits -******* +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, +EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY +WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. -Keith Packard wrote the pcf driver found in XFree86. His work is at -the same time the specification and the sample implementation of the -PCF format. Undoubtedly, this driver is inspired from his work. -~~~ +IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR +ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF +LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE +OF THIS SOFTWARE. ---- -HARFBUZZ - -HarfBuzz is licensed under the so-called "Old MIT" license. Details follow. -For parts of HarfBuzz that are licensed under different licenses see individual -files names COPYING in subdirectories where applicable. +LIBWEBP -Copyright © 2010-2022 Google, Inc. -Copyright © 2015-2020 Ebrahim Byagowi -Copyright © 2019,2020 Facebook, Inc. -Copyright © 2012,2015 Mozilla Foundation -Copyright © 2011 Codethink Limited -Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies) -Copyright © 2009 Keith Stribley -Copyright © 2011 Martin Hosken and SIL International -Copyright © 2007 Chris Wilson -Copyright © 2005,2006,2020,2021,2022,2023 Behdad Esfahbod -Copyright © 2004,2007,2008,2009,2010,2013,2021,2022,2023 Red Hat, Inc. -Copyright © 1998-2005 David Turner and Werner Lemberg -Copyright © 2016 Igalia S.L. -Copyright © 2022 Matthias Clasen -Copyright © 2018,2021 Khaled Hosny -Copyright © 2018,2019,2020 Adobe, Inc -Copyright © 2013-2015 Alexei Podtelezhnikov +Copyright (c) 2010, Google Inc. All rights reserved. -For full copyright notices consult the individual files in the package. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. -Permission is hereby granted, without written agreement and without -license or royalty fees, to use, copy, modify, and distribute this -software and its documentation for any purpose, provided that the -above copyright notice and the following two paragraphs appear in -all copies of this software. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. -IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR -DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN -IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. + * Neither the name of Google nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. -THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS -ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO -PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---- -LCMS2 - -Little CMS -Copyright (c) 1998-2020 Marti Maria Saguer +OPENJPEG -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +* + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third + * party and contributor rights, including patent rights, and no such rights + * are granted under this license. + * + * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2014, Professor Benoit Macq + * Copyright (c) 2003-2014, Antonin Descampe + * Copyright (c) 2003-2009, Francois-Olivier Devaux + * Copyright (c) 2005, Herve Drolon, FreeImage Team + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France + * Copyright (c) 2012, CS Systemes d'Information, France + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +---- +RAQM ----- +The MIT License (MIT) -LIBJPEG +Copyright © 2015 Information Technology Authority (ITA) +Copyright © 2016 Khaled Hosny -1. We don't promise that this software works. (But if you find any bugs, - please let us know!) -2. You can use this software for whatever you want. You don't have to pay us. -3. You may not pretend that you wrote this software. If you use it in a - program, you must acknowledge somewhere in your documentation that - you've used the IJG code. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -In legalese: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -The authors make NO WARRANTY or representation, either express or implied, -with respect to this software, its quality, accuracy, merchantability, or -fitness for a particular purpose. This software is provided "AS IS", and you, -its user, assume the entire risk as to its quality and accuracy. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -This software is copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding. -All Rights Reserved except as specified below. -Permission is hereby granted to use, copy, modify, and distribute this -software (or portions thereof) for any purpose, without fee, subject to these -conditions: -(1) If any part of the source code for this software is distributed, then this -README file must be included, with this copyright and no-warranty notice -unaltered; and any additions, deletions, or changes to the original files -must be clearly indicated in accompanying documentation. -(2) If only executable code is distributed, then the accompanying -documentation must state that "this software is based in part on the work of -the Independent JPEG Group". -(3) Permission for use of this software is granted only if the user accepts -full responsibility for any undesirable consequences; the authors accept -NO LIABILITY for damages of any kind. +---- -These conditions apply to any software derived from or based on the IJG code, -not just to the unmodified library. If you use our work, you ought to -acknowledge us. +XAU -Permission is NOT granted for the use of any IJG author's name or company name -in advertising or publicity relating to this software or products derived from -it. This software may be referred to only as "the Independent JPEG Group's -software". +Copyright 1988, 1993, 1994, 1998 The Open Group -We specifically permit and encourage the use of this software as the basis of -commercial products, provided that all warranty or liability claims are -assumed by the product vendor. +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. ----- +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -LIBLZMA +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. -XZ Utils Licensing -================== - Different licenses apply to different files in this package. Here - is a rough summary of which licenses apply to which parts of this - package (but check the individual files to be sure!): +---- - - liblzma is in the public domain. +XCB - - xz, xzdec, and lzmadec command line tools are in the public - domain unless GNU getopt_long had to be compiled and linked - in from the lib directory. The getopt_long code is under - GNU LGPLv2.1+. +Copyright (C) 2001-2006 Bart Massey, Jamey Sharp, and Josh Triplett. +All Rights Reserved. - - The scripts to grep, diff, and view compressed files have been - adapted from gzip. These scripts and their documentation are - under GNU GPLv2+. +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, +subject to the following conditions: - - All the documentation in the doc directory and most of the - XZ Utils specific documentation files in other directories - are in the public domain. +The above copyright notice and this permission notice shall +be included in all copies or substantial portions of the +Software. - - Translated messages are in the public domain. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. - - The build system contains public domain files, and files that - are under GNU GPLv2+ or GNU GPLv3+. None of these files end up - in the binaries being built. +Except as contained in this notice, the names of the authors +or their institutions shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this +Software without prior written authorization from the +authors. - - Test files and test code in the tests directory, and debugging - utilities in the debug directory are in the public domain. - - The extra directory may contain public domain files, and files - that are under various free software licenses. +---- - You can do whatever you want with the files that have been put into - the public domain. If you find public domain legally problematic, - take the previous sentence as a license grant. If you still find - the lack of copyright legally problematic, you have too many - lawyers. +XDMCP - As usual, this software is provided "as is", without any warranty. +Copyright 1989, 1998 The Open Group - If you copy significant amounts of public domain code from XZ Utils - into your project, acknowledging this somewhere in your software is - polite (especially if it is proprietary, non-free software), but - naturally it is not legally required. Here is an example of a good - notice to put into "about box" or into documentation: +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. - This software includes code from XZ Utils . +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - The following license texts are included in the following files: - - COPYING.LGPLv2.1: GNU Lesser General Public License version 2.1 - - COPYING.GPLv2: GNU General Public License version 2 - - COPYING.GPLv3: GNU General Public License version 3 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - Note that the toolchain (compiler, linker etc.) may add some code - pieces that are copyrighted. Thus, it is possible that e.g. liblzma - binary wouldn't actually be in the public domain in its entirety - even though it contains no copyrighted code from the XZ Utils source - package. +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. - If you have questions, don't hesitate to ask the author(s) for more - information. +Author: Keith Packard, MIT X Consortium ---- -LIBPNG +ZLIB -COPYRIGHT NOTICE, DISCLAIMER, and LICENSE -========================================= + (C) 1995-2017 Jean-loup Gailly and Mark Adler -PNG Reference Library License version 2 ---------------------------------------- + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. - * Copyright (c) 1995-2022 The PNG Reference Library Authors. - * Copyright (c) 2018-2022 Cosmin Truta. - * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. - * Copyright (c) 1996-1997 Andreas Dilger. - * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: -The software is supplied "as is", without warranty of any kind, -express or implied, including, without limitation, the warranties -of merchantability, fitness for a particular purpose, title, and -non-infringement. In no event shall the Copyright owners, or -anyone distributing the software, be liable for any damages or -other liability, whether in contract, tort or otherwise, arising -from, out of, or in connection with the software, or the use or -other dealings in the software, even if advised of the possibility -of such damage. + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. -Permission is hereby granted to use, copy, modify, and distribute -this software, or portions hereof, for any purpose, without fee, -subject to the following restrictions: + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu - 1. The origin of this software must not be misrepresented; you - must not claim that you wrote the original software. If you - use this software in a product, an acknowledgment in the product - documentation would be appreciated, but is not required. +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but without +warranty of any kind. The library has been entirely written by Jean-loup +Gailly and Mark Adler; it does not include third-party code. - 2. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. - 3. This Copyright notice may not be removed or altered from any - source or altered source distribution. +``` +## pip (25.0.1) - MIT License -PNG Reference Library License version 1 (for libpng 0.5 through 1.6.35) ------------------------------------------------------------------------ +The PyPA recommended tool for installing Python packages. -libpng versions 1.0.7, July 1, 2000, through 1.6.35, July 15, 2018 are -Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson, are -derived from libpng-1.0.6, and are distributed according to the same -disclaimer and license as libpng-1.0.6 with the following individuals -added to the list of Contributing Authors: +* URL: https://pip.pypa.io/ +* Author(s): The pip developers - Simon-Pierre Cadieux - Eric S. Raymond - Mans Rullgard - Cosmin Truta - Gilles Vollant - James Yu - Mandar Sahastrabuddhe - Google Inc. - Vadim Barkov +### License Text -and with the following additions to the disclaimer: +``` +Copyright (c) 2008-present The pip developers (see AUTHORS.txt file) - There is no warranty against interference with your enjoyment of - the library or against infringement. There is no warranty that our - efforts or the library will fulfill any of your particular purposes - or needs. This library is provided with all faults, and the entire - risk of satisfactory quality, performance, accuracy, and effort is - with the user. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -Some files in the "contrib" directory and some configure-generated -files that are distributed with libpng have other copyright owners, and -are released under other open source licenses. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are -Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from -libpng-0.96, and are distributed according to the same disclaimer and -license as libpng-0.96, with the following individuals added to the -list of Contributing Authors: +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - Tom Lane - Glenn Randers-Pehrson - Willem van Schaik +``` -libpng versions 0.89, June 1996, through 0.96, May 1997, are -Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88, -and are distributed according to the same disclaimer and license as -libpng-0.88, with the following individuals added to the list of -Contributing Authors: +## pip-api (0.0.34) - Apache Software License - John Bowler - Kevin Bracey - Sam Bushell - Magnus Holmgren - Greg Roelofs - Tom Tanner +An unofficial, importable pip API -Some files in the "scripts" directory have other copyright owners, -but are released under this license. +* URL: http://github.com/di/pip-api +* Author(s): Dustin Ingram -libpng versions 0.5, May 1995, through 0.88, January 1996, are -Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. +### License Text -For the purposes of this copyright and license, "Contributing Authors" -is defined as the following set of individuals: +``` + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ - Andreas Dilger - Dave Martindale - Guy Eric Schalnat - Paul Schmidt - Tim Wegner +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -The PNG Reference Library is supplied "AS IS". The Contributing -Authors and Group 42, Inc. disclaim all warranties, expressed or -implied, including, without limitation, the warranties of -merchantability and of fitness for any purpose. The Contributing -Authors and Group 42, Inc. assume no liability for direct, indirect, -incidental, special, exemplary, or consequential damages, which may -result from the use of the PNG Reference Library, even if advised of -the possibility of such damage. +1. Definitions. -Permission is hereby granted to use, copy, modify, and distribute this -source code, or portions hereof, for any purpose, without fee, subject -to the following restrictions: + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. - 1. The origin of this source code must not be misrepresented. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. - 2. Altered versions must be plainly marked as such and must not - be misrepresented as being the original source. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. - 3. This Copyright notice may not be removed or altered from any - source or altered source distribution. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -The Contributing Authors and Group 42, Inc. specifically permit, -without fee, and encourage the use of this source code as a component -to supporting the PNG file format in commercial products. If you use -this source code in a product, acknowledgment is not required but would -be appreciated. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. ----- + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -LIBTIFF + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -Copyright (c) 1988-1997 Sam Leffler -Copyright (c) 1991-1997 Silicon Graphics, Inc. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -Permission to use, copy, modify, distribute, and sell this software and -its documentation for any purpose is hereby granted without fee, provided -that (i) the above copyright notices and this permission notice appear in -all copies of the software and related documentation, and (ii) the names of -Sam Leffler and Silicon Graphics may not be used in any advertising or -publicity relating to the software without the specific, prior written -permission of Sam Leffler and Silicon Graphics. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, -EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY -WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR -ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF -LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE -OF THIS SOFTWARE. +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: ----- + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -LIBWEBP + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -Copyright (c) 2010, Google Inc. All rights reserved. + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. - * Neither the name of Google nor the names of its contributors may - be used to endorse or promote products derived from this software - without specific prior written permission. +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. ----- +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -OPENJPEG +``` -* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third - * party and contributor rights, including patent rights, and no such rights - * are granted under this license. - * - * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2003-2014, Antonin Descampe - * Copyright (c) 2003-2009, Francois-Olivier Devaux - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France - * Copyright (c) 2012, CS Systemes d'Information, France - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ +## pip-licenses (5.0.0) - MIT License +Dump the software license list of Python packages installed with pip. ----- +* URL: https://github.com/raimon49/pip-licenses +* Author(s): raimon -RAQM +### License Text -The MIT License (MIT) +``` +MIT License -Copyright © 2015 Information Technology Authority (ITA) -Copyright © 2016 Khaled Hosny +Copyright (c) 2018 raimon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -13135,368 +15199,252 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` ----- - -XAU - -Copyright 1988, 1993, 1994, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - - ----- - -XCB - -Copyright (C) 2001-2006 Bart Massey, Jamey Sharp, and Josh Triplett. -All Rights Reserved. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, -sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall -be included in all copies or substantial portions of the -Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the names of the authors -or their institutions shall not be used in advertising or -otherwise to promote the sale, use or other dealings in this -Software without prior written authorization from the -authors. - - ----- - -XDMCP - -Copyright 1989, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - -Author: Keith Packard, MIT X Consortium - - ----- - -ZLIB - - (C) 1995-2017 Jean-loup Gailly and Mark Adler +## pip-requirements-parser (32.0.1) - MIT - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. +pip requirements parser - a mostly correct pip requirements parsing library because it uses pip's own code. - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: +* URL: https://github.com/nexB/pip-requirements-parser +* Author(s): The pip authors, nexB. Inc. and others - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. +## pip_audit (2.8.0) - Apache Software License - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu +A tool for scanning Python environments for known vulnerabilities -If you use the zlib library in a product, we would appreciate *not* receiving -lengthy legal documents to sign. The sources are provided for free but without -warranty of any kind. The library has been entirely written by Jean-loup -Gailly and Mark Adler; it does not include third-party code. +* URL: https://pypi.org/project/pip-audit/ +* Author(s): Alex Cameron , Dustin Ingram , William Woodruff -If you redistribute modified sources, we would appreciate that you include in -the file ChangeLog history information documenting your changes. Please read -the FAQ for more information on the distribution of modified source versions. +### License Text ``` -## pip (25.0.1) - MIT License - -The PyPA recommended tool for installing Python packages. - -* URL: https://pip.pypa.io/ -* Author(s): The pip developers + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -### License Text + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -``` -Copyright (c) 2008-present The pip developers (see AUTHORS.txt file) + 1. Definitions. -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -``` + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -## pip-api (0.0.34) - Apache Software License + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -An unofficial, importable pip API + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -* URL: http://github.com/di/pip-api -* Author(s): Dustin Ingram + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -### License Text + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -``` - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -1. Definitions. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: + END OF TERMS AND CONDITIONS - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +``` - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +## platformdirs (4.3.7) - MIT License - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +* URL: https://github.com/tox-dev/platformdirs +* Maintainer(s): Bernát Gábor , Julian Berman , Ofek Lev , Ronny Pfannschmidt - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +### License Text -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +``` +MIT License -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +Copyright (c) 2010-202x The platformdirs developers -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` -## pip-licenses (5.0.0) - MIT License +## pluggy (1.5.0) - MIT License -Dump the software license list of Python packages installed with pip. +plugin and hook calling mechanisms for python -* URL: https://github.com/raimon49/pip-licenses -* Author(s): raimon +* URL: https://github.com/pytest-dev/pluggy +* Author(s): Holger Krekel ### License Text ``` -MIT License +The MIT License (MIT) -Copyright (c) 2018 raimon +Copyright (c) 2015 holger krekel (rather uses bitbucket/hpk42) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -13518,24 +15466,92 @@ SOFTWARE. ``` -## pip-requirements-parser (32.0.1) - MIT +## pre_commit (4.2.0) - MIT License -pip requirements parser - a mostly correct pip requirements parsing library because it uses pip's own code. +A framework for managing and maintaining multi-language pre-commit hooks. -* URL: https://github.com/nexB/pip-requirements-parser -* Author(s): The pip authors, nexB. Inc. and others +* URL: https://github.com/pre-commit/pre-commit +* Author(s): Anthony Sottile -## pip_audit (2.8.0) - Apache Software License +### License Text -A tool for scanning Python environments for known vulnerabilities +``` +Copyright (c) 2014 pre-commit dev team: Anthony Sottile, Ken Struys -* URL: https://pypi.org/project/pip-audit/ -* Author(s): Alex Cameron , Dustin Ingram , William Woodruff +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + +## prettytable (3.15.1) - UNKNOWN + +A simple Python library for easily displaying tabular data in a visually appealing ASCII table format + +* URL: https://github.com/prettytable/prettytable +* Author(s): Luke Maurits +* Maintainer(s): Hugo van Kemenade ### License Text ``` +# Copyright (c) 2009-2014 Luke Maurits +# All rights reserved. +# With contributions from: +# * Chris Clark +# * Klein Stephane +# * John Filleau +# * Vladimir Vrzić +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +``` + +## prometheus_client (0.21.1) - Apache Software License + +Python client for the Prometheus monitoring system. + +* URL: https://github.com/prometheus/client_python +* Author(s): Brian Brazil + +### License Text +``` Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -13708,167 +15724,100 @@ A tool for scanning Python environments for known vulnerabilities on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - -``` - -## platformdirs (4.3.7) - MIT License - -A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. - -* URL: https://github.com/tox-dev/platformdirs -* Maintainer(s): Bernát Gábor , Julian Berman , Ofek Lev , Ronny Pfannschmidt - -### License Text - -``` -MIT License - -Copyright (c) 2010-202x The platformdirs developers - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + END OF TERMS AND CONDITIONS -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + APPENDIX: How to apply the Apache License to your work. -``` + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -## pluggy (1.5.0) - MIT License + Copyright [yyyy] [name of copyright owner] -plugin and hook calling mechanisms for python + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -* URL: https://github.com/pytest-dev/pluggy -* Author(s): Holger Krekel + http://www.apache.org/licenses/LICENSE-2.0 -### License Text + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -The MIT License (MIT) - -Copyright (c) 2015 holger krekel (rather uses bitbucket/hpk42) -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +### Notice -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +``` +Prometheus instrumentation library for Python applications +Copyright 2015 The Prometheus Authors -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +This product bundles decorator 4.0.10 which is available under a "2-clause BSD" +license. For details, see prometheus_client/decorator.py. ``` -## pre_commit (4.2.0) - MIT License +## prompt_toolkit (3.0.50) - BSD License -A framework for managing and maintaining multi-language pre-commit hooks. +Library for building powerful interactive command lines in Python -* URL: https://github.com/pre-commit/pre-commit -* Author(s): Anthony Sottile +* URL: https://github.com/prompt-toolkit/python-prompt-toolkit +* Author(s): Jonathan Slenders ### License Text ``` -Copyright (c) 2014 pre-commit dev team: Anthony Sottile, Ken Struys - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -``` +Copyright (c) 2014, Jonathan Slenders +All rights reserved. -## prettytable (3.15.1) - UNKNOWN +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: -A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -* URL: https://github.com/prettytable/prettytable -* Author(s): Luke Maurits -* Maintainer(s): Hugo van Kemenade +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. -### License Text +* Neither the name of the {organization} nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. -``` -# Copyright (c) 2009-2014 Luke Maurits -# All rights reserved. -# With contributions from: -# * Chris Clark -# * Klein Stephane -# * John Filleau -# * Vladimir Vrzić -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * The name of the author may not be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## prometheus_client (0.21.1) - Apache Software License +## proto-plus (1.26.1) - Apache Software License -Python client for the Prometheus monitoring system. +Beautiful, Pythonic protocol buffers -* URL: https://github.com/prometheus/client_python -* Author(s): Brian Brazil +* URL: https://github.com/googleapis/proto-plus-python +* Author(s): Google LLC ### License Text ``` + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -14073,57 +16022,6 @@ Python client for the Prometheus monitoring system. ``` -### Notice - -``` -Prometheus instrumentation library for Python applications -Copyright 2015 The Prometheus Authors - -This product bundles decorator 4.0.10 which is available under a "2-clause BSD" -license. For details, see prometheus_client/decorator.py. - -``` - -## prompt_toolkit (3.0.50) - BSD License - -Library for building powerful interactive command lines in Python - -* URL: https://github.com/prompt-toolkit/python-prompt-toolkit -* Author(s): Jonathan Slenders - -### License Text - -``` -Copyright (c) 2014, Jonathan Slenders -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - -* Neither the name of the {organization} nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -``` - ## protobuf (5.29.4) - 3-Clause BSD License UNKNOWN @@ -16831,25 +18729,101 @@ its NOTICE file: Apache Kudu Copyright 2016 The Apache Software Foundation - This product includes software developed at - The Apache Software Foundation (http://www.apache.org/). + This product includes software developed at + The Apache Software Foundation (http://www.apache.org/). + + Portions of this software were developed at + Cloudera, Inc (http://www.cloudera.com/). + +-------------------------------------------------------------------------------- + +This product includes code from Apache ORC, which includes the following in +its NOTICE file: + + Apache ORC + Copyright 2013-2019 The Apache Software Foundation + + This product includes software developed by The Apache Software + Foundation (http://www.apache.org/). + + This product includes software developed by Hewlett-Packard: + (c) Copyright [2014-2015] Hewlett-Packard Development Company, L.P + +``` + +## pyasn1 (0.6.1) - BSD License + +Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208) + +* URL: https://github.com/pyasn1/pyasn1 +* Author(s): Ilya Etingof +* Maintainer(s): pyasn1 maintenance organization + +### License Text + +``` +Copyright (c) 2005-2020, Ilya Etingof +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +``` + +## pyasn1_modules (0.4.2) - BSD License + +A collection of ASN.1-based protocols modules + +* URL: https://github.com/pyasn1/pyasn1-modules +* Author(s): Ilya Etingof +* Maintainer(s): pyasn1 maintenance organization - Portions of this software were developed at - Cloudera, Inc (http://www.cloudera.com/). +### License Text --------------------------------------------------------------------------------- +``` +Copyright (c) 2005-2020, Ilya Etingof +All rights reserved. -This product includes code from Apache ORC, which includes the following in -its NOTICE file: +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: - Apache ORC - Copyright 2013-2019 The Apache Software Foundation + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. - This product includes software developed by The Apache Software - Foundation (http://www.apache.org/). + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. - This product includes software developed by Hewlett-Packard: - (c) Copyright [2014-2015] Hewlett-Packard Development Company, L.P +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. ``` @@ -16928,7 +18902,7 @@ SOFTWARE. ``` -## pydantic (2.10.6) - MIT License +## pydantic (2.11.1) - MIT License Data validation using Python type hints @@ -17030,12 +19004,12 @@ SOFTWARE. ``` -## pydantic_core (2.27.2) - MIT License +## pydantic_core (2.33.0) - MIT License Core functionality for Pydantic validation and serialization * URL: https://github.com/pydantic/pydantic-core -* Author(s): Samuel Colvin +* Author(s): Samuel Colvin , Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, David Montague , David Hewitt , Sydney Runkle , Victorien Plot ### License Text @@ -17216,7 +19190,7 @@ Complete Legal Terms: http://opensource.org/licenses/MIT ``` -## pyparsing (3.2.1) - MIT License +## pyparsing (3.0.9) - MIT License pyparsing module - Classes and methods to define and execute parsing grammars @@ -17530,7 +19504,7 @@ Apache License ``` -## pytest-cov (6.0.0) - MIT License +## pytest-cov (6.1.0) - MIT License Pytest plugin for measuring coverage. @@ -17714,6 +19688,41 @@ The MIT License (MIT) Copyright (c) 2019 Andrzej Klajnert +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + +## pytest-timeout (2.3.1) - DFSG approved; MIT License + +pytest plugin to abort hanging tests + +* URL: https://github.com/pytest-dev/pytest-timeout +* Author(s): Floris Bruynooghe + +### License Text + +``` +The MIT License + +Copyright (C) 2012, 2014 Floris Bruynooghe + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights @@ -18322,6 +20331,34 @@ Python HTTP for Humans. ``` +## requests-oauthlib (2.0.0) - BSD License + +OAuthlib authentication support for Requests. + +* URL: https://github.com/requests/requests-oauthlib +* Author(s): Kenneth Reitz + +### License Text + +``` +ISC License + +Copyright (c) 2014 Kenneth Reitz. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +``` + ## rfc3339-validator (0.1.4) - MIT License A pure python RFC3339 validator @@ -18683,6 +20720,73 @@ THE SOFTWARE. ``` +## rsa (4.9) - Apache Software License + +Pure-Python RSA implementation + +* URL: https://stuvel.eu/rsa +* Author(s): Sybren A. Stüvel + +### License Text + +``` +Copyright 2011 Sybren A. Stüvel + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +``` + +## rstr (3.2.2) - BSD License + +Generate random strings in Python + +* URL: https://github.com/leapfrogonline/rstr +* Author(s): Leapfrog Direct Response LLC +* Maintainer(s): Brendan McCollam + +### License Text + +``` +Copyright (c) 2011, Leapfrog Direct Response, LLC +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Leapfrog Direct Response, LLC, including + its subsidiaries and affiliates nor the names of its + contributors, may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL LEAPFROG DIRECT +RESPONSE, LLC, INCLUDING ITS SUBSIDIARIES AND AFFILIATES, BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + ## ruamel.yaml (0.18.10) - MIT License ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order @@ -20229,6 +22333,42 @@ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## smart-open (7.1.0) - MIT License + +Utils for streaming large files (S3, HDFS, GCS, Azure Blob Storage, gzip, bz2...) + +* URL: https://github.com/piskvorky/smart_open +* Author(s): Radim Rehurek +* Maintainer(s): Radim Rehurek + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2015 Radim Řehůřek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + ``` ## smmap (5.0.2) - BSD License @@ -21060,7 +23200,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## streamlit (1.44.0) - Apache Software License +## streamlit (1.44.1) - Apache Software License A faster way to build and share data apps @@ -21932,6 +24072,68 @@ Tornado is a Python web framework and asynchronous networking library, originall ``` +## tqdm (4.67.1) - MIT License; Mozilla Public License 2.0 (MPL 2.0) + +Fast, Extensible Progress Meter + +* URL: https://tqdm.github.io +* Maintainer(s): tqdm developers + +### License Text + +``` +`tqdm` is a product of collaborative work. +Unless otherwise stated, all authors (see commit logs) retain copyright +for their respective work, and release the work under the MIT licence +(text below). + +Exceptions or notable authors are listed below +in reverse chronological order: + +* files: * + MPL-2.0 2015-2024 (c) Casper da Costa-Luis + [casperdcl](https://github.com/casperdcl). +* files: tqdm/_tqdm.py + MIT 2016 (c) [PR #96] on behalf of Google Inc. +* files: tqdm/_tqdm.py README.rst .gitignore + MIT 2013 (c) Noam Yorav-Raphael, original author. + +[PR #96]: https://github.com/tqdm/tqdm/pull/96 + + +Mozilla Public Licence (MPL) v. 2.0 - Exhibit A +----------------------------------------------- + +This Source Code Form is subject to the terms of the +Mozilla Public License, v. 2.0. +If a copy of the MPL was not distributed with this project, +You can obtain one at https://mozilla.org/MPL/2.0/. + + +MIT License (MIT) +----------------- + +Copyright (c) 2013 noamraph + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + ## traitlets (5.14.3) - BSD License Traitlets Python configuration system @@ -22009,7 +24211,7 @@ THE SOFTWARE. ``` -## types-PyYAML (6.0.12.20250326) - Apache Software License +## types-PyYAML (6.0.12.20250402) - UNKNOWN Typing stubs for PyYAML @@ -22507,6 +24709,40 @@ DEALINGS IN THE SOFTWARE. ``` +## typing-inspection (0.4.0) - MIT License + +Runtime typing introspection tools + +* URL: https://github.com/pydantic/typing-inspection +* Author(s): Victorien Plot + +### License Text + +``` +MIT License + +Copyright (c) 2025 Victorien + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## typing_extensions (4.12.2) - Python Software Foundation License Backported and Experimental Type Hints for Python 3.8+ @@ -24004,3 +26240,40 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` + +## wrapt (1.17.2) - BSD License + +Module for decorators, wrappers and monkey patching. + +* URL: https://github.com/GrahamDumpleton/wrapt +* Author(s): Graham Dumpleton + +### License Text + +``` +Copyright (c) 2013-2023, Graham Dumpleton +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +``` diff --git a/client_configs/Dockerfile b/client_configs/Dockerfile deleted file mode 100644 index 38f29d31..00000000 --- a/client_configs/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -ARG REPO_PATH=/srv/repo - -FROM europe-docker.pkg.dev/aignx-shared-tools-ebagiogxst/aignx-dockerhub-registry-prd-ar/python:3.12-slim-bookworm AS base -ARG REPO_PATH - -# Install Poetry without defiling environment with its dependencies -RUN apt-get update && apt-get install -y curl libmagic1 -RUN curl -sSL https://install.python-poetry.org | python3 - -ENV PATH="/root/.local/bin:${PATH}" - -RUN mkdir -p ${REPO_PATH} -WORKDIR $REPO_PATH - -RUN poetry config virtualenvs.create false - -COPY poetry.lock poetry.lock -COPY pyproject.toml pyproject.toml - -# todo(andreas): change to .env and also adjust code -COPY .env .env.dev -COPY .env .env -COPY src/ src -COPY codegen/ codegen - -ENV PYTHONPATH="\ -$REPO_PATH/src/:\ -$REPO_PATH/codegen/:\ -" - -FROM base AS test -ARG REPO_PATH - -COPY tests/ tests - -WORKDIR $REPO_PATH -RUN poetry install --sync --no-root - -CMD ["pytest"] diff --git a/client_configs/README.md b/client_configs/README.md deleted file mode 100644 index 94c04398..00000000 --- a/client_configs/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Generate client -Run the `schema/generate.sh` shell script from the library root to generate -a new version of the client based on the `schema/api.json` schema. - -# Run tests -```sh -# build docker image if necessary -docker build -t aignx-client . - -# run tests in docker container (requires SA that has permissions to generate signed urls for sample slides) -docker run \ --v :/.config/google-sa.json \ --e GOOGLE_APPLICATION_CREDENTIALS=/.config/google-sa.json \ --e AIGNX_REFRESH_TOKEN="" aignx-client -``` diff --git a/client_configs/_pyproject_uv.toml b/client_configs/_pyproject_uv.toml deleted file mode 100644 index 3232e7b9..00000000 --- a/client_configs/_pyproject_uv.toml +++ /dev/null @@ -1,22 +0,0 @@ -[project] -name = "aignx-platform-client" -version = "0.1.0" -description = "Client library for the Aignostics Platform API" -#authors = ["Aignostics GmbH "] -readme = "README.md" -requires-python = ">=3.12" -dependencies = [ - "pydantic>=2.10.6", - "codegen" -] - -[tool.uv.sources] -codegen = { path = "true" } - -[tool.uv.workspace] -members = ["packages/*"] -#exclude = ["codegen/docs"] - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" diff --git a/client_configs/conftest.py b/client_configs/conftest.py deleted file mode 100644 index ef44e226..00000000 --- a/client_configs/conftest.py +++ /dev/null @@ -1,29 +0,0 @@ -default_label_set = {"unit-test", "automated-test"} - - -# see https://docs.getxray.app/display/XRAYCLOUD/Taking+advantage+of+JUnit+XML+reports -# as well as https://docs.pytest.org/en/6.2.x/reference.html#collection-hooks -def pytest_collection_modifyitems(session, config, items): - """Iterate over markers and add properties.""" - for item in items: - jira_issues_set = set() - - for marker in item.iter_markers(name="requirements"): - jira_issues_set.update(req.strip() for req in marker.args[0].split(",")) - - for marker in item.iter_markers(name="specifications"): - jira_issues_set.update(spec.strip() for spec in marker.args[0].split(",")) - - if jira_issues_set: - jira_issues = ",".join(jira_issues_set) - item.user_properties.append(("requirements", jira_issues)) - - for marker in item.iter_markers(name="labels"): - default_label_set.update(marker.args[0].split(",")) - - if default_label_set: - labels = ",".join(default_label_set) - item.user_properties.append(("tags", labels)) - - for marker in item.iter_markers(name="description"): - item.user_properties.append(("test_description", marker.args[0])) diff --git a/client_configs/poetry.lock b/client_configs/poetry.lock deleted file mode 100644 index 0b731ceb..00000000 --- a/client_configs/poetry.lock +++ /dev/null @@ -1,1520 +0,0 @@ -# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. - -[[package]] -name = "annotated-types" -version = "0.7.0" -description = "Reusable constraint types to use with typing.Annotated" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, - {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, -] - -[[package]] -name = "anyio" -version = "4.9.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, - {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, -] - -[package.dependencies] -idna = ">=2.8" -sniffio = ">=1.1" -typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} - -[package.extras] -doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] -trio = ["trio (>=0.26.1)"] - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] - -[[package]] -name = "attrs" -version = "25.3.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, - {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, -] - -[package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] - -[[package]] -name = "cachetools" -version = "5.5.2" -description = "Extensible memoizing collections and decorators" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a"}, - {file = "cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4"}, -] - -[[package]] -name = "certifi" -version = "2025.1.31" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, - {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.1" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, - {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, - {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "dev"] -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win32\""} - -[[package]] -name = "coverage" -version = "7.7.1" -description = "Code coverage measurement for Python" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "coverage-7.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:553ba93f8e3c70e1b0031e4dfea36aba4e2b51fe5770db35e99af8dc5c5a9dfe"}, - {file = "coverage-7.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:44683f2556a56c9a6e673b583763096b8efbd2df022b02995609cf8e64fc8ae0"}, - {file = "coverage-7.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02fad4f8faa4153db76f9246bc95c1d99f054f4e0a884175bff9155cf4f856cb"}, - {file = "coverage-7.7.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c181ceba2e6808ede1e964f7bdc77bd8c7eb62f202c63a48cc541e5ffffccb6"}, - {file = "coverage-7.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b5b207a8b08c6a934b214e364cab2fa82663d4af18981a6c0a9e95f8df7602"}, - {file = "coverage-7.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:25fe40967717bad0ce628a0223f08a10d54c9d739e88c9cbb0f77b5959367542"}, - {file = "coverage-7.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:881cae0f9cbd928c9c001487bb3dcbfd0b0af3ef53ae92180878591053be0cb3"}, - {file = "coverage-7.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90e9141e9221dd6fbc16a2727a5703c19443a8d9bf7d634c792fa0287cee1ab"}, - {file = "coverage-7.7.1-cp310-cp310-win32.whl", hash = "sha256:ae13ed5bf5542d7d4a0a42ff5160e07e84adc44eda65ddaa635c484ff8e55917"}, - {file = "coverage-7.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:171e9977c6a5d2b2be9efc7df1126fd525ce7cad0eb9904fe692da007ba90d81"}, - {file = "coverage-7.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1165490be0069e34e4f99d08e9c5209c463de11b471709dfae31e2a98cbd49fd"}, - {file = "coverage-7.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:44af11c00fd3b19b8809487630f8a0039130d32363239dfd15238e6d37e41a48"}, - {file = "coverage-7.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fbba59022e7c20124d2f520842b75904c7b9f16c854233fa46575c69949fb5b9"}, - {file = "coverage-7.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af94fb80e4f159f4d93fb411800448ad87b6039b0500849a403b73a0d36bb5ae"}, - {file = "coverage-7.7.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eae79f8e3501133aa0e220bbc29573910d096795882a70e6f6e6637b09522133"}, - {file = "coverage-7.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e33426a5e1dc7743dd54dfd11d3a6c02c5d127abfaa2edd80a6e352b58347d1a"}, - {file = "coverage-7.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b559adc22486937786731dac69e57296cb9aede7e2687dfc0d2696dbd3b1eb6b"}, - {file = "coverage-7.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b838a91e84e1773c3436f6cc6996e000ed3ca5721799e7789be18830fad009a2"}, - {file = "coverage-7.7.1-cp311-cp311-win32.whl", hash = "sha256:2c492401bdb3a85824669d6a03f57b3dfadef0941b8541f035f83bbfc39d4282"}, - {file = "coverage-7.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:1e6f867379fd033a0eeabb1be0cffa2bd660582b8b0c9478895c509d875a9d9e"}, - {file = "coverage-7.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:eff187177d8016ff6addf789dcc421c3db0d014e4946c1cc3fbf697f7852459d"}, - {file = "coverage-7.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2444fbe1ba1889e0b29eb4d11931afa88f92dc507b7248f45be372775b3cef4f"}, - {file = "coverage-7.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:177d837339883c541f8524683e227adcaea581eca6bb33823a2a1fdae4c988e1"}, - {file = "coverage-7.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15d54ecef1582b1d3ec6049b20d3c1a07d5e7f85335d8a3b617c9960b4f807e0"}, - {file = "coverage-7.7.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c82b27c56478d5e1391f2e7b2e7f588d093157fa40d53fd9453a471b1191f2"}, - {file = "coverage-7.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:315ff74b585110ac3b7ab631e89e769d294f303c6d21302a816b3554ed4c81af"}, - {file = "coverage-7.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4dd532dac197d68c478480edde74fd4476c6823355987fd31d01ad9aa1e5fb59"}, - {file = "coverage-7.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:385618003e3d608001676bb35dc67ae3ad44c75c0395d8de5780af7bb35be6b2"}, - {file = "coverage-7.7.1-cp312-cp312-win32.whl", hash = "sha256:63306486fcb5a827449464f6211d2991f01dfa2965976018c9bab9d5e45a35c8"}, - {file = "coverage-7.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:37351dc8123c154fa05b7579fdb126b9f8b1cf42fd6f79ddf19121b7bdd4aa04"}, - {file = "coverage-7.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:eebd927b86761a7068a06d3699fd6c20129becf15bb44282db085921ea0f1585"}, - {file = "coverage-7.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2a79c4a09765d18311c35975ad2eb1ac613c0401afdd9cb1ca4110aeb5dd3c4c"}, - {file = "coverage-7.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b1c65a739447c5ddce5b96c0a388fd82e4bbdff7251396a70182b1d83631019"}, - {file = "coverage-7.7.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:392cc8fd2b1b010ca36840735e2a526fcbd76795a5d44006065e79868cc76ccf"}, - {file = "coverage-7.7.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bb47cc9f07a59a451361a850cb06d20633e77a9118d05fd0f77b1864439461b"}, - {file = "coverage-7.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b4c144c129343416a49378e05c9451c34aae5ccf00221e4fa4f487db0816ee2f"}, - {file = "coverage-7.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bc96441c9d9ca12a790b5ae17d2fa6654da4b3962ea15e0eabb1b1caed094777"}, - {file = "coverage-7.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3d03287eb03186256999539d98818c425c33546ab4901028c8fa933b62c35c3a"}, - {file = "coverage-7.7.1-cp313-cp313-win32.whl", hash = "sha256:8fed429c26b99641dc1f3a79179860122b22745dd9af36f29b141e178925070a"}, - {file = "coverage-7.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:092b134129a8bb940c08b2d9ceb4459af5fb3faea77888af63182e17d89e1cf1"}, - {file = "coverage-7.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3154b369141c3169b8133973ac00f63fcf8d6dbcc297d788d36afbb7811e511"}, - {file = "coverage-7.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:264ff2bcce27a7f455b64ac0dfe097680b65d9a1a293ef902675fa8158d20b24"}, - {file = "coverage-7.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba8480ebe401c2f094d10a8c4209b800a9b77215b6c796d16b6ecdf665048950"}, - {file = "coverage-7.7.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:520af84febb6bb54453e7fbb730afa58c7178fd018c398a8fcd8e269a79bf96d"}, - {file = "coverage-7.7.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88d96127ae01ff571d465d4b0be25c123789cef88ba0879194d673fdea52f54e"}, - {file = "coverage-7.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0ce92c5a9d7007d838456f4b77ea159cb628187a137e1895331e530973dcf862"}, - {file = "coverage-7.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0dab4ef76d7b14f432057fdb7a0477e8bffca0ad39ace308be6e74864e632271"}, - {file = "coverage-7.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7e688010581dbac9cab72800e9076e16f7cccd0d89af5785b70daa11174e94de"}, - {file = "coverage-7.7.1-cp313-cp313t-win32.whl", hash = "sha256:e52eb31ae3afacdacfe50705a15b75ded67935770c460d88c215a9c0c40d0e9c"}, - {file = "coverage-7.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a6b6b3bd121ee2ec4bd35039319f3423d0be282b9752a5ae9f18724bc93ebe7c"}, - {file = "coverage-7.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:34a3bf6b92e6621fc4dcdaab353e173ccb0ca9e4bfbcf7e49a0134c86c9cd303"}, - {file = "coverage-7.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d6874929d624d3a670f676efafbbc747f519a6121b581dd41d012109e70a5ebd"}, - {file = "coverage-7.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ba5ff236c87a7b7aa1441a216caf44baee14cbfbd2256d306f926d16b026578"}, - {file = "coverage-7.7.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452735fafe8ff5918236d5fe1feac322b359e57692269c75151f9b4ee4b7e1bc"}, - {file = "coverage-7.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5f99a93cecf799738e211f9746dc83749b5693538fbfac279a61682ba309387"}, - {file = "coverage-7.7.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:11dd6f52c2a7ce8bf0a5f3b6e4a8eb60e157ffedc3c4b4314a41c1dfbd26ce58"}, - {file = "coverage-7.7.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:b52edb940d087e2a96e73c1523284a2e94a4e66fa2ea1e2e64dddc67173bad94"}, - {file = "coverage-7.7.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d2e73e2ac468536197e6b3ab79bc4a5c9da0f078cd78cfcc7fe27cf5d1195ef0"}, - {file = "coverage-7.7.1-cp39-cp39-win32.whl", hash = "sha256:18f544356bceef17cc55fcf859e5664f06946c1b68efcea6acdc50f8f6a6e776"}, - {file = "coverage-7.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:d66ff48ab3bb6f762a153e29c0fc1eb5a62a260217bc64470d7ba602f5886d20"}, - {file = "coverage-7.7.1-pp39.pp310.pp311-none-any.whl", hash = "sha256:5b7b02e50d54be6114cc4f6a3222fec83164f7c42772ba03b520138859b5fde1"}, - {file = "coverage-7.7.1-py3-none-any.whl", hash = "sha256:822fa99dd1ac686061e1219b67868e25d9757989cf2259f735a4802497d6da31"}, - {file = "coverage-7.7.1.tar.gz", hash = "sha256:199a1272e642266b90c9f40dec7fd3d307b51bf639fa0d15980dc0b3246c1393"}, -] - -[package.extras] -toml = ["tomli"] - -[[package]] -name = "faker" -version = "37.1.0" -description = "Faker is a Python package that generates fake data for you." -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "faker-37.1.0-py3-none-any.whl", hash = "sha256:dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c"}, - {file = "faker-37.1.0.tar.gz", hash = "sha256:ad9dc66a3b84888b837ca729e85299a96b58fdaef0323ed0baace93c9614af06"}, -] - -[package.dependencies] -tzdata = "*" - -[[package]] -name = "google-api-core" -version = "2.24.2" -description = "Google API client core library" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9"}, - {file = "google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696"}, -] - -[package.dependencies] -google-auth = ">=2.14.1,<3.0.0" -googleapis-common-protos = ">=1.56.2,<2.0.0" -proto-plus = [ - {version = ">=1.25.0,<2.0.0", markers = "python_version >= \"3.13\""}, - {version = ">=1.22.3,<2.0.0", markers = "python_version < \"3.13\""}, -] -protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" -requests = ">=2.18.0,<3.0.0" - -[package.extras] -async-rest = ["google-auth[aiohttp] (>=2.35.0,<3.0.dev0)"] -grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] -grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] - -[[package]] -name = "google-auth" -version = "2.38.0" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a"}, - {file = "google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography", "pyopenssl"] -pyjwt = ["cryptography (>=38.0.3)", "pyjwt (>=2.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0.dev0)"] - -[[package]] -name = "google-cloud-core" -version = "2.4.3" -description = "Google Cloud API client core library" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "google_cloud_core-2.4.3-py2.py3-none-any.whl", hash = "sha256:5130f9f4c14b4fafdff75c79448f9495cfade0d8775facf1b09c3bf67e027f6e"}, - {file = "google_cloud_core-2.4.3.tar.gz", hash = "sha256:1fab62d7102844b278fe6dead3af32408b1df3eb06f5c7e8634cbd40edc4da53"}, -] - -[package.dependencies] -google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" -google-auth = ">=1.25.0,<3.0dev" - -[package.extras] -grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] - -[[package]] -name = "google-cloud-storage" -version = "3.1.0" -description = "Google Cloud Storage API client library" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "google_cloud_storage-3.1.0-py2.py3-none-any.whl", hash = "sha256:eaf36966b68660a9633f03b067e4a10ce09f1377cae3ff9f2c699f69a81c66c6"}, - {file = "google_cloud_storage-3.1.0.tar.gz", hash = "sha256:944273179897c7c8a07ee15f2e6466a02da0c7c4b9ecceac2a26017cb2972049"}, -] - -[package.dependencies] -google-api-core = ">=2.15.0,<3.0.0dev" -google-auth = ">=2.26.1,<3.0dev" -google-cloud-core = ">=2.4.2,<3.0dev" -google-crc32c = ">=1.0,<2.0dev" -google-resumable-media = ">=2.7.2" -requests = ">=2.18.0,<3.0.0dev" - -[package.extras] -protobuf = ["protobuf (<6.0.0dev)"] -tracing = ["opentelemetry-api (>=1.1.0)"] - -[[package]] -name = "google-crc32c" -version = "1.7.1" -description = "A python wrapper of the C library 'Google CRC32C'" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "google_crc32c-1.7.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:b07d48faf8292b4db7c3d64ab86f950c2e94e93a11fd47271c28ba458e4a0d76"}, - {file = "google_crc32c-1.7.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7cc81b3a2fbd932a4313eb53cc7d9dde424088ca3a0337160f35d91826880c1d"}, - {file = "google_crc32c-1.7.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c67ca0a1f5b56162951a9dae987988679a7db682d6f97ce0f6381ebf0fbea4c"}, - {file = "google_crc32c-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc5319db92daa516b653600794d5b9f9439a9a121f3e162f94b0e1891c7933cb"}, - {file = "google_crc32c-1.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcdf5a64adb747610140572ed18d011896e3b9ae5195f2514b7ff678c80f1603"}, - {file = "google_crc32c-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:754561c6c66e89d55754106739e22fdaa93fafa8da7221b29c8b8e8270c6ec8a"}, - {file = "google_crc32c-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06"}, - {file = "google_crc32c-1.7.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9"}, - {file = "google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77"}, - {file = "google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53"}, - {file = "google_crc32c-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d"}, - {file = "google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194"}, - {file = "google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e"}, - {file = "google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337"}, - {file = "google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65"}, - {file = "google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6"}, - {file = "google_crc32c-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35"}, - {file = "google_crc32c-1.7.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638"}, - {file = "google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb"}, - {file = "google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6"}, - {file = "google_crc32c-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db"}, - {file = "google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3"}, - {file = "google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9"}, - {file = "google_crc32c-1.7.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:9fc196f0b8d8bd2789352c6a522db03f89e83a0ed6b64315923c396d7a932315"}, - {file = "google_crc32c-1.7.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:bb5e35dcd8552f76eed9461a23de1030920a3c953c1982f324be8f97946e7127"}, - {file = "google_crc32c-1.7.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f2226b6a8da04f1d9e61d3e357f2460b9551c5e6950071437e122c958a18ae14"}, - {file = "google_crc32c-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f2b3522222746fff0e04a9bd0a23ea003ba3cccc8cf21385c564deb1f223242"}, - {file = "google_crc32c-1.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bda0fcb632d390e3ea8b6b07bf6b4f4a66c9d02dcd6fbf7ba00a197c143f582"}, - {file = "google_crc32c-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:713121af19f1a617054c41f952294764e0c5443d5a5d9034b2cd60f5dd7e0349"}, - {file = "google_crc32c-1.7.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8e9afc74168b0b2232fb32dd202c93e46b7d5e4bf03e66ba5dc273bb3559589"}, - {file = "google_crc32c-1.7.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa8136cc14dd27f34a3221c0f16fd42d8a40e4778273e61a3c19aedaa44daf6b"}, - {file = "google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48"}, - {file = "google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82"}, - {file = "google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472"}, -] - -[package.extras] -testing = ["pytest"] - -[[package]] -name = "google-resumable-media" -version = "2.7.2" -description = "Utilities for Google Media Downloads and Resumable Uploads" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "google_resumable_media-2.7.2-py2.py3-none-any.whl", hash = "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa"}, - {file = "google_resumable_media-2.7.2.tar.gz", hash = "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0"}, -] - -[package.dependencies] -google-crc32c = ">=1.0,<2.0dev" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "google-auth (>=1.22.0,<2.0dev)"] -requests = ["requests (>=2.18.0,<3.0.0dev)"] - -[[package]] -name = "googleapis-common-protos" -version = "1.69.2" -description = "Common protobufs used in Google APIs" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "googleapis_common_protos-1.69.2-py3-none-any.whl", hash = "sha256:0b30452ff9c7a27d80bfc5718954063e8ab53dd3697093d3bc99581f5fd24212"}, - {file = "googleapis_common_protos-1.69.2.tar.gz", hash = "sha256:3e1b904a27a33c821b4b749fd31d334c0c9c30e6113023d495e48979a3dc9c5f"}, -] - -[package.dependencies] -protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0" - -[package.extras] -grpc = ["grpcio (>=1.44.0,<2.0.0)"] - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "httpcore" -version = "1.0.7" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, - {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<1.0)"] - -[[package]] -name = "httpx" -version = "0.28.1" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, - {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "idna" -version = "3.10" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, -] - -[package.extras] -all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] - -[[package]] -name = "iniconfig" -version = "2.1.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, - {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, -] - -[[package]] -name = "jsf" -version = "0.11.2" -description = "Creates fake JSON files from a JSON schema" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "jsf-0.11.2-py3-none-any.whl", hash = "sha256:b4472c8c2d776eb3e0bb08368caa6ae0ead7ea78b20653facc07b6d93768612c"}, - {file = "jsf-0.11.2.tar.gz", hash = "sha256:07055b363281d38ce871a9256a00587d8472802c5108721a7fe5884465104b5d"}, -] - -[package.dependencies] -faker = ">=15.3.4" -jsonschema = ">=4.17.3" -pydantic = ">=2.0.0" -rstr = ">=3.2.0" -smart-open = {version = ">=6.3.0", extras = ["http"]} -typing-extensions = ">=4.9.0" - -[package.extras] -cli = ["typer (>=0.7.0)"] - -[[package]] -name = "jsonschema" -version = "4.23.0" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, - {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.03.6" -referencing = ">=0.28.4" -rpds-py = ">=0.7.1" - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] - -[[package]] -name = "jsonschema-specifications" -version = "2024.10.1" -description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, - {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, -] - -[package.dependencies] -referencing = ">=0.31.0" - -[[package]] -name = "numpy" -version = "2.2.4" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.10" -groups = ["main"] -files = [ - {file = "numpy-2.2.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9"}, - {file = "numpy-2.2.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae"}, - {file = "numpy-2.2.4-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775"}, - {file = "numpy-2.2.4-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9"}, - {file = "numpy-2.2.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2"}, - {file = "numpy-2.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020"}, - {file = "numpy-2.2.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3"}, - {file = "numpy-2.2.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017"}, - {file = "numpy-2.2.4-cp310-cp310-win32.whl", hash = "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a"}, - {file = "numpy-2.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542"}, - {file = "numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4"}, - {file = "numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4"}, - {file = "numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f"}, - {file = "numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880"}, - {file = "numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1"}, - {file = "numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5"}, - {file = "numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687"}, - {file = "numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6"}, - {file = "numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09"}, - {file = "numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91"}, - {file = "numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4"}, - {file = "numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854"}, - {file = "numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24"}, - {file = "numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee"}, - {file = "numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba"}, - {file = "numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592"}, - {file = "numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb"}, - {file = "numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f"}, - {file = "numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00"}, - {file = "numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146"}, - {file = "numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7"}, - {file = "numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0"}, - {file = "numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392"}, - {file = "numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc"}, - {file = "numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298"}, - {file = "numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7"}, - {file = "numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6"}, - {file = "numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd"}, - {file = "numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c"}, - {file = "numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3"}, - {file = "numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8"}, - {file = "numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39"}, - {file = "numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd"}, - {file = "numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0"}, - {file = "numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960"}, - {file = "numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8"}, - {file = "numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc"}, - {file = "numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff"}, - {file = "numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286"}, - {file = "numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d"}, - {file = "numpy-2.2.4-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8"}, - {file = "numpy-2.2.4-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c"}, - {file = "numpy-2.2.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d"}, - {file = "numpy-2.2.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d"}, - {file = "numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f"}, -] - -[[package]] -name = "oauthlib" -version = "3.2.2" -description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, - {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, -] - -[package.extras] -rsa = ["cryptography (>=3.0.0)"] -signals = ["blinker (>=1.4.0)"] -signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] - -[[package]] -name = "packaging" -version = "24.2" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, - {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "proto-plus" -version = "1.26.1" -description = "Beautiful, Pythonic protocol buffers" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66"}, - {file = "proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012"}, -] - -[package.dependencies] -protobuf = ">=3.19.0,<7.0.0" - -[package.extras] -testing = ["google-api-core (>=1.31.5)"] - -[[package]] -name = "protobuf" -version = "6.30.2" -description = "" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "protobuf-6.30.2-cp310-abi3-win32.whl", hash = "sha256:b12ef7df7b9329886e66404bef5e9ce6a26b54069d7f7436a0853ccdeb91c103"}, - {file = "protobuf-6.30.2-cp310-abi3-win_amd64.whl", hash = "sha256:7653c99774f73fe6b9301b87da52af0e69783a2e371e8b599b3e9cb4da4b12b9"}, - {file = "protobuf-6.30.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:0eb523c550a66a09a0c20f86dd554afbf4d32b02af34ae53d93268c1f73bc65b"}, - {file = "protobuf-6.30.2-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:50f32cc9fd9cb09c783ebc275611b4f19dfdfb68d1ee55d2f0c7fa040df96815"}, - {file = "protobuf-6.30.2-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:4f6c687ae8efae6cf6093389a596548214467778146b7245e886f35e1485315d"}, - {file = "protobuf-6.30.2-cp39-cp39-win32.whl", hash = "sha256:524afedc03b31b15586ca7f64d877a98b184f007180ce25183d1a5cb230ee72b"}, - {file = "protobuf-6.30.2-cp39-cp39-win_amd64.whl", hash = "sha256:acec579c39c88bd8fbbacab1b8052c793efe83a0a5bd99db4a31423a25c0a0e2"}, - {file = "protobuf-6.30.2-py3-none-any.whl", hash = "sha256:ae86b030e69a98e08c77beab574cbcb9fff6d031d57209f574a5aea1445f4b51"}, - {file = "protobuf-6.30.2.tar.gz", hash = "sha256:35c859ae076d8c56054c25b59e5e59638d86545ed6e2b6efac6be0b6ea3ba048"}, -] - -[[package]] -name = "pyasn1" -version = "0.6.1" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, - {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.4.2" -description = "A collection of ASN.1-based protocols modules" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a"}, - {file = "pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6"}, -] - -[package.dependencies] -pyasn1 = ">=0.6.1,<0.7.0" - -[[package]] -name = "pydantic" -version = "2.11.1" -description = "Data validation using Python type hints" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "pydantic-2.11.1-py3-none-any.whl", hash = "sha256:5b6c415eee9f8123a14d859be0c84363fec6b1feb6b688d6435801230b56e0b8"}, - {file = "pydantic-2.11.1.tar.gz", hash = "sha256:442557d2910e75c991c39f4b4ab18963d57b9b55122c8b2a9cd176d8c29ce968"}, -] - -[package.dependencies] -annotated-types = ">=0.6.0" -pydantic-core = "2.33.0" -typing-extensions = ">=4.12.2" -typing-inspection = ">=0.4.0" - -[package.extras] -email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] - -[[package]] -name = "pydantic-core" -version = "2.33.0" -description = "Core functionality for Pydantic validation and serialization" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "pydantic_core-2.33.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71dffba8fe9ddff628c68f3abd845e91b028361d43c5f8e7b3f8b91d7d85413e"}, - {file = "pydantic_core-2.33.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:abaeec1be6ed535a5d7ffc2e6c390083c425832b20efd621562fbb5bff6dc518"}, - {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759871f00e26ad3709efc773ac37b4d571de065f9dfb1778012908bcc36b3a73"}, - {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dcfebee69cd5e1c0b76a17e17e347c84b00acebb8dd8edb22d4a03e88e82a207"}, - {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b1262b912435a501fa04cd213720609e2cefa723a07c92017d18693e69bf00b"}, - {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4726f1f3f42d6a25678c67da3f0b10f148f5655813c5aca54b0d1742ba821b8f"}, - {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e790954b5093dff1e3a9a2523fddc4e79722d6f07993b4cd5547825c3cbf97b5"}, - {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34e7fb3abe375b5c4e64fab75733d605dda0f59827752debc99c17cb2d5f3276"}, - {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ecb158fb9b9091b515213bed3061eb7deb1d3b4e02327c27a0ea714ff46b0760"}, - {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:4d9149e7528af8bbd76cc055967e6e04617dcb2a2afdaa3dea899406c5521faa"}, - {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e81a295adccf73477220e15ff79235ca9dcbcee4be459eb9d4ce9a2763b8386c"}, - {file = "pydantic_core-2.33.0-cp310-cp310-win32.whl", hash = "sha256:f22dab23cdbce2005f26a8f0c71698457861f97fc6318c75814a50c75e87d025"}, - {file = "pydantic_core-2.33.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cb2390355ba084c1ad49485d18449b4242da344dea3e0fe10babd1f0db7dcfc"}, - {file = "pydantic_core-2.33.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a608a75846804271cf9c83e40bbb4dab2ac614d33c6fd5b0c6187f53f5c593ef"}, - {file = "pydantic_core-2.33.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e1c69aa459f5609dec2fa0652d495353accf3eda5bdb18782bc5a2ae45c9273a"}, - {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9ec80eb5a5f45a2211793f1c4aeddff0c3761d1c70d684965c1807e923a588b"}, - {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e925819a98318d17251776bd3d6aa9f3ff77b965762155bdad15d1a9265c4cfd"}, - {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bf68bb859799e9cec3d9dd8323c40c00a254aabb56fe08f907e437005932f2b"}, - {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b2ea72dea0825949a045fa4071f6d5b3d7620d2a208335207793cf29c5a182d"}, - {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1583539533160186ac546b49f5cde9ffc928062c96920f58bd95de32ffd7bffd"}, - {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23c3e77bf8a7317612e5c26a3b084c7edeb9552d645742a54a5867635b4f2453"}, - {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7a7f2a3f628d2f7ef11cb6188bcf0b9e1558151d511b974dfea10a49afe192b"}, - {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:f1fb026c575e16f673c61c7b86144517705865173f3d0907040ac30c4f9f5915"}, - {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:635702b2fed997e0ac256b2cfbdb4dd0bf7c56b5d8fba8ef03489c03b3eb40e2"}, - {file = "pydantic_core-2.33.0-cp311-cp311-win32.whl", hash = "sha256:07b4ced28fccae3f00626eaa0c4001aa9ec140a29501770a88dbbb0966019a86"}, - {file = "pydantic_core-2.33.0-cp311-cp311-win_amd64.whl", hash = "sha256:4927564be53239a87770a5f86bdc272b8d1fbb87ab7783ad70255b4ab01aa25b"}, - {file = "pydantic_core-2.33.0-cp311-cp311-win_arm64.whl", hash = "sha256:69297418ad644d521ea3e1aa2e14a2a422726167e9ad22b89e8f1130d68e1e9a"}, - {file = "pydantic_core-2.33.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6c32a40712e3662bebe524abe8abb757f2fa2000028d64cc5a1006016c06af43"}, - {file = "pydantic_core-2.33.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ec86b5baa36f0a0bfb37db86c7d52652f8e8aa076ab745ef7725784183c3fdd"}, - {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4deac83a8cc1d09e40683be0bc6d1fa4cde8df0a9bf0cda5693f9b0569ac01b6"}, - {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:175ab598fb457a9aee63206a1993874badf3ed9a456e0654273e56f00747bbd6"}, - {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f36afd0d56a6c42cf4e8465b6441cf546ed69d3a4ec92724cc9c8c61bd6ecf4"}, - {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a98257451164666afafc7cbf5fb00d613e33f7e7ebb322fbcd99345695a9a61"}, - {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecc6d02d69b54a2eb83ebcc6f29df04957f734bcf309d346b4f83354d8376862"}, - {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a69b7596c6603afd049ce7f3835bcf57dd3892fc7279f0ddf987bebed8caa5a"}, - {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea30239c148b6ef41364c6f51d103c2988965b643d62e10b233b5efdca8c0099"}, - {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:abfa44cf2f7f7d7a199be6c6ec141c9024063205545aa09304349781b9a125e6"}, - {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20d4275f3c4659d92048c70797e5fdc396c6e4446caf517ba5cad2db60cd39d3"}, - {file = "pydantic_core-2.33.0-cp312-cp312-win32.whl", hash = "sha256:918f2013d7eadea1d88d1a35fd4a1e16aaf90343eb446f91cb091ce7f9b431a2"}, - {file = "pydantic_core-2.33.0-cp312-cp312-win_amd64.whl", hash = "sha256:aec79acc183865bad120b0190afac467c20b15289050648b876b07777e67ea48"}, - {file = "pydantic_core-2.33.0-cp312-cp312-win_arm64.whl", hash = "sha256:5461934e895968655225dfa8b3be79e7e927e95d4bd6c2d40edd2fa7052e71b6"}, - {file = "pydantic_core-2.33.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f00e8b59e1fc8f09d05594aa7d2b726f1b277ca6155fc84c0396db1b373c4555"}, - {file = "pydantic_core-2.33.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a73be93ecef45786d7d95b0c5e9b294faf35629d03d5b145b09b81258c7cd6d"}, - {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff48a55be9da6930254565ff5238d71d5e9cd8c5487a191cb85df3bdb8c77365"}, - {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a4ea04195638dcd8c53dadb545d70badba51735b1594810e9768c2c0b4a5da"}, - {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41d698dcbe12b60661f0632b543dbb119e6ba088103b364ff65e951610cb7ce0"}, - {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae62032ef513fe6281ef0009e30838a01057b832dc265da32c10469622613885"}, - {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f225f3a3995dbbc26affc191d0443c6c4aa71b83358fd4c2b7d63e2f6f0336f9"}, - {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bdd36b362f419c78d09630cbaebc64913f66f62bda6d42d5fbb08da8cc4f181"}, - {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a0147c0bef783fd9abc9f016d66edb6cac466dc54a17ec5f5ada08ff65caf5d"}, - {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:c860773a0f205926172c6644c394e02c25421dc9a456deff16f64c0e299487d3"}, - {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:138d31e3f90087f42aa6286fb640f3c7a8eb7bdae829418265e7e7474bd2574b"}, - {file = "pydantic_core-2.33.0-cp313-cp313-win32.whl", hash = "sha256:d20cbb9d3e95114325780f3cfe990f3ecae24de7a2d75f978783878cce2ad585"}, - {file = "pydantic_core-2.33.0-cp313-cp313-win_amd64.whl", hash = "sha256:ca1103d70306489e3d006b0f79db8ca5dd3c977f6f13b2c59ff745249431a606"}, - {file = "pydantic_core-2.33.0-cp313-cp313-win_arm64.whl", hash = "sha256:6291797cad239285275558e0a27872da735b05c75d5237bbade8736f80e4c225"}, - {file = "pydantic_core-2.33.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7b79af799630af263eca9ec87db519426d8c9b3be35016eddad1832bac812d87"}, - {file = "pydantic_core-2.33.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eabf946a4739b5237f4f56d77fa6668263bc466d06a8036c055587c130a46f7b"}, - {file = "pydantic_core-2.33.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8a1d581e8cdbb857b0e0e81df98603376c1a5c34dc5e54039dcc00f043df81e7"}, - {file = "pydantic_core-2.33.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:7c9c84749f5787781c1c45bb99f433402e484e515b40675a5d121ea14711cf61"}, - {file = "pydantic_core-2.33.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:64672fa888595a959cfeff957a654e947e65bbe1d7d82f550417cbd6898a1d6b"}, - {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bc7367c0961dec292244ef2549afa396e72e28cc24706210bd44d947582c59"}, - {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce72d46eb201ca43994303025bd54d8a35a3fc2a3495fac653d6eb7205ce04f4"}, - {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14229c1504287533dbf6b1fc56f752ce2b4e9694022ae7509631ce346158de11"}, - {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:085d8985b1c1e48ef271e98a658f562f29d89bda98bf120502283efbc87313eb"}, - {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31860fbda80d8f6828e84b4a4d129fd9c4535996b8249cfb8c720dc2a1a00bb8"}, - {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f200b2f20856b5a6c3a35f0d4e344019f805e363416e609e9b47c552d35fd5ea"}, - {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f72914cfd1d0176e58ddc05c7a47674ef4222c8253bf70322923e73e14a4ac3"}, - {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:91301a0980a1d4530d4ba7e6a739ca1a6b31341252cb709948e0aca0860ce0ae"}, - {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7419241e17c7fbe5074ba79143d5523270e04f86f1b3a0dff8df490f84c8273a"}, - {file = "pydantic_core-2.33.0-cp39-cp39-win32.whl", hash = "sha256:7a25493320203005d2a4dac76d1b7d953cb49bce6d459d9ae38e30dd9f29bc9c"}, - {file = "pydantic_core-2.33.0-cp39-cp39-win_amd64.whl", hash = "sha256:82a4eba92b7ca8af1b7d5ef5f3d9647eee94d1f74d21ca7c21e3a2b92e008358"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e2762c568596332fdab56b07060c8ab8362c56cf2a339ee54e491cd503612c50"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bf637300ff35d4f59c006fff201c510b2b5e745b07125458a5389af3c0dff8c"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c151ce3d59ed56ebd7ce9ce5986a409a85db697d25fc232f8e81f195aa39a1"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee65f0cc652261744fd07f2c6e6901c914aa6c5ff4dcfaf1136bc394d0dd26b"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:024d136ae44d233e6322027bbf356712b3940bee816e6c948ce4b90f18471b3d"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e37f10f6d4bc67c58fbd727108ae1d8b92b397355e68519f1e4a7babb1473442"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:502ed542e0d958bd12e7c3e9a015bce57deaf50eaa8c2e1c439b512cb9db1e3a"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:715c62af74c236bf386825c0fdfa08d092ab0f191eb5b4580d11c3189af9d330"}, - {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bccc06fa0372151f37f6b69834181aa9eb57cf8665ed36405fb45fbf6cac3bae"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d8dc9f63a26f7259b57f46a7aab5af86b2ad6fbe48487500bb1f4b27e051e4c"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30369e54d6d0113d2aa5aee7a90d17f225c13d87902ace8fcd7bbf99b19124db"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3eb479354c62067afa62f53bb387827bee2f75c9c79ef25eef6ab84d4b1ae3b"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0310524c833d91403c960b8a3cf9f46c282eadd6afd276c8c5edc617bd705dc9"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eddb18a00bbb855325db27b4c2a89a4ba491cd6a0bd6d852b225172a1f54b36c"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ade5dbcf8d9ef8f4b28e682d0b29f3008df9842bb5ac48ac2c17bc55771cc976"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2c0afd34f928383e3fd25740f2050dbac9d077e7ba5adbaa2227f4d4f3c8da5c"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7da333f21cd9df51d5731513a6d39319892947604924ddf2e24a4612975fb936"}, - {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b6d77c75a57f041c5ee915ff0b0bb58eabb78728b69ed967bc5b780e8f701b8"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba95691cf25f63df53c1d342413b41bd7762d9acb425df8858d7efa616c0870e"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f1ab031feb8676f6bd7c85abec86e2935850bf19b84432c64e3e239bffeb1ec"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58c1151827eef98b83d49b6ca6065575876a02d2211f259fb1a6b7757bd24dd8"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a66d931ea2c1464b738ace44b7334ab32a2fd50be023d863935eb00f42be1778"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0bcf0bab28995d483f6c8d7db25e0d05c3efa5cebfd7f56474359e7137f39856"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:89670d7a0045acb52be0566df5bc8b114ac967c662c06cf5e0c606e4aadc964b"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:b716294e721d8060908dbebe32639b01bfe61b15f9f57bcc18ca9a0e00d9520b"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fc53e05c16697ff0c1c7c2b98e45e131d4bfb78068fffff92a82d169cbb4c7b7"}, - {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:68504959253303d3ae9406b634997a2123a0b0c1da86459abbd0ffc921695eac"}, - {file = "pydantic_core-2.33.0.tar.gz", hash = "sha256:40eb8af662ba409c3cbf4a8150ad32ae73514cd7cb1f1a2113af39763dd616b3"}, -] - -[package.dependencies] -typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" - -[[package]] -name = "pyjwt" -version = "2.10.1" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, - {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -optional = false -python-versions = ">=3.6.8" -groups = ["main"] -files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "pyrfc6266" -version = "1.0.2" -description = "RFC6266 implementation in Python" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "pyrfc6266-1.0.2-py3-none-any.whl", hash = "sha256:0532307f319566f337dba97577dfaefe493c3e0c40ab211449ba4566fc2cf73d"}, - {file = "pyrfc6266-1.0.2.tar.gz", hash = "sha256:3c41616b6a1f2e9a26df7f005fbaa634f960121769ccc4445acfb404e9f8fd4c"}, -] - -[package.dependencies] -pyparsing = ">=3.0.7,<3.1.0" - -[[package]] -name = "pytest" -version = "8.3.5" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820"}, - {file = "pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=1.5,<2" - -[package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-cov" -version = "5.0.0" -description = "Pytest plugin for measuring coverage." -optional = false -python-versions = ">=3.8" -groups = ["dev"] -files = [ - {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, - {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, -] - -[package.dependencies] -coverage = {version = ">=5.2.1", extras = ["toml"]} -pytest = ">=4.6" - -[package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] - -[[package]] -name = "pytest-timeout" -version = "2.3.1" -description = "pytest plugin to abort hanging tests" -optional = false -python-versions = ">=3.7" -groups = ["dev"] -files = [ - {file = "pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9"}, - {file = "pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e"}, -] - -[package.dependencies] -pytest = ">=7.0.0" - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main"] -files = [ - {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, - {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-dotenv" -version = "1.1.0" -description = "Read key-value pairs from a .env file and set them as environment variables" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"}, - {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"}, -] - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "referencing" -version = "0.36.2" -description = "JSON Referencing + Python" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, - {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, -] - -[package.dependencies] -attrs = ">=22.2.0" -rpds-py = ">=0.7.0" -typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} - -[[package]] -name = "requests" -version = "2.32.3" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "requests-oauthlib" -version = "2.0.0" -description = "OAuthlib authentication support for Requests." -optional = false -python-versions = ">=3.4" -groups = ["main"] -files = [ - {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, - {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, -] - -[package.dependencies] -oauthlib = ">=3.0.0" -requests = ">=2.0.0" - -[package.extras] -rsa = ["oauthlib[signedtoken] (>=3.0.0)"] - -[[package]] -name = "rpds-py" -version = "0.24.0" -description = "Python bindings to Rust's persistent data structures (rpds)" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "rpds_py-0.24.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:006f4342fe729a368c6df36578d7a348c7c716be1da0a1a0f86e3021f8e98724"}, - {file = "rpds_py-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2d53747da70a4e4b17f559569d5f9506420966083a31c5fbd84e764461c4444b"}, - {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8acd55bd5b071156bae57b555f5d33697998752673b9de554dd82f5b5352727"}, - {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7e80d375134ddb04231a53800503752093dbb65dad8dabacce2c84cccc78e964"}, - {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60748789e028d2a46fc1c70750454f83c6bdd0d05db50f5ae83e2db500b34da5"}, - {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6e1daf5bf6c2be39654beae83ee6b9a12347cb5aced9a29eecf12a2d25fff664"}, - {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b221c2457d92a1fb3c97bee9095c874144d196f47c038462ae6e4a14436f7bc"}, - {file = "rpds_py-0.24.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:66420986c9afff67ef0c5d1e4cdc2d0e5262f53ad11e4f90e5e22448df485bf0"}, - {file = "rpds_py-0.24.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:43dba99f00f1d37b2a0265a259592d05fcc8e7c19d140fe51c6e6f16faabeb1f"}, - {file = "rpds_py-0.24.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a88c0d17d039333a41d9bf4616bd062f0bd7aa0edeb6cafe00a2fc2a804e944f"}, - {file = "rpds_py-0.24.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc31e13ce212e14a539d430428cd365e74f8b2d534f8bc22dd4c9c55b277b875"}, - {file = "rpds_py-0.24.0-cp310-cp310-win32.whl", hash = "sha256:fc2c1e1b00f88317d9de6b2c2b39b012ebbfe35fe5e7bef980fd2a91f6100a07"}, - {file = "rpds_py-0.24.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0145295ca415668420ad142ee42189f78d27af806fcf1f32a18e51d47dd2052"}, - {file = "rpds_py-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2d3ee4615df36ab8eb16c2507b11e764dcc11fd350bbf4da16d09cda11fcedef"}, - {file = "rpds_py-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e13ae74a8a3a0c2f22f450f773e35f893484fcfacb00bb4344a7e0f4f48e1f97"}, - {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf86f72d705fc2ef776bb7dd9e5fbba79d7e1f3e258bf9377f8204ad0fc1c51e"}, - {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c43583ea8517ed2e780a345dd9960896afc1327e8cf3ac8239c167530397440d"}, - {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cd031e63bc5f05bdcda120646a0d32f6d729486d0067f09d79c8db5368f4586"}, - {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34d90ad8c045df9a4259c47d2e16a3f21fdb396665c94520dbfe8766e62187a4"}, - {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e838bf2bb0b91ee67bf2b889a1a841e5ecac06dd7a2b1ef4e6151e2ce155c7ae"}, - {file = "rpds_py-0.24.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04ecf5c1ff4d589987b4d9882872f80ba13da7d42427234fce8f22efb43133bc"}, - {file = "rpds_py-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:630d3d8ea77eabd6cbcd2ea712e1c5cecb5b558d39547ac988351195db433f6c"}, - {file = "rpds_py-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ebcb786b9ff30b994d5969213a8430cbb984cdd7ea9fd6df06663194bd3c450c"}, - {file = "rpds_py-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:174e46569968ddbbeb8a806d9922f17cd2b524aa753b468f35b97ff9c19cb718"}, - {file = "rpds_py-0.24.0-cp311-cp311-win32.whl", hash = "sha256:5ef877fa3bbfb40b388a5ae1cb00636a624690dcb9a29a65267054c9ea86d88a"}, - {file = "rpds_py-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:e274f62cbd274359eff63e5c7e7274c913e8e09620f6a57aae66744b3df046d6"}, - {file = "rpds_py-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d8551e733626afec514b5d15befabea0dd70a343a9f23322860c4f16a9430205"}, - {file = "rpds_py-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e374c0ce0ca82e5b67cd61fb964077d40ec177dd2c4eda67dba130de09085c7"}, - {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d69d003296df4840bd445a5d15fa5b6ff6ac40496f956a221c4d1f6f7b4bc4d9"}, - {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8212ff58ac6dfde49946bea57474a386cca3f7706fc72c25b772b9ca4af6b79e"}, - {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:528927e63a70b4d5f3f5ccc1fa988a35456eb5d15f804d276709c33fc2f19bda"}, - {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a824d2c7a703ba6daaca848f9c3d5cb93af0505be505de70e7e66829affd676e"}, - {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d51febb7a114293ffd56c6cf4736cb31cd68c0fddd6aa303ed09ea5a48e029"}, - {file = "rpds_py-0.24.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3fab5f4a2c64a8fb64fc13b3d139848817a64d467dd6ed60dcdd6b479e7febc9"}, - {file = "rpds_py-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9be4f99bee42ac107870c61dfdb294d912bf81c3c6d45538aad7aecab468b6b7"}, - {file = "rpds_py-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:564c96b6076a98215af52f55efa90d8419cc2ef45d99e314fddefe816bc24f91"}, - {file = "rpds_py-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:75a810b7664c17f24bf2ffd7f92416c00ec84b49bb68e6a0d93e542406336b56"}, - {file = "rpds_py-0.24.0-cp312-cp312-win32.whl", hash = "sha256:f6016bd950be4dcd047b7475fdf55fb1e1f59fc7403f387be0e8123e4a576d30"}, - {file = "rpds_py-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034"}, - {file = "rpds_py-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2d8e4508e15fc05b31285c4b00ddf2e0eb94259c2dc896771966a163122a0c"}, - {file = "rpds_py-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f00c16e089282ad68a3820fd0c831c35d3194b7cdc31d6e469511d9bffc535c"}, - {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951cc481c0c395c4a08639a469d53b7d4afa252529a085418b82a6b43c45c240"}, - {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9ca89938dff18828a328af41ffdf3902405a19f4131c88e22e776a8e228c5a8"}, - {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0ef550042a8dbcd657dfb284a8ee00f0ba269d3f2286b0493b15a5694f9fe8"}, - {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2356688e5d958c4d5cb964af865bea84db29971d3e563fb78e46e20fe1848b"}, - {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78884d155fd15d9f64f5d6124b486f3d3f7fd7cd71a78e9670a0f6f6ca06fb2d"}, - {file = "rpds_py-0.24.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a4a535013aeeef13c5532f802708cecae8d66c282babb5cd916379b72110cf7"}, - {file = "rpds_py-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:84e0566f15cf4d769dade9b366b7b87c959be472c92dffb70462dd0844d7cbad"}, - {file = "rpds_py-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:823e74ab6fbaa028ec89615ff6acb409e90ff45580c45920d4dfdddb069f2120"}, - {file = "rpds_py-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c61a2cb0085c8783906b2f8b1f16a7e65777823c7f4d0a6aaffe26dc0d358dd9"}, - {file = "rpds_py-0.24.0-cp313-cp313-win32.whl", hash = "sha256:60d9b630c8025b9458a9d114e3af579a2c54bd32df601c4581bd054e85258143"}, - {file = "rpds_py-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a"}, - {file = "rpds_py-0.24.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:d09dc82af2d3c17e7dd17120b202a79b578d79f2b5424bda209d9966efeed114"}, - {file = "rpds_py-0.24.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5fc13b44de6419d1e7a7e592a4885b323fbc2f46e1f22151e3a8ed3b8b920405"}, - {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c347a20d79cedc0a7bd51c4d4b7dbc613ca4e65a756b5c3e57ec84bd43505b47"}, - {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20f2712bd1cc26a3cc16c5a1bfee9ed1abc33d4cdf1aabd297fe0eb724df4272"}, - {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad911555286884be1e427ef0dc0ba3929e6821cbeca2194b13dc415a462c7fd"}, - {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0aeb3329c1721c43c58cae274d7d2ca85c1690d89485d9c63a006cb79a85771a"}, - {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0f156e9509cee987283abd2296ec816225145a13ed0391df8f71bf1d789e2d"}, - {file = "rpds_py-0.24.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa6800adc8204ce898c8a424303969b7aa6a5e4ad2789c13f8648739830323b7"}, - {file = "rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a18fc371e900a21d7392517c6f60fe859e802547309e94313cd8181ad9db004d"}, - {file = "rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9168764133fd919f8dcca2ead66de0105f4ef5659cbb4fa044f7014bed9a1797"}, - {file = "rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f6e3cec44ba05ee5cbdebe92d052f69b63ae792e7d05f1020ac5e964394080c"}, - {file = "rpds_py-0.24.0-cp313-cp313t-win32.whl", hash = "sha256:8ebc7e65ca4b111d928b669713865f021b7773350eeac4a31d3e70144297baba"}, - {file = "rpds_py-0.24.0-cp313-cp313t-win_amd64.whl", hash = "sha256:675269d407a257b8c00a6b58205b72eec8231656506c56fd429d924ca00bb350"}, - {file = "rpds_py-0.24.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a36b452abbf29f68527cf52e181fced56685731c86b52e852053e38d8b60bc8d"}, - {file = "rpds_py-0.24.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b3b397eefecec8e8e39fa65c630ef70a24b09141a6f9fc17b3c3a50bed6b50e"}, - {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdabcd3beb2a6dca7027007473d8ef1c3b053347c76f685f5f060a00327b8b65"}, - {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5db385bacd0c43f24be92b60c857cf760b7f10d8234f4bd4be67b5b20a7c0b6b"}, - {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8097b3422d020ff1c44effc40ae58e67d93e60d540a65649d2cdaf9466030791"}, - {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:493fe54318bed7d124ce272fc36adbf59d46729659b2c792e87c3b95649cdee9"}, - {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8aa362811ccdc1f8dadcc916c6d47e554169ab79559319ae9fae7d7752d0d60c"}, - {file = "rpds_py-0.24.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d8f9a6e7fd5434817526815f09ea27f2746c4a51ee11bb3439065f5fc754db58"}, - {file = "rpds_py-0.24.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8205ee14463248d3349131bb8099efe15cd3ce83b8ef3ace63c7e976998e7124"}, - {file = "rpds_py-0.24.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:921ae54f9ecba3b6325df425cf72c074cd469dea843fb5743a26ca7fb2ccb149"}, - {file = "rpds_py-0.24.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32bab0a56eac685828e00cc2f5d1200c548f8bc11f2e44abf311d6b548ce2e45"}, - {file = "rpds_py-0.24.0-cp39-cp39-win32.whl", hash = "sha256:f5c0ed12926dec1dfe7d645333ea59cf93f4d07750986a586f511c0bc61fe103"}, - {file = "rpds_py-0.24.0-cp39-cp39-win_amd64.whl", hash = "sha256:afc6e35f344490faa8276b5f2f7cbf71f88bc2cda4328e00553bd451728c571f"}, - {file = "rpds_py-0.24.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:619ca56a5468f933d940e1bf431c6f4e13bef8e688698b067ae68eb4f9b30e3a"}, - {file = "rpds_py-0.24.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:4b28e5122829181de1898c2c97f81c0b3246d49f585f22743a1246420bb8d399"}, - {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e5ab32cf9eb3647450bc74eb201b27c185d3857276162c101c0f8c6374e098"}, - {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:208b3a70a98cf3710e97cabdc308a51cd4f28aa6e7bb11de3d56cd8b74bab98d"}, - {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbc4362e06f950c62cad3d4abf1191021b2ffaf0b31ac230fbf0526453eee75e"}, - {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebea2821cdb5f9fef44933617be76185b80150632736f3d76e54829ab4a3b4d1"}, - {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4df06c35465ef4d81799999bba810c68d29972bf1c31db61bfdb81dd9d5bb"}, - {file = "rpds_py-0.24.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d3aa13bdf38630da298f2e0d77aca967b200b8cc1473ea05248f6c5e9c9bdb44"}, - {file = "rpds_py-0.24.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:041f00419e1da7a03c46042453598479f45be3d787eb837af382bfc169c0db33"}, - {file = "rpds_py-0.24.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d8754d872a5dfc3c5bf9c0e059e8107451364a30d9fd50f1f1a85c4fb9481164"}, - {file = "rpds_py-0.24.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:896c41007931217a343eff197c34513c154267636c8056fb409eafd494c3dcdc"}, - {file = "rpds_py-0.24.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:92558d37d872e808944c3c96d0423b8604879a3d1c86fdad508d7ed91ea547d5"}, - {file = "rpds_py-0.24.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f9e0057a509e096e47c87f753136c9b10d7a91842d8042c2ee6866899a717c0d"}, - {file = "rpds_py-0.24.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6e109a454412ab82979c5b1b3aee0604eca4bbf9a02693bb9df027af2bfa91a"}, - {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc1c892b1ec1f8cbd5da8de287577b455e388d9c328ad592eabbdcb6fc93bee5"}, - {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c39438c55983d48f4bb3487734d040e22dad200dab22c41e331cee145e7a50d"}, - {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d7e8ce990ae17dda686f7e82fd41a055c668e13ddcf058e7fb5e9da20b57793"}, - {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ea7f4174d2e4194289cb0c4e172d83e79a6404297ff95f2875cf9ac9bced8ba"}, - {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb2954155bb8f63bb19d56d80e5e5320b61d71084617ed89efedb861a684baea"}, - {file = "rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04f2b712a2206e13800a8136b07aaedc23af3facab84918e7aa89e4be0260032"}, - {file = "rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:eda5c1e2a715a4cbbca2d6d304988460942551e4e5e3b7457b50943cd741626d"}, - {file = "rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:9abc80fe8c1f87218db116016de575a7998ab1629078c90840e8d11ab423ee25"}, - {file = "rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6a727fd083009bc83eb83d6950f0c32b3c94c8b80a9b667c87f4bd1274ca30ba"}, - {file = "rpds_py-0.24.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e0f3ef95795efcd3b2ec3fe0a5bcfb5dadf5e3996ea2117427e524d4fbf309c6"}, - {file = "rpds_py-0.24.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:2c13777ecdbbba2077670285dd1fe50828c8742f6a4119dbef6f83ea13ad10fb"}, - {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79e8d804c2ccd618417e96720ad5cd076a86fa3f8cb310ea386a3e6229bae7d1"}, - {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd822f019ccccd75c832deb7aa040bb02d70a92eb15a2f16c7987b7ad4ee8d83"}, - {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0047638c3aa0dbcd0ab99ed1e549bbf0e142c9ecc173b6492868432d8989a046"}, - {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5b66d1b201cc71bc3081bc2f1fc36b0c1f268b773e03bbc39066651b9e18391"}, - {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbcbb6db5582ea33ce46a5d20a5793134b5365110d84df4e30b9d37c6fd40ad3"}, - {file = "rpds_py-0.24.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:63981feca3f110ed132fd217bf7768ee8ed738a55549883628ee3da75bb9cb78"}, - {file = "rpds_py-0.24.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3a55fc10fdcbf1a4bd3c018eea422c52cf08700cf99c28b5cb10fe97ab77a0d3"}, - {file = "rpds_py-0.24.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:c30ff468163a48535ee7e9bf21bd14c7a81147c0e58a36c1078289a8ca7af0bd"}, - {file = "rpds_py-0.24.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:369d9c6d4c714e36d4a03957b4783217a3ccd1e222cdd67d464a3a479fc17796"}, - {file = "rpds_py-0.24.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:24795c099453e3721fda5d8ddd45f5dfcc8e5a547ce7b8e9da06fecc3832e26f"}, - {file = "rpds_py-0.24.0.tar.gz", hash = "sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e"}, -] - -[[package]] -name = "rsa" -version = "4.9" -description = "Pure-Python RSA implementation" -optional = false -python-versions = ">=3.6,<4" -groups = ["main"] -files = [ - {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, - {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - -[[package]] -name = "rstr" -version = "3.2.2" -description = "Generate random strings in Python" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "rstr-3.2.2-py3-none-any.whl", hash = "sha256:f39195d38da1748331eeec52f1276e71eb6295e7949beea91a5e9af2340d7b3b"}, - {file = "rstr-3.2.2.tar.gz", hash = "sha256:c4a564d4dfb4472d931d145c43d1cf1ad78c24592142e7755b8866179eeac012"}, -] - -[[package]] -name = "six" -version = "1.17.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main"] -files = [ - {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, - {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, -] - -[[package]] -name = "smart-open" -version = "7.1.0" -description = "Utils for streaming large files (S3, HDFS, GCS, Azure Blob Storage, gzip, bz2...)" -optional = false -python-versions = "<4.0,>=3.7" -groups = ["main"] -files = [ - {file = "smart_open-7.1.0-py3-none-any.whl", hash = "sha256:4b8489bb6058196258bafe901730c7db0dcf4f083f316e97269c66f45502055b"}, - {file = "smart_open-7.1.0.tar.gz", hash = "sha256:a4f09f84f0f6d3637c6543aca7b5487438877a21360e7368ccf1f704789752ba"}, -] - -[package.dependencies] -requests = {version = "*", optional = true, markers = "extra == \"http\""} -wrapt = "*" - -[package.extras] -all = ["azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "paramiko", "requests", "zstandard"] -azure = ["azure-common", "azure-core", "azure-storage-blob"] -gcs = ["google-cloud-storage (>=2.6.0)"] -http = ["requests"] -s3 = ["boto3"] -ssh = ["paramiko"] -test = ["awscli", "azure-common", "azure-core", "azure-storage-blob", "boto3", "google-cloud-storage (>=2.6.0)", "moto[server]", "numpy", "paramiko", "pyopenssl", "pytest", "pytest-benchmark", "pytest-rerunfailures", "requests", "responses", "zstandard"] -webhdfs = ["requests"] -zst = ["zstandard"] - -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - -[[package]] -name = "tifffile" -version = "2025.3.30" -description = "Read and write TIFF files" -optional = false -python-versions = ">=3.10" -groups = ["main"] -files = [ - {file = "tifffile-2025.3.30-py3-none-any.whl", hash = "sha256:0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c"}, - {file = "tifffile-2025.3.30.tar.gz", hash = "sha256:3cdee47fe06cd75367c16bc3ff34523713156dae6cd498e3a392e5b39a51b789"}, -] - -[package.dependencies] -numpy = "*" - -[package.extras] -all = ["defusedxml", "fsspec", "imagecodecs (>=2024.12.30)", "lxml", "matplotlib", "zarr (<3)"] -codecs = ["imagecodecs (>=2024.12.30)"] -plot = ["matplotlib"] -test = ["cmapfile", "czifile", "dask", "defusedxml", "fsspec", "imagecodecs", "lfdfiles", "lxml", "ndtiff", "oiffile", "psdtags", "pytest", "roifile", "xarray", "zarr (<3)"] -xml = ["defusedxml", "lxml"] -zarr = ["fsspec", "zarr (<3)"] - -[[package]] -name = "tqdm" -version = "4.67.1" -description = "Fast, Extensible Progress Meter" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, - {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] -discord = ["requests"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "typing-extensions" -version = "4.13.0" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5"}, - {file = "typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b"}, -] - -[[package]] -name = "typing-inspection" -version = "0.4.0" -description = "Runtime typing introspection tools" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f"}, - {file = "typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122"}, -] - -[package.dependencies] -typing-extensions = ">=4.12.0" - -[[package]] -name = "tzdata" -version = "2025.2" -description = "Provider of IANA time zone data" -optional = false -python-versions = ">=2" -groups = ["main"] -files = [ - {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, - {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, -] - -[[package]] -name = "urllib3" -version = "2.3.0" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, - {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -h2 = ["h2 (>=4,<5)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] - -[[package]] -name = "wrapt" -version = "1.17.2" -description = "Module for decorators, wrappers and monkey patching." -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, - {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, - {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, - {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, - {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, - {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, - {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, - {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, - {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, - {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, - {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, - {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, - {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, - {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, - {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, - {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, - {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, - {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, - {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, -] - -[metadata] -lock-version = "2.1" -python-versions = ">=3.12,<4.0" -content-hash = "ee3c11073e00ca5c479aee828bd3d962e690e25d35cf7250a2c50530fdcd0dba" diff --git a/client_configs/pyproject.toml b/client_configs/pyproject.toml deleted file mode 100644 index 522d9769..00000000 --- a/client_configs/pyproject.toml +++ /dev/null @@ -1,60 +0,0 @@ -#[tool.pyright] -#venvPath = "." -#venv = ".venv" -#include = ["src", "codegen"] -#pythonVersion = "3.12" -#executionEnvironments = [{ root = ".", extraPaths = ["codegen"] }] - -[build-system] -requires = ["poetry-core>=1.2.0"] -build-backend = "poetry.core.masonry.api" - -[tool.poetry] -name = "aignostics_platform_client" -version = "0.1.0" -description = "Client library for the Aignostics Platform API" -authors = ["Aignostics GmbH "] -readme = "README.md" -packages = [ - { include = "aignx", from = "src" }, - { include = "aignx", from = "codegen" }, - { include = "aignx", from = "tests" }, -] - -[tool.poetry.dependencies] -python = ">=3.12,<4.0" -pydantic = "^2.9.2" -typing-extensions = ">=4.13.0" -python-dateutil = "^2.9.0.post0" -urllib3 = "^2.2.3" -requests-oauthlib = "^2.0.0" -requests = "^2.32.3" -httpx = "^0.28.1" -tifffile = "^2025.1.10" -pyrfc6266 = "^1.0.2" -tqdm = "^4.67.1" -jsonschema = "4.23.0" -google-crc32c = "1.7.1" -google-cloud-storage = "3.1.0" -pyjwt = "2.10.1" -#keyring = "25.6.0" -# to temp. store the tokens in the cache folder -appdirs = "1.4.4" -python-dotenv = "1.1.0" -jsf = "0.11.2" - - -[tool.poetry.group.dev.dependencies] -pytest = "^8.2.0" -pytest-cov = "^5.0.0" -pytest-timeout = "2.3.1" - - -[tool.pytest.ini_options] -addopts = "--strict-markers" -markers = [ - "requirements: mark tests with ids (e.g., PAPI-123, HETA-123) of requirements in Jira. The test will be linked to them - optional; comma-separated", - "specifications: mark test with ids (e.g., PAPI-123, HETA-123) of specifications in Jira. The test will be linked to them - optional; comma-separated", - "labels: mark test with labels that are attached to the test tickets in Jira - optional; comma-separated", - "description: textual description what the test does, goes in `description` field in the Jira ticket - optional", -] diff --git a/codegen/test/test_externals_api.py b/codegen/test/test_externals_api.py new file mode 100644 index 00000000..af332ca9 --- /dev/null +++ b/codegen/test/test_externals_api.py @@ -0,0 +1,126 @@ + +""" +Aignostics Platform API + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +The version of the OpenAPI document: 0.1.0 +Generated by OpenAPI Generator (https://openapi-generator.tech) + +Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from aignx.codegen.api.externals_api import ExternalsApi + + +class TestExternalsApi(unittest.TestCase): + """ExternalsApi unit test stubs""" + + def setUp(self) -> None: + self.api = ExternalsApi() + + def tearDown(self) -> None: + pass + + def test_cancel_run_v1_runs_application_run_id_cancel_post(self) -> None: + """Test case for cancel_run_v1_runs_application_run_id_cancel_post + + Cancel Run + """ + + def test_create_application_run_v1_runs_post(self) -> None: + """Test case for create_application_run_v1_runs_post + + Create Application Run + """ + + def test_create_user_v1_users_post(self) -> None: + """Test case for create_user_v1_users_post + + Create User + """ + + def test_delete_run_results_v1_runs_application_run_id_results_delete(self) -> None: + """Test case for delete_run_results_v1_runs_application_run_id_results_delete + + Delete Run Results + """ + + def test_get_run_v1_runs_application_run_id_get(self) -> None: + """Test case for get_run_v1_runs_application_run_id_get + + Get Run + """ + + def test_get_user_v1_users_user_id_get(self) -> None: + """Test case for get_user_v1_users_user_id_get + + Get User + """ + + def test_get_version_v1_versions_application_version_id_get(self) -> None: + """Test case for get_version_v1_versions_application_version_id_get + + Get Version + """ + + def test_list_application_runs_v1_runs_get(self) -> None: + """Test case for list_application_runs_v1_runs_get + + List Application Runs + """ + + def test_list_applications_v1_applications_get(self) -> None: + """Test case for list_applications_v1_applications_get + + List Applications + """ + + def test_list_run_results_v1_runs_application_run_id_results_get(self) -> None: + """Test case for list_run_results_v1_runs_application_run_id_results_get + + List Run Results + """ + + def test_list_versions_by_application_id_v1_applications_application_id_versions_get(self) -> None: + """Test case for list_versions_by_application_id_v1_applications_application_id_versions_get + + List Versions By Application Id + """ + + def test_list_versions_by_application_slug_v1_applications_application_slug_versions_get(self) -> None: + """Test case for list_versions_by_application_slug_v1_applications_application_slug_versions_get + + List Versions By Application Slug + """ + + def test_read_application_by_id_v1_applications_application_id_get(self) -> None: + """Test case for read_application_by_id_v1_applications_application_id_get + + Read Application By Id + """ + + def test_read_application_by_slug_v1_applications_application_slug_get(self) -> None: + """Test case for read_application_by_slug_v1_applications_application_slug_get + + Read Application By Slug + """ + + def test_register_version_v1_versions_post(self) -> None: + """Test case for register_version_v1_versions_post + + Register Version + """ + + def test_update_user_v1_users_user_id_patch(self) -> None: + """Test case for update_user_v1_users_user_id_patch + + Update User + """ + + +if __name__ == "__main__": + unittest.main() diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index f1a167fb..fbb3d0c5 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -4,7 +4,8 @@ components: properties: description: examples: - - 'H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, + - 'H&E Tumor Micro Environment Analysis: Performing tissue QC, +segmentation, cell detection and cell classfication' title: Description type: string @@ -133,10 +134,12 @@ components: title: ApplicationVersionReadResponse type: object ArtifactEvent: - description: 'This is a subset of the OutputArtifactEvent used by the state + description: 'This is a subset of the OutputArtifactEvent used by the +state machine. - Only the variants defined below are allowed to be submitted from the Algorithms/Applications.' + Only the variants defined below are allowed to be submitted from the +Algorithms/Applications.' enum: - succeeded - failed_with_user_error @@ -1059,9 +1062,12 @@ components: tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token type: oauth2 info: - description: Pagination is done via `page` and `page_size`. Sorting via `sort` query - parameter. sort is a comma-separated list of field names. The sorting direction - can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + description: Pagination is done via `page` and `page_size`. Sorting via `sort` +query + parameter. sort is a comma-separated list of field names. The sorting +direction + can be indicated via `+` (ascending) or `-` (descending) (e.g. +`/applications?sort=+name)`. summary: Interact with Aignostics' Application Platform title: Aignostics Platform API version: 0.1.0 @@ -1240,7 +1246,8 @@ paths: - Externals /v1/applications/{application_id}/versions: get: - operationId: list_versions_by_application_id_v1_applications__application_id__versions_get + operationId: +list_versions_by_application_id_v1_applications__application_id__versions_get parameters: - in: path name: application_id @@ -1303,7 +1310,8 @@ paths: schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications Application + title: Response List Versions By Application Id V1 Applications +Application Id Versions Get type: array description: Successful Response @@ -1320,7 +1328,8 @@ paths: - Externals /v1/applications/{application_slug}: get: - operationId: read_application_by_slug_v1_applications__application_slug__get + operationId: +read_application_by_slug_v1_applications__application_slug__get parameters: - in: path name: application_slug @@ -1348,7 +1357,9 @@ paths: - Externals /v1/applications/{application_slug}/versions: get: - operationId: list_versions_by_application_slug_v1_applications__application_slug__versions_get + operationId: +list_versions_by_application_slug_v1_applications__application_slug__versions_ge +t parameters: - in: path name: application_slug @@ -1411,7 +1422,8 @@ paths: schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 Applications Application + title: Response List Versions By Application Slug V1 +Applications Application Slug Versions Get type: array description: Successful Response @@ -1428,7 +1440,8 @@ paths: - Externals /v1/artifacts/{output_artifact_id}/event: post: - operationId: trigger_artifact_event_v1_artifacts__output_artifact_id__event_post + operationId: +trigger_artifact_event_v1_artifacts__output_artifact_id__event_post parameters: - in: path name: output_artifact_id @@ -1843,7 +1856,8 @@ paths: - Externals /v1/runs/{application_run_id}/results: delete: - operationId: delete_run_results_v1_runs__application_run_id__results_delete + operationId: +delete_run_results_v1_runs__application_run_id__results_delete parameters: - in: path name: application_run_id @@ -1943,7 +1957,8 @@ paths: schema: items: $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id Results + title: Response List Run Results V1 Runs Application Run Id +Results Get type: array description: Successful Response diff --git a/examples/playbook.py b/examples/playbook.py new file mode 100644 index 00000000..888fbdf7 --- /dev/null +++ b/examples/playbook.py @@ -0,0 +1,141 @@ +import marimo + +__generated_with = "0.12.2" +app = marimo.App(width="medium") + + +@app.cell +def _(): + import marimo as mo + return (mo,) + + +@app.cell +def _(mo): + mo.md( + r""" + # Login + + As a first step, you need to initialize the client to interact with the Aignostics Platform. This will execute an OAuth flow depending on the environment you run: + - In case you have a browser available, an interactive login flow in your browser is started. + - In case there is no browser available, a device flow is started. + + **NOTE:** By default, the client caches the access token in your operation systems application cache folder. If you do not want to store the access token, please initialize the client like this: + + ```python + client = aignostics.client.Client(cache_token=False) + ``` + """ + ) + + +@app.cell +def _(): + import aignostics.client + client = aignostics.client.Client() + + # the following functions is just used to visualize the results nicely in this notebook + import pandas as pd + from pydantic import BaseModel + + def show(models: BaseModel | list[BaseModel]) -> pd.DataFrame: + if isinstance(models, BaseModel): + items = [models.model_dump()] + else: + items = (a.model_dump() for a in models) + return pd.DataFrame(items) + return BaseModel, aignostics, client, pd, show + + +@app.cell +def _(mo): + mo.md(r"""# List our available applications""") + + +@app.cell +def _(client, show): + show(client.applications.list()) + + +@app.cell +def _(mo): + mo.md(r"""# List all available versions of an application""") + + +@app.cell +def _(client, show): + # let's show the available version for the `TwoTaskDummy` application + show(client.applications.versions.list(for_application="ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed")) + + +@app.cell +def _(mo): + mo.md(r"""# Inspect the input payload for an application version""") + + +@app.cell +def _(client): + # get a reference to the application version you are interested in + # in our case, let us inspect the latest version `0.0.4` + application_version = client.versions.details(for_application_version_id="212470c6-103e-429e-a9a0-0f662166faf5") + + # view the `input_artifacts` to get insights in the required fields of the application version payload + for artifact in application_version.input_artifacts: + print(artifact.to_json()) + return application_version, artifact + + +@app.cell +def _(mo): + mo.md(r"""# Trigger an run for an application version""") + + +@app.cell +def _(client): + import os + + from aignostics.samples import input_samples + from aignx.codegen.models import ApplicationVersion, RunCreationRequest + + os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/Users/akunft/Downloads/aignx-platform-api-shsodcule-9086ce65109a.json" + + application_run = client.runs.create( + RunCreationRequest( + application_version=ApplicationVersion("212470c6-103e-429e-a9a0-0f662166faf5"), + items=input_samples.three_spots_payload() + ) + ) + print(application_run) + return ( + ApplicationVersion, + RunCreationRequest, + application_run, + input_samples, + os, + ) + + +@app.cell +def _(mo): + mo.md(r"""# Download application run results""") + + +@app.cell +def _(application_run): + from aignostics.resources.runs import ApplicationRun + # if you have a reference to an application run + download_folder = "/tmp/" + application_run.download_to_folder(download_folder) + + # if you want to check on the status when you do not have a reference to the application run anymore + # ApplicationRun.for_application_run_id("").download_to_folder(download_folder) + return ApplicationRun, download_folder + + +@app.cell +def _(): + return + + +if __name__ == "__main__": + app.run() diff --git a/noxfile.py b/noxfile.py index adfa740b..1fd49509 100644 --- a/noxfile.py +++ b/noxfile.py @@ -42,7 +42,7 @@ def _is_act_environment() -> bool: return os.environ.get("GITHUB_WORKFLOW_RUNTIME") == "ACT" -@nox.session(python=["3.13"]) +@nox.session(python=["3.12"]) def lint(session: nox.Session) -> None: """Run code formatting checks, linting, and static type checking.""" _setup_venv(session) diff --git a/pyproject.toml b/pyproject.toml index cf36ff72..c14fe242 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -75,12 +75,9 @@ dependencies = [ "jsf>=0.11.2", "jsonschema>=4.23.0", "pyjwt>=2.10.1", - "pyrfc6266>=1.0.2", - "python-dateutil>=2.9.0.post0", "python-dotenv>=1.1.0", # Can be removed later "requests>=2.32.3", "requests-oauthlib>=2.0.0", - "tifffile>=2025.1.10", "tqdm>=4.67.1", "urllib3>=2.2.3", ] @@ -103,7 +100,7 @@ build-backend = "hatchling.build" include = ["src/*", "codegen/*"] [tool.hatch.build.targets.wheel] -packages = ["src/aignostics", "codegen/aignx", "src/aignx"] +packages = ["src/aignostics", "codegen/aignostics"] [tool.hatch.build.targets.wheel.force-include] "codegen" = "codegen" diff --git a/schema/config.json b/schema/config.json index b3cc9010..91c9d8b4 100644 --- a/schema/config.json +++ b/schema/config.json @@ -4,7 +4,7 @@ "modelTests": false, "modelDocs": false, "apis": "Externals", - "apiTests": false, + "apiTests": true, "apiDocs": true, "supportingFiles": "configuration.py,rest.py,api_client.py,exceptions.py,api_response.py" }, diff --git a/schema/generate.sh b/schema/generate.sh index 8c7d0939..298ac2b2 100755 --- a/schema/generate.sh +++ b/schema/generate.sh @@ -6,6 +6,7 @@ docker run --rm -u "$(id -u):$(id -g)" -v "${PWD}:/local" openapitools/openapi-g -o /local/codegen \ -c /local/schema/config.json \ # Hotfix for https://github.com/OpenAPITools/openapi-generator/issues/18932 +# create __init__.py files ls codegen/aignx/codegen/models/ | awk -F . '/[a-z].py/ {print "from ."$1" import *"}' > codegen/aignx/codegen/models/__init__.py @@ -21,4 +22,4 @@ ls codegen/aignx/codegen/models/ | awk -F . '/[a-z].py/ {print "from ."$1" impor # -c /local/schema/config.json \ # -a "Authorization:Bearer $TOKEN" ## Hotfix for https://github.com/OpenAPITools/openapi-generator/issues/18932 -#ls codegen/aignx/codegen/models/ | awk -F . '/[a-z].py/ {print "from ."$1" import *"}' > codegen/aignx/codegen/models/__init__.py +#ls codegen/aignostics/codegen/models/ | awk -F . '/[a-z].py/ {print "from ."$1" import *"}' > codegen/aignostics/codegen/models/__init__.py diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index 60ecfe19..cce5ef07 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -6,7 +6,7 @@ import yaml from rich.console import Console -import aignx.platform +import aignostics.client from . import APIVersion, InfoOutputFormat, OpenAPIOutputFormat, Service, __version__ from .utils import prepare_cli @@ -26,7 +26,7 @@ @applications_app.command("list") def applications_list() -> None: """List AI applications.""" - papi_client = aignx.platform.Client() + papi_client = aignostics.client.Client() applications = papi_client.applications.list() _console.print(applications) diff --git a/src/aignostics/client/__init__.py b/src/aignostics/client/__init__.py new file mode 100644 index 00000000..e533905d --- /dev/null +++ b/src/aignostics/client/__init__.py @@ -0,0 +1 @@ +from aignostics.client._client import Client as Client diff --git a/src/aignx/platform/_authentication.py b/src/aignostics/client/_authentication.py similarity index 63% rename from src/aignx/platform/_authentication.py rename to src/aignostics/client/_authentication.py index 958c0ec1..1f13d0b4 100644 --- a/src/aignx/platform/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -14,7 +14,7 @@ from requests_oauthlib import OAuth2Session # load client ids -load_dotenv() +load_dotenv(dotenv_path=Path.home() / ".aignostics/env") CLIENT_ID_DEVICE = os.getenv("CLIENT_ID_DEVICE") CLIENT_ID_INTERACTIVE = os.getenv("CLIENT_ID_INTERACTIVE") @@ -26,6 +26,11 @@ TOKEN_URL = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" DEVICE_URL = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/device/code" +# AUDIENCE = "https://aignostics-platform-staging-samia" +# AUTHORIZATION_BASE_URL = "https://aignostics-platform-staging.eu.auth0.com/authorize" +# TOKEN_URL = "https://aignostics-platform-staging.eu.auth0.com/oauth/token" +# DEVICE_URL = "https://aignostics-platform-staging.eu.auth0.com/oauth/device/code" + # constants for token caching CLIENT_APP_NAME = "python-sdk" CACHE_DIR = appdirs.user_cache_dir(CLIENT_APP_NAME, "aignostics") @@ -35,6 +40,18 @@ def get_token(store: bool = True): + """Retrieves an authentication token, either from cache or via login. + + Args: + store: Boolean indicating whether to store the token to disk cache. + Defaults to True. + + Returns: + str: The JWT access token. + + Raises: + RuntimeError: If token retrieval fails. + """ if not store: return _login() @@ -52,8 +69,7 @@ def get_token(store: bool = True): return token # If we got here, we need a new token - refresh_token = os.getenv("AIGNX_REFRESH_TOKEN") - if refresh_token: + if refresh_token := os.getenv("AIGNX_REFRESH_TOKEN"): new_token = _token_from_refresh_token(refresh_token) else: new_token = _login() @@ -71,7 +87,18 @@ def get_token(store: bool = True): def _login() -> str: - """Allows the user to login, returns the JSON Web Token.""" + """Allows the user to login and obtain an access token. + + Determines the appropriate authentication flow based on whether + a browser can be opened, then executes that flow. + + Returns: + str: The JWT access token. + + Raises: + RuntimeError: If authentication fails. + AssertionError: If the returned token doesn't have the expected format. + """ flow_type = "browser" if _can_open_browser() else "device" if flow_type == "browser": token = _perform_authorization_code_with_pkce_flow() @@ -82,6 +109,11 @@ def _login() -> str: def _can_open_browser() -> bool: + """Checks if a browser can be opened for authentication. + + Returns: + bool: True if a browser can be opened, False otherwise. + """ launch_browser = False try: _ = webbrowser.get() @@ -93,13 +125,31 @@ def _can_open_browser() -> bool: class _OAuthHttpServer(HTTPServer): + """HTTP server for OAuth authorization code flow. + + Extends HTTPServer to store the authorization code received during OAuth flow. + """ def __init__(self, *args, **kwargs): + """Initializes the server with storage for the authorization code. + + Args: + *args: Variable length argument list passed to parent. + **kwargs: Arbitrary keyword arguments passed to parent. + """ HTTPServer.__init__(self, *args, **kwargs) self.authorization_code = "" class _OAuthHttpHandler(BaseHTTPRequestHandler): + """HTTP request handler for OAuth authorization code flow. + + Processes the OAuth callback redirect and extracts the authorization code. + """ def do_GET(self): + """Handles GET requests containing OAuth response parameters. + + Extracts authorization code or error from the URL and updates the server state. + """ self.send_response(200) self.send_header("Content-Type", "text/html") self.end_headers() @@ -129,14 +179,34 @@ def do_GET(self): self.wfile.write(response + status) def log_message(self, format, *args): - pass + """Suppresses log messages from the HTTP server. + + Args: + format: The log message format string. + *args: The arguments to be applied to the format string. + """ def _perform_authorization_code_with_pkce_flow(): + """Performs the OAuth 2.0 Authorization Code flow with PKCE. + + Opens a browser for user authentication and uses a local redirect + to receive the authorization code. + + Returns: + str: The JWT access token. + + Raises: + RuntimeError: If authentication fails. + """ parsed_redirect = urlparse(REDIRECT_URI) - with _OAuthHttpServer((parsed_redirect.hostname, parsed_redirect.port), _OAuthHttpHandler) as httpd: + with _OAuthHttpServer( + (parsed_redirect.hostname, parsed_redirect.port), _OAuthHttpHandler + ) as httpd: # initialize flow (generate code_challenge and code_verifier) - session = OAuth2Session(CLIENT_ID_INTERACTIVE, scope=SCOPE, redirect_uri=REDIRECT_URI, pkce="S256") + session = OAuth2Session( + CLIENT_ID_INTERACTIVE, scope=SCOPE, redirect_uri=REDIRECT_URI, pkce="S256" + ) authorization_url, state = session.authorization_url( AUTHORIZATION_BASE_URL, access_type="offline", audience=AUDIENCE ) @@ -155,9 +225,22 @@ def _perform_authorization_code_with_pkce_flow(): def _perform_device_flow(): - resp = requests.post(DEVICE_URL, data={"client_id": CLIENT_ID_DEVICE, "scope": SCOPE, "audience": AUDIENCE}) + """Performs the OAuth 2.0 Device Authorization flow. + + Used when a browser cannot be opened. Provides a URL for the user to visit + on another device and polls for authorization completion. + + Returns: + str: The JWT access token. + + Raises: + RuntimeError: If authentication fails or is denied. + """ + resp = requests.post( + DEVICE_URL, data={"client_id": CLIENT_ID_DEVICE, "scope": SCOPE, "audience": AUDIENCE} + ) device_code = resp.json()["device_code"] - print(f"Please visit: {resp.json()['verification_uri_complete']}") + print(f'Please visit: {resp.json()["verification_uri_complete"]}') # Polling for access token with received device code while True: @@ -180,6 +263,17 @@ def _perform_device_flow(): def _token_from_refresh_token(refresh_token: str): + """Obtains a new access token using a refresh token. + + Args: + refresh_token: The refresh token to use for obtaining a new access token. + + Returns: + str: The new JWT access token. + + Raises: + RuntimeError: If token refresh fails. + """ while True: resp = requests.post( TOKEN_URL, diff --git a/src/aignostics/client/_client.py b/src/aignostics/client/_client.py new file mode 100644 index 00000000..ea4c9042 --- /dev/null +++ b/src/aignostics/client/_client.py @@ -0,0 +1,58 @@ +from aignostics.client._authentication import get_token +from aignostics.client.resources.applications import Applications, Versions +from aignostics.client.resources.runs import Runs +from aignx.codegen.api.externals_api import ExternalsApi +from aignx.codegen.api_client import ApiClient +from aignx.codegen.configuration import Configuration + +API_ROOT = "https://platform-dev.aignostics.com" +# API_ROOT = "https://platform-staging.aignostics.ai" + + +class Client: + """Main client for interacting with the Aignostics Platform API. + + Provides access to platform resources like applications, versions, and runs. + Handles authentication and API client configuration. + """ + def __init__(self, cache_token: bool = True): + """Initializes a client instance with authenticated API access. + + Args: + cache_token (bool): If True, caches the authentication token. + Defaults to True. + + Sets up resource accessors for applications, versions, and runs. + """ + self._api = Client._get_api_client(cache_token=cache_token) + self.applications: Applications = Applications(self._api) + self.versions: Versions = Versions(self._api) + self.runs: Runs = Runs(self._api) + + @staticmethod + def _get_api_client(cache_token: bool = True) -> ExternalsApi: + """Creates and configures an authenticated API client. + + Args: + cache_token (bool): If True, caches the authentication token. + Defaults to True. + + Returns: + ExternalsApi: Configured API client with authentication token. + + Raises: + RuntimeError: If authentication fails. + """ + token = get_token(store=cache_token) + client = ApiClient( + Configuration( + host=API_ROOT, + # debug=True, + # the following can be used if the auth is set in the schema + # api_key={"Authorization": T}, + # api_key_prefix={"Authorization": "Bearer"}, + ), + header_name="Authorization", + header_value=f"Bearer {token}" + ) + return ExternalsApi(client) diff --git a/src/aignostics/client/resources/applications.py b/src/aignostics/client/resources/applications.py new file mode 100644 index 00000000..02580baf --- /dev/null +++ b/src/aignostics/client/resources/applications.py @@ -0,0 +1,78 @@ +from aignx.codegen.api.externals_api import ExternalsApi +from aignx.codegen.models import ApplicationReadResponse, ApplicationVersionReadResponse, VersionReadResponse + + +class Versions: + """Resource class for managing application versions. + + Provides operations to list and retrieve application versions. + """ + def __init__(self, api: ExternalsApi): + """Initializes the Versions resource with the API client. + + Args: + api: The configured API client. + """ + self._api = api + + def list(self, for_application: ApplicationReadResponse | str) -> list[ApplicationVersionReadResponse]: + """Lists all versions for a specific application. + + Args: + for_application: Either an ApplicationReadResponse object or + an application ID string. + + Returns: + list[ApplicationVersionReadResponse]: A list of application versions. + + Raises: + Exception: If the API request fails. + """ + if isinstance(for_application, ApplicationReadResponse): + application_id = for_application.application_id + else: + application_id = for_application + res = self._api.list_versions_by_application_id_v1_applications_application_id_versions_get(application_id=application_id) + return res + + def details(self, for_application_version_id: str) -> VersionReadResponse: + """Retrieves details for a specific application version. + + Args: + for_application_version_id: The ID of the application version. + + Returns: + VersionReadResponse: The version details. + + Raises: + Exception: If the API request fails. + """ + return self._api.get_version_v1_versions_application_version_id_get(application_version_id=for_application_version_id) + + +class Applications: + """Resource class for managing applications. + + Provides operations to list applications and access version resources. + """ + + def __init__(self, api: ExternalsApi): + """Initializes the Applications resource with the API client. + + Args: + api: The configured API client. + """ + self._api = api + self.versions: Versions = Versions(self._api) + + def list(self) -> list[ApplicationReadResponse]: + """Lists all available applications. + + Returns: + list[ApplicationReadResponse]: A list of applications. + + Raises: + Exception: If the API request fails. + """ + res = self._api.list_applications_v1_applications_get() + return res diff --git a/src/aignx/platform/resources/runs.py b/src/aignostics/client/resources/runs.py similarity index 63% rename from src/aignx/platform/resources/runs.py rename to src/aignostics/client/resources/runs.py index ecc5df6d..56557683 100644 --- a/src/aignx/platform/resources/runs.py +++ b/src/aignostics/client/resources/runs.py @@ -6,6 +6,8 @@ from jsonschema.exceptions import ValidationError from jsonschema.validators import validate +from aignostics.client.resources.applications import Versions +from aignostics.client.utils import _calculate_file_crc32c, _download_file, mime_type_to_file_ending from aignx.codegen.api.externals_api import ExternalsApi from aignx.codegen.models import ( ApplicationRunStatus, @@ -15,25 +17,57 @@ RunCreationResponse, RunReadResponse, ) -from aignx.platform.resources.applications import Versions -from aignx.platform.utils import _calculate_file_crc32c, _download_file, mime_type_to_file_ending class ApplicationRun: + """Represents a single application run. + + Provides operations to check status, retrieve results, and download artifacts. + """ def __init__(self, api: ExternalsApi, application_run_id: str): + """Initializes an ApplicationRun instance. + + Args: + api: The configured API client. + application_run_id: The ID of the application run. + """ self._api = api self.application_run_id = application_run_id @classmethod def for_application_run_id(cls, application_run_id: str) -> "ApplicationRun": - from aignx.platform import Client + """Creates an ApplicationRun instance for an existing run. + + Args: + application_run_id: The ID of the application run. + + Returns: + ApplicationRun: The initialized ApplicationRun instance. + """ + from aignostics.client import Client return cls(Client._get_api_client(), application_run_id) def status(self) -> RunReadResponse: + """Retrieves the current status of the application run. + + Returns: + RunReadResponse: The run status details. + + Raises: + Exception: If the API request fails. + """ res = self._api.get_run_v1_runs_application_run_id_get(self.application_run_id, include=None) return res def item_status(self) -> dict[str, ItemStatus]: + """Retrieves the status of all items in the run. + + Returns: + dict[str, ItemStatus]: A dictionary mapping item references to their status. + + Raises: + Exception: If the API request fails. + """ results = self.results() item_status = {} for item in results: @@ -41,14 +75,38 @@ def item_status(self) -> dict[str, ItemStatus]: return item_status def cancel(self): + """Cancels the application run. + + Raises: + Exception: If the API request fails. + """ res = self._api.cancel_run_v1_runs_application_run_id_cancel_post(self.application_run_id) def results(self) -> list[ItemResultReadResponse]: + """Retrieves the results of all items in the run. + + Returns: + list[ItemResultReadResponse]: A list of item results. + + Raises: + Exception: If the API request fails. + """ # TODO(andreas): paging, sorting res = self._api.list_run_results_v1_runs_application_run_id_results_get(self.application_run_id) return res def download_to_folder(self, download_base: Path | str): + """Downloads all result artifacts to a folder. + + Monitors run progress and downloads results as they become available. + + Args: + download_base: Base directory to download results to. + + Raises: + ValueError: If the provided path is not a directory. + Exception: If downloads or API requests fail. + """ # create application run base folder download_base = Path(download_base) if not download_base.is_dir(): @@ -75,6 +133,18 @@ def download_to_folder(self, download_base: Path | str): @staticmethod def ensure_artifacts_downloaded(base_folder: Path, item: ItemResultReadResponse): + """Ensures all artifacts for an item are downloaded. + + Downloads missing or partially downloaded artifacts and verifies their integrity. + + Args: + base_folder: Base directory to download artifacts to. + item: The item result containing the artifacts to download. + + Raises: + ValueError: If checksums don't match. + Exception: If downloads fail. + """ item_dir = base_folder / item.reference downloaded_at_least_one_artifact = False @@ -104,6 +174,13 @@ def ensure_artifacts_downloaded(base_folder: Path, item: ItemResultReadResponse) print(f"Results for item: {item.reference} already present in {item_dir}") def __str__(self): + """Returns a string representation of the application run. + + The string includes run ID, status, and item statistics. + + Returns: + str: String representation of the application run. + """ app_status = self.status().status.value item_status = self.item_status() pending, succeeded, error = 0, 0, 0 @@ -121,19 +198,56 @@ def __str__(self): class Runs: + """Resource class for managing application runs. + + Provides operations to create, list, and retrieve runs. + """ def __init__(self, api: ExternalsApi): + """Initializes the Runs resource with the API client. + + Args: + api: The configured API client. + """ self._api = api def __call__(self, application_run_id: str) -> ApplicationRun: + """Retrieves an ApplicationRun instance for an existing run. + + Args: + application_run_id: The ID of the application run. + + Returns: + ApplicationRun: The initialized ApplicationRun instance. + """ return ApplicationRun(self._api, application_run_id) def create(self, payload: RunCreationRequest) -> ApplicationRun: + """Creates a new application run. + + Args: + payload: The run creation request payload. + + Returns: + ApplicationRun: The created application run. + + Raises: + ValueError: If the payload is invalid. + Exception: If the API request fails. + """ self._validate_input_items(payload) res: RunCreationResponse = self._api.create_application_run_v1_runs_post(payload) return ApplicationRun(self._api, res.application_run_id) def generate_example_payload(self, application_version_id: str): - app_version = Versions(self._api)(for_application_version_id=application_version_id) + """Generates an example payload for creating a run. + + Args: + application_version_id: The ID of the application version. + + Raises: + Exception: If the API request fails. + """ + app_version = Versions(self._api).details(for_application_version_id=application_version_id) schema_idx = { input_artifact.name: input_artifact.metadata_schema for input_artifact in app_version.input_artifacts @@ -156,6 +270,17 @@ def generate_example_payload(self, application_version_id: str): # validate(artifact.metadata, schema=schema_idx[artifact.name]) def list(self, for_application_version: str = None) -> list[ApplicationRun]: + """Lists application runs, optionally filtered by application version. + + Args: + for_application_version: Optional application version ID to filter by. + + Returns: + list[ApplicationRun]: A list of application runs. + + Raises: + Exception: If the API request fails. + """ # TODO(andreas): pagination if not for_application_version: res = self._api.list_application_runs_v1_runs_get() @@ -167,8 +292,20 @@ def list(self, for_application_version: str = None) -> list[ApplicationRun]: ] def _validate_input_items(self, payload: RunCreationRequest): + """Validates the input items in a run creation request. + + Checks that references are unique, all required artifacts are provided, + and artifact metadata matches the expected schema. + + Args: + payload: The run creation request payload. + + Raises: + ValueError: If validation fails. + Exception: If the API request fails. + """ # validate metadata based on schema of application version - app_version = Versions(self._api)(for_application_version_id=payload.application_version.actual_instance) + app_version = Versions(self._api).details(for_application_version_id=payload.application_version.actual_instance) schema_idx = { input_artifact.name: input_artifact.metadata_schema for input_artifact in app_version.input_artifacts diff --git a/src/aignx/platform/__main__.py b/src/aignostics/client/samples/input_samples.py similarity index 62% rename from src/aignx/platform/__main__.py rename to src/aignostics/client/samples/input_samples.py index cf90b377..d78b4830 100644 --- a/src/aignx/platform/__main__.py +++ b/src/aignostics/client/samples/input_samples.py @@ -1,21 +1,5 @@ -from pathlib import Path - -import aignx.platform -from aignx.codegen.models import ( - ApplicationVersion, - InputArtifactCreationRequest, - ItemCreationRequest, - RunCreationRequest, -) -from aignx.platform.utils import _generate_signed_url - -DEMO_SLIDE_URL = "gs://platform-api-application-test-data/heta/slides/8c7b079e-8b8a-4036-bfde-5818352b503a.tiff" -DOWNLOAD_PATH = (Path(__file__) / "../../../../out").resolve() - - -def printall(list): - for i in list: - print(i) +from aignostics.client.utils import _generate_signed_url +from aignx.codegen.models import InputArtifactCreationRequest, ItemCreationRequest def three_spots_payload(): @@ -72,24 +56,3 @@ def three_spots_payload(): ] ) ] - - -def main(): - platform = aignx.platform.Client() - printall(platform.applications.list()) - printall(platform.versions.list(for_application="f7aa7f53-3b4c-476a-bc25-561ef9cfbf6d")) - # # heta v0.3.4 - application_version_id = "8fbd3a43-d08d-41c1-8ad7-90ee69743b9d" - application_run = platform.runs.create( - RunCreationRequest( - application_version=ApplicationVersion(application_version_id), - items=three_spots_payload() - ) - ) - print(application_run) - # run = ApplicationRun.for_application_run_id("0feb2cc6-c6c0-4c31-90ba-e452266f9195") - # run.download_to_folder("/Users/akunft/tmp/papi_pre_alpha") - - -if __name__ == "__main__": - main() diff --git a/src/aignx/platform/utils.py b/src/aignostics/client/utils.py similarity index 62% rename from src/aignx/platform/utils.py rename to src/aignostics/client/utils.py index 16348d62..6a9fe311 100644 --- a/src/aignx/platform/utils.py +++ b/src/aignostics/client/utils.py @@ -16,8 +16,16 @@ def mime_type_to_file_ending(mime_type: str) -> str: - """ - Convert a mime type to a file ending. + """Converts a MIME type to an appropriate file extension. + + Args: + mime_type: The MIME type string to convert. + + Returns: + str: The corresponding file extension including the dot. + + Raises: + ValueError: If the MIME type is not recognized. """ if mime_type == "image/png": return ".png" @@ -33,6 +41,17 @@ def mime_type_to_file_ending(mime_type: str) -> str: def _download_file(signed_url: str, file_path: str, verify_checksum: str) -> None: + """Downloads a file from a signed URL and verifies its integrity. + + Args: + signed_url: The signed URL to download the file from. + file_path: The local path where the file should be saved. + verify_checksum: The expected CRC32C checksum in base64 encoding. + + Raises: + ValueError: If the downloaded file's checksum doesn't match the expected value. + requests.HTTPError: If the download request fails. + """ checksum = google_crc32c.Checksum() with requests.get(signed_url, stream=True) as stream: stream.raise_for_status() @@ -51,6 +70,17 @@ def _download_file(signed_url: str, file_path: str, verify_checksum: str) -> Non def _generate_signed_url(fully_qualified_gs_path: str): + """Generates a signed URL for a Google Cloud Storage object. + + Args: + fully_qualified_gs_path: The full GS path (gs://bucket/path/to/object). + + Returns: + str: A signed URL that can be used to download the object. + + Raises: + ValueError: If the GS path is invalid or the blob doesn't exist. + """ pattern = r"gs://(?P[^/]+)/(?P.*)" m = re.fullmatch(pattern, fully_qualified_gs_path) if not m: @@ -73,6 +103,14 @@ def _generate_signed_url(fully_qualified_gs_path: str): def _calculate_file_crc32c(file: Path) -> str: + """Calculates the CRC32C checksum of a file. + + Args: + file: Path to the file to calculate the checksum for. + + Returns: + str: The CRC32C checksum in base64 encoding. + """ checksum = google_crc32c.Checksum() with open(file, "rb") as file: for _ in checksum.consume(file, EIGHT_MB): @@ -82,6 +120,19 @@ def _calculate_file_crc32c(file: Path) -> str: @contextlib.contextmanager def download_temporarily(signed_url: str, verify_checksum: str) -> Generator[IO[bytes], Any, None]: + """Downloads a file to a temporary location and provides file handle. + + Args: + signed_url: The signed URL to download the file from. + verify_checksum: The expected CRC32C checksum in base64 encoding. + + Yields: + IO[bytes]: File handle to the downloaded temporary file. + + Raises: + ValueError: If the downloaded file's checksum doesn't match the expected value. + requests.HTTPError: If the download request fails. + """ with tempfile.NamedTemporaryFile() as file: _download_file(signed_url, file.name, verify_checksum) yield file diff --git a/src/aignx/platform/__init__.py b/src/aignx/platform/__init__.py deleted file mode 100644 index cc4fa6c8..00000000 --- a/src/aignx/platform/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from aignx.platform._client import Client as Client diff --git a/src/aignx/platform/_client.py b/src/aignx/platform/_client.py deleted file mode 100644 index 53c55870..00000000 --- a/src/aignx/platform/_client.py +++ /dev/null @@ -1,37 +0,0 @@ -import httpx - -from aignx.codegen.api.externals_api import ExternalsApi -from aignx.codegen.api_client import ApiClient -from aignx.codegen.configuration import Configuration -from aignx.platform._authentication import get_token -from aignx.platform.resources.applications import Applications, Versions -from aignx.platform.resources.runs import Runs - -API_ROOT = "https://platform-dev.aignostics.com" - - -class Client: - def __init__(self): - self._api = Client._get_api_client() - self.applications: Applications = Applications(self._api) - self.versions: Versions = Versions(self._api) - self.runs: Runs = Runs(self._api) - - def _check_health(self): - httpx.get(str(API_ROOT) + "/health") - - @staticmethod - def _get_api_client() -> ExternalsApi: - token = get_token() - client = ApiClient( - Configuration( - host=API_ROOT, - # debug=True, - # the following can be used if the auth is set in the schema - # api_key={"Authorization": T}, - # api_key_prefix={"Authorization": "Bearer"}, - ), - header_name="Authorization", - header_value=f"Bearer {token}", - ) - return ExternalsApi(client) diff --git a/src/aignx/platform/resources/applications.py b/src/aignx/platform/resources/applications.py deleted file mode 100644 index c8fcc914..00000000 --- a/src/aignx/platform/resources/applications.py +++ /dev/null @@ -1,33 +0,0 @@ -from aignx.codegen.api.externals_api import ExternalsApi -from aignx.codegen.models import ApplicationVersionReadResponse, VersionReadResponse -from aignx.codegen.models.application_read_response import ApplicationReadResponse - - -class Versions: - def __init__(self, api: ExternalsApi): - self._api = api - - def list(self, for_application: ApplicationReadResponse | str) -> list[ApplicationVersionReadResponse]: - if isinstance(for_application, ApplicationReadResponse): - application_id = for_application.application_id - else: - application_id = for_application - res = self._api.list_versions_by_application_id_v1_applications_application_id_versions_get( - application_id=application_id - ) - return res - - def __call__(self, for_application_version_id: str) -> VersionReadResponse: - return self._api.get_version_v1_versions_application_version_id_get( - application_version_id=for_application_version_id - ) - - -class Applications: - def __init__(self, api: ExternalsApi): - self._api = api - self.versions = Versions(self._api) - - def list(self) -> list[ApplicationReadResponse]: - res = self._api.list_applications_v1_applications_get() - return res diff --git a/tests/aignx/platform/applications_test.py b/tests/aignostics/client/applications_test.py similarity index 95% rename from tests/aignx/platform/applications_test.py rename to tests/aignostics/client/applications_test.py index 71a4d7b1..f2f38ed8 100644 --- a/tests/aignx/platform/applications_test.py +++ b/tests/aignostics/client/applications_test.py @@ -2,10 +2,10 @@ import pytest +from aignostics.client.resources.applications import Applications, Versions from aignx.codegen.api.externals_api import ExternalsApi from aignx.codegen.models import ApplicationVersionReadResponse -from aignx.platform.resources.applications import Applications, Versions -from codegen.aignx.codegen.models.application_read_response import ApplicationReadResponse +from aignx.codegen.models.application_read_response import ApplicationReadResponse @pytest.fixture diff --git a/tests/aignostics/client/scheduled_test.py b/tests/aignostics/client/scheduled_test.py new file mode 100644 index 00000000..5704f3c2 --- /dev/null +++ b/tests/aignostics/client/scheduled_test.py @@ -0,0 +1,51 @@ +import tempfile +from pathlib import Path + +import pytest + +import aignostics.client +from aignostics.client.samples import input_samples +from aignostics.client.utils import _calculate_file_crc32c, mime_type_to_file_ending +from aignx.codegen.models import ApplicationRunStatus, ApplicationVersion, ItemStatus, RunCreationRequest + + +@pytest.mark.timeout(240) +def test_two_task_dummy_app(): + application_version = "60e7b441-307a-4b41-8a97-5b02e7bc73a4" + print(f"Create application run for application version: {application_version}") + platform = aignostics.client.Client(cache_token=False) + application_run = platform.runs.create( + RunCreationRequest( + application_version=ApplicationVersion(application_version), + items=input_samples.three_spots_payload() + ) + ) + + with tempfile.TemporaryDirectory() as dir: + dir = Path(dir) + application_run.download_to_folder(dir) + + assert application_run.status().status == ApplicationRunStatus.COMPLETED, "Application run did not finish in completed status" + + run_result_folder = dir / application_run.application_run_id + assert run_result_folder.exists(), "Application run result folder does not exist" + + run_results = application_run.results() + + for item in run_results: + # validate status + assert item.status == ItemStatus.SUCCEEDED + # validate results + item_dir = run_result_folder / item.reference + assert item_dir.exists(), f"Result folder for item {item.reference} does not exist" + + for artifact in item.output_artifacts: + assert artifact.download_url is not None, f"{artifact} should provide an download url" + # check if file exists + file_ending = mime_type_to_file_ending(artifact.mime_type) + file_path = item_dir / f"{artifact.name}{file_ending}" + assert file_path.exists(), f"Artifact {artifact} was not downloaded" + # validate checksum + checksum = artifact.metadata["checksum_crc32c"] + file_checksum = _calculate_file_crc32c(file_path) + assert file_checksum == checksum, f"Metadata checksum != file checksum {checksum} <> {file_checksum}" diff --git a/tests/aignx/platform/two_task_dummy_app_test.py b/tests/aignx/platform/two_task_dummy_app_test.py deleted file mode 100644 index 3a0fbca4..00000000 --- a/tests/aignx/platform/two_task_dummy_app_test.py +++ /dev/null @@ -1,112 +0,0 @@ -import tempfile -from pathlib import Path - -import pytest - -import aignx.platform -from aignx.codegen.models import ( - ApplicationRunStatus, - ApplicationVersion, - InputArtifactCreationRequest, - ItemCreationRequest, - ItemStatus, - RunCreationRequest, -) -from aignx.platform.utils import _calculate_file_crc32c, _generate_signed_url, mime_type_to_file_ending - - -def three_spots_payload(): - return [ - ItemCreationRequest( - reference="1", - input_artifacts=[ - InputArtifactCreationRequest( - name="user_slide", - download_url=_generate_signed_url( - "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" - ), - metadata={ - "checksum_crc32c": "N+LWCg==", - "base_mpp": 0.46499982, - "width": 3728, - "height": 3640, - }, - ) - ], - ), - ItemCreationRequest( - reference="2", - input_artifacts=[ - InputArtifactCreationRequest( - name="user_slide", - download_url=_generate_signed_url( - "gs://aignx-storage-service-dev/sample_data_formatted/8c7b079e-8b8a-4036-bfde-5818352b503a.tiff" - ), - metadata={ - "checksum_crc32c": "w+ud3g==", - "base_mpp": 0.46499982, - "width": 3616, - "height": 3400, - }, - ) - ], - ), - ItemCreationRequest( - reference="3", - input_artifacts=[ - InputArtifactCreationRequest( - name="user_slide", - download_url=_generate_signed_url( - "gs://aignx-storage-service-dev/sample_data_formatted/1f4f366f-a2c5-4407-9f5e-23400b22d50e.tiff" - ), - metadata={ - "checksum_crc32c": "Zmx0wA==", - "base_mpp": 0.46499982, - "width": 4016, - "height": 3952, - }, - ) - ], - ), - ] - - -@pytest.mark.timeout(2) # TODO (Helmut): Revert to 240 -def test_two_task_dummy_app(): - application_version = "60e7b441-307a-4b41-8a97-5b02e7bc73a4" - print(f"Create application run for application version: {application_version}") - platform = aignx.platform.Client() - application_run = platform.runs.create( - RunCreationRequest(application_version=ApplicationVersion(application_version), items=three_spots_payload()) - ) - - with tempfile.TemporaryDirectory() as dir: - dir = Path(dir) - application_run.download_to_folder(dir) - - assert application_run.status().status == ApplicationRunStatus.COMPLETED, ( - "Application run did not finish in completed status" - ) - - run_result_folder = dir / application_run.application_run_id - assert run_result_folder.exists(), "Application run result folder does not exist" - - run_results = application_run.results() - - for item in run_results: - # validate status - assert item.status == ItemStatus.SUCCEEDED - # validate results - item_dir = run_result_folder / item.reference - assert item_dir.exists(), f"Result folder for item {item.reference} does not exist" - - for artifact in item.output_artifacts: - assert artifact.download_url is not None, f"{artifact} should provide an download url" - # check if file exists - file_ending = mime_type_to_file_ending(artifact.mime_type) - file_path = item_dir / f"{artifact.name}{file_ending}" - assert file_path.exists(), f"Artifact {artifact} was not downloaded" - # validate checksum - checksum = artifact.metadata["checksum_crc32c"] - file_checksum = _calculate_file_crc32c(file_path) - assert file_checksum == checksum, f"Metadata checksum != file checksum {checksum} <> {file_checksum}" diff --git a/uv.lock b/uv.lock index 99af9852..c17d19b4 100644 --- a/uv.lock +++ b/uv.lock @@ -25,12 +25,9 @@ dependencies = [ { name = "pydantic" }, { name = "pydantic-settings" }, { name = "pyjwt" }, - { name = "pyrfc6266" }, - { name = "python-dateutil" }, { name = "python-dotenv" }, { name = "requests" }, { name = "requests-oauthlib" }, - { name = "tifffile" }, { name = "tqdm" }, { name = "typer" }, { name = "urllib3" }, @@ -100,13 +97,10 @@ requires-dist = [ { name = "pydantic", specifier = ">=2.11.1" }, { name = "pydantic-settings", specifier = ">=2.8.1" }, { name = "pyjwt", specifier = ">=2.10.1" }, - { name = "pyrfc6266", specifier = ">=1.0.2" }, - { name = "python-dateutil", specifier = ">=2.9.0.post0" }, { name = "python-dotenv", specifier = ">=1.1.0" }, { name = "requests", specifier = ">=2.32.3" }, { name = "requests-oauthlib", specifier = ">=2.0.0" }, { name = "streamlit", marker = "extra == 'examples'", specifier = ">=1.44.1" }, - { name = "tifffile", specifier = ">=2025.1.10" }, { name = "tqdm", specifier = ">=4.67.1" }, { name = "typer", specifier = ">=0.15.1" }, { name = "urllib3", specifier = ">=2.2.3" }, @@ -3036,18 +3030,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6c/10/a7d0fa5baea8fe7b50f448ab742f26f52b80bfca85ac2be9d35cdd9a3246/pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc", size = 98338 }, ] -[[package]] -name = "pyrfc6266" -version = "1.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyparsing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/74/ef/693fe33d34317facaf26a5716f965dac492d0f47e56e90bf310d7d4e74df/pyrfc6266-1.0.2.tar.gz", hash = "sha256:3c41616b6a1f2e9a26df7f005fbaa634f960121769ccc4445acfb404e9f8fd4c", size = 4454 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/fc/d416c1bfb54f86259f631fd9ff6a9b813f7050129a377d94c43500109479/pyrfc6266-1.0.2-py3-none-any.whl", hash = "sha256:0532307f319566f337dba97577dfaefe493c3e0c40ab211449ba4566fc2cf73d", size = 4729 }, -] - [[package]] name = "pyright" version = "1.1.398" @@ -4136,18 +4118,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154 }, ] -[[package]] -name = "tifffile" -version = "2025.3.30" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3c/54/d5ebe66a9de349b833e570e87bdbd9eec76ec54bd505c24b0591a15783ad/tifffile-2025.3.30.tar.gz", hash = "sha256:3cdee47fe06cd75367c16bc3ff34523713156dae6cd498e3a392e5b39a51b789", size = 366039 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/be/10d23cfd4078fbec6aba768a357eff9e70c0b6d2a07398425985c524ad2a/tifffile-2025.3.30-py3-none-any.whl", hash = "sha256:0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c", size = 226837 }, -] - [[package]] name = "tinycss2" version = "1.4.0" From a063f162038fa408eca2f4858c69423aeaefbd4b Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Thu, 3 Apr 2025 23:39:52 +0200 Subject: [PATCH 019/110] chore(test): Add two task app scheduled test --- .github/workflows/test-scheduled.yml | 18 ++++++++++++++++-- src/aignostics/cli.py | 2 +- tests/aignostics/client/scheduled_test.py | 1 + 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index 915206b3..91631b19 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -2,7 +2,8 @@ name: "CI Scheduled" on: schedule: - - cron: '0 * * * *' + - cron: '0 7 * * *' + workflow_dispatch: jobs: test-scheduled: @@ -33,7 +34,20 @@ jobs: envkey_CLIENT_ID_DEVICE: ${{ secrets.CLIENT_ID_DEVICE }} envkey_CLIENT_ID_INTERACTIVE: ${{ secrets.CLIENT_ID_INTERACTIVE }} fail_on_empty: true + directory: '~/.aignostics' + file_name: 'env' + + - name: Set up cloud credentials + env: + CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} + run: | + echo "$CREDENTIALS" | base64 -d > credentials.json + echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV + + - name: Set up refresh token + env: + AIGNX_REFRESH_TOKEN: ${{ secrets.AIGNX_REFRESH_TOKEN }} - name: Run tests marked as scheduled run: | - uv run --all-extras nox -s test -p 3.11 -- -m scheduled + uv run --all-extras nox -s test -p 3.12 -- -m scheduled diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index cce5ef07..04efc826 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -34,7 +34,7 @@ def applications_list() -> None: @runs_app.command("list") def runs_list() -> None: """List runs.""" - papi_client = aignx.platform.Client() + papi_client = aignostics.client.Client() runs = papi_client.runs.list() _console.print(runs) diff --git a/tests/aignostics/client/scheduled_test.py b/tests/aignostics/client/scheduled_test.py index 5704f3c2..c9ca2005 100644 --- a/tests/aignostics/client/scheduled_test.py +++ b/tests/aignostics/client/scheduled_test.py @@ -10,6 +10,7 @@ @pytest.mark.timeout(240) +@pytest.mark.scheduled def test_two_task_dummy_app(): application_version = "60e7b441-307a-4b41-8a97-5b02e7bc73a4" print(f"Create application run for application version: {application_version}") From 559f1200aa17fe84c7fc7ff8ff7b10d62835f4f7 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Fri, 4 Apr 2025 08:59:02 +0200 Subject: [PATCH 020/110] refactor(codegen): schema now integrated in codegen folder; added make codegen --- Makefile | 18 +- .../codegen/models/application_run_status.py | 41 - .../aignx/codegen/models/artifact_event.py | 36 - .../aignx/codegen/models/artifact_status.py | 41 - codegen/aignx/codegen/models/item_event.py | 35 - codegen/aignx/codegen/models/item_status.py | 39 - .../codegen/models/output_artifact_scope.py | 35 - .../models/output_artifact_visibility.py | 35 - codegen/aignx/codegen/models/quota_name.py | 42 - {schema => codegen}/config.json | 0 {schema => codegen/in}/api.json | 0 codegen/{ => out}/.openapi-generator/FILES | 0 codegen/{ => out}/.openapi-generator/VERSION | 0 .../aignx/codegen/api/externals_api.py | 2300 ++++++++++------- codegen/{ => out}/aignx/codegen/api_client.py | 221 +- .../{ => out}/aignx/codegen/api_response.py | 10 +- .../{ => out}/aignx/codegen/configuration.py | 148 +- codegen/{ => out}/aignx/codegen/exceptions.py | 61 +- .../aignx/codegen/models/__init__.py | 92 +- .../models/application_creation_request.py | 36 +- .../models/application_creation_response.py | 34 +- .../models/application_read_response.py | 36 +- .../codegen/models/application_run_status.py | 43 + .../codegen/models/application_version.py | 51 +- .../application_version_read_response.py | 52 +- .../aignx/codegen/models/artifact_event.py | 38 + .../aignx/codegen/models/artifact_status.py | 43 + .../codegen/models/http_validation_error.py | 39 +- .../aignx/codegen/models/input_artifact.py | 41 +- .../models/input_artifact_creation_request.py | 37 +- .../models/input_artifact_read_response.py | 41 +- .../input_artifact_schema_creation_request.py | 36 +- .../codegen/models/item_creation_request.py | 39 +- .../out/aignx/codegen/models/item_event.py | 37 + .../models/item_event_creation_request.py | 35 +- .../models/item_event_creation_response.py | 35 +- .../codegen/models/item_read_response.py | 43 +- .../models/item_result_read_response.py | 43 +- .../out/aignx/codegen/models/item_status.py | 41 + .../models/organization_creation_request.py | 34 +- .../codegen/models/organization_quota.py | 38 +- .../codegen/models/organization_response.py | 37 +- .../models/organization_update_request.py | 42 +- .../aignx/codegen/models/output_artifact.py | 42 +- .../output_artifact_event_trigger_request.py | 41 +- .../output_artifact_event_trigger_response.py | 35 +- .../models/output_artifact_read_response.py | 42 +- .../output_artifact_result_read_response.py | 45 +- ...output_artifact_schema_creation_request.py | 37 +- .../codegen/models/output_artifact_scope.py | 37 + .../models/output_artifact_visibility.py | 37 + .../codegen/models/payload_input_artifact.py | 37 +- .../aignx/codegen/models/payload_item.py | 43 +- .../codegen/models/payload_output_artifact.py | 39 +- .../out/aignx/codegen/models/quota_name.py | 44 + .../codegen/models/quota_read_response.py | 35 +- .../codegen/models/quota_update_request.py | 35 +- .../codegen/models/quota_update_response.py | 35 +- .../codegen/models/quotas_read_response.py | 39 +- .../codegen/models/quotas_update_request.py | 39 +- .../codegen/models/quotas_update_response.py | 39 +- .../codegen/models/run_creation_request.py | 41 +- .../codegen/models/run_creation_response.py | 34 +- .../aignx/codegen/models/run_read_response.py | 43 +- .../codegen/models/slug_version_request.py | 39 +- .../aignx/codegen/models/transfer_urls.py | 35 +- .../codegen/models/user_creation_request.py | 38 +- .../aignx/codegen/models/user_payload.py | 45 +- .../aignx/codegen/models/user_quota.py | 38 +- .../aignx/codegen/models/user_response.py | 45 +- .../codegen/models/user_update_request.py | 42 +- .../aignx/codegen/models/validation_error.py | 39 +- .../models/validation_error_loc_inner.py | 50 +- .../models/version_creation_request.py | 43 +- .../models/version_creation_response.py | 34 +- .../codegen/models/version_read_response.py | 49 +- codegen/{ => out}/aignx/codegen/rest.py | 55 +- codegen/{ => out}/docs/ExternalsApi.md | 95 +- codegen/{ => out}/test/test_externals_api.py | 30 +- docs/source/_static/openapi_v1.yaml | 43 +- examples/playbook.py | 13 +- install.sh | 1 + pyproject.toml | 19 +- schema/generate.sh | 25 - src/aignostics/client/_authentication.py | 16 +- src/aignostics/client/_client.py | 10 +- .../client/resources/applications.py | 9 +- src/aignostics/client/resources/runs.py | 30 +- .../client/samples/input_samples.py | 17 +- src/aignostics/client/utils.py | 6 +- src/aignostics/service.py | 2 +- .../cli/core_test.py} | 0 tests/aignostics/client/applications_test.py | 12 +- tests/aignostics/client/scheduled_test.py | 9 +- 94 files changed, 3307 insertions(+), 2506 deletions(-) delete mode 100644 codegen/aignx/codegen/models/application_run_status.py delete mode 100644 codegen/aignx/codegen/models/artifact_event.py delete mode 100644 codegen/aignx/codegen/models/artifact_status.py delete mode 100644 codegen/aignx/codegen/models/item_event.py delete mode 100644 codegen/aignx/codegen/models/item_status.py delete mode 100644 codegen/aignx/codegen/models/output_artifact_scope.py delete mode 100644 codegen/aignx/codegen/models/output_artifact_visibility.py delete mode 100644 codegen/aignx/codegen/models/quota_name.py rename {schema => codegen}/config.json (100%) rename {schema => codegen/in}/api.json (100%) rename codegen/{ => out}/.openapi-generator/FILES (100%) rename codegen/{ => out}/.openapi-generator/VERSION (100%) rename codegen/{ => out}/aignx/codegen/api/externals_api.py (72%) rename codegen/{ => out}/aignx/codegen/api_client.py (81%) rename codegen/{ => out}/aignx/codegen/api_response.py (67%) rename codegen/{ => out}/aignx/codegen/configuration.py (79%) rename codegen/{ => out}/aignx/codegen/exceptions.py (74%) rename codegen/{ => out}/aignx/codegen/models/__init__.py (100%) rename codegen/{ => out}/aignx/codegen/models/application_creation_request.py (69%) rename codegen/{ => out}/aignx/codegen/models/application_creation_response.py (68%) rename codegen/{ => out}/aignx/codegen/models/application_read_response.py (70%) create mode 100644 codegen/out/aignx/codegen/models/application_run_status.py rename codegen/{ => out}/aignx/codegen/models/application_version.py (73%) rename codegen/{ => out}/aignx/codegen/models/application_version_read_response.py (77%) create mode 100644 codegen/out/aignx/codegen/models/artifact_event.py create mode 100644 codegen/out/aignx/codegen/models/artifact_status.py rename codegen/{ => out}/aignx/codegen/models/http_validation_error.py (70%) rename codegen/{ => out}/aignx/codegen/models/input_artifact.py (69%) rename codegen/{ => out}/aignx/codegen/models/input_artifact_creation_request.py (68%) rename codegen/{ => out}/aignx/codegen/models/input_artifact_read_response.py (69%) rename codegen/{ => out}/aignx/codegen/models/input_artifact_schema_creation_request.py (69%) rename codegen/{ => out}/aignx/codegen/models/item_creation_request.py (71%) create mode 100644 codegen/out/aignx/codegen/models/item_event.py rename codegen/{ => out}/aignx/codegen/models/item_event_creation_request.py (69%) rename codegen/{ => out}/aignx/codegen/models/item_event_creation_response.py (69%) rename codegen/{ => out}/aignx/codegen/models/item_read_response.py (71%) rename codegen/{ => out}/aignx/codegen/models/item_result_read_response.py (74%) create mode 100644 codegen/out/aignx/codegen/models/item_status.py rename codegen/{ => out}/aignx/codegen/models/organization_creation_request.py (71%) rename codegen/{ => out}/aignx/codegen/models/organization_quota.py (68%) rename codegen/{ => out}/aignx/codegen/models/organization_response.py (72%) rename codegen/{ => out}/aignx/codegen/models/organization_update_request.py (68%) rename codegen/{ => out}/aignx/codegen/models/output_artifact.py (72%) rename codegen/{ => out}/aignx/codegen/models/output_artifact_event_trigger_request.py (69%) rename codegen/{ => out}/aignx/codegen/models/output_artifact_event_trigger_response.py (70%) rename codegen/{ => out}/aignx/codegen/models/output_artifact_read_response.py (71%) rename codegen/{ => out}/aignx/codegen/models/output_artifact_result_read_response.py (70%) rename codegen/{ => out}/aignx/codegen/models/output_artifact_schema_creation_request.py (72%) create mode 100644 codegen/out/aignx/codegen/models/output_artifact_scope.py create mode 100644 codegen/out/aignx/codegen/models/output_artifact_visibility.py rename codegen/{ => out}/aignx/codegen/models/payload_input_artifact.py (68%) rename codegen/{ => out}/aignx/codegen/models/payload_item.py (75%) rename codegen/{ => out}/aignx/codegen/models/payload_output_artifact.py (71%) create mode 100644 codegen/out/aignx/codegen/models/quota_name.py rename codegen/{ => out}/aignx/codegen/models/quota_read_response.py (69%) rename codegen/{ => out}/aignx/codegen/models/quota_update_request.py (69%) rename codegen/{ => out}/aignx/codegen/models/quota_update_response.py (69%) rename codegen/{ => out}/aignx/codegen/models/quotas_read_response.py (71%) rename codegen/{ => out}/aignx/codegen/models/quotas_update_request.py (71%) rename codegen/{ => out}/aignx/codegen/models/quotas_update_response.py (71%) rename codegen/{ => out}/aignx/codegen/models/run_creation_request.py (72%) rename codegen/{ => out}/aignx/codegen/models/run_creation_response.py (68%) rename codegen/{ => out}/aignx/codegen/models/run_read_response.py (74%) rename codegen/{ => out}/aignx/codegen/models/slug_version_request.py (69%) rename codegen/{ => out}/aignx/codegen/models/transfer_urls.py (68%) rename codegen/{ => out}/aignx/codegen/models/user_creation_request.py (69%) rename codegen/{ => out}/aignx/codegen/models/user_payload.py (75%) rename codegen/{ => out}/aignx/codegen/models/user_quota.py (68%) rename codegen/{ => out}/aignx/codegen/models/user_response.py (70%) rename codegen/{ => out}/aignx/codegen/models/user_update_request.py (68%) rename codegen/{ => out}/aignx/codegen/models/validation_error.py (71%) rename codegen/{ => out}/aignx/codegen/models/validation_error_loc_inner.py (73%) rename codegen/{ => out}/aignx/codegen/models/version_creation_request.py (75%) rename codegen/{ => out}/aignx/codegen/models/version_creation_response.py (68%) rename codegen/{ => out}/aignx/codegen/models/version_read_response.py (76%) rename codegen/{ => out}/aignx/codegen/rest.py (84%) rename codegen/{ => out}/docs/ExternalsApi.md (95%) rename codegen/{ => out}/test/test_externals_api.py (81%) delete mode 100755 schema/generate.sh rename tests/{cli_test.py => aignostics/cli/core_test.py} (100%) diff --git a/Makefile b/Makefile index 8b99b9ea..3410b60b 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # Makefile for running common development tasks # Define all PHONY targets -.PHONY: all act audit bump clean dist docs docker_build lint setup setup test test_scheduledupdate_from_template +.PHONY: all act audit bump clean codegen dist docs docker_build lint setup setup test test_scheduledupdate_from_template # Main target i.e. default sessions defined in noxfile.py all: @@ -50,6 +50,22 @@ clean: docker_build: docker build -t aignostics . +# Project specific targets +## codegen +codegen: + docker run --rm -u "$(id -u):$(id -g)" -v "${PWD}:/local" openapitools/openapi-generator-cli:v7.10.0 generate \ + -i "/local/codegen/in/api.json" \ + -g python \ + -o /local/codegen/out \ + -c /local/codegen/config.json \ + # Alternative + # openapi-generator generate -i codegen/in/api.json -g python -c codegen/config.json -o codegen/out + + # Hotfix for https://github.com/OpenAPITools/openapi-generator/issues/18932 + # create __init__.py files + find codegen/out/aignx/codegen/models/ -name "[a-z]*.py" -type f | sed 's|.*/\(.*\)\.py|\1|' | xargs -I{} echo "from .{} import *" > codegen/out/aignx/codegen/models/__init__.py + # ls codegen/out/aignx/codegen/models/ | awk -F . '/[a-z].py/ {print "from ."$1" import *"}' > codegen/out/aignx/codegen/models/__init__.py + # Special rule to catch any arguments (like patch, minor, major, pdf, Python versions, or x.y.z) # This prevents "No rule to make target" errors when passing arguments to make commands .PHONY: % diff --git a/codegen/aignx/codegen/models/application_run_status.py b/codegen/aignx/codegen/models/application_run_status.py deleted file mode 100644 index b0b884ef..00000000 --- a/codegen/aignx/codegen/models/application_run_status.py +++ /dev/null @@ -1,41 +0,0 @@ - -""" -Aignostics Platform API - -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations - -import json -from enum import Enum -from typing import Self - - -class ApplicationRunStatus(str, Enum): - """ - ApplicationRunStatus - """ - - """ - allowed enum values - """ - CANCELED_SYSTEM = "canceled_system" - CANCELED_USER = "canceled_user" - COMPLETED = "completed" - COMPLETED_WITH_ERROR = "completed_with_error" - RECEIVED = "received" - REJECTED = "rejected" - RUNNING = "running" - SCHEDULED = "scheduled" - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ApplicationRunStatus from a JSON string""" - return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/artifact_event.py b/codegen/aignx/codegen/models/artifact_event.py deleted file mode 100644 index 490cbf97..00000000 --- a/codegen/aignx/codegen/models/artifact_event.py +++ /dev/null @@ -1,36 +0,0 @@ - -""" -Aignostics Platform API - -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations - -import json -from enum import Enum -from typing import Self - - -class ArtifactEvent(str, Enum): - """ - This is a subset of the OutputArtifactEvent used by the state machine. Only the variants defined below are allowed to be submitted from the Algorithms/Applications. - """ - - """ - allowed enum values - """ - SUCCEEDED = "succeeded" - FAILED_WITH_USER_ERROR = "failed_with_user_error" - FAILED_WITH_SYSTEM_ERROR = "failed_with_system_error" - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ArtifactEvent from a JSON string""" - return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/artifact_status.py b/codegen/aignx/codegen/models/artifact_status.py deleted file mode 100644 index e29c473b..00000000 --- a/codegen/aignx/codegen/models/artifact_status.py +++ /dev/null @@ -1,41 +0,0 @@ - -""" -Aignostics Platform API - -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations - -import json -from enum import Enum -from typing import Self - - -class ArtifactStatus(str, Enum): - """ - ArtifactStatus - """ - - """ - allowed enum values - """ - PENDING = "pending" - CANCELED_USER = "canceled_user" - CANCELED_SYSTEM = "canceled_system" - ERROR_USER = "error_user" - ERROR_SYSTEM_FATAL = "error_system_fatal" - ERROR_SYSTEM_RECOVERABLE = "error_system_recoverable" - SKIPPED = "skipped" - SUCCEEDED = "succeeded" - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ArtifactStatus from a JSON string""" - return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/item_event.py b/codegen/aignx/codegen/models/item_event.py deleted file mode 100644 index 9ef0947c..00000000 --- a/codegen/aignx/codegen/models/item_event.py +++ /dev/null @@ -1,35 +0,0 @@ - -""" -Aignostics Platform API - -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations - -import json -from enum import Enum -from typing import Self - - -class ItemEvent(str, Enum): - """ - ItemEvent - """ - - """ - allowed enum values - """ - FAILED_WITH_SYSTEM_ERROR = "failed_with_system_error" - FAILED_RECOVERABLE = "failed_recoverable" - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ItemEvent from a JSON string""" - return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/item_status.py b/codegen/aignx/codegen/models/item_status.py deleted file mode 100644 index eab72cad..00000000 --- a/codegen/aignx/codegen/models/item_status.py +++ /dev/null @@ -1,39 +0,0 @@ - -""" -Aignostics Platform API - -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations - -import json -from enum import Enum -from typing import Self - - -class ItemStatus(str, Enum): - """ - ItemStatus - """ - - """ - allowed enum values - """ - PENDING = "pending" - CANCELED_USER = "canceled_user" - CANCELED_SYSTEM = "canceled_system" - ERROR_USER = "error_user" - ERROR_SYSTEM = "error_system" - SUCCEEDED = "succeeded" - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ItemStatus from a JSON string""" - return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/output_artifact_scope.py b/codegen/aignx/codegen/models/output_artifact_scope.py deleted file mode 100644 index c6276db8..00000000 --- a/codegen/aignx/codegen/models/output_artifact_scope.py +++ /dev/null @@ -1,35 +0,0 @@ - -""" -Aignostics Platform API - -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations - -import json -from enum import Enum -from typing import Self - - -class OutputArtifactScope(str, Enum): - """ - OutputArtifactScope - """ - - """ - allowed enum values - """ - ITEM = "item" - GLOBAL = "global" - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of OutputArtifactScope from a JSON string""" - return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/output_artifact_visibility.py b/codegen/aignx/codegen/models/output_artifact_visibility.py deleted file mode 100644 index 09161192..00000000 --- a/codegen/aignx/codegen/models/output_artifact_visibility.py +++ /dev/null @@ -1,35 +0,0 @@ - -""" -Aignostics Platform API - -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations - -import json -from enum import Enum -from typing import Self - - -class OutputArtifactVisibility(str, Enum): - """ - OutputArtifactVisibility - """ - - """ - allowed enum values - """ - INTERNAL = "internal" - EXTERNAL = "external" - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of OutputArtifactVisibility from a JSON string""" - return cls(json.loads(json_str)) diff --git a/codegen/aignx/codegen/models/quota_name.py b/codegen/aignx/codegen/models/quota_name.py deleted file mode 100644 index 3c9c113f..00000000 --- a/codegen/aignx/codegen/models/quota_name.py +++ /dev/null @@ -1,42 +0,0 @@ - -""" -Aignostics Platform API - -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) - -Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations - -import json -from enum import Enum -from typing import Self - - -class QuotaName(str, Enum): - """ - Global, API-level, and slide-level quotas for Samia API. - """ - - """ - allowed enum values - """ - MAX_USERS = "max_users" - MAX_ORGANIZATIONS = "max_organizations" - MAX_USERS_PER_ORGANIZATION = "max_users_per_organization" - MAX_APPLICATIONS = "max_applications" - MAX_APPLICATION_VERSIONS = "max_application_versions" - MAX_SLIDES_PER_RUN = "max_slides_per_run" - MAX_PARALLEL_RUNS = "max_parallel_runs" - MAX_PARALLEL_RUNS_PER_ORGANIZATION = "max_parallel_runs_per_organization" - MAX_PARALLEL_RUNS_PER_USER = "max_parallel_runs_per_user" - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of QuotaName from a JSON string""" - return cls(json.loads(json_str)) diff --git a/schema/config.json b/codegen/config.json similarity index 100% rename from schema/config.json rename to codegen/config.json diff --git a/schema/api.json b/codegen/in/api.json similarity index 100% rename from schema/api.json rename to codegen/in/api.json diff --git a/codegen/.openapi-generator/FILES b/codegen/out/.openapi-generator/FILES similarity index 100% rename from codegen/.openapi-generator/FILES rename to codegen/out/.openapi-generator/FILES diff --git a/codegen/.openapi-generator/VERSION b/codegen/out/.openapi-generator/VERSION similarity index 100% rename from codegen/.openapi-generator/VERSION rename to codegen/out/.openapi-generator/VERSION diff --git a/codegen/aignx/codegen/api/externals_api.py b/codegen/out/aignx/codegen/api/externals_api.py similarity index 72% rename from codegen/aignx/codegen/api/externals_api.py rename to codegen/out/aignx/codegen/api/externals_api.py index 96a2268f..13a98183 100644 --- a/codegen/aignx/codegen/api/externals_api.py +++ b/codegen/out/aignx/codegen/api/externals_api.py @@ -1,21 +1,24 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 -from typing import Annotated, Any - -from pydantic import Field, StrictFloat, StrictInt, StrictStr, validate_call +import warnings +from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt +from typing import Any, Dict, List, Optional, Tuple, Union +from typing_extensions import Annotated -from aignx.codegen.api_client import ApiClient, RequestSerialized -from aignx.codegen.api_response import ApiResponse +from pydantic import Field, StrictStr, field_validator +from typing import Any, List, Optional +from typing_extensions import Annotated from aignx.codegen.models.application_read_response import ApplicationReadResponse from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse from aignx.codegen.models.item_result_read_response import ItemResultReadResponse @@ -29,6 +32,9 @@ from aignx.codegen.models.version_creation_request import VersionCreationRequest from aignx.codegen.models.version_creation_response import VersionCreationResponse from aignx.codegen.models.version_read_response import VersionReadResponse + +from aignx.codegen.api_client import ApiClient, RequestSerialized +from aignx.codegen.api_response import ApiResponse from aignx.codegen.rest import RESTResponseType @@ -44,18 +50,27 @@ def __init__(self, api_client=None) -> None: api_client = ApiClient.get_default() self.api_client = api_client + @validate_call def cancel_run_v1_runs_application_run_id_cancel_post( self, application_run_id: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> object: """Cancel Run + :param application_run_id: (required) :type application_run_id: str :param _request_timeout: timeout setting for this request. If one @@ -78,7 +93,8 @@ def cancel_run_v1_runs_application_run_id_cancel_post( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( application_run_id=application_run_id, _request_auth=_request_auth, @@ -87,10 +103,10 @@ def cancel_run_v1_runs_application_run_id_cancel_post( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "202": "object", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '202': "object", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -102,18 +118,27 @@ def cancel_run_v1_runs_application_run_id_cancel_post( response_types_map=_response_types_map, ).data + @validate_call def cancel_run_v1_runs_application_run_id_cancel_post_with_http_info( self, application_run_id: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[object]: """Cancel Run + :param application_run_id: (required) :type application_run_id: str :param _request_timeout: timeout setting for this request. If one @@ -136,7 +161,8 @@ def cancel_run_v1_runs_application_run_id_cancel_post_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( application_run_id=application_run_id, _request_auth=_request_auth, @@ -145,10 +171,10 @@ def cancel_run_v1_runs_application_run_id_cancel_post_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "202": "object", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '202': "object", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -160,18 +186,27 @@ def cancel_run_v1_runs_application_run_id_cancel_post_with_http_info( response_types_map=_response_types_map, ) + @validate_call def cancel_run_v1_runs_application_run_id_cancel_post_without_preload_content( self, application_run_id: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """Cancel Run + :param application_run_id: (required) :type application_run_id: str :param _request_timeout: timeout setting for this request. If one @@ -194,7 +229,8 @@ def cancel_run_v1_runs_application_run_id_cancel_post_without_preload_content( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( application_run_id=application_run_id, _request_auth=_request_auth, @@ -203,10 +239,10 @@ def cancel_run_v1_runs_application_run_id_cancel_post_without_preload_content( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "202": "object", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '202': "object", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -214,6 +250,7 @@ def cancel_run_v1_runs_application_run_id_cancel_post_without_preload_content( ) return response_data.response + def _cancel_run_v1_runs_application_run_id_cancel_post_serialize( self, application_run_id, @@ -225,42 +262,44 @@ def _cancel_run_v1_runs_application_run_id_cancel_post_serialize( _host = None - _collection_formats: dict[str, str] = { + _collection_formats: Dict[str, str] = { } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters if application_run_id is not None: - _path_params["application_run_id"] = application_run_id + _path_params['application_run_id'] = application_run_id # process the query parameters # process the header parameters # process the form parameters # process the body parameter + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) + # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="POST", - resource_path="/v1/runs/{application_run_id}/cancel", + method='POST', + resource_path='/v1/runs/{application_run_id}/cancel', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -273,18 +312,29 @@ def _cancel_run_v1_runs_application_run_id_cancel_post_serialize( _request_auth=_request_auth ) + + + @validate_call def create_application_run_v1_runs_post( self, run_creation_request: RunCreationRequest, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RunCreationResponse: """Create Application Run + :param run_creation_request: (required) :type run_creation_request: RunCreationRequest :param _request_timeout: timeout setting for this request. If one @@ -307,7 +357,8 @@ def create_application_run_v1_runs_post( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._create_application_run_v1_runs_post_serialize( run_creation_request=run_creation_request, _request_auth=_request_auth, @@ -316,10 +367,10 @@ def create_application_run_v1_runs_post( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "201": "RunCreationResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '201': "RunCreationResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -331,18 +382,27 @@ def create_application_run_v1_runs_post( response_types_map=_response_types_map, ).data + @validate_call def create_application_run_v1_runs_post_with_http_info( self, run_creation_request: RunCreationRequest, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[RunCreationResponse]: """Create Application Run + :param run_creation_request: (required) :type run_creation_request: RunCreationRequest :param _request_timeout: timeout setting for this request. If one @@ -365,7 +425,8 @@ def create_application_run_v1_runs_post_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._create_application_run_v1_runs_post_serialize( run_creation_request=run_creation_request, _request_auth=_request_auth, @@ -374,10 +435,10 @@ def create_application_run_v1_runs_post_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "201": "RunCreationResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '201': "RunCreationResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -389,18 +450,27 @@ def create_application_run_v1_runs_post_with_http_info( response_types_map=_response_types_map, ) + @validate_call def create_application_run_v1_runs_post_without_preload_content( self, run_creation_request: RunCreationRequest, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """Create Application Run + :param run_creation_request: (required) :type run_creation_request: RunCreationRequest :param _request_timeout: timeout setting for this request. If one @@ -423,7 +493,8 @@ def create_application_run_v1_runs_post_without_preload_content( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._create_application_run_v1_runs_post_serialize( run_creation_request=run_creation_request, _request_auth=_request_auth, @@ -432,10 +503,10 @@ def create_application_run_v1_runs_post_without_preload_content( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "201": "RunCreationResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '201': "RunCreationResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -443,6 +514,7 @@ def create_application_run_v1_runs_post_without_preload_content( ) return response_data.response + def _create_application_run_v1_runs_post_serialize( self, run_creation_request, @@ -454,17 +526,17 @@ def _create_application_run_v1_runs_post_serialize( _host = None - _collection_formats: dict[str, str] = { + _collection_formats: Dict[str, str] = { } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters # process the query parameters @@ -474,36 +546,37 @@ def _create_application_run_v1_runs_post_serialize( if run_creation_request is not None: _body_params = run_creation_request + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) # set the HTTP header `Content-Type` if _content_type: - _header_params["Content-Type"] = _content_type + _header_params['Content-Type'] = _content_type else: _default_content_type = ( self.api_client.select_header_content_type( [ - "application/json" + 'application/json' ] ) ) if _default_content_type is not None: - _header_params["Content-Type"] = _default_content_type + _header_params['Content-Type'] = _default_content_type # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="POST", - resource_path="/v1/runs", + method='POST', + resource_path='/v1/runs', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -516,18 +589,29 @@ def _create_application_run_v1_runs_post_serialize( _request_auth=_request_auth ) + + + @validate_call def create_user_v1_users_post( self, user_creation_request: UserCreationRequest, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> UserResponse: """Create User + :param user_creation_request: (required) :type user_creation_request: UserCreationRequest :param _request_timeout: timeout setting for this request. If one @@ -550,7 +634,8 @@ def create_user_v1_users_post( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._create_user_v1_users_post_serialize( user_creation_request=user_creation_request, _request_auth=_request_auth, @@ -559,10 +644,10 @@ def create_user_v1_users_post( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "UserResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -574,18 +659,27 @@ def create_user_v1_users_post( response_types_map=_response_types_map, ).data + @validate_call def create_user_v1_users_post_with_http_info( self, user_creation_request: UserCreationRequest, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[UserResponse]: """Create User + :param user_creation_request: (required) :type user_creation_request: UserCreationRequest :param _request_timeout: timeout setting for this request. If one @@ -608,7 +702,8 @@ def create_user_v1_users_post_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._create_user_v1_users_post_serialize( user_creation_request=user_creation_request, _request_auth=_request_auth, @@ -617,10 +712,10 @@ def create_user_v1_users_post_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "UserResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -632,18 +727,27 @@ def create_user_v1_users_post_with_http_info( response_types_map=_response_types_map, ) + @validate_call def create_user_v1_users_post_without_preload_content( self, user_creation_request: UserCreationRequest, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """Create User + :param user_creation_request: (required) :type user_creation_request: UserCreationRequest :param _request_timeout: timeout setting for this request. If one @@ -666,7 +770,8 @@ def create_user_v1_users_post_without_preload_content( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._create_user_v1_users_post_serialize( user_creation_request=user_creation_request, _request_auth=_request_auth, @@ -675,10 +780,10 @@ def create_user_v1_users_post_without_preload_content( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "UserResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -686,6 +791,7 @@ def create_user_v1_users_post_without_preload_content( ) return response_data.response + def _create_user_v1_users_post_serialize( self, user_creation_request, @@ -697,17 +803,17 @@ def _create_user_v1_users_post_serialize( _host = None - _collection_formats: dict[str, str] = { + _collection_formats: Dict[str, str] = { } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters # process the query parameters @@ -717,36 +823,37 @@ def _create_user_v1_users_post_serialize( if user_creation_request is not None: _body_params = user_creation_request + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) # set the HTTP header `Content-Type` if _content_type: - _header_params["Content-Type"] = _content_type + _header_params['Content-Type'] = _content_type else: _default_content_type = ( self.api_client.select_header_content_type( [ - "application/json" + 'application/json' ] ) ) if _default_content_type is not None: - _header_params["Content-Type"] = _default_content_type + _header_params['Content-Type'] = _default_content_type # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="POST", - resource_path="/v1/users/", + method='POST', + resource_path='/v1/users/', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -759,18 +866,29 @@ def _create_user_v1_users_post_serialize( _request_auth=_request_auth ) + + + @validate_call def delete_run_results_v1_runs_application_run_id_results_delete( self, application_run_id: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> None: """Delete Run Results + :param application_run_id: (required) :type application_run_id: str :param _request_timeout: timeout setting for this request. If one @@ -793,7 +911,8 @@ def delete_run_results_v1_runs_application_run_id_results_delete( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( application_run_id=application_run_id, _request_auth=_request_auth, @@ -802,10 +921,10 @@ def delete_run_results_v1_runs_application_run_id_results_delete( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "204": None, - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '204': None, + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -817,18 +936,27 @@ def delete_run_results_v1_runs_application_run_id_results_delete( response_types_map=_response_types_map, ).data + @validate_call def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( self, application_run_id: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[None]: """Delete Run Results + :param application_run_id: (required) :type application_run_id: str :param _request_timeout: timeout setting for this request. If one @@ -851,7 +979,8 @@ def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( application_run_id=application_run_id, _request_auth=_request_auth, @@ -860,10 +989,10 @@ def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "204": None, - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '204': None, + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -875,18 +1004,27 @@ def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( response_types_map=_response_types_map, ) + @validate_call def delete_run_results_v1_runs_application_run_id_results_delete_without_preload_content( self, application_run_id: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """Delete Run Results + :param application_run_id: (required) :type application_run_id: str :param _request_timeout: timeout setting for this request. If one @@ -909,7 +1047,8 @@ def delete_run_results_v1_runs_application_run_id_results_delete_without_preload in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( application_run_id=application_run_id, _request_auth=_request_auth, @@ -918,10 +1057,10 @@ def delete_run_results_v1_runs_application_run_id_results_delete_without_preload _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "204": None, - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '204': None, + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -929,6 +1068,7 @@ def delete_run_results_v1_runs_application_run_id_results_delete_without_preload ) return response_data.response + def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( self, application_run_id, @@ -940,42 +1080,44 @@ def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( _host = None - _collection_formats: dict[str, str] = { + _collection_formats: Dict[str, str] = { } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters if application_run_id is not None: - _path_params["application_run_id"] = application_run_id + _path_params['application_run_id'] = application_run_id # process the query parameters # process the header parameters # process the form parameters # process the body parameter + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) + # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="DELETE", - resource_path="/v1/runs/{application_run_id}/results", + method='DELETE', + resource_path='/v1/runs/{application_run_id}/results', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -988,19 +1130,30 @@ def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( _request_auth=_request_auth ) + + + @validate_call def get_run_v1_runs_application_run_id_get( self, application_run_id: StrictStr, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RunReadResponse: """Get Run + :param application_run_id: (required) :type application_run_id: str :param include: @@ -1025,7 +1178,8 @@ def get_run_v1_runs_application_run_id_get( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._get_run_v1_runs_application_run_id_get_serialize( application_run_id=application_run_id, include=include, @@ -1035,10 +1189,10 @@ def get_run_v1_runs_application_run_id_get( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "RunReadResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "RunReadResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -1050,19 +1204,28 @@ def get_run_v1_runs_application_run_id_get( response_types_map=_response_types_map, ).data + @validate_call def get_run_v1_runs_application_run_id_get_with_http_info( self, application_run_id: StrictStr, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[RunReadResponse]: """Get Run + :param application_run_id: (required) :type application_run_id: str :param include: @@ -1087,7 +1250,8 @@ def get_run_v1_runs_application_run_id_get_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._get_run_v1_runs_application_run_id_get_serialize( application_run_id=application_run_id, include=include, @@ -1097,10 +1261,10 @@ def get_run_v1_runs_application_run_id_get_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "RunReadResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "RunReadResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -1112,19 +1276,28 @@ def get_run_v1_runs_application_run_id_get_with_http_info( response_types_map=_response_types_map, ) + @validate_call def get_run_v1_runs_application_run_id_get_without_preload_content( self, application_run_id: StrictStr, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """Get Run + :param application_run_id: (required) :type application_run_id: str :param include: @@ -1149,7 +1322,8 @@ def get_run_v1_runs_application_run_id_get_without_preload_content( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._get_run_v1_runs_application_run_id_get_serialize( application_run_id=application_run_id, include=include, @@ -1159,10 +1333,10 @@ def get_run_v1_runs_application_run_id_get_without_preload_content( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "RunReadResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "RunReadResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -1170,6 +1344,7 @@ def get_run_v1_runs_application_run_id_get_without_preload_content( ) return response_data.response + def _get_run_v1_runs_application_run_id_get_serialize( self, application_run_id, @@ -1182,47 +1357,49 @@ def _get_run_v1_runs_application_run_id_get_serialize( _host = None - _collection_formats: dict[str, str] = { - "include": "multi", + _collection_formats: Dict[str, str] = { + 'include': 'multi', } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters if application_run_id is not None: - _path_params["application_run_id"] = application_run_id + _path_params['application_run_id'] = application_run_id # process the query parameters if include is not None: - - _query_params.append(("include", include)) - + + _query_params.append(('include', include)) + # process the header parameters # process the form parameters # process the body parameter + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) + # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="GET", - resource_path="/v1/runs/{application_run_id}", + method='GET', + resource_path='/v1/runs/{application_run_id}', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -1235,18 +1412,29 @@ def _get_run_v1_runs_application_run_id_get_serialize( _request_auth=_request_auth ) + + + @validate_call def get_user_v1_users_user_id_get( self, user_id: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> UserResponse: """Get User + :param user_id: (required) :type user_id: str :param _request_timeout: timeout setting for this request. If one @@ -1269,7 +1457,8 @@ def get_user_v1_users_user_id_get( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._get_user_v1_users_user_id_get_serialize( user_id=user_id, _request_auth=_request_auth, @@ -1278,10 +1467,10 @@ def get_user_v1_users_user_id_get( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "UserResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -1293,18 +1482,27 @@ def get_user_v1_users_user_id_get( response_types_map=_response_types_map, ).data + @validate_call def get_user_v1_users_user_id_get_with_http_info( self, user_id: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[UserResponse]: """Get User + :param user_id: (required) :type user_id: str :param _request_timeout: timeout setting for this request. If one @@ -1327,7 +1525,8 @@ def get_user_v1_users_user_id_get_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._get_user_v1_users_user_id_get_serialize( user_id=user_id, _request_auth=_request_auth, @@ -1336,10 +1535,10 @@ def get_user_v1_users_user_id_get_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "UserResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -1351,18 +1550,27 @@ def get_user_v1_users_user_id_get_with_http_info( response_types_map=_response_types_map, ) + @validate_call def get_user_v1_users_user_id_get_without_preload_content( self, user_id: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """Get User + :param user_id: (required) :type user_id: str :param _request_timeout: timeout setting for this request. If one @@ -1385,7 +1593,8 @@ def get_user_v1_users_user_id_get_without_preload_content( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._get_user_v1_users_user_id_get_serialize( user_id=user_id, _request_auth=_request_auth, @@ -1394,10 +1603,10 @@ def get_user_v1_users_user_id_get_without_preload_content( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "UserResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -1405,6 +1614,7 @@ def get_user_v1_users_user_id_get_without_preload_content( ) return response_data.response + def _get_user_v1_users_user_id_get_serialize( self, user_id, @@ -1416,42 +1626,44 @@ def _get_user_v1_users_user_id_get_serialize( _host = None - _collection_formats: dict[str, str] = { + _collection_formats: Dict[str, str] = { } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters if user_id is not None: - _path_params["user_id"] = user_id + _path_params['user_id'] = user_id # process the query parameters # process the header parameters # process the form parameters # process the body parameter + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) + # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="GET", - resource_path="/v1/users/{user_id}", + method='GET', + resource_path='/v1/users/{user_id}', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -1464,19 +1676,30 @@ def _get_user_v1_users_user_id_get_serialize( _request_auth=_request_auth ) + + + @validate_call def get_version_v1_versions_application_version_id_get( self, application_version_id: StrictStr, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> VersionReadResponse: """Get Version + :param application_version_id: (required) :type application_version_id: str :param include: @@ -1501,7 +1724,8 @@ def get_version_v1_versions_application_version_id_get( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._get_version_v1_versions_application_version_id_get_serialize( application_version_id=application_version_id, include=include, @@ -1511,9 +1735,9 @@ def get_version_v1_versions_application_version_id_get( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "VersionReadResponse", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "VersionReadResponse", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -1525,19 +1749,28 @@ def get_version_v1_versions_application_version_id_get( response_types_map=_response_types_map, ).data + @validate_call def get_version_v1_versions_application_version_id_get_with_http_info( self, application_version_id: StrictStr, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[VersionReadResponse]: """Get Version + :param application_version_id: (required) :type application_version_id: str :param include: @@ -1562,7 +1795,8 @@ def get_version_v1_versions_application_version_id_get_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._get_version_v1_versions_application_version_id_get_serialize( application_version_id=application_version_id, include=include, @@ -1572,9 +1806,9 @@ def get_version_v1_versions_application_version_id_get_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "VersionReadResponse", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "VersionReadResponse", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -1586,19 +1820,28 @@ def get_version_v1_versions_application_version_id_get_with_http_info( response_types_map=_response_types_map, ) + @validate_call def get_version_v1_versions_application_version_id_get_without_preload_content( self, application_version_id: StrictStr, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """Get Version + :param application_version_id: (required) :type application_version_id: str :param include: @@ -1623,7 +1866,8 @@ def get_version_v1_versions_application_version_id_get_without_preload_content( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._get_version_v1_versions_application_version_id_get_serialize( application_version_id=application_version_id, include=include, @@ -1633,9 +1877,9 @@ def get_version_v1_versions_application_version_id_get_without_preload_content( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "VersionReadResponse", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "VersionReadResponse", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -1643,6 +1887,7 @@ def get_version_v1_versions_application_version_id_get_without_preload_content( ) return response_data.response + def _get_version_v1_versions_application_version_id_get_serialize( self, application_version_id, @@ -1655,47 +1900,49 @@ def _get_version_v1_versions_application_version_id_get_serialize( _host = None - _collection_formats: dict[str, str] = { - "include": "multi", + _collection_formats: Dict[str, str] = { + 'include': 'multi', } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters if application_version_id is not None: - _path_params["application_version_id"] = application_version_id + _path_params['application_version_id'] = application_version_id # process the query parameters if include is not None: - - _query_params.append(("include", include)) - + + _query_params.append(('include', include)) + # process the header parameters # process the form parameters # process the body parameter + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) + # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="GET", - resource_path="/v1/versions/{application_version_id}", + method='GET', + resource_path='/v1/versions/{application_version_id}', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -1708,23 +1955,34 @@ def _get_version_v1_versions_application_version_id_get_serialize( _request_auth=_request_auth ) + + + @validate_call def list_application_runs_v1_runs_get( self, - application_id: StrictStr | None = None, - application_version_id: StrictStr | None = None, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + application_id: Optional[StrictStr] = None, + application_version_id: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> list[RunReadResponse]: + ) -> List[RunReadResponse]: """List Application Runs + :param application_id: :type application_id: str :param application_version_id: @@ -1757,7 +2015,8 @@ def list_application_runs_v1_runs_get( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_application_runs_v1_runs_get_serialize( application_id=application_id, application_version_id=application_version_id, @@ -1771,10 +2030,10 @@ def list_application_runs_v1_runs_get( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[RunReadResponse]", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[RunReadResponse]", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -1786,23 +2045,32 @@ def list_application_runs_v1_runs_get( response_types_map=_response_types_map, ).data + @validate_call def list_application_runs_v1_runs_get_with_http_info( self, - application_id: StrictStr | None = None, - application_version_id: StrictStr | None = None, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + application_id: Optional[StrictStr] = None, + application_version_id: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[list[RunReadResponse]]: + ) -> ApiResponse[List[RunReadResponse]]: """List Application Runs + :param application_id: :type application_id: str :param application_version_id: @@ -1835,7 +2103,8 @@ def list_application_runs_v1_runs_get_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_application_runs_v1_runs_get_serialize( application_id=application_id, application_version_id=application_version_id, @@ -1849,10 +2118,10 @@ def list_application_runs_v1_runs_get_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[RunReadResponse]", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[RunReadResponse]", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -1864,23 +2133,32 @@ def list_application_runs_v1_runs_get_with_http_info( response_types_map=_response_types_map, ) + @validate_call def list_application_runs_v1_runs_get_without_preload_content( self, - application_id: StrictStr | None = None, - application_version_id: StrictStr | None = None, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + application_id: Optional[StrictStr] = None, + application_version_id: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """List Application Runs + :param application_id: :type application_id: str :param application_version_id: @@ -1913,7 +2191,8 @@ def list_application_runs_v1_runs_get_without_preload_content( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_application_runs_v1_runs_get_serialize( application_id=application_id, application_version_id=application_version_id, @@ -1927,10 +2206,10 @@ def list_application_runs_v1_runs_get_without_preload_content( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[RunReadResponse]", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[RunReadResponse]", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -1938,6 +2217,7 @@ def list_application_runs_v1_runs_get_without_preload_content( ) return response_data.response + def _list_application_runs_v1_runs_get_serialize( self, application_id, @@ -1954,66 +2234,68 @@ def _list_application_runs_v1_runs_get_serialize( _host = None - _collection_formats: dict[str, str] = { - "include": "multi", - "sort": "multi", + _collection_formats: Dict[str, str] = { + 'include': 'multi', + 'sort': 'multi', } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters # process the query parameters if application_id is not None: - - _query_params.append(("application_id", application_id)) - + + _query_params.append(('application_id', application_id)) + if application_version_id is not None: - - _query_params.append(("application_version_id", application_version_id)) - + + _query_params.append(('application_version_id', application_version_id)) + if include is not None: - - _query_params.append(("include", include)) - + + _query_params.append(('include', include)) + if page is not None: - - _query_params.append(("page", page)) - + + _query_params.append(('page', page)) + if page_size is not None: - - _query_params.append(("page_size", page_size)) - + + _query_params.append(('page_size', page_size)) + if sort is not None: - - _query_params.append(("sort", sort)) - + + _query_params.append(('sort', sort)) + # process the header parameters # process the form parameters # process the body parameter + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) + # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="GET", - resource_path="/v1/runs", + method='GET', + resource_path='/v1/runs', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -2026,20 +2308,31 @@ def _list_application_runs_v1_runs_get_serialize( _request_auth=_request_auth ) + + + @validate_call def list_applications_v1_applications_get( self, - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> list[ApplicationReadResponse]: + ) -> List[ApplicationReadResponse]: """List Applications + :param page: :type page: int :param page_size: @@ -2066,7 +2359,8 @@ def list_applications_v1_applications_get( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_applications_v1_applications_get_serialize( page=page, page_size=page_size, @@ -2077,9 +2371,9 @@ def list_applications_v1_applications_get( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[ApplicationReadResponse]", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationReadResponse]", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -2091,20 +2385,29 @@ def list_applications_v1_applications_get( response_types_map=_response_types_map, ).data + @validate_call def list_applications_v1_applications_get_with_http_info( self, - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[list[ApplicationReadResponse]]: + ) -> ApiResponse[List[ApplicationReadResponse]]: """List Applications + :param page: :type page: int :param page_size: @@ -2131,7 +2434,8 @@ def list_applications_v1_applications_get_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_applications_v1_applications_get_serialize( page=page, page_size=page_size, @@ -2142,9 +2446,9 @@ def list_applications_v1_applications_get_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[ApplicationReadResponse]", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationReadResponse]", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -2156,20 +2460,29 @@ def list_applications_v1_applications_get_with_http_info( response_types_map=_response_types_map, ) + @validate_call def list_applications_v1_applications_get_without_preload_content( self, - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """List Applications + :param page: :type page: int :param page_size: @@ -2196,7 +2509,8 @@ def list_applications_v1_applications_get_without_preload_content( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_applications_v1_applications_get_serialize( page=page, page_size=page_size, @@ -2207,9 +2521,9 @@ def list_applications_v1_applications_get_without_preload_content( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[ApplicationReadResponse]", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationReadResponse]", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -2217,6 +2531,7 @@ def list_applications_v1_applications_get_without_preload_content( ) return response_data.response + def _list_applications_v1_applications_get_serialize( self, page, @@ -2230,53 +2545,55 @@ def _list_applications_v1_applications_get_serialize( _host = None - _collection_formats: dict[str, str] = { - "sort": "multi", + _collection_formats: Dict[str, str] = { + 'sort': 'multi', } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters # process the query parameters if page is not None: - - _query_params.append(("page", page)) - + + _query_params.append(('page', page)) + if page_size is not None: - - _query_params.append(("page_size", page_size)) - + + _query_params.append(('page_size', page_size)) + if sort is not None: - - _query_params.append(("sort", sort)) - + + _query_params.append(('sort', sort)) + # process the header parameters # process the form parameters # process the body parameter + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) + # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="GET", - resource_path="/v1/applications", + method='GET', + resource_path='/v1/applications', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -2289,24 +2606,35 @@ def _list_applications_v1_applications_get_serialize( _request_auth=_request_auth ) + + + @validate_call def list_run_results_v1_runs_application_run_id_results_get( self, application_run_id: StrictStr, - item_id__in: list[StrictStr | None] | None = None, - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - reference__in: list[StrictStr] | None = None, - status__in: list[ItemStatus] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + item_id__in: Optional[List[Optional[StrictStr]]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + reference__in: Optional[List[StrictStr]] = None, + status__in: Optional[List[ItemStatus]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> list[ItemResultReadResponse]: + ) -> List[ItemResultReadResponse]: """List Run Results + :param application_run_id: (required) :type application_run_id: str :param item_id__in: @@ -2341,7 +2669,8 @@ def list_run_results_v1_runs_application_run_id_results_get( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( application_run_id=application_run_id, item_id__in=item_id__in, @@ -2356,10 +2685,10 @@ def list_run_results_v1_runs_application_run_id_results_get( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[ItemResultReadResponse]", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ItemResultReadResponse]", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -2371,24 +2700,33 @@ def list_run_results_v1_runs_application_run_id_results_get( response_types_map=_response_types_map, ).data + @validate_call def list_run_results_v1_runs_application_run_id_results_get_with_http_info( self, application_run_id: StrictStr, - item_id__in: list[StrictStr | None] | None = None, - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - reference__in: list[StrictStr] | None = None, - status__in: list[ItemStatus] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + item_id__in: Optional[List[Optional[StrictStr]]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + reference__in: Optional[List[StrictStr]] = None, + status__in: Optional[List[ItemStatus]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[list[ItemResultReadResponse]]: + ) -> ApiResponse[List[ItemResultReadResponse]]: """List Run Results + :param application_run_id: (required) :type application_run_id: str :param item_id__in: @@ -2423,7 +2761,8 @@ def list_run_results_v1_runs_application_run_id_results_get_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( application_run_id=application_run_id, item_id__in=item_id__in, @@ -2438,10 +2777,10 @@ def list_run_results_v1_runs_application_run_id_results_get_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[ItemResultReadResponse]", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ItemResultReadResponse]", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -2453,24 +2792,33 @@ def list_run_results_v1_runs_application_run_id_results_get_with_http_info( response_types_map=_response_types_map, ) + @validate_call def list_run_results_v1_runs_application_run_id_results_get_without_preload_content( self, application_run_id: StrictStr, - item_id__in: list[StrictStr | None] | None = None, - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - reference__in: list[StrictStr] | None = None, - status__in: list[ItemStatus] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + item_id__in: Optional[List[Optional[StrictStr]]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + reference__in: Optional[List[StrictStr]] = None, + status__in: Optional[List[ItemStatus]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """List Run Results + :param application_run_id: (required) :type application_run_id: str :param item_id__in: @@ -2505,7 +2853,8 @@ def list_run_results_v1_runs_application_run_id_results_get_without_preload_cont in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( application_run_id=application_run_id, item_id__in=item_id__in, @@ -2520,10 +2869,10 @@ def list_run_results_v1_runs_application_run_id_results_get_without_preload_cont _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[ItemResultReadResponse]", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ItemResultReadResponse]", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -2531,6 +2880,7 @@ def list_run_results_v1_runs_application_run_id_results_get_without_preload_cont ) return response_data.response + def _list_run_results_v1_runs_application_run_id_results_get_serialize( self, application_run_id, @@ -2548,70 +2898,72 @@ def _list_run_results_v1_runs_application_run_id_results_get_serialize( _host = None - _collection_formats: dict[str, str] = { - "item_id__in": "multi", - "reference__in": "multi", - "status__in": "multi", - "sort": "multi", + _collection_formats: Dict[str, str] = { + 'item_id__in': 'multi', + 'reference__in': 'multi', + 'status__in': 'multi', + 'sort': 'multi', } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters if application_run_id is not None: - _path_params["application_run_id"] = application_run_id + _path_params['application_run_id'] = application_run_id # process the query parameters if item_id__in is not None: - - _query_params.append(("item_id__in", item_id__in)) - + + _query_params.append(('item_id__in', item_id__in)) + if page is not None: - - _query_params.append(("page", page)) - + + _query_params.append(('page', page)) + if page_size is not None: - - _query_params.append(("page_size", page_size)) - + + _query_params.append(('page_size', page_size)) + if reference__in is not None: - - _query_params.append(("reference__in", reference__in)) - + + _query_params.append(('reference__in', reference__in)) + if status__in is not None: - - _query_params.append(("status__in", status__in)) - + + _query_params.append(('status__in', status__in)) + if sort is not None: - - _query_params.append(("sort", sort)) - + + _query_params.append(('sort', sort)) + # process the header parameters # process the form parameters # process the body parameter + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) + # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="GET", - resource_path="/v1/runs/{application_run_id}/results", + method='GET', + resource_path='/v1/runs/{application_run_id}/results', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -2624,23 +2976,34 @@ def _list_run_results_v1_runs_application_run_id_results_get_serialize( _request_auth=_request_auth ) + + + @validate_call def list_versions_by_application_id_v1_applications_application_id_versions_get( self, application_id: StrictStr, - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - version: StrictStr | None = None, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> list[ApplicationVersionReadResponse]: + ) -> List[ApplicationVersionReadResponse]: """List Versions By Application Id + :param application_id: (required) :type application_id: str :param page: @@ -2673,7 +3036,8 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( application_id=application_id, page=page, @@ -2687,9 +3051,9 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[ApplicationVersionReadResponse]", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationVersionReadResponse]", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -2701,23 +3065,32 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get( response_types_map=_response_types_map, ).data + @validate_call def list_versions_by_application_id_v1_applications_application_id_versions_get_with_http_info( self, application_id: StrictStr, - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - version: StrictStr | None = None, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[list[ApplicationVersionReadResponse]]: + ) -> ApiResponse[List[ApplicationVersionReadResponse]]: """List Versions By Application Id + :param application_id: (required) :type application_id: str :param page: @@ -2750,7 +3123,8 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( application_id=application_id, page=page, @@ -2764,9 +3138,9 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[ApplicationVersionReadResponse]", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationVersionReadResponse]", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -2778,23 +3152,32 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ response_types_map=_response_types_map, ) + @validate_call def list_versions_by_application_id_v1_applications_application_id_versions_get_without_preload_content( self, application_id: StrictStr, - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - version: StrictStr | None = None, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """List Versions By Application Id + :param application_id: (required) :type application_id: str :param page: @@ -2827,7 +3210,8 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( application_id=application_id, page=page, @@ -2841,9 +3225,9 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[ApplicationVersionReadResponse]", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationVersionReadResponse]", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -2851,6 +3235,7 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ ) return response_data.response + def _list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( self, application_id, @@ -2867,64 +3252,66 @@ def _list_versions_by_application_id_v1_applications_application_id_versions_get _host = None - _collection_formats: dict[str, str] = { - "include": "multi", - "sort": "multi", + _collection_formats: Dict[str, str] = { + 'include': 'multi', + 'sort': 'multi', } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters if application_id is not None: - _path_params["application_id"] = application_id + _path_params['application_id'] = application_id # process the query parameters if page is not None: - - _query_params.append(("page", page)) - + + _query_params.append(('page', page)) + if page_size is not None: - - _query_params.append(("page_size", page_size)) - + + _query_params.append(('page_size', page_size)) + if version is not None: - - _query_params.append(("version", version)) - + + _query_params.append(('version', version)) + if include is not None: - - _query_params.append(("include", include)) - + + _query_params.append(('include', include)) + if sort is not None: - - _query_params.append(("sort", sort)) - + + _query_params.append(('sort', sort)) + # process the header parameters # process the form parameters # process the body parameter + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) + # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="GET", - resource_path="/v1/applications/{application_id}/versions", + method='GET', + resource_path='/v1/applications/{application_id}/versions', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -2937,23 +3324,34 @@ def _list_versions_by_application_id_v1_applications_application_id_versions_get _request_auth=_request_auth ) + + + @validate_call def list_versions_by_application_slug_v1_applications_application_slug_versions_get( self, application_slug: Annotated[str, Field(strict=True)], - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - version: StrictStr | None = None, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> list[ApplicationVersionReadResponse]: + ) -> List[ApplicationVersionReadResponse]: """List Versions By Application Slug + :param application_slug: (required) :type application_slug: str :param page: @@ -2986,7 +3384,8 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( application_slug=application_slug, page=page, @@ -3000,9 +3399,9 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[ApplicationVersionReadResponse]", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationVersionReadResponse]", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -3014,23 +3413,32 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ response_types_map=_response_types_map, ).data + @validate_call def list_versions_by_application_slug_v1_applications_application_slug_versions_get_with_http_info( self, application_slug: Annotated[str, Field(strict=True)], - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - version: StrictStr | None = None, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[list[ApplicationVersionReadResponse]]: + ) -> ApiResponse[List[ApplicationVersionReadResponse]]: """List Versions By Application Slug + :param application_slug: (required) :type application_slug: str :param page: @@ -3063,7 +3471,8 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( application_slug=application_slug, page=page, @@ -3077,9 +3486,9 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[ApplicationVersionReadResponse]", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationVersionReadResponse]", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -3091,23 +3500,32 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ response_types_map=_response_types_map, ) + @validate_call def list_versions_by_application_slug_v1_applications_application_slug_versions_get_without_preload_content( self, application_slug: Annotated[str, Field(strict=True)], - page: Annotated[int, Field(strict=True, ge=1)] | None = None, - page_size: Annotated[int, Field(le=100, strict=True, ge=5)] | None = None, - version: StrictStr | None = None, - include: Annotated[list[Any], Field(min_length=1, max_length=1)] | None = None, - sort: list[StrictStr] | None = None, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """List Versions By Application Slug + :param application_slug: (required) :type application_slug: str :param page: @@ -3140,7 +3558,8 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( application_slug=application_slug, page=page, @@ -3154,9 +3573,9 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "List[ApplicationVersionReadResponse]", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationVersionReadResponse]", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -3164,6 +3583,7 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ ) return response_data.response + def _list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( self, application_slug, @@ -3180,64 +3600,66 @@ def _list_versions_by_application_slug_v1_applications_application_slug_versions _host = None - _collection_formats: dict[str, str] = { - "include": "multi", - "sort": "multi", + _collection_formats: Dict[str, str] = { + 'include': 'multi', + 'sort': 'multi', } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters if application_slug is not None: - _path_params["application_slug"] = application_slug + _path_params['application_slug'] = application_slug # process the query parameters if page is not None: - - _query_params.append(("page", page)) - + + _query_params.append(('page', page)) + if page_size is not None: - - _query_params.append(("page_size", page_size)) - + + _query_params.append(('page_size', page_size)) + if version is not None: - - _query_params.append(("version", version)) - + + _query_params.append(('version', version)) + if include is not None: - - _query_params.append(("include", include)) - + + _query_params.append(('include', include)) + if sort is not None: - - _query_params.append(("sort", sort)) - + + _query_params.append(('sort', sort)) + # process the header parameters # process the form parameters # process the body parameter + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) + # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="GET", - resource_path="/v1/applications/{application_slug}/versions", + method='GET', + resource_path='/v1/applications/{application_slug}/versions', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -3250,18 +3672,29 @@ def _list_versions_by_application_slug_v1_applications_application_slug_versions _request_auth=_request_auth ) + + + @validate_call def read_application_by_id_v1_applications_application_id_get( self, application_id: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApplicationReadResponse: """Read Application By Id + :param application_id: (required) :type application_id: str :param _request_timeout: timeout setting for this request. If one @@ -3284,7 +3717,8 @@ def read_application_by_id_v1_applications_application_id_get( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._read_application_by_id_v1_applications_application_id_get_serialize( application_id=application_id, _request_auth=_request_auth, @@ -3293,9 +3727,9 @@ def read_application_by_id_v1_applications_application_id_get( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "ApplicationReadResponse", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "ApplicationReadResponse", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -3307,18 +3741,27 @@ def read_application_by_id_v1_applications_application_id_get( response_types_map=_response_types_map, ).data + @validate_call def read_application_by_id_v1_applications_application_id_get_with_http_info( self, application_id: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[ApplicationReadResponse]: """Read Application By Id + :param application_id: (required) :type application_id: str :param _request_timeout: timeout setting for this request. If one @@ -3341,7 +3784,8 @@ def read_application_by_id_v1_applications_application_id_get_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._read_application_by_id_v1_applications_application_id_get_serialize( application_id=application_id, _request_auth=_request_auth, @@ -3350,9 +3794,9 @@ def read_application_by_id_v1_applications_application_id_get_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "ApplicationReadResponse", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "ApplicationReadResponse", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -3364,18 +3808,27 @@ def read_application_by_id_v1_applications_application_id_get_with_http_info( response_types_map=_response_types_map, ) + @validate_call def read_application_by_id_v1_applications_application_id_get_without_preload_content( self, application_id: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """Read Application By Id + :param application_id: (required) :type application_id: str :param _request_timeout: timeout setting for this request. If one @@ -3398,7 +3851,8 @@ def read_application_by_id_v1_applications_application_id_get_without_preload_co in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._read_application_by_id_v1_applications_application_id_get_serialize( application_id=application_id, _request_auth=_request_auth, @@ -3407,9 +3861,9 @@ def read_application_by_id_v1_applications_application_id_get_without_preload_co _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "ApplicationReadResponse", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "ApplicationReadResponse", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -3417,6 +3871,7 @@ def read_application_by_id_v1_applications_application_id_get_without_preload_co ) return response_data.response + def _read_application_by_id_v1_applications_application_id_get_serialize( self, application_id, @@ -3428,42 +3883,44 @@ def _read_application_by_id_v1_applications_application_id_get_serialize( _host = None - _collection_formats: dict[str, str] = { + _collection_formats: Dict[str, str] = { } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters if application_id is not None: - _path_params["application_id"] = application_id + _path_params['application_id'] = application_id # process the query parameters # process the header parameters # process the form parameters # process the body parameter + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) + # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="GET", - resource_path="/v1/applications/{application_id}", + method='GET', + resource_path='/v1/applications/{application_id}', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -3476,18 +3933,29 @@ def _read_application_by_id_v1_applications_application_id_get_serialize( _request_auth=_request_auth ) + + + @validate_call def read_application_by_slug_v1_applications_application_slug_get( self, application_slug: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApplicationReadResponse: """Read Application By Slug + :param application_slug: (required) :type application_slug: str :param _request_timeout: timeout setting for this request. If one @@ -3510,7 +3978,8 @@ def read_application_by_slug_v1_applications_application_slug_get( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( application_slug=application_slug, _request_auth=_request_auth, @@ -3519,9 +3988,9 @@ def read_application_by_slug_v1_applications_application_slug_get( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "ApplicationReadResponse", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "ApplicationReadResponse", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -3533,18 +4002,27 @@ def read_application_by_slug_v1_applications_application_slug_get( response_types_map=_response_types_map, ).data + @validate_call def read_application_by_slug_v1_applications_application_slug_get_with_http_info( self, application_slug: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[ApplicationReadResponse]: """Read Application By Slug + :param application_slug: (required) :type application_slug: str :param _request_timeout: timeout setting for this request. If one @@ -3567,7 +4045,8 @@ def read_application_by_slug_v1_applications_application_slug_get_with_http_info in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( application_slug=application_slug, _request_auth=_request_auth, @@ -3576,9 +4055,9 @@ def read_application_by_slug_v1_applications_application_slug_get_with_http_info _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "ApplicationReadResponse", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "ApplicationReadResponse", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -3590,18 +4069,27 @@ def read_application_by_slug_v1_applications_application_slug_get_with_http_info response_types_map=_response_types_map, ) + @validate_call def read_application_by_slug_v1_applications_application_slug_get_without_preload_content( self, application_slug: StrictStr, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """Read Application By Slug + :param application_slug: (required) :type application_slug: str :param _request_timeout: timeout setting for this request. If one @@ -3624,7 +4112,8 @@ def read_application_by_slug_v1_applications_application_slug_get_without_preloa in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( application_slug=application_slug, _request_auth=_request_auth, @@ -3633,9 +4122,9 @@ def read_application_by_slug_v1_applications_application_slug_get_without_preloa _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "ApplicationReadResponse", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "ApplicationReadResponse", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -3643,6 +4132,7 @@ def read_application_by_slug_v1_applications_application_slug_get_without_preloa ) return response_data.response + def _read_application_by_slug_v1_applications_application_slug_get_serialize( self, application_slug, @@ -3654,42 +4144,44 @@ def _read_application_by_slug_v1_applications_application_slug_get_serialize( _host = None - _collection_formats: dict[str, str] = { + _collection_formats: Dict[str, str] = { } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters if application_slug is not None: - _path_params["application_slug"] = application_slug + _path_params['application_slug'] = application_slug # process the query parameters # process the header parameters # process the form parameters # process the body parameter + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) + # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="GET", - resource_path="/v1/applications/{application_slug}", + method='GET', + resource_path='/v1/applications/{application_slug}', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -3702,18 +4194,29 @@ def _read_application_by_slug_v1_applications_application_slug_get_serialize( _request_auth=_request_auth ) + + + @validate_call def register_version_v1_versions_post( self, version_creation_request: VersionCreationRequest, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> VersionCreationResponse: """Register Version + :param version_creation_request: (required) :type version_creation_request: VersionCreationRequest :param _request_timeout: timeout setting for this request. If one @@ -3736,7 +4239,8 @@ def register_version_v1_versions_post( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._register_version_v1_versions_post_serialize( version_creation_request=version_creation_request, _request_auth=_request_auth, @@ -3745,9 +4249,9 @@ def register_version_v1_versions_post( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "201": "VersionCreationResponse", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '201': "VersionCreationResponse", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -3759,18 +4263,27 @@ def register_version_v1_versions_post( response_types_map=_response_types_map, ).data + @validate_call def register_version_v1_versions_post_with_http_info( self, version_creation_request: VersionCreationRequest, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[VersionCreationResponse]: """Register Version + :param version_creation_request: (required) :type version_creation_request: VersionCreationRequest :param _request_timeout: timeout setting for this request. If one @@ -3793,7 +4306,8 @@ def register_version_v1_versions_post_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._register_version_v1_versions_post_serialize( version_creation_request=version_creation_request, _request_auth=_request_auth, @@ -3802,9 +4316,9 @@ def register_version_v1_versions_post_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "201": "VersionCreationResponse", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '201': "VersionCreationResponse", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -3816,18 +4330,27 @@ def register_version_v1_versions_post_with_http_info( response_types_map=_response_types_map, ) + @validate_call def register_version_v1_versions_post_without_preload_content( self, version_creation_request: VersionCreationRequest, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """Register Version + :param version_creation_request: (required) :type version_creation_request: VersionCreationRequest :param _request_timeout: timeout setting for this request. If one @@ -3850,7 +4373,8 @@ def register_version_v1_versions_post_without_preload_content( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._register_version_v1_versions_post_serialize( version_creation_request=version_creation_request, _request_auth=_request_auth, @@ -3859,9 +4383,9 @@ def register_version_v1_versions_post_without_preload_content( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "201": "VersionCreationResponse", - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '201': "VersionCreationResponse", + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -3869,6 +4393,7 @@ def register_version_v1_versions_post_without_preload_content( ) return response_data.response + def _register_version_v1_versions_post_serialize( self, version_creation_request, @@ -3880,17 +4405,17 @@ def _register_version_v1_versions_post_serialize( _host = None - _collection_formats: dict[str, str] = { + _collection_formats: Dict[str, str] = { } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters # process the query parameters @@ -3900,36 +4425,37 @@ def _register_version_v1_versions_post_serialize( if version_creation_request is not None: _body_params = version_creation_request + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) # set the HTTP header `Content-Type` if _content_type: - _header_params["Content-Type"] = _content_type + _header_params['Content-Type'] = _content_type else: _default_content_type = ( self.api_client.select_header_content_type( [ - "application/json" + 'application/json' ] ) ) if _default_content_type is not None: - _header_params["Content-Type"] = _default_content_type + _header_params['Content-Type'] = _default_content_type # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="POST", - resource_path="/v1/versions", + method='POST', + resource_path='/v1/versions', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -3942,19 +4468,30 @@ def _register_version_v1_versions_post_serialize( _request_auth=_request_auth ) + + + @validate_call def update_user_v1_users_user_id_patch( self, user_id: StrictStr, user_update_request: UserUpdateRequest, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> UserResponse: """Update User + :param user_id: (required) :type user_id: str :param user_update_request: (required) @@ -3979,7 +4516,8 @@ def update_user_v1_users_user_id_patch( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._update_user_v1_users_user_id_patch_serialize( user_id=user_id, user_update_request=user_update_request, @@ -3989,10 +4527,10 @@ def update_user_v1_users_user_id_patch( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "UserResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -4004,19 +4542,28 @@ def update_user_v1_users_user_id_patch( response_types_map=_response_types_map, ).data + @validate_call def update_user_v1_users_user_id_patch_with_http_info( self, user_id: StrictStr, user_update_request: UserUpdateRequest, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[UserResponse]: """Update User + :param user_id: (required) :type user_id: str :param user_update_request: (required) @@ -4041,7 +4588,8 @@ def update_user_v1_users_user_id_patch_with_http_info( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._update_user_v1_users_user_id_patch_serialize( user_id=user_id, user_update_request=user_update_request, @@ -4051,10 +4599,10 @@ def update_user_v1_users_user_id_patch_with_http_info( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "UserResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -4066,19 +4614,28 @@ def update_user_v1_users_user_id_patch_with_http_info( response_types_map=_response_types_map, ) + @validate_call def update_user_v1_users_user_id_patch_without_preload_content( self, user_id: StrictStr, user_update_request: UserUpdateRequest, - _request_timeout: None | Annotated[StrictFloat, Field(gt=0)] | tuple[Annotated[StrictFloat, Field(gt=0)], Annotated[StrictFloat, Field(gt=0)]] = None, - _request_auth: dict[StrictStr, Any] | None = None, - _content_type: StrictStr | None = None, - _headers: dict[StrictStr, Any] | None = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: """Update User + :param user_id: (required) :type user_id: str :param user_update_request: (required) @@ -4103,7 +4660,8 @@ def update_user_v1_users_user_id_patch_without_preload_content( in the spec for a single request. :type _host_index: int, optional :return: Returns the result object. - """ + """ # noqa: E501 + _param = self._update_user_v1_users_user_id_patch_serialize( user_id=user_id, user_update_request=user_update_request, @@ -4113,10 +4671,10 @@ def update_user_v1_users_user_id_patch_without_preload_content( _host_index=_host_index ) - _response_types_map: dict[str, str | None] = { - "200": "UserResponse", - "404": None, - "422": "HTTPValidationError", + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", } response_data = self.api_client.call_api( *_param, @@ -4124,6 +4682,7 @@ def update_user_v1_users_user_id_patch_without_preload_content( ) return response_data.response + def _update_user_v1_users_user_id_patch_serialize( self, user_id, @@ -4136,21 +4695,21 @@ def _update_user_v1_users_user_id_patch_serialize( _host = None - _collection_formats: dict[str, str] = { + _collection_formats: Dict[str, str] = { } - _path_params: dict[str, str] = {} - _query_params: list[tuple[str, str]] = [] - _header_params: dict[str, str | None] = _headers or {} - _form_params: list[tuple[str, str]] = [] - _files: dict[ - str, str | bytes | list[str] | list[bytes] | list[tuple[str, bytes]] + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] ] = {} - _body_params: bytes | None = None + _body_params: Optional[bytes] = None # process the path parameters if user_id is not None: - _path_params["user_id"] = user_id + _path_params['user_id'] = user_id # process the query parameters # process the header parameters # process the form parameters @@ -4158,36 +4717,37 @@ def _update_user_v1_users_user_id_patch_serialize( if user_update_request is not None: _body_params = user_update_request + # set the HTTP header `Accept` - if "Accept" not in _header_params: - _header_params["Accept"] = self.api_client.select_header_accept( + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( [ - "application/json" + 'application/json' ] ) # set the HTTP header `Content-Type` if _content_type: - _header_params["Content-Type"] = _content_type + _header_params['Content-Type'] = _content_type else: _default_content_type = ( self.api_client.select_header_content_type( [ - "application/json" + 'application/json' ] ) ) if _default_content_type is not None: - _header_params["Content-Type"] = _default_content_type + _header_params['Content-Type'] = _default_content_type # authentication setting - _auth_settings: list[str] = [ - "OAuth2AuthorizationCodeBearer" + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method="PATCH", - resource_path="/v1/users/{user_id}", + method='PATCH', + resource_path='/v1/users/{user_id}', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -4199,3 +4759,5 @@ def _update_user_v1_users_user_id_patch_serialize( _host=_host, _request_auth=_request_auth ) + + diff --git a/codegen/aignx/codegen/api_client.py b/codegen/out/aignx/codegen/api_client.py similarity index 81% rename from codegen/aignx/codegen/api_client.py rename to codegen/out/aignx/codegen/api_client.py index 52a16b6e..9b1b1ecf 100644 --- a/codegen/aignx/codegen/api_client.py +++ b/codegen/out/aignx/codegen/api_client.py @@ -1,41 +1,46 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 import datetime +from dateutil.parser import parse +from enum import Enum import decimal import json import mimetypes import os import re import tempfile -from enum import Enum -from urllib.parse import quote -from dateutil.parser import parse +from urllib.parse import quote +from typing import Tuple, Optional, List, Dict, Union from pydantic import SecretStr +from aignx.codegen.configuration import Configuration +from aignx.codegen.api_response import ApiResponse, T as ApiResponseT import aignx.codegen.models from aignx.codegen import rest -from aignx.codegen.api_response import ApiResponse -from aignx.codegen.api_response import T as ApiResponseT -from aignx.codegen.configuration import Configuration from aignx.codegen.exceptions import ( - ApiException, ApiValueError, + ApiException, + BadRequestException, + UnauthorizedException, + ForbiddenException, + NotFoundException, + ServiceException ) -RequestSerialized = tuple[str, str, dict[str, str], str | None, list[str]] - +RequestSerialized = Tuple[str, str, Dict[str, str], Optional[str], List[str]] class ApiClient: """Generic API client for OpenAPI client library builds. @@ -55,15 +60,15 @@ class ApiClient: PRIMITIVE_TYPES = (float, bool, bytes, str, int) NATIVE_TYPES_MAPPING = { - "int": int, - "long": int, # TODO remove as only py3 is supported? - "float": float, - "str": str, - "bool": bool, - "date": datetime.date, - "datetime": datetime.datetime, - "decimal": decimal.Decimal, - "object": object, + 'int': int, + 'long': int, # TODO remove as only py3 is supported? + 'float': float, + 'str': str, + 'bool': bool, + 'date': datetime.date, + 'datetime': datetime.datetime, + 'decimal': decimal.Decimal, + 'object': object, } _pool = None @@ -85,7 +90,7 @@ def __init__( self.default_headers[header_name] = header_value self.cookie = cookie # Set default User-Agent. - self.user_agent = "OpenAPI-Generator/1.0.0/python" + self.user_agent = 'OpenAPI-Generator/1.0.0/python' self.client_side_validation = configuration.client_side_validation def __enter__(self): @@ -97,15 +102,16 @@ def __exit__(self, exc_type, exc_value, traceback): @property def user_agent(self): """User agent for this API client""" - return self.default_headers["User-Agent"] + return self.default_headers['User-Agent'] @user_agent.setter def user_agent(self, value): - self.default_headers["User-Agent"] = value + self.default_headers['User-Agent'] = value def set_default_header(self, header_name, header_value): self.default_headers[header_name] = header_value + _default = None @classmethod @@ -146,6 +152,7 @@ def param_serialize( _host=None, _request_auth=None ) -> RequestSerialized: + """Builds the HTTP request params needed by the request. :param method: Method to call. :param resource_path: Path to method endpoint. @@ -167,17 +174,18 @@ def param_serialize( :return: tuple of form (path, http_method, query_params, header_params, body, post_params, files) """ + config = self.configuration # header parameters header_params = header_params or {} header_params.update(self.default_headers) if self.cookie: - header_params["Cookie"] = self.cookie + header_params['Cookie'] = self.cookie if header_params: header_params = self.sanitize_for_serialization(header_params) header_params = dict( - self.parameters_to_tuples(header_params, collection_formats) + self.parameters_to_tuples(header_params,collection_formats) ) # path parameters @@ -190,13 +198,13 @@ def param_serialize( for k, v in path_params: # specified safe chars, encode everything resource_path = resource_path.replace( - "{%s}" % k, + '{%s}' % k, quote(str(v), safe=config.safe_chars_for_path_param) ) # post parameters if post_params or files: - post_params = post_params or [] + post_params = post_params if post_params else [] post_params = self.sanitize_for_serialization(post_params) post_params = self.parameters_to_tuples( post_params, @@ -238,6 +246,7 @@ def param_serialize( return method, url, header_params, body, post_params + def call_api( self, method, @@ -258,6 +267,7 @@ def call_api( :param _request_timeout: timeout setting for this request. :return: RESTResponse """ + try: # perform request and return response response_data = self.rest_client.request( @@ -275,13 +285,14 @@ def call_api( def response_deserialize( self, response_data: rest.RESTResponse, - response_types_map: dict[str, ApiResponseT] | None = None + response_types_map: Optional[Dict[str, ApiResponseT]]=None ) -> ApiResponse[ApiResponseT]: """Deserializes response into an object. :param response_data: RESTResponse object to be deserialized. :param response_types_map: dict of response types. :return: ApiResponse """ + msg = "RESTResponse.read() must be called before passing it to response_deserialize()" assert response_data.data is not None, msg @@ -300,7 +311,7 @@ def response_deserialize( return_data = self.__deserialize_file(response_data) elif response_type is not None: match = None - content_type = response_data.getheader("content-type") + content_type = response_data.getheader('content-type') if content_type is not None: match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type) encoding = match.group(1) if match else "utf-8" @@ -315,10 +326,10 @@ def response_deserialize( ) return ApiResponse( - status_code=response_data.status, - data=return_data, - headers=response_data.getheaders(), - raw_data=response_data.data + status_code = response_data.status, + data = return_data, + headers = response_data.getheaders(), + raw_data = response_data.data ) def sanitize_for_serialization(self, obj): @@ -339,43 +350,44 @@ def sanitize_for_serialization(self, obj): """ if obj is None: return None - if isinstance(obj, Enum): + elif isinstance(obj, Enum): return obj.value - if isinstance(obj, SecretStr): + elif isinstance(obj, SecretStr): return obj.get_secret_value() - if isinstance(obj, self.PRIMITIVE_TYPES): + elif isinstance(obj, self.PRIMITIVE_TYPES): return obj - if isinstance(obj, list): + elif isinstance(obj, list): return [ self.sanitize_for_serialization(sub_obj) for sub_obj in obj ] - if isinstance(obj, tuple): + elif isinstance(obj, tuple): return tuple( self.sanitize_for_serialization(sub_obj) for sub_obj in obj ) - if isinstance(obj, (datetime.datetime, datetime.date)): + elif isinstance(obj, (datetime.datetime, datetime.date)): return obj.isoformat() - if isinstance(obj, decimal.Decimal): + elif isinstance(obj, decimal.Decimal): return str(obj) - if isinstance(obj, dict): + elif isinstance(obj, dict): obj_dict = obj - # Convert model obj to dict except - # attributes `openapi_types`, `attribute_map` - # and attributes which value is not None. - # Convert attribute name to json key in - # model definition for request. - elif hasattr(obj, "to_dict") and callable(obj.to_dict): - obj_dict = obj.to_dict() else: - obj_dict = obj.__dict__ + # Convert model obj to dict except + # attributes `openapi_types`, `attribute_map` + # and attributes which value is not None. + # Convert attribute name to json key in + # model definition for request. + if hasattr(obj, 'to_dict') and callable(getattr(obj, 'to_dict')): + obj_dict = obj.to_dict() + else: + obj_dict = obj.__dict__ return { key: self.sanitize_for_serialization(val) for key, val in obj_dict.items() } - def deserialize(self, response_text: str, response_type: str, content_type: str | None): + def deserialize(self, response_text: str, response_type: str, content_type: Optional[str]): """Deserializes response into an object. :param response: RESTResponse object to be deserialized. @@ -385,23 +397,24 @@ def deserialize(self, response_text: str, response_type: str, content_type: str :return: deserialized object. """ + # fetch data from response object if content_type is None: try: data = json.loads(response_text) except ValueError: data = response_text - elif re.match(r"^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)", content_type, re.IGNORECASE): + elif re.match(r'^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)', content_type, re.IGNORECASE): if response_text == "": data = "" else: data = json.loads(response_text) - elif re.match(r"^text\/[a-z.+-]+\s*(;|$)", content_type, re.IGNORECASE): + elif re.match(r'^text\/[a-z.+-]+\s*(;|$)', content_type, re.IGNORECASE): data = response_text else: raise ApiException( status=0, - reason=f"Unsupported content type: {content_type}" + reason="Unsupported content type: {0}".format(content_type) ) return self.__deserialize(data, response_type) @@ -418,15 +431,15 @@ def __deserialize(self, data, klass): return None if isinstance(klass, str): - if klass.startswith("List["): - m = re.match(r"List\[(.*)]", klass) + if klass.startswith('List['): + m = re.match(r'List\[(.*)]', klass) assert m is not None, "Malformed List type definition" sub_kls = m.group(1) return [self.__deserialize(sub_data, sub_kls) for sub_data in data] - if klass.startswith("Dict["): - m = re.match(r"Dict\[([^,]*), (.*)]", klass) + if klass.startswith('Dict['): + m = re.match(r'Dict\[([^,]*), (.*)]', klass) assert m is not None, "Malformed Dict type definition" sub_kls = m.group(2) return {k: self.__deserialize(v, sub_kls) @@ -440,17 +453,18 @@ def __deserialize(self, data, klass): if klass in self.PRIMITIVE_TYPES: return self.__deserialize_primitive(data, klass) - if klass == object: + elif klass == object: return self.__deserialize_object(data) - if klass == datetime.date: + elif klass == datetime.date: return self.__deserialize_date(data) - if klass == datetime.datetime: + elif klass == datetime.datetime: return self.__deserialize_datetime(data) - if klass == decimal.Decimal: + elif klass == decimal.Decimal: return decimal.Decimal(data) - if issubclass(klass, Enum): + elif issubclass(klass, Enum): return self.__deserialize_enum(data, klass) - return self.__deserialize_model(data, klass) + else: + return self.__deserialize_model(data, klass) def parameters_to_tuples(self, params, collection_formats): """Get parameters as list of tuples, formatting collections. @@ -459,23 +473,23 @@ def parameters_to_tuples(self, params, collection_formats): :param dict collection_formats: Parameter collection formats :return: Parameters as list of tuples, collections formatted """ - new_params: list[tuple[str, str]] = [] + new_params: List[Tuple[str, str]] = [] if collection_formats is None: collection_formats = {} for k, v in params.items() if isinstance(params, dict) else params: if k in collection_formats: collection_format = collection_formats[k] - if collection_format == "multi": + if collection_format == 'multi': new_params.extend((k, value) for value in v) else: - if collection_format == "ssv": - delimiter = " " - elif collection_format == "tsv": - delimiter = "\t" - elif collection_format == "pipes": - delimiter = "|" + if collection_format == 'ssv': + delimiter = ' ' + elif collection_format == 'tsv': + delimiter = '\t' + elif collection_format == 'pipes': + delimiter = '|' else: # csv is the default - delimiter = "," + delimiter = ',' new_params.append( (k, delimiter.join(str(value) for value in v))) else: @@ -489,7 +503,7 @@ def parameters_to_url_query(self, params, collection_formats): :param dict collection_formats: Parameter collection formats :return: URL query string (e.g. a=Hello%20World&b=123) """ - new_params: list[tuple[str, str]] = [] + new_params: List[Tuple[str, str]] = [] if collection_formats is None: collection_formats = {} for k, v in params.items() if isinstance(params, dict) else params: @@ -502,17 +516,17 @@ def parameters_to_url_query(self, params, collection_formats): if k in collection_formats: collection_format = collection_formats[k] - if collection_format == "multi": + if collection_format == 'multi': new_params.extend((k, str(value)) for value in v) else: - if collection_format == "ssv": - delimiter = " " - elif collection_format == "tsv": - delimiter = "\t" - elif collection_format == "pipes": - delimiter = "|" + if collection_format == 'ssv': + delimiter = ' ' + elif collection_format == 'tsv': + delimiter = '\t' + elif collection_format == 'pipes': + delimiter = '|' else: # csv is the default - delimiter = "," + delimiter = ',' new_params.append( (k, delimiter.join(quote(str(value)) for value in v)) ) @@ -523,7 +537,7 @@ def parameters_to_url_query(self, params, collection_formats): def files_parameters( self, - files: dict[str, str | bytes | list[str] | list[bytes] | tuple[str, bytes]], + files: Dict[str, Union[str, bytes, List[str], List[bytes], Tuple[str, bytes]]], ): """Builds form parameters. @@ -533,7 +547,7 @@ def files_parameters( params = [] for k, v in files.items(): if isinstance(v, str): - with open(v, "rb") as f: + with open(v, 'rb') as f: filename = os.path.basename(f.name) filedata = f.read() elif isinstance(v, bytes): @@ -549,14 +563,14 @@ def files_parameters( raise ValueError("Unsupported file value") mimetype = ( mimetypes.guess_type(filename)[0] - or "application/octet-stream" + or 'application/octet-stream' ) params.append( tuple([k, tuple([filename, filedata, mimetype])]) ) return params - def select_header_accept(self, accepts: list[str]) -> str | None: + def select_header_accept(self, accepts: List[str]) -> Optional[str]: """Returns `Accept` based on an array of accepts provided. :param accepts: List of headers. @@ -566,7 +580,7 @@ def select_header_accept(self, accepts: list[str]) -> str | None: return None for accept in accepts: - if re.search(r"json", accept, re.IGNORECASE): + if re.search('json', accept, re.IGNORECASE): return accept return accepts[0] @@ -581,7 +595,7 @@ def select_header_content_type(self, content_types): return None for content_type in content_types: - if re.search(r"json", content_type, re.IGNORECASE): + if re.search('json', content_type, re.IGNORECASE): return content_type return content_types[0] @@ -652,16 +666,16 @@ def _apply_auth_params( The object type is the return value of sanitize_for_serialization(). :param auth_setting: auth settings for the endpoint """ - if auth_setting["in"] == "cookie": - headers["Cookie"] = auth_setting["value"] - elif auth_setting["in"] == "header": - if auth_setting["type"] != "http-signature": - headers[auth_setting["key"]] = auth_setting["value"] - elif auth_setting["in"] == "query": - queries.append((auth_setting["key"], auth_setting["value"])) + if auth_setting['in'] == 'cookie': + headers['Cookie'] = auth_setting['value'] + elif auth_setting['in'] == 'header': + if auth_setting['type'] != 'http-signature': + headers[auth_setting['key']] = auth_setting['value'] + elif auth_setting['in'] == 'query': + queries.append((auth_setting['key'], auth_setting['value'])) else: raise ApiValueError( - "Authentication token must be in `query` or `header`" + 'Authentication token must be in `query` or `header`' ) def __deserialize_file(self, response): @@ -730,7 +744,7 @@ def __deserialize_date(self, string): except ValueError: raise rest.ApiException( status=0, - reason=f"Failed to parse `{string}` as date object" + reason="Failed to parse `{0}` as date object".format(string) ) def __deserialize_datetime(self, string): @@ -749,8 +763,8 @@ def __deserialize_datetime(self, string): raise rest.ApiException( status=0, reason=( - f"Failed to parse `{string}` as datetime object" - + "Failed to parse `{0}` as datetime object" + .format(string) ) ) @@ -767,8 +781,8 @@ def __deserialize_enum(self, data, klass): raise rest.ApiException( status=0, reason=( - f"Failed to parse `{data}` as `{klass}`" - + "Failed to parse `{0}` as `{1}`" + .format(data, klass) ) ) @@ -779,4 +793,5 @@ def __deserialize_model(self, data, klass): :param klass: class literal. :return: model object. """ + return klass.from_dict(data) diff --git a/codegen/aignx/codegen/api_response.py b/codegen/out/aignx/codegen/api_response.py similarity index 67% rename from codegen/aignx/codegen/api_response.py rename to codegen/out/aignx/codegen/api_response.py index fbdf12c9..9bc7c11f 100644 --- a/codegen/aignx/codegen/api_response.py +++ b/codegen/out/aignx/codegen/api_response.py @@ -1,22 +1,18 @@ """API response object.""" from __future__ import annotations - -from collections.abc import Mapping -from typing import Generic, TypeVar - -from pydantic import BaseModel, Field, StrictBytes, StrictInt +from typing import Optional, Generic, Mapping, TypeVar +from pydantic import Field, StrictInt, StrictBytes, BaseModel T = TypeVar("T") - class ApiResponse(BaseModel, Generic[T]): """ API response object """ status_code: StrictInt = Field(description="HTTP status code") - headers: Mapping[str, str] | None = Field(None, description="HTTP headers") + headers: Optional[Mapping[str, str]] = Field(None, description="HTTP headers") data: T = Field(description="Deserialized data given the data type") raw_data: StrictBytes = Field(description="Raw data (HTTP response body)") diff --git a/codegen/aignx/codegen/configuration.py b/codegen/out/aignx/codegen/configuration.py similarity index 79% rename from codegen/aignx/codegen/configuration.py rename to codegen/out/aignx/codegen/configuration.py index d6a28432..9b55ae13 100644 --- a/codegen/aignx/codegen/configuration.py +++ b/codegen/out/aignx/codegen/configuration.py @@ -1,33 +1,36 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 import copy import http.client as httplib import logging +from logging import FileHandler import multiprocessing import sys -from logging import FileHandler -from typing import Any, ClassVar, Literal, NotRequired, Self, TypedDict +from typing import Any, ClassVar, Dict, List, Literal, Optional, TypedDict +from typing_extensions import NotRequired, Self import urllib3 + JSON_SCHEMA_VALIDATION_KEYWORDS = { - "multipleOf", "maximum", "exclusiveMaximum", - "minimum", "exclusiveMinimum", "maxLength", - "minLength", "pattern", "maxItems", "minItems" + 'multipleOf', 'maximum', 'exclusiveMaximum', + 'minimum', 'exclusiveMinimum', 'maxLength', + 'minLength', 'pattern', 'maxItems', 'minItems' } -ServerVariablesT = dict[str, str] +ServerVariablesT = Dict[str, str] GenericAuthSetting = TypedDict( "GenericAuthSetting", @@ -57,7 +60,7 @@ "type": Literal["api_key"], "in": str, "key": str, - "value": str | None, + "value": Optional[str], }, ) @@ -68,7 +71,7 @@ "type": Literal["basic"], "in": Literal["header"], "key": Literal["Authorization"], - "value": str | None, + "value": Optional[str], }, ) @@ -107,20 +110,25 @@ ) -class AuthSettings(TypedDict, total=False): - OAuth2AuthorizationCodeBearer: OAuth2AuthSetting +AuthSettings = TypedDict( + "AuthSettings", + { + "OAuth2AuthorizationCodeBearer": OAuth2AuthSetting, + }, + total=False, +) class HostSettingVariable(TypedDict): description: str default_value: str - enum_values: list[str] + enum_values: List[str] class HostSetting(TypedDict): url: str description: str - variables: NotRequired[dict[str, HostSettingVariable]] + variables: NotRequired[Dict[str, HostSettingVariable]] class Configuration: @@ -157,25 +165,25 @@ class Configuration: :Example: """ - _default: ClassVar[Self | None] = None + _default: ClassVar[Optional[Self]] = None def __init__( self, - host: str | None = None, - api_key: dict[str, str] | None = None, - api_key_prefix: dict[str, str] | None = None, - username: str | None = None, - password: str | None = None, - access_token: str | None = None, - server_index: int | None = None, - server_variables: ServerVariablesT | None = None, - server_operation_index: dict[int, int] | None = None, - server_operation_variables: dict[int, ServerVariablesT] | None = None, - ignore_operation_servers: bool = False, - ssl_ca_cert: str | None = None, - retries: int | None = None, + host: Optional[str]=None, + api_key: Optional[Dict[str, str]]=None, + api_key_prefix: Optional[Dict[str, str]]=None, + username: Optional[str]=None, + password: Optional[str]=None, + access_token: Optional[str]=None, + server_index: Optional[int]=None, + server_variables: Optional[ServerVariablesT]=None, + server_operation_index: Optional[Dict[int, int]]=None, + server_operation_variables: Optional[Dict[int, ServerVariablesT]]=None, + ignore_operation_servers: bool=False, + ssl_ca_cert: Optional[str]=None, + retries: Optional[int] = None, *, - debug: bool | None = None, + debug: Optional[bool] = None, ) -> None: """Constructor """ @@ -224,13 +232,13 @@ def __init__( """ self.logger["package_logger"] = logging.getLogger("aignx.codegen") self.logger["urllib3_logger"] = logging.getLogger("urllib3") - self.logger_format = "%(asctime)s %(levelname)s %(message)s" + self.logger_format = '%(asctime)s %(levelname)s %(message)s' """Log format """ self.logger_stream_handler = None """Log stream handler """ - self.logger_file_handler: FileHandler | None = None + self.logger_file_handler: Optional[FileHandler] = None """Log file handler """ self.logger_file = None @@ -273,13 +281,13 @@ def __init__( cpu_count * 5 is used as default value to increase performance. """ - self.proxy: str | None = None + self.proxy: Optional[str] = None """Proxy URL """ self.proxy_headers = None """Proxy headers """ - self.safe_chars_for_path_param = "" + self.safe_chars_for_path_param = '' """Safe chars for path_param """ self.retries = retries @@ -300,12 +308,12 @@ def __init__( """date format """ - def __deepcopy__(self, memo: dict[int, Any]) -> Self: + def __deepcopy__(self, memo: Dict[int, Any]) -> Self: cls = self.__class__ result = cls.__new__(cls) memo[id(self)] = result for k, v in self.__dict__.items(): - if k not in ("logger", "logger_file_handler"): + if k not in ('logger', 'logger_file_handler'): setattr(result, k, copy.deepcopy(v, memo)) # shallow copy of loggers result.logger = copy.copy(self.logger) @@ -318,7 +326,7 @@ def __setattr__(self, name: str, value: Any) -> None: object.__setattr__(self, name, value) @classmethod - def set_default(cls, default: Self | None) -> None: + def set_default(cls, default: Optional[Self]) -> None: """Set default instance of configuration. It stores default configuration, which can be @@ -353,7 +361,7 @@ def get_default(cls) -> Self: return cls._default @property - def logger_file(self) -> str | None: + def logger_file(self) -> Optional[str]: """The logger file. If the logger_file is None, then add stream handler and remove file @@ -365,7 +373,7 @@ def logger_file(self) -> str | None: return self.__logger_file @logger_file.setter - def logger_file(self, value: str | None) -> None: + def logger_file(self, value: Optional[str]) -> None: """The logger file. If the logger_file is None, then add stream handler and remove file @@ -437,7 +445,7 @@ def logger_format(self, value: str) -> None: self.__logger_format = value self.logger_formatter = logging.Formatter(self.__logger_format) - def get_api_key_with_prefix(self, identifier: str, alias: str | None = None) -> str | None: + def get_api_key_with_prefix(self, identifier: str, alias: Optional[str]=None) -> Optional[str]: """Gets API key (with prefix if set). :param identifier: The identifier of apiKey. @@ -451,11 +459,12 @@ def get_api_key_with_prefix(self, identifier: str, alias: str | None = None) -> prefix = self.api_key_prefix.get(identifier) if prefix: return "%s %s" % (prefix, key) - return key + else: + return key return None - def get_basic_auth_token(self) -> str | None: + def get_basic_auth_token(self) -> Optional[str]: """Gets HTTP basic authentication header (string). :return: The token for basic HTTP authentication. @@ -467,21 +476,21 @@ def get_basic_auth_token(self) -> str | None: if self.password is not None: password = self.password return urllib3.util.make_headers( - basic_auth=username + ":" + password - ).get("authorization") + basic_auth=username + ':' + password + ).get('authorization') - def auth_settings(self) -> AuthSettings: + def auth_settings(self)-> AuthSettings: """Gets Auth Settings dict for api client. :return: The Auth Settings information dict. """ auth: AuthSettings = {} if self.access_token is not None: - auth["OAuth2AuthorizationCodeBearer"] = { - "type": "oauth2", - "in": "header", - "key": "Authorization", - "value": "Bearer " + self.access_token + auth['OAuth2AuthorizationCodeBearer'] = { + 'type': 'oauth2', + 'in': 'header', + 'key': 'Authorization', + 'value': 'Bearer ' + self.access_token } return auth @@ -491,28 +500,29 @@ def to_debug_report(self) -> str: :return: The report for debugging. """ return "Python SDK Debug Report:\n"\ - f"OS: {sys.platform}\n"\ - f"Python Version: {sys.version}\n"\ + "OS: {env}\n"\ + "Python Version: {pyversion}\n"\ "Version of the API: 0.1.0\n"\ - "SDK Package Version: 1.0.0" + "SDK Package Version: 1.0.0".\ + format(env=sys.platform, pyversion=sys.version) - def get_host_settings(self) -> list[HostSetting]: + def get_host_settings(self) -> List[HostSetting]: """Gets an array of host settings :return: An array of host settings """ return [ { - "url": "", - "description": "No description provided", + 'url': "", + 'description': "No description provided", } ] def get_host_from_settings( self, - index: int | None, - variables: ServerVariablesT | None = None, - servers: list[HostSetting] | None = None, + index: Optional[int], + variables: Optional[ServerVariablesT]=None, + servers: Optional[List[HostSetting]]=None, ) -> str: """Gets host URL based on the index and variables :param index: array index of the host settings @@ -530,23 +540,23 @@ def get_host_from_settings( server = servers[index] except IndexError: raise ValueError( - f"Invalid index {index} when selecting the host settings. " - f"Must be less than {len(servers)}") + "Invalid index {0} when selecting the host settings. " + "Must be less than {1}".format(index, len(servers))) - url = server["url"] + url = server['url'] # go through variables and replace placeholders - for variable_name, variable in server.get("variables", {}).items(): + for variable_name, variable in server.get('variables', {}).items(): used_value = variables.get( - variable_name, variable["default_value"]) + variable_name, variable['default_value']) - if "enum_values" in variable \ - and used_value not in variable["enum_values"]: + if 'enum_values' in variable \ + and used_value not in variable['enum_values']: raise ValueError( "The variable `{0}` in the host URL has invalid value " "{1}. Must be {2}.".format( variable_name, variables[variable_name], - variable["enum_values"])) + variable['enum_values'])) url = url.replace("{" + variable_name + "}", used_value) diff --git a/codegen/aignx/codegen/exceptions.py b/codegen/out/aignx/codegen/exceptions.py similarity index 74% rename from codegen/aignx/codegen/exceptions.py rename to codegen/out/aignx/codegen/exceptions.py index e25a58d3..2eda998d 100644 --- a/codegen/aignx/codegen/exceptions.py +++ b/codegen/out/aignx/codegen/exceptions.py @@ -1,17 +1,18 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 -from typing import Any, Self - +from typing import Any, Optional +from typing_extensions import Self class OpenApiException(Exception): """The base exception class for all OpenAPIExceptions""" @@ -20,7 +21,7 @@ class OpenApiException(Exception): class ApiTypeError(OpenApiException, TypeError): def __init__(self, msg, path_to_item=None, valid_classes=None, key_type=None) -> None: - """Raises an exception for TypeErrors + """ Raises an exception for TypeErrors Args: msg (str): the exception message @@ -42,7 +43,7 @@ def __init__(self, msg, path_to_item=None, valid_classes=None, self.key_type = key_type full_msg = msg if path_to_item: - full_msg = f"{msg} at {render_path(path_to_item)}" + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) super(ApiTypeError, self).__init__(full_msg) @@ -56,10 +57,11 @@ def __init__(self, msg, path_to_item=None) -> None: path_to_item (list) the path to the exception in the received_data dict. None if unset """ + self.path_to_item = path_to_item full_msg = msg if path_to_item: - full_msg = f"{msg} at {render_path(path_to_item)}" + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) super(ApiValueError, self).__init__(full_msg) @@ -78,7 +80,7 @@ def __init__(self, msg, path_to_item=None) -> None: self.path_to_item = path_to_item full_msg = msg if path_to_item: - full_msg = f"{msg} at {render_path(path_to_item)}" + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) super(ApiAttributeError, self).__init__(full_msg) @@ -95,20 +97,20 @@ def __init__(self, msg, path_to_item=None) -> None: self.path_to_item = path_to_item full_msg = msg if path_to_item: - full_msg = f"{msg} at {render_path(path_to_item)}" + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) super(ApiKeyError, self).__init__(full_msg) class ApiException(OpenApiException): def __init__( - self, - status=None, - reason=None, + self, + status=None, + reason=None, http_resp=None, *, - body: str | None = None, - data: Any | None = None, + body: Optional[str] = None, + data: Optional[Any] = None, ) -> None: self.status = status self.reason = reason @@ -123,18 +125,18 @@ def __init__( self.reason = http_resp.reason if self.body is None: try: - self.body = http_resp.data.decode("utf-8") + self.body = http_resp.data.decode('utf-8') except Exception: pass self.headers = http_resp.getheaders() @classmethod def from_response( - cls, - *, - http_resp, - body: str | None, - data: Any | None, + cls, + *, + http_resp, + body: Optional[str], + data: Optional[Any], ) -> Self: if http_resp.status == 400: raise BadRequestException(http_resp=http_resp, body=body, data=data) @@ -154,13 +156,14 @@ def from_response( def __str__(self): """Custom error messages for exception""" - error_message = f"({self.status})\n"\ - f"Reason: {self.reason}\n" + error_message = "({0})\n"\ + "Reason: {1}\n".format(self.status, self.reason) if self.headers: - error_message += f"HTTP response headers: {self.headers}\n" + error_message += "HTTP response headers: {0}\n".format( + self.headers) if self.data or self.body: - error_message += f"HTTP response body: {self.data or self.body}\n" + error_message += "HTTP response body: {0}\n".format(self.data or self.body) return error_message @@ -190,7 +193,7 @@ def render_path(path_to_item): result = "" for pth in path_to_item: if isinstance(pth, int): - result += f"[{pth}]" + result += "[{0}]".format(pth) else: - result += f"['{pth}']" + result += "['{0}']".format(pth) return result diff --git a/codegen/aignx/codegen/models/__init__.py b/codegen/out/aignx/codegen/models/__init__.py similarity index 100% rename from codegen/aignx/codegen/models/__init__.py rename to codegen/out/aignx/codegen/models/__init__.py index 44dc76b3..33ff63eb 100644 --- a/codegen/aignx/codegen/models/__init__.py +++ b/codegen/out/aignx/codegen/models/__init__.py @@ -1,57 +1,57 @@ -from .application_creation_request import * -from .application_creation_response import * -from .application_read_response import * -from .application_run_status import * -from .application_version import * +from .user_creation_request import * +from .item_result_read_response import * +from .input_artifact_schema_creation_request import * +from .organization_update_request import * +from .validation_error_loc_inner import * from .application_version_read_response import * -from .artifact_event import * -from .artifact_status import * -from .http_validation_error import * -from .input_artifact import * -from .input_artifact_creation_request import * +from .item_status import * +from .run_creation_response import * from .input_artifact_read_response import * -from .input_artifact_schema_creation_request import * -from .item_creation_request import * -from .item_event import * -from .item_event_creation_request import * +from .version_creation_request import * +from .user_payload import * +from .validation_error import * +from .application_read_response import * +from .application_creation_response import * +from .output_artifact_event_trigger_response import * +from .output_artifact_event_trigger_request import * +from .application_creation_request import * +from .quota_name import * +from .output_artifact_scope import * +from .version_creation_response import * from .item_event_creation_response import * from .item_read_response import * -from .item_result_read_response import * -from .item_status import * -from .organization_creation_request import * -from .organization_quota import * +from .input_artifact_creation_request import * +from .item_event_creation_request import * +from .user_update_request import * +from .item_creation_request import * from .organization_response import * -from .organization_update_request import * -from .output_artifact import * -from .output_artifact_event_trigger_request import * -from .output_artifact_event_trigger_response import * -from .output_artifact_read_response import * +from .quotas_read_response import * +from .application_version import * +from .http_validation_error import * +from .transfer_urls import * +from .item_event import * +from .slug_version_request import * +from .input_artifact import * from .output_artifact_result_read_response import * +from .version_read_response import * +from .quotas_update_request import * from .output_artifact_schema_creation_request import * -from .output_artifact_scope import * -from .output_artifact_visibility import * +from .run_read_response import * +from .application_run_status import * +from .run_creation_request import * +from .quota_read_response import * +from .payload_output_artifact import * from .payload_input_artifact import * +from .organization_quota import * +from .organization_creation_request import * +from .user_response import * +from .user_quota import * +from .artifact_event import * +from .output_artifact_visibility import * +from .quota_update_response import * from .payload_item import * -from .payload_output_artifact import * -from .quota_name import * -from .quota_read_response import * +from .output_artifact_read_response import * from .quota_update_request import * -from .quota_update_response import * -from .quotas_read_response import * -from .quotas_update_request import * from .quotas_update_response import * -from .run_creation_request import * -from .run_creation_response import * -from .run_read_response import * -from .slug_version_request import * -from .transfer_urls import * -from .user_creation_request import * -from .user_payload import * -from .user_quota import * -from .user_response import * -from .user_update_request import * -from .validation_error import * -from .validation_error_loc_inner import * -from .version_creation_request import * -from .version_creation_response import * -from .version_read_response import * +from .artifact_status import * +from .output_artifact import * diff --git a/codegen/aignx/codegen/models/application_creation_request.py b/codegen/out/aignx/codegen/models/application_creation_request.py similarity index 69% rename from codegen/aignx/codegen/models/application_creation_request.py rename to codegen/out/aignx/codegen/models/application_creation_request.py index e8933db1..b1b6aa4d 100644 --- a/codegen/aignx/codegen/models/application_creation_request.py +++ b/codegen/out/aignx/codegen/models/application_creation_request.py @@ -1,34 +1,35 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self class ApplicationCreationRequest(BaseModel): """ ApplicationCreationRequest - """ + """ # noqa: E501 name: StrictStr description: StrictStr - regulatory_classes: list[StrictStr] - __properties: ClassVar[list[str]] = ["name", "description", "regulatory_classes"] + regulatory_classes: List[StrictStr] + __properties: ClassVar[List[str]] = ["name", "description", "regulatory_classes"] model_config = ConfigDict( populate_by_name=True, @@ -36,6 +37,7 @@ class ApplicationCreationRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -46,11 +48,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of ApplicationCreationRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -60,7 +62,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -71,7 +73,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of ApplicationCreationRequest from a dict""" if obj is None: return None @@ -85,3 +87,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "regulatory_classes": obj.get("regulatory_classes") }) return _obj + + diff --git a/codegen/aignx/codegen/models/application_creation_response.py b/codegen/out/aignx/codegen/models/application_creation_response.py similarity index 68% rename from codegen/aignx/codegen/models/application_creation_response.py rename to codegen/out/aignx/codegen/models/application_creation_response.py index 59486a36..026c7a73 100644 --- a/codegen/aignx/codegen/models/application_creation_response.py +++ b/codegen/out/aignx/codegen/models/application_creation_response.py @@ -1,32 +1,33 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self class ApplicationCreationResponse(BaseModel): """ ApplicationCreationResponse - """ + """ # noqa: E501 application_id: StrictStr - __properties: ClassVar[list[str]] = ["application_id"] + __properties: ClassVar[List[str]] = ["application_id"] model_config = ConfigDict( populate_by_name=True, @@ -34,6 +35,7 @@ class ApplicationCreationResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -44,11 +46,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of ApplicationCreationResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -58,7 +60,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -69,7 +71,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of ApplicationCreationResponse from a dict""" if obj is None: return None @@ -81,3 +83,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "application_id": obj.get("application_id") }) return _obj + + diff --git a/codegen/aignx/codegen/models/application_read_response.py b/codegen/out/aignx/codegen/models/application_read_response.py similarity index 70% rename from codegen/aignx/codegen/models/application_read_response.py rename to codegen/out/aignx/codegen/models/application_read_response.py index 8b1cdbad..aa90171e 100644 --- a/codegen/aignx/codegen/models/application_read_response.py +++ b/codegen/out/aignx/codegen/models/application_read_response.py @@ -1,36 +1,37 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self class ApplicationReadResponse(BaseModel): """ ApplicationReadResponse - """ + """ # noqa: E501 application_id: StrictStr name: StrictStr slug: StrictStr - regulatory_classes: list[StrictStr] + regulatory_classes: List[StrictStr] description: StrictStr - __properties: ClassVar[list[str]] = ["application_id", "name", "slug", "regulatory_classes", "description"] + __properties: ClassVar[List[str]] = ["application_id", "name", "slug", "regulatory_classes", "description"] model_config = ConfigDict( populate_by_name=True, @@ -38,6 +39,7 @@ class ApplicationReadResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -48,11 +50,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of ApplicationReadResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -62,7 +64,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -73,7 +75,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of ApplicationReadResponse from a dict""" if obj is None: return None @@ -89,3 +91,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "description": obj.get("description") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/application_run_status.py b/codegen/out/aignx/codegen/models/application_run_status.py new file mode 100644 index 00000000..0bd73d9c --- /dev/null +++ b/codegen/out/aignx/codegen/models/application_run_status.py @@ -0,0 +1,43 @@ +# coding: utf-8 + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class ApplicationRunStatus(str, Enum): + """ + ApplicationRunStatus + """ + + """ + allowed enum values + """ + CANCELED_SYSTEM = 'canceled_system' + CANCELED_USER = 'canceled_user' + COMPLETED = 'completed' + COMPLETED_WITH_ERROR = 'completed_with_error' + RECEIVED = 'received' + REJECTED = 'rejected' + RUNNING = 'running' + SCHEDULED = 'scheduled' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ApplicationRunStatus from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/codegen/aignx/codegen/models/application_version.py b/codegen/out/aignx/codegen/models/application_version.py similarity index 73% rename from codegen/aignx/codegen/models/application_version.py rename to codegen/out/aignx/codegen/models/application_version.py index a9534c44..5f9bee3f 100644 --- a/codegen/aignx/codegen/models/application_version.py +++ b/codegen/out/aignx/codegen/models/application_version.py @@ -1,44 +1,45 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - +from inspect import getfullargspec import json import pprint import re # noqa: F401 -from typing import TYPE_CHECKING, Any, Self - -from pydantic import BaseModel, StrictStr, ValidationError, field_validator - +from pydantic import BaseModel, ConfigDict, Field, StrictStr, ValidationError, field_validator +from typing import Optional from aignx.codegen.models.slug_version_request import SlugVersionRequest +from typing import Union, Any, List, Set, TYPE_CHECKING, Optional, Dict +from typing_extensions import Literal, Self +from pydantic import Field APPLICATIONVERSION_ANY_OF_SCHEMAS = ["SlugVersionRequest", "str"] - class ApplicationVersion(BaseModel): """ ApplicationVersion """ # data type: str - anyof_schema_1_validator: StrictStr | None = None + anyof_schema_1_validator: Optional[StrictStr] = None # data type: SlugVersionRequest - anyof_schema_2_validator: SlugVersionRequest | None = None + anyof_schema_2_validator: Optional[SlugVersionRequest] = None if TYPE_CHECKING: - actual_instance: SlugVersionRequest | str | None = None + actual_instance: Optional[Union[SlugVersionRequest, str]] = None else: actual_instance: Any = None - any_of_schemas: set[str] = {"SlugVersionRequest", "str"} + any_of_schemas: Set[str] = { "SlugVersionRequest", "str" } model_config = { "validate_assignment": True, @@ -55,7 +56,7 @@ def __init__(self, *args, **kwargs) -> None: else: super().__init__(**kwargs) - @field_validator("actual_instance") + @field_validator('actual_instance') def actual_instance_must_validate_anyof(cls, v): instance = ApplicationVersion.model_construct() error_messages = [] @@ -74,10 +75,11 @@ def actual_instance_must_validate_anyof(cls, v): if error_messages: # no match raise ValueError("No match found when setting the actual_instance in ApplicationVersion with anyOf schemas: SlugVersionRequest, str. Details: " + ", ".join(error_messages)) - return v + else: + return v @classmethod - def from_dict(cls, obj: dict[str, Any]) -> Self: + def from_dict(cls, obj: Dict[str, Any]) -> Self: return cls.from_json(json.dumps(obj)) @classmethod @@ -104,7 +106,8 @@ def from_json(cls, json_str: str) -> Self: if error_messages: # no match raise ValueError("No match found when deserializing the JSON string into ApplicationVersion with anyOf schemas: SlugVersionRequest, str. Details: " + ", ".join(error_messages)) - return instance + else: + return instance def to_json(self) -> str: """Returns the JSON representation of the actual instance""" @@ -113,17 +116,21 @@ def to_json(self) -> str: if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): return self.actual_instance.to_json() - return json.dumps(self.actual_instance) + else: + return json.dumps(self.actual_instance) - def to_dict(self) -> dict[str, Any] | SlugVersionRequest | str | None: + def to_dict(self) -> Optional[Union[Dict[str, Any], SlugVersionRequest, str]]: """Returns the dict representation of the actual instance""" if self.actual_instance is None: return None if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): return self.actual_instance.to_dict() - return self.actual_instance + else: + return self.actual_instance def to_str(self) -> str: """Returns the string representation of the actual instance""" return pprint.pformat(self.model_dump()) + + diff --git a/codegen/aignx/codegen/models/application_version_read_response.py b/codegen/out/aignx/codegen/models/application_version_read_response.py similarity index 77% rename from codegen/aignx/codegen/models/application_version_read_response.py rename to codegen/out/aignx/codegen/models/application_version_read_response.py index f530d262..2f8c2c28 100644 --- a/codegen/aignx/codegen/models/application_version_read_response.py +++ b/codegen/out/aignx/codegen/models/application_version_read_response.py @@ -1,44 +1,45 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint -import re -from typing import Annotated, Any, ClassVar, Self +import re # noqa: F401 +import json from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator - +from typing import Any, ClassVar, Dict, List, Optional +from typing_extensions import Annotated from aignx.codegen.models.input_artifact_read_response import InputArtifactReadResponse from aignx.codegen.models.output_artifact_read_response import OutputArtifactReadResponse - +from typing import Optional, Set +from typing_extensions import Self class ApplicationVersionReadResponse(BaseModel): """ ApplicationVersionReadResponse - """ + """ # noqa: E501 application_version_id: StrictStr application_version_slug: Annotated[str, Field(strict=True)] version: StrictStr application_id: StrictStr - flow_id: StrictStr | None = None + flow_id: Optional[StrictStr] = None changelog: StrictStr - input_artifacts: list[InputArtifactReadResponse] - output_artifacts: list[OutputArtifactReadResponse] - __properties: ClassVar[list[str]] = ["application_version_id", "application_version_slug", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] + input_artifacts: List[InputArtifactReadResponse] + output_artifacts: List[OutputArtifactReadResponse] + __properties: ClassVar[List[str]] = ["application_version_id", "application_version_slug", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] - @field_validator("application_version_slug") + @field_validator('application_version_slug') def application_version_slug_validate_regular_expression(cls, value): """Validates the regular expression""" if not re.match(r"^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$", value): @@ -51,6 +52,7 @@ def application_version_slug_validate_regular_expression(cls, value): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -61,11 +63,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of ApplicationVersionReadResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -75,7 +77,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -89,23 +91,23 @@ def to_dict(self) -> dict[str, Any]: for _item_input_artifacts in self.input_artifacts: if _item_input_artifacts: _items.append(_item_input_artifacts.to_dict()) - _dict["input_artifacts"] = _items + _dict['input_artifacts'] = _items # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) _items = [] if self.output_artifacts: for _item_output_artifacts in self.output_artifacts: if _item_output_artifacts: _items.append(_item_output_artifacts.to_dict()) - _dict["output_artifacts"] = _items + _dict['output_artifacts'] = _items # set to None if flow_id (nullable) is None # and model_fields_set contains the field if self.flow_id is None and "flow_id" in self.model_fields_set: - _dict["flow_id"] = None + _dict['flow_id'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of ApplicationVersionReadResponse from a dict""" if obj is None: return None @@ -124,3 +126,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "output_artifacts": [OutputArtifactReadResponse.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/artifact_event.py b/codegen/out/aignx/codegen/models/artifact_event.py new file mode 100644 index 00000000..5de53169 --- /dev/null +++ b/codegen/out/aignx/codegen/models/artifact_event.py @@ -0,0 +1,38 @@ +# coding: utf-8 + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class ArtifactEvent(str, Enum): + """ + This is a subset of the OutputArtifactEvent used by the state machine. Only the variants defined below are allowed to be submitted from the Algorithms/Applications. + """ + + """ + allowed enum values + """ + SUCCEEDED = 'succeeded' + FAILED_WITH_USER_ERROR = 'failed_with_user_error' + FAILED_WITH_SYSTEM_ERROR = 'failed_with_system_error' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ArtifactEvent from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/codegen/out/aignx/codegen/models/artifact_status.py b/codegen/out/aignx/codegen/models/artifact_status.py new file mode 100644 index 00000000..7ee40339 --- /dev/null +++ b/codegen/out/aignx/codegen/models/artifact_status.py @@ -0,0 +1,43 @@ +# coding: utf-8 + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class ArtifactStatus(str, Enum): + """ + ArtifactStatus + """ + + """ + allowed enum values + """ + PENDING = 'pending' + CANCELED_USER = 'canceled_user' + CANCELED_SYSTEM = 'canceled_system' + ERROR_USER = 'error_user' + ERROR_SYSTEM_FATAL = 'error_system_fatal' + ERROR_SYSTEM_RECOVERABLE = 'error_system_recoverable' + SKIPPED = 'skipped' + SUCCEEDED = 'succeeded' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ArtifactStatus from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/codegen/aignx/codegen/models/http_validation_error.py b/codegen/out/aignx/codegen/models/http_validation_error.py similarity index 70% rename from codegen/aignx/codegen/models/http_validation_error.py rename to codegen/out/aignx/codegen/models/http_validation_error.py index 4081904b..769fd8fa 100644 --- a/codegen/aignx/codegen/models/http_validation_error.py +++ b/codegen/out/aignx/codegen/models/http_validation_error.py @@ -1,34 +1,34 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict - +from typing import Any, ClassVar, Dict, List, Optional from aignx.codegen.models.validation_error import ValidationError - +from typing import Optional, Set +from typing_extensions import Self class HTTPValidationError(BaseModel): """ HTTPValidationError - """ - detail: list[ValidationError] | None = None - __properties: ClassVar[list[str]] = ["detail"] + """ # noqa: E501 + detail: Optional[List[ValidationError]] = None + __properties: ClassVar[List[str]] = ["detail"] model_config = ConfigDict( populate_by_name=True, @@ -36,6 +36,7 @@ class HTTPValidationError(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -46,11 +47,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of HTTPValidationError from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -60,7 +61,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -74,11 +75,11 @@ def to_dict(self) -> dict[str, Any]: for _item_detail in self.detail: if _item_detail: _items.append(_item_detail.to_dict()) - _dict["detail"] = _items + _dict['detail'] = _items return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of HTTPValidationError from a dict""" if obj is None: return None @@ -90,3 +91,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "detail": [ValidationError.from_dict(_item) for _item in obj["detail"]] if obj.get("detail") is not None else None }) return _obj + + diff --git a/codegen/aignx/codegen/models/input_artifact.py b/codegen/out/aignx/codegen/models/input_artifact.py similarity index 69% rename from codegen/aignx/codegen/models/input_artifact.py rename to codegen/out/aignx/codegen/models/input_artifact.py index e775245f..0ac720b9 100644 --- a/codegen/aignx/codegen/models/input_artifact.py +++ b/codegen/out/aignx/codegen/models/input_artifact.py @@ -1,36 +1,38 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint -import re -from typing import Annotated, Any, ClassVar, Self +import re # noqa: F401 +import json from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator - +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self class InputArtifact(BaseModel): """ InputArtifact - """ + """ # noqa: E501 name: StrictStr mime_type: Annotated[str, Field(strict=True)] - metadata_schema: dict[str, Any] - __properties: ClassVar[list[str]] = ["name", "mime_type", "metadata_schema"] + metadata_schema: Dict[str, Any] + __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema"] - @field_validator("mime_type") + @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): @@ -43,6 +45,7 @@ def mime_type_validate_regular_expression(cls, value): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -53,11 +56,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of InputArtifact from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -67,7 +70,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -78,7 +81,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of InputArtifact from a dict""" if obj is None: return None @@ -92,3 +95,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "metadata_schema": obj.get("metadata_schema") }) return _obj + + diff --git a/codegen/aignx/codegen/models/input_artifact_creation_request.py b/codegen/out/aignx/codegen/models/input_artifact_creation_request.py similarity index 68% rename from codegen/aignx/codegen/models/input_artifact_creation_request.py rename to codegen/out/aignx/codegen/models/input_artifact_creation_request.py index 2e3e20ae..bde6dd98 100644 --- a/codegen/aignx/codegen/models/input_artifact_creation_request.py +++ b/codegen/out/aignx/codegen/models/input_artifact_creation_request.py @@ -1,34 +1,36 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Annotated, Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, Field, StrictStr - +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self class InputArtifactCreationRequest(BaseModel): """ InputArtifactCreationRequest - """ + """ # noqa: E501 name: StrictStr download_url: Annotated[str, Field(min_length=1, strict=True, max_length=2083)] - metadata: dict[str, Any] - __properties: ClassVar[list[str]] = ["name", "download_url", "metadata"] + metadata: Dict[str, Any] + __properties: ClassVar[List[str]] = ["name", "download_url", "metadata"] model_config = ConfigDict( populate_by_name=True, @@ -36,6 +38,7 @@ class InputArtifactCreationRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -46,11 +49,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of InputArtifactCreationRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -60,7 +63,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -71,7 +74,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of InputArtifactCreationRequest from a dict""" if obj is None: return None @@ -85,3 +88,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "metadata": obj.get("metadata") }) return _obj + + diff --git a/codegen/aignx/codegen/models/input_artifact_read_response.py b/codegen/out/aignx/codegen/models/input_artifact_read_response.py similarity index 69% rename from codegen/aignx/codegen/models/input_artifact_read_response.py rename to codegen/out/aignx/codegen/models/input_artifact_read_response.py index 94326b2c..c831851b 100644 --- a/codegen/aignx/codegen/models/input_artifact_read_response.py +++ b/codegen/out/aignx/codegen/models/input_artifact_read_response.py @@ -1,36 +1,38 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint -import re -from typing import Annotated, Any, ClassVar, Self +import re # noqa: F401 +import json from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator - +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self class InputArtifactReadResponse(BaseModel): """ InputArtifactReadResponse - """ + """ # noqa: E501 name: StrictStr mime_type: Annotated[str, Field(strict=True)] - metadata_schema: dict[str, Any] - __properties: ClassVar[list[str]] = ["name", "mime_type", "metadata_schema"] + metadata_schema: Dict[str, Any] + __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema"] - @field_validator("mime_type") + @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): @@ -43,6 +45,7 @@ def mime_type_validate_regular_expression(cls, value): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -53,11 +56,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of InputArtifactReadResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -67,7 +70,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -78,7 +81,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of InputArtifactReadResponse from a dict""" if obj is None: return None @@ -92,3 +95,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "metadata_schema": obj.get("metadata_schema") }) return _obj + + diff --git a/codegen/aignx/codegen/models/input_artifact_schema_creation_request.py b/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py similarity index 69% rename from codegen/aignx/codegen/models/input_artifact_schema_creation_request.py rename to codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py index 968d2b3e..a463bf2d 100644 --- a/codegen/aignx/codegen/models/input_artifact_schema_creation_request.py +++ b/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py @@ -1,34 +1,35 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self class InputArtifactSchemaCreationRequest(BaseModel): """ InputArtifactSchemaCreationRequest - """ + """ # noqa: E501 name: StrictStr mime_type: StrictStr - metadata_schema: dict[str, Any] - __properties: ClassVar[list[str]] = ["name", "mime_type", "metadata_schema"] + metadata_schema: Dict[str, Any] + __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema"] model_config = ConfigDict( populate_by_name=True, @@ -36,6 +37,7 @@ class InputArtifactSchemaCreationRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -46,11 +48,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of InputArtifactSchemaCreationRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -60,7 +62,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -71,7 +73,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of InputArtifactSchemaCreationRequest from a dict""" if obj is None: return None @@ -85,3 +87,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "metadata_schema": obj.get("metadata_schema") }) return _obj + + diff --git a/codegen/aignx/codegen/models/item_creation_request.py b/codegen/out/aignx/codegen/models/item_creation_request.py similarity index 71% rename from codegen/aignx/codegen/models/item_creation_request.py rename to codegen/out/aignx/codegen/models/item_creation_request.py index 83fcdafb..7831ca6f 100644 --- a/codegen/aignx/codegen/models/item_creation_request.py +++ b/codegen/out/aignx/codegen/models/item_creation_request.py @@ -1,35 +1,35 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.input_artifact_creation_request import InputArtifactCreationRequest - +from typing import Optional, Set +from typing_extensions import Self class ItemCreationRequest(BaseModel): """ ItemCreationRequest - """ + """ # noqa: E501 reference: StrictStr - input_artifacts: list[InputArtifactCreationRequest] - __properties: ClassVar[list[str]] = ["reference", "input_artifacts"] + input_artifacts: List[InputArtifactCreationRequest] + __properties: ClassVar[List[str]] = ["reference", "input_artifacts"] model_config = ConfigDict( populate_by_name=True, @@ -37,6 +37,7 @@ class ItemCreationRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -47,11 +48,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of ItemCreationRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -61,7 +62,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -75,11 +76,11 @@ def to_dict(self) -> dict[str, Any]: for _item_input_artifacts in self.input_artifacts: if _item_input_artifacts: _items.append(_item_input_artifacts.to_dict()) - _dict["input_artifacts"] = _items + _dict['input_artifacts'] = _items return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of ItemCreationRequest from a dict""" if obj is None: return None @@ -92,3 +93,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "input_artifacts": [InputArtifactCreationRequest.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/item_event.py b/codegen/out/aignx/codegen/models/item_event.py new file mode 100644 index 00000000..5f4d709f --- /dev/null +++ b/codegen/out/aignx/codegen/models/item_event.py @@ -0,0 +1,37 @@ +# coding: utf-8 + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class ItemEvent(str, Enum): + """ + ItemEvent + """ + + """ + allowed enum values + """ + FAILED_WITH_SYSTEM_ERROR = 'failed_with_system_error' + FAILED_RECOVERABLE = 'failed_recoverable' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ItemEvent from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/codegen/aignx/codegen/models/item_event_creation_request.py b/codegen/out/aignx/codegen/models/item_event_creation_request.py similarity index 69% rename from codegen/aignx/codegen/models/item_event_creation_request.py rename to codegen/out/aignx/codegen/models/item_event_creation_request.py index ff489473..30271ed3 100644 --- a/codegen/aignx/codegen/models/item_event_creation_request.py +++ b/codegen/out/aignx/codegen/models/item_event_creation_request.py @@ -1,35 +1,35 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.item_event import ItemEvent - +from typing import Optional, Set +from typing_extensions import Self class ItemEventCreationRequest(BaseModel): """ ItemEventCreationRequest - """ + """ # noqa: E501 event: ItemEvent error: StrictStr - __properties: ClassVar[list[str]] = ["event", "error"] + __properties: ClassVar[List[str]] = ["event", "error"] model_config = ConfigDict( populate_by_name=True, @@ -37,6 +37,7 @@ class ItemEventCreationRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -47,11 +48,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of ItemEventCreationRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -61,7 +62,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -72,7 +73,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of ItemEventCreationRequest from a dict""" if obj is None: return None @@ -85,3 +86,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "error": obj.get("error") }) return _obj + + diff --git a/codegen/aignx/codegen/models/item_event_creation_response.py b/codegen/out/aignx/codegen/models/item_event_creation_response.py similarity index 69% rename from codegen/aignx/codegen/models/item_event_creation_response.py rename to codegen/out/aignx/codegen/models/item_event_creation_response.py index 72d006ee..c3028f57 100644 --- a/codegen/aignx/codegen/models/item_event_creation_response.py +++ b/codegen/out/aignx/codegen/models/item_event_creation_response.py @@ -1,35 +1,35 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.item_status import ItemStatus - +from typing import Optional, Set +from typing_extensions import Self class ItemEventCreationResponse(BaseModel): """ ItemEventCreationResponse - """ + """ # noqa: E501 item_id: StrictStr status: ItemStatus - __properties: ClassVar[list[str]] = ["item_id", "status"] + __properties: ClassVar[List[str]] = ["item_id", "status"] model_config = ConfigDict( populate_by_name=True, @@ -37,6 +37,7 @@ class ItemEventCreationResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -47,11 +48,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of ItemEventCreationResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -61,7 +62,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -72,7 +73,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of ItemEventCreationResponse from a dict""" if obj is None: return None @@ -85,3 +86,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "status": obj.get("status") }) return _obj + + diff --git a/codegen/aignx/codegen/models/item_read_response.py b/codegen/out/aignx/codegen/models/item_read_response.py similarity index 71% rename from codegen/aignx/codegen/models/item_read_response.py rename to codegen/out/aignx/codegen/models/item_read_response.py index d4ee1b56..2d720aaf 100644 --- a/codegen/aignx/codegen/models/item_read_response.py +++ b/codegen/out/aignx/codegen/models/item_read_response.py @@ -1,38 +1,38 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List, Optional from aignx.codegen.models.item_status import ItemStatus - +from typing import Optional, Set +from typing_extensions import Self class ItemReadResponse(BaseModel): """ ItemReadResponse - """ + """ # noqa: E501 item_id: StrictStr - application_run_id: StrictStr | None = None + application_run_id: Optional[StrictStr] = None reference: StrictStr status: ItemStatus - error: StrictStr | None - __properties: ClassVar[list[str]] = ["item_id", "application_run_id", "reference", "status", "error"] + error: Optional[StrictStr] + __properties: ClassVar[List[str]] = ["item_id", "application_run_id", "reference", "status", "error"] model_config = ConfigDict( populate_by_name=True, @@ -40,6 +40,7 @@ class ItemReadResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -50,11 +51,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of ItemReadResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -64,7 +65,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -75,17 +76,17 @@ def to_dict(self) -> dict[str, Any]: # set to None if application_run_id (nullable) is None # and model_fields_set contains the field if self.application_run_id is None and "application_run_id" in self.model_fields_set: - _dict["application_run_id"] = None + _dict['application_run_id'] = None # set to None if error (nullable) is None # and model_fields_set contains the field if self.error is None and "error" in self.model_fields_set: - _dict["error"] = None + _dict['error'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of ItemReadResponse from a dict""" if obj is None: return None @@ -101,3 +102,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "error": obj.get("error") }) return _obj + + diff --git a/codegen/aignx/codegen/models/item_result_read_response.py b/codegen/out/aignx/codegen/models/item_result_read_response.py similarity index 74% rename from codegen/aignx/codegen/models/item_result_read_response.py rename to codegen/out/aignx/codegen/models/item_result_read_response.py index caae55dd..01d90d9c 100644 --- a/codegen/aignx/codegen/models/item_result_read_response.py +++ b/codegen/out/aignx/codegen/models/item_result_read_response.py @@ -1,40 +1,40 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List, Optional from aignx.codegen.models.item_status import ItemStatus from aignx.codegen.models.output_artifact_result_read_response import OutputArtifactResultReadResponse - +from typing import Optional, Set +from typing_extensions import Self class ItemResultReadResponse(BaseModel): """ ItemResultReadResponse - """ + """ # noqa: E501 item_id: StrictStr application_run_id: StrictStr reference: StrictStr status: ItemStatus - error: StrictStr | None - output_artifacts: list[OutputArtifactResultReadResponse] - __properties: ClassVar[list[str]] = ["item_id", "application_run_id", "reference", "status", "error", "output_artifacts"] + error: Optional[StrictStr] + output_artifacts: List[OutputArtifactResultReadResponse] + __properties: ClassVar[List[str]] = ["item_id", "application_run_id", "reference", "status", "error", "output_artifacts"] model_config = ConfigDict( populate_by_name=True, @@ -42,6 +42,7 @@ class ItemResultReadResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -52,11 +53,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of ItemResultReadResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -66,7 +67,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -80,16 +81,16 @@ def to_dict(self) -> dict[str, Any]: for _item_output_artifacts in self.output_artifacts: if _item_output_artifacts: _items.append(_item_output_artifacts.to_dict()) - _dict["output_artifacts"] = _items + _dict['output_artifacts'] = _items # set to None if error (nullable) is None # and model_fields_set contains the field if self.error is None and "error" in self.model_fields_set: - _dict["error"] = None + _dict['error'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of ItemResultReadResponse from a dict""" if obj is None: return None @@ -106,3 +107,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "output_artifacts": [OutputArtifactResultReadResponse.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/item_status.py b/codegen/out/aignx/codegen/models/item_status.py new file mode 100644 index 00000000..646b0e2c --- /dev/null +++ b/codegen/out/aignx/codegen/models/item_status.py @@ -0,0 +1,41 @@ +# coding: utf-8 + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class ItemStatus(str, Enum): + """ + ItemStatus + """ + + """ + allowed enum values + """ + PENDING = 'pending' + CANCELED_USER = 'canceled_user' + CANCELED_SYSTEM = 'canceled_system' + ERROR_USER = 'error_user' + ERROR_SYSTEM = 'error_system' + SUCCEEDED = 'succeeded' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ItemStatus from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/codegen/aignx/codegen/models/organization_creation_request.py b/codegen/out/aignx/codegen/models/organization_creation_request.py similarity index 71% rename from codegen/aignx/codegen/models/organization_creation_request.py rename to codegen/out/aignx/codegen/models/organization_creation_request.py index e587f375..9dba311e 100644 --- a/codegen/aignx/codegen/models/organization_creation_request.py +++ b/codegen/out/aignx/codegen/models/organization_creation_request.py @@ -1,35 +1,36 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr - +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self class OrganizationCreationRequest(BaseModel): """ OrganizationCreationRequest - """ + """ # noqa: E501 organization_id: StrictStr owner_email: StrictStr slide_quota: StrictInt batch_size: StrictInt - __properties: ClassVar[list[str]] = ["organization_id", "owner_email", "slide_quota", "batch_size"] + __properties: ClassVar[List[str]] = ["organization_id", "owner_email", "slide_quota", "batch_size"] model_config = ConfigDict( populate_by_name=True, @@ -37,6 +38,7 @@ class OrganizationCreationRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -47,11 +49,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of OrganizationCreationRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -61,7 +63,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -72,7 +74,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of OrganizationCreationRequest from a dict""" if obj is None: return None @@ -87,3 +89,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "batch_size": obj.get("batch_size") }) return _obj + + diff --git a/codegen/aignx/codegen/models/organization_quota.py b/codegen/out/aignx/codegen/models/organization_quota.py similarity index 68% rename from codegen/aignx/codegen/models/organization_quota.py rename to codegen/out/aignx/codegen/models/organization_quota.py index a5ff8882..61c5ba4e 100644 --- a/codegen/aignx/codegen/models/organization_quota.py +++ b/codegen/out/aignx/codegen/models/organization_quota.py @@ -1,33 +1,34 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictInt - +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self class OrganizationQuota(BaseModel): """ OrganizationQuota - """ - total: StrictInt | None + """ # noqa: E501 + total: Optional[StrictInt] used: StrictInt - __properties: ClassVar[list[str]] = ["total", "used"] + __properties: ClassVar[List[str]] = ["total", "used"] model_config = ConfigDict( populate_by_name=True, @@ -35,6 +36,7 @@ class OrganizationQuota(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -45,11 +47,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of OrganizationQuota from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -59,7 +61,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -70,12 +72,12 @@ def to_dict(self) -> dict[str, Any]: # set to None if total (nullable) is None # and model_fields_set contains the field if self.total is None and "total" in self.model_fields_set: - _dict["total"] = None + _dict['total'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of OrganizationQuota from a dict""" if obj is None: return None @@ -88,3 +90,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "used": obj.get("used") }) return _obj + + diff --git a/codegen/aignx/codegen/models/organization_response.py b/codegen/out/aignx/codegen/models/organization_response.py similarity index 72% rename from codegen/aignx/codegen/models/organization_response.py rename to codegen/out/aignx/codegen/models/organization_response.py index daadd054..857f6097 100644 --- a/codegen/aignx/codegen/models/organization_response.py +++ b/codegen/out/aignx/codegen/models/organization_response.py @@ -1,37 +1,37 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.organization_quota import OrganizationQuota - +from typing import Optional, Set +from typing_extensions import Self class OrganizationResponse(BaseModel): """ OrganizationResponse - """ + """ # noqa: E501 organization_id: StrictStr owner_id: StrictStr slide_quota: OrganizationQuota batch_size: StrictInt - __properties: ClassVar[list[str]] = ["organization_id", "owner_id", "slide_quota", "batch_size"] + __properties: ClassVar[List[str]] = ["organization_id", "owner_id", "slide_quota", "batch_size"] model_config = ConfigDict( populate_by_name=True, @@ -39,6 +39,7 @@ class OrganizationResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -49,11 +50,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of OrganizationResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -63,7 +64,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -73,11 +74,11 @@ def to_dict(self) -> dict[str, Any]: ) # override the default output from pydantic by calling `to_dict()` of slide_quota if self.slide_quota: - _dict["slide_quota"] = self.slide_quota.to_dict() + _dict['slide_quota'] = self.slide_quota.to_dict() return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of OrganizationResponse from a dict""" if obj is None: return None @@ -92,3 +93,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "batch_size": obj.get("batch_size") }) return _obj + + diff --git a/codegen/aignx/codegen/models/organization_update_request.py b/codegen/out/aignx/codegen/models/organization_update_request.py similarity index 68% rename from codegen/aignx/codegen/models/organization_update_request.py rename to codegen/out/aignx/codegen/models/organization_update_request.py index 30ade97d..f0e74fb4 100644 --- a/codegen/aignx/codegen/models/organization_update_request.py +++ b/codegen/out/aignx/codegen/models/organization_update_request.py @@ -1,33 +1,34 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictInt - +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self class OrganizationUpdateRequest(BaseModel): """ OrganizationUpdateRequest - """ - slide_quota: StrictInt | None = None - batch_size: StrictInt | None = None - __properties: ClassVar[list[str]] = ["slide_quota", "batch_size"] + """ # noqa: E501 + slide_quota: Optional[StrictInt] = None + batch_size: Optional[StrictInt] = None + __properties: ClassVar[List[str]] = ["slide_quota", "batch_size"] model_config = ConfigDict( populate_by_name=True, @@ -35,6 +36,7 @@ class OrganizationUpdateRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -45,11 +47,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of OrganizationUpdateRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -59,7 +61,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -70,17 +72,17 @@ def to_dict(self) -> dict[str, Any]: # set to None if slide_quota (nullable) is None # and model_fields_set contains the field if self.slide_quota is None and "slide_quota" in self.model_fields_set: - _dict["slide_quota"] = None + _dict['slide_quota'] = None # set to None if batch_size (nullable) is None # and model_fields_set contains the field if self.batch_size is None and "batch_size" in self.model_fields_set: - _dict["batch_size"] = None + _dict['batch_size'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of OrganizationUpdateRequest from a dict""" if obj is None: return None @@ -93,3 +95,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "batch_size": obj.get("batch_size") }) return _obj + + diff --git a/codegen/aignx/codegen/models/output_artifact.py b/codegen/out/aignx/codegen/models/output_artifact.py similarity index 72% rename from codegen/aignx/codegen/models/output_artifact.py rename to codegen/out/aignx/codegen/models/output_artifact.py index 99b639d8..9bc27023 100644 --- a/codegen/aignx/codegen/models/output_artifact.py +++ b/codegen/out/aignx/codegen/models/output_artifact.py @@ -1,41 +1,42 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint -import re -from typing import Annotated, Any, ClassVar, Self +import re # noqa: F401 +import json from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator - +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated from aignx.codegen.models.output_artifact_scope import OutputArtifactScope from aignx.codegen.models.output_artifact_visibility import OutputArtifactVisibility - +from typing import Optional, Set +from typing_extensions import Self class OutputArtifact(BaseModel): """ OutputArtifact - """ + """ # noqa: E501 name: StrictStr mime_type: Annotated[str, Field(strict=True)] - metadata_schema: dict[str, Any] + metadata_schema: Dict[str, Any] scope: OutputArtifactScope visibility: OutputArtifactVisibility - __properties: ClassVar[list[str]] = ["name", "mime_type", "metadata_schema", "scope", "visibility"] + __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema", "scope", "visibility"] - @field_validator("mime_type") + @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): @@ -48,6 +49,7 @@ def mime_type_validate_regular_expression(cls, value): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -58,11 +60,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of OutputArtifact from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -72,7 +74,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -83,7 +85,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of OutputArtifact from a dict""" if obj is None: return None @@ -99,3 +101,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "visibility": obj.get("visibility") }) return _obj + + diff --git a/codegen/aignx/codegen/models/output_artifact_event_trigger_request.py b/codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py similarity index 69% rename from codegen/aignx/codegen/models/output_artifact_event_trigger_request.py rename to codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py index a6f4b382..ef777027 100644 --- a/codegen/aignx/codegen/models/output_artifact_event_trigger_request.py +++ b/codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py @@ -1,36 +1,36 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List, Optional from aignx.codegen.models.artifact_event import ArtifactEvent - +from typing import Optional, Set +from typing_extensions import Self class OutputArtifactEventTriggerRequest(BaseModel): """ OutputArtifactEventTriggerRequest - """ + """ # noqa: E501 event: ArtifactEvent - metadata: dict[str, Any] - error: StrictStr | None = None - __properties: ClassVar[list[str]] = ["event", "metadata", "error"] + metadata: Dict[str, Any] + error: Optional[StrictStr] = None + __properties: ClassVar[List[str]] = ["event", "metadata", "error"] model_config = ConfigDict( populate_by_name=True, @@ -38,6 +38,7 @@ class OutputArtifactEventTriggerRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -48,11 +49,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of OutputArtifactEventTriggerRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -62,7 +63,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -73,12 +74,12 @@ def to_dict(self) -> dict[str, Any]: # set to None if error (nullable) is None # and model_fields_set contains the field if self.error is None and "error" in self.model_fields_set: - _dict["error"] = None + _dict['error'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of OutputArtifactEventTriggerRequest from a dict""" if obj is None: return None @@ -92,3 +93,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "error": obj.get("error") }) return _obj + + diff --git a/codegen/aignx/codegen/models/output_artifact_event_trigger_response.py b/codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py similarity index 70% rename from codegen/aignx/codegen/models/output_artifact_event_trigger_response.py rename to codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py index f5fe7d4c..0c802b7e 100644 --- a/codegen/aignx/codegen/models/output_artifact_event_trigger_response.py +++ b/codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py @@ -1,35 +1,35 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.artifact_status import ArtifactStatus - +from typing import Optional, Set +from typing_extensions import Self class OutputArtifactEventTriggerResponse(BaseModel): """ OutputArtifactEventTriggerResponse - """ + """ # noqa: E501 output_artifact_id: StrictStr status: ArtifactStatus - __properties: ClassVar[list[str]] = ["output_artifact_id", "status"] + __properties: ClassVar[List[str]] = ["output_artifact_id", "status"] model_config = ConfigDict( populate_by_name=True, @@ -37,6 +37,7 @@ class OutputArtifactEventTriggerResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -47,11 +48,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of OutputArtifactEventTriggerResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -61,7 +62,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -72,7 +73,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of OutputArtifactEventTriggerResponse from a dict""" if obj is None: return None @@ -85,3 +86,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "status": obj.get("status") }) return _obj + + diff --git a/codegen/aignx/codegen/models/output_artifact_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_read_response.py similarity index 71% rename from codegen/aignx/codegen/models/output_artifact_read_response.py rename to codegen/out/aignx/codegen/models/output_artifact_read_response.py index 8f9a670a..abab4c4a 100644 --- a/codegen/aignx/codegen/models/output_artifact_read_response.py +++ b/codegen/out/aignx/codegen/models/output_artifact_read_response.py @@ -1,39 +1,40 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint -import re -from typing import Annotated, Any, ClassVar, Self +import re # noqa: F401 +import json from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator - +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated from aignx.codegen.models.output_artifact_scope import OutputArtifactScope - +from typing import Optional, Set +from typing_extensions import Self class OutputArtifactReadResponse(BaseModel): """ OutputArtifactReadResponse - """ + """ # noqa: E501 name: StrictStr mime_type: Annotated[str, Field(strict=True)] - metadata_schema: dict[str, Any] + metadata_schema: Dict[str, Any] scope: OutputArtifactScope - __properties: ClassVar[list[str]] = ["name", "mime_type", "metadata_schema", "scope"] + __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema", "scope"] - @field_validator("mime_type") + @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): @@ -46,6 +47,7 @@ def mime_type_validate_regular_expression(cls, value): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -56,11 +58,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of OutputArtifactReadResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -70,7 +72,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -81,7 +83,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of OutputArtifactReadResponse from a dict""" if obj is None: return None @@ -96,3 +98,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "scope": obj.get("scope") }) return _obj + + diff --git a/codegen/aignx/codegen/models/output_artifact_result_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py similarity index 70% rename from codegen/aignx/codegen/models/output_artifact_result_read_response.py rename to codegen/out/aignx/codegen/models/output_artifact_result_read_response.py index e346e8ae..7af8bd0b 100644 --- a/codegen/aignx/codegen/models/output_artifact_result_read_response.py +++ b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py @@ -1,38 +1,40 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint -import re -from typing import Annotated, Any, ClassVar, Self +import re # noqa: F401 +import json from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator - +from typing import Any, ClassVar, Dict, List, Optional +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self class OutputArtifactResultReadResponse(BaseModel): """ OutputArtifactResultReadResponse - """ + """ # noqa: E501 output_artifact_id: StrictStr name: StrictStr mime_type: Annotated[str, Field(strict=True)] - metadata: dict[str, Any] - download_url: Annotated[str, Field(min_length=1, strict=True, max_length=2083)] | None - __properties: ClassVar[list[str]] = ["output_artifact_id", "name", "mime_type", "metadata", "download_url"] + metadata: Dict[str, Any] + download_url: Optional[Annotated[str, Field(min_length=1, strict=True, max_length=2083)]] + __properties: ClassVar[List[str]] = ["output_artifact_id", "name", "mime_type", "metadata", "download_url"] - @field_validator("mime_type") + @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): @@ -45,6 +47,7 @@ def mime_type_validate_regular_expression(cls, value): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -55,11 +58,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of OutputArtifactResultReadResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -69,7 +72,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -80,12 +83,12 @@ def to_dict(self) -> dict[str, Any]: # set to None if download_url (nullable) is None # and model_fields_set contains the field if self.download_url is None and "download_url" in self.model_fields_set: - _dict["download_url"] = None + _dict['download_url'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of OutputArtifactResultReadResponse from a dict""" if obj is None: return None @@ -101,3 +104,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "download_url": obj.get("download_url") }) return _obj + + diff --git a/codegen/aignx/codegen/models/output_artifact_schema_creation_request.py b/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py similarity index 72% rename from codegen/aignx/codegen/models/output_artifact_schema_creation_request.py rename to codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py index 765f01db..4696c21b 100644 --- a/codegen/aignx/codegen/models/output_artifact_schema_creation_request.py +++ b/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py @@ -1,39 +1,39 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.output_artifact_scope import OutputArtifactScope from aignx.codegen.models.output_artifact_visibility import OutputArtifactVisibility - +from typing import Optional, Set +from typing_extensions import Self class OutputArtifactSchemaCreationRequest(BaseModel): """ OutputArtifactSchemaCreationRequest - """ + """ # noqa: E501 name: StrictStr mime_type: StrictStr scope: OutputArtifactScope visibility: OutputArtifactVisibility - metadata_schema: dict[str, Any] - __properties: ClassVar[list[str]] = ["name", "mime_type", "scope", "visibility", "metadata_schema"] + metadata_schema: Dict[str, Any] + __properties: ClassVar[List[str]] = ["name", "mime_type", "scope", "visibility", "metadata_schema"] model_config = ConfigDict( populate_by_name=True, @@ -41,6 +41,7 @@ class OutputArtifactSchemaCreationRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -51,11 +52,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of OutputArtifactSchemaCreationRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -65,7 +66,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -76,7 +77,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of OutputArtifactSchemaCreationRequest from a dict""" if obj is None: return None @@ -92,3 +93,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "metadata_schema": obj.get("metadata_schema") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/output_artifact_scope.py b/codegen/out/aignx/codegen/models/output_artifact_scope.py new file mode 100644 index 00000000..530f54c4 --- /dev/null +++ b/codegen/out/aignx/codegen/models/output_artifact_scope.py @@ -0,0 +1,37 @@ +# coding: utf-8 + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class OutputArtifactScope(str, Enum): + """ + OutputArtifactScope + """ + + """ + allowed enum values + """ + ITEM = 'item' + GLOBAL = 'global' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of OutputArtifactScope from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/codegen/out/aignx/codegen/models/output_artifact_visibility.py b/codegen/out/aignx/codegen/models/output_artifact_visibility.py new file mode 100644 index 00000000..c4c79507 --- /dev/null +++ b/codegen/out/aignx/codegen/models/output_artifact_visibility.py @@ -0,0 +1,37 @@ +# coding: utf-8 + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class OutputArtifactVisibility(str, Enum): + """ + OutputArtifactVisibility + """ + + """ + allowed enum values + """ + INTERNAL = 'internal' + EXTERNAL = 'external' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of OutputArtifactVisibility from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/codegen/aignx/codegen/models/payload_input_artifact.py b/codegen/out/aignx/codegen/models/payload_input_artifact.py similarity index 68% rename from codegen/aignx/codegen/models/payload_input_artifact.py rename to codegen/out/aignx/codegen/models/payload_input_artifact.py index 3705978c..65927248 100644 --- a/codegen/aignx/codegen/models/payload_input_artifact.py +++ b/codegen/out/aignx/codegen/models/payload_input_artifact.py @@ -1,34 +1,36 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Annotated, Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, Field, StrictStr - +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self class PayloadInputArtifact(BaseModel): """ PayloadInputArtifact - """ + """ # noqa: E501 input_artifact_id: StrictStr - metadata: dict[str, Any] + metadata: Dict[str, Any] download_url: Annotated[str, Field(min_length=1, strict=True)] - __properties: ClassVar[list[str]] = ["input_artifact_id", "metadata", "download_url"] + __properties: ClassVar[List[str]] = ["input_artifact_id", "metadata", "download_url"] model_config = ConfigDict( populate_by_name=True, @@ -36,6 +38,7 @@ class PayloadInputArtifact(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -46,11 +49,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of PayloadInputArtifact from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -60,7 +63,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -71,7 +74,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of PayloadInputArtifact from a dict""" if obj is None: return None @@ -85,3 +88,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "download_url": obj.get("download_url") }) return _obj + + diff --git a/codegen/aignx/codegen/models/payload_item.py b/codegen/out/aignx/codegen/models/payload_item.py similarity index 75% rename from codegen/aignx/codegen/models/payload_item.py rename to codegen/out/aignx/codegen/models/payload_item.py index 49bc09ee..fccb20e4 100644 --- a/codegen/aignx/codegen/models/payload_item.py +++ b/codegen/out/aignx/codegen/models/payload_item.py @@ -1,37 +1,37 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.payload_input_artifact import PayloadInputArtifact from aignx.codegen.models.payload_output_artifact import PayloadOutputArtifact - +from typing import Optional, Set +from typing_extensions import Self class PayloadItem(BaseModel): """ PayloadItem - """ + """ # noqa: E501 item_id: StrictStr - input_artifacts: dict[str, PayloadInputArtifact] - output_artifacts: dict[str, PayloadOutputArtifact] - __properties: ClassVar[list[str]] = ["item_id", "input_artifacts", "output_artifacts"] + input_artifacts: Dict[str, PayloadInputArtifact] + output_artifacts: Dict[str, PayloadOutputArtifact] + __properties: ClassVar[List[str]] = ["item_id", "input_artifacts", "output_artifacts"] model_config = ConfigDict( populate_by_name=True, @@ -39,6 +39,7 @@ class PayloadItem(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -49,11 +50,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of PayloadItem from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -63,7 +64,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -77,18 +78,18 @@ def to_dict(self) -> dict[str, Any]: for _key_input_artifacts in self.input_artifacts: if self.input_artifacts[_key_input_artifacts]: _field_dict[_key_input_artifacts] = self.input_artifacts[_key_input_artifacts].to_dict() - _dict["input_artifacts"] = _field_dict + _dict['input_artifacts'] = _field_dict # override the default output from pydantic by calling `to_dict()` of each value in output_artifacts (dict) _field_dict = {} if self.output_artifacts: for _key_output_artifacts in self.output_artifacts: if self.output_artifacts[_key_output_artifacts]: _field_dict[_key_output_artifacts] = self.output_artifacts[_key_output_artifacts].to_dict() - _dict["output_artifacts"] = _field_dict + _dict['output_artifacts'] = _field_dict return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of PayloadItem from a dict""" if obj is None: return None @@ -112,3 +113,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: else None }) return _obj + + diff --git a/codegen/aignx/codegen/models/payload_output_artifact.py b/codegen/out/aignx/codegen/models/payload_output_artifact.py similarity index 71% rename from codegen/aignx/codegen/models/payload_output_artifact.py rename to codegen/out/aignx/codegen/models/payload_output_artifact.py index f407ef47..f735a279 100644 --- a/codegen/aignx/codegen/models/payload_output_artifact.py +++ b/codegen/out/aignx/codegen/models/payload_output_artifact.py @@ -1,36 +1,36 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.transfer_urls import TransferUrls - +from typing import Optional, Set +from typing_extensions import Self class PayloadOutputArtifact(BaseModel): """ PayloadOutputArtifact - """ + """ # noqa: E501 output_artifact_id: StrictStr data: TransferUrls metadata: TransferUrls - __properties: ClassVar[list[str]] = ["output_artifact_id", "data", "metadata"] + __properties: ClassVar[List[str]] = ["output_artifact_id", "data", "metadata"] model_config = ConfigDict( populate_by_name=True, @@ -38,6 +38,7 @@ class PayloadOutputArtifact(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -48,11 +49,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of PayloadOutputArtifact from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -62,7 +63,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -72,14 +73,14 @@ def to_dict(self) -> dict[str, Any]: ) # override the default output from pydantic by calling `to_dict()` of data if self.data: - _dict["data"] = self.data.to_dict() + _dict['data'] = self.data.to_dict() # override the default output from pydantic by calling `to_dict()` of metadata if self.metadata: - _dict["metadata"] = self.metadata.to_dict() + _dict['metadata'] = self.metadata.to_dict() return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of PayloadOutputArtifact from a dict""" if obj is None: return None @@ -93,3 +94,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "metadata": TransferUrls.from_dict(obj["metadata"]) if obj.get("metadata") is not None else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/quota_name.py b/codegen/out/aignx/codegen/models/quota_name.py new file mode 100644 index 00000000..6094443f --- /dev/null +++ b/codegen/out/aignx/codegen/models/quota_name.py @@ -0,0 +1,44 @@ +# coding: utf-8 + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class QuotaName(str, Enum): + """ + Global, API-level, and slide-level quotas for Samia API. + """ + + """ + allowed enum values + """ + MAX_USERS = 'max_users' + MAX_ORGANIZATIONS = 'max_organizations' + MAX_USERS_PER_ORGANIZATION = 'max_users_per_organization' + MAX_APPLICATIONS = 'max_applications' + MAX_APPLICATION_VERSIONS = 'max_application_versions' + MAX_SLIDES_PER_RUN = 'max_slides_per_run' + MAX_PARALLEL_RUNS = 'max_parallel_runs' + MAX_PARALLEL_RUNS_PER_ORGANIZATION = 'max_parallel_runs_per_organization' + MAX_PARALLEL_RUNS_PER_USER = 'max_parallel_runs_per_user' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of QuotaName from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/codegen/aignx/codegen/models/quota_read_response.py b/codegen/out/aignx/codegen/models/quota_read_response.py similarity index 69% rename from codegen/aignx/codegen/models/quota_read_response.py rename to codegen/out/aignx/codegen/models/quota_read_response.py index 647021b3..8f2234b8 100644 --- a/codegen/aignx/codegen/models/quota_read_response.py +++ b/codegen/out/aignx/codegen/models/quota_read_response.py @@ -1,35 +1,35 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictInt - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.quota_name import QuotaName - +from typing import Optional, Set +from typing_extensions import Self class QuotaReadResponse(BaseModel): """ GET response payload for quota read. - """ + """ # noqa: E501 name: QuotaName quota: StrictInt - __properties: ClassVar[list[str]] = ["name", "quota"] + __properties: ClassVar[List[str]] = ["name", "quota"] model_config = ConfigDict( populate_by_name=True, @@ -37,6 +37,7 @@ class QuotaReadResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -47,11 +48,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of QuotaReadResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -61,7 +62,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -72,7 +73,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of QuotaReadResponse from a dict""" if obj is None: return None @@ -85,3 +86,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "quota": obj.get("quota") }) return _obj + + diff --git a/codegen/aignx/codegen/models/quota_update_request.py b/codegen/out/aignx/codegen/models/quota_update_request.py similarity index 69% rename from codegen/aignx/codegen/models/quota_update_request.py rename to codegen/out/aignx/codegen/models/quota_update_request.py index 7d3af858..2f19c517 100644 --- a/codegen/aignx/codegen/models/quota_update_request.py +++ b/codegen/out/aignx/codegen/models/quota_update_request.py @@ -1,35 +1,35 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictInt - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.quota_name import QuotaName - +from typing import Optional, Set +from typing_extensions import Self class QuotaUpdateRequest(BaseModel): """ PATCH request payload for quota update. - """ + """ # noqa: E501 name: QuotaName quota: StrictInt - __properties: ClassVar[list[str]] = ["name", "quota"] + __properties: ClassVar[List[str]] = ["name", "quota"] model_config = ConfigDict( populate_by_name=True, @@ -37,6 +37,7 @@ class QuotaUpdateRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -47,11 +48,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of QuotaUpdateRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -61,7 +62,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -72,7 +73,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of QuotaUpdateRequest from a dict""" if obj is None: return None @@ -85,3 +86,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "quota": obj.get("quota") }) return _obj + + diff --git a/codegen/aignx/codegen/models/quota_update_response.py b/codegen/out/aignx/codegen/models/quota_update_response.py similarity index 69% rename from codegen/aignx/codegen/models/quota_update_response.py rename to codegen/out/aignx/codegen/models/quota_update_response.py index 182ee551..0e5595aa 100644 --- a/codegen/aignx/codegen/models/quota_update_response.py +++ b/codegen/out/aignx/codegen/models/quota_update_response.py @@ -1,35 +1,35 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictInt - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.quota_name import QuotaName - +from typing import Optional, Set +from typing_extensions import Self class QuotaUpdateResponse(BaseModel): """ PATCH response payload for quota update. - """ + """ # noqa: E501 name: QuotaName quota: StrictInt - __properties: ClassVar[list[str]] = ["name", "quota"] + __properties: ClassVar[List[str]] = ["name", "quota"] model_config = ConfigDict( populate_by_name=True, @@ -37,6 +37,7 @@ class QuotaUpdateResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -47,11 +48,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of QuotaUpdateResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -61,7 +62,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -72,7 +73,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of QuotaUpdateResponse from a dict""" if obj is None: return None @@ -85,3 +86,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "quota": obj.get("quota") }) return _obj + + diff --git a/codegen/aignx/codegen/models/quotas_read_response.py b/codegen/out/aignx/codegen/models/quotas_read_response.py similarity index 71% rename from codegen/aignx/codegen/models/quotas_read_response.py rename to codegen/out/aignx/codegen/models/quotas_read_response.py index 85216464..7d872a36 100644 --- a/codegen/aignx/codegen/models/quotas_read_response.py +++ b/codegen/out/aignx/codegen/models/quotas_read_response.py @@ -1,34 +1,34 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.quota_read_response import QuotaReadResponse - +from typing import Optional, Set +from typing_extensions import Self class QuotasReadResponse(BaseModel): """ GET response payload for multiple quota reads. - """ - quotas: list[QuotaReadResponse] - __properties: ClassVar[list[str]] = ["quotas"] + """ # noqa: E501 + quotas: List[QuotaReadResponse] + __properties: ClassVar[List[str]] = ["quotas"] model_config = ConfigDict( populate_by_name=True, @@ -36,6 +36,7 @@ class QuotasReadResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -46,11 +47,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of QuotasReadResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -60,7 +61,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -74,11 +75,11 @@ def to_dict(self) -> dict[str, Any]: for _item_quotas in self.quotas: if _item_quotas: _items.append(_item_quotas.to_dict()) - _dict["quotas"] = _items + _dict['quotas'] = _items return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of QuotasReadResponse from a dict""" if obj is None: return None @@ -90,3 +91,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "quotas": [QuotaReadResponse.from_dict(_item) for _item in obj["quotas"]] if obj.get("quotas") is not None else None }) return _obj + + diff --git a/codegen/aignx/codegen/models/quotas_update_request.py b/codegen/out/aignx/codegen/models/quotas_update_request.py similarity index 71% rename from codegen/aignx/codegen/models/quotas_update_request.py rename to codegen/out/aignx/codegen/models/quotas_update_request.py index 47f4f330..a0834118 100644 --- a/codegen/aignx/codegen/models/quotas_update_request.py +++ b/codegen/out/aignx/codegen/models/quotas_update_request.py @@ -1,34 +1,34 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.quota_update_request import QuotaUpdateRequest - +from typing import Optional, Set +from typing_extensions import Self class QuotasUpdateRequest(BaseModel): """ PATCH request payload for quota updates. - """ - quotas: list[QuotaUpdateRequest] - __properties: ClassVar[list[str]] = ["quotas"] + """ # noqa: E501 + quotas: List[QuotaUpdateRequest] + __properties: ClassVar[List[str]] = ["quotas"] model_config = ConfigDict( populate_by_name=True, @@ -36,6 +36,7 @@ class QuotasUpdateRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -46,11 +47,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of QuotasUpdateRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -60,7 +61,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -74,11 +75,11 @@ def to_dict(self) -> dict[str, Any]: for _item_quotas in self.quotas: if _item_quotas: _items.append(_item_quotas.to_dict()) - _dict["quotas"] = _items + _dict['quotas'] = _items return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of QuotasUpdateRequest from a dict""" if obj is None: return None @@ -90,3 +91,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "quotas": [QuotaUpdateRequest.from_dict(_item) for _item in obj["quotas"]] if obj.get("quotas") is not None else None }) return _obj + + diff --git a/codegen/aignx/codegen/models/quotas_update_response.py b/codegen/out/aignx/codegen/models/quotas_update_response.py similarity index 71% rename from codegen/aignx/codegen/models/quotas_update_response.py rename to codegen/out/aignx/codegen/models/quotas_update_response.py index e5e0b992..62df743d 100644 --- a/codegen/aignx/codegen/models/quotas_update_response.py +++ b/codegen/out/aignx/codegen/models/quotas_update_response.py @@ -1,34 +1,34 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.quota_update_response import QuotaUpdateResponse - +from typing import Optional, Set +from typing_extensions import Self class QuotasUpdateResponse(BaseModel): """ PATCH response payload for quota updates. - """ - updated_quotas: list[QuotaUpdateResponse] - __properties: ClassVar[list[str]] = ["updated_quotas"] + """ # noqa: E501 + updated_quotas: List[QuotaUpdateResponse] + __properties: ClassVar[List[str]] = ["updated_quotas"] model_config = ConfigDict( populate_by_name=True, @@ -36,6 +36,7 @@ class QuotasUpdateResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -46,11 +47,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of QuotasUpdateResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -60,7 +61,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -74,11 +75,11 @@ def to_dict(self) -> dict[str, Any]: for _item_updated_quotas in self.updated_quotas: if _item_updated_quotas: _items.append(_item_updated_quotas.to_dict()) - _dict["updated_quotas"] = _items + _dict['updated_quotas'] = _items return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of QuotasUpdateResponse from a dict""" if obj is None: return None @@ -90,3 +91,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "updated_quotas": [QuotaUpdateResponse.from_dict(_item) for _item in obj["updated_quotas"]] if obj.get("updated_quotas") is not None else None }) return _obj + + diff --git a/codegen/aignx/codegen/models/run_creation_request.py b/codegen/out/aignx/codegen/models/run_creation_request.py similarity index 72% rename from codegen/aignx/codegen/models/run_creation_request.py rename to codegen/out/aignx/codegen/models/run_creation_request.py index a84e27ab..63e970de 100644 --- a/codegen/aignx/codegen/models/run_creation_request.py +++ b/codegen/out/aignx/codegen/models/run_creation_request.py @@ -1,36 +1,36 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.application_version import ApplicationVersion from aignx.codegen.models.item_creation_request import ItemCreationRequest - +from typing import Optional, Set +from typing_extensions import Self class RunCreationRequest(BaseModel): """ RunCreationRequest - """ + """ # noqa: E501 application_version: ApplicationVersion - items: list[ItemCreationRequest] - __properties: ClassVar[list[str]] = ["application_version", "items"] + items: List[ItemCreationRequest] + __properties: ClassVar[List[str]] = ["application_version", "items"] model_config = ConfigDict( populate_by_name=True, @@ -38,6 +38,7 @@ class RunCreationRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -48,11 +49,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of RunCreationRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -62,7 +63,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -72,18 +73,18 @@ def to_dict(self) -> dict[str, Any]: ) # override the default output from pydantic by calling `to_dict()` of application_version if self.application_version: - _dict["application_version"] = self.application_version.to_dict() + _dict['application_version'] = self.application_version.to_dict() # override the default output from pydantic by calling `to_dict()` of each item in items (list) _items = [] if self.items: for _item_items in self.items: if _item_items: _items.append(_item_items.to_dict()) - _dict["items"] = _items + _dict['items'] = _items return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of RunCreationRequest from a dict""" if obj is None: return None @@ -96,3 +97,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "items": [ItemCreationRequest.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None }) return _obj + + diff --git a/codegen/aignx/codegen/models/run_creation_response.py b/codegen/out/aignx/codegen/models/run_creation_response.py similarity index 68% rename from codegen/aignx/codegen/models/run_creation_response.py rename to codegen/out/aignx/codegen/models/run_creation_response.py index b99f6505..1cb01e7e 100644 --- a/codegen/aignx/codegen/models/run_creation_response.py +++ b/codegen/out/aignx/codegen/models/run_creation_response.py @@ -1,32 +1,33 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self class RunCreationResponse(BaseModel): """ RunCreationResponse - """ + """ # noqa: E501 application_run_id: StrictStr - __properties: ClassVar[list[str]] = ["application_run_id"] + __properties: ClassVar[List[str]] = ["application_run_id"] model_config = ConfigDict( populate_by_name=True, @@ -34,6 +35,7 @@ class RunCreationResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -44,11 +46,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of RunCreationResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -58,7 +60,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -69,7 +71,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of RunCreationResponse from a dict""" if obj is None: return None @@ -81,3 +83,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "application_run_id": obj.get("application_run_id") }) return _obj + + diff --git a/codegen/aignx/codegen/models/run_read_response.py b/codegen/out/aignx/codegen/models/run_read_response.py similarity index 74% rename from codegen/aignx/codegen/models/run_read_response.py rename to codegen/out/aignx/codegen/models/run_read_response.py index c29c604d..f348ef6e 100644 --- a/codegen/aignx/codegen/models/run_read_response.py +++ b/codegen/out/aignx/codegen/models/run_read_response.py @@ -1,42 +1,42 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from datetime import datetime -from typing import Any, ClassVar, Self +import json +from datetime import datetime from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List, Optional from aignx.codegen.models.application_run_status import ApplicationRunStatus from aignx.codegen.models.user_payload import UserPayload - +from typing import Optional, Set +from typing_extensions import Self class RunReadResponse(BaseModel): """ RunReadResponse - """ + """ # noqa: E501 application_run_id: StrictStr application_version_id: StrictStr organization_id: StrictStr - user_payload: UserPayload | None = None + user_payload: Optional[UserPayload] = None status: ApplicationRunStatus triggered_at: datetime triggered_by: StrictStr - __properties: ClassVar[list[str]] = ["application_run_id", "application_version_id", "organization_id", "user_payload", "status", "triggered_at", "triggered_by"] + __properties: ClassVar[List[str]] = ["application_run_id", "application_version_id", "organization_id", "user_payload", "status", "triggered_at", "triggered_by"] model_config = ConfigDict( populate_by_name=True, @@ -44,6 +44,7 @@ class RunReadResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -54,11 +55,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of RunReadResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -68,7 +69,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -78,16 +79,16 @@ def to_dict(self) -> dict[str, Any]: ) # override the default output from pydantic by calling `to_dict()` of user_payload if self.user_payload: - _dict["user_payload"] = self.user_payload.to_dict() + _dict['user_payload'] = self.user_payload.to_dict() # set to None if user_payload (nullable) is None # and model_fields_set contains the field if self.user_payload is None and "user_payload" in self.model_fields_set: - _dict["user_payload"] = None + _dict['user_payload'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of RunReadResponse from a dict""" if obj is None: return None @@ -105,3 +106,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "triggered_by": obj.get("triggered_by") }) return _obj + + diff --git a/codegen/aignx/codegen/models/slug_version_request.py b/codegen/out/aignx/codegen/models/slug_version_request.py similarity index 69% rename from codegen/aignx/codegen/models/slug_version_request.py rename to codegen/out/aignx/codegen/models/slug_version_request.py index 4f9842bd..4431169a 100644 --- a/codegen/aignx/codegen/models/slug_version_request.py +++ b/codegen/out/aignx/codegen/models/slug_version_request.py @@ -1,35 +1,37 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint -import re -from typing import Annotated, Any, ClassVar, Self +import re # noqa: F401 +import json from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator - +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self class SlugVersionRequest(BaseModel): """ SlugVersionRequest - """ + """ # noqa: E501 application_slug: Annotated[str, Field(strict=True)] version: StrictStr - __properties: ClassVar[list[str]] = ["application_slug", "version"] + __properties: ClassVar[List[str]] = ["application_slug", "version"] - @field_validator("application_slug") + @field_validator('application_slug') def application_slug_validate_regular_expression(cls, value): """Validates the regular expression""" if not re.match(r"^[a-z](-?[a-z])*$", value): @@ -42,6 +44,7 @@ def application_slug_validate_regular_expression(cls, value): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -52,11 +55,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of SlugVersionRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -66,7 +69,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -77,7 +80,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of SlugVersionRequest from a dict""" if obj is None: return None @@ -90,3 +93,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "version": obj.get("version") }) return _obj + + diff --git a/codegen/aignx/codegen/models/transfer_urls.py b/codegen/out/aignx/codegen/models/transfer_urls.py similarity index 68% rename from codegen/aignx/codegen/models/transfer_urls.py rename to codegen/out/aignx/codegen/models/transfer_urls.py index 33555798..02b617df 100644 --- a/codegen/aignx/codegen/models/transfer_urls.py +++ b/codegen/out/aignx/codegen/models/transfer_urls.py @@ -1,33 +1,35 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Annotated, Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, Field - +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self class TransferUrls(BaseModel): """ TransferUrls - """ + """ # noqa: E501 upload_url: Annotated[str, Field(min_length=1, strict=True)] download_url: Annotated[str, Field(min_length=1, strict=True)] - __properties: ClassVar[list[str]] = ["upload_url", "download_url"] + __properties: ClassVar[List[str]] = ["upload_url", "download_url"] model_config = ConfigDict( populate_by_name=True, @@ -35,6 +37,7 @@ class TransferUrls(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -45,11 +48,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of TransferUrls from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -59,7 +62,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -70,7 +73,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of TransferUrls from a dict""" if obj is None: return None @@ -83,3 +86,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "download_url": obj.get("download_url") }) return _obj + + diff --git a/codegen/aignx/codegen/models/user_creation_request.py b/codegen/out/aignx/codegen/models/user_creation_request.py similarity index 69% rename from codegen/aignx/codegen/models/user_creation_request.py rename to codegen/out/aignx/codegen/models/user_creation_request.py index a8c2d4af..9df30790 100644 --- a/codegen/aignx/codegen/models/user_creation_request.py +++ b/codegen/out/aignx/codegen/models/user_creation_request.py @@ -1,34 +1,35 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self class UserCreationRequest(BaseModel): """ UserCreationRequest - """ + """ # noqa: E501 user_id: StrictStr organization_id: StrictStr - email: StrictStr | None - __properties: ClassVar[list[str]] = ["user_id", "organization_id", "email"] + email: Optional[StrictStr] + __properties: ClassVar[List[str]] = ["user_id", "organization_id", "email"] model_config = ConfigDict( populate_by_name=True, @@ -36,6 +37,7 @@ class UserCreationRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -46,11 +48,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of UserCreationRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -60,7 +62,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -71,12 +73,12 @@ def to_dict(self) -> dict[str, Any]: # set to None if email (nullable) is None # and model_fields_set contains the field if self.email is None and "email" in self.model_fields_set: - _dict["email"] = None + _dict['email'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of UserCreationRequest from a dict""" if obj is None: return None @@ -90,3 +92,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "email": obj.get("email") }) return _obj + + diff --git a/codegen/aignx/codegen/models/user_payload.py b/codegen/out/aignx/codegen/models/user_payload.py similarity index 75% rename from codegen/aignx/codegen/models/user_payload.py rename to codegen/out/aignx/codegen/models/user_payload.py index 849380c0..c6244457 100644 --- a/codegen/aignx/codegen/models/user_payload.py +++ b/codegen/out/aignx/codegen/models/user_payload.py @@ -1,38 +1,38 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List, Optional from aignx.codegen.models.payload_item import PayloadItem from aignx.codegen.models.payload_output_artifact import PayloadOutputArtifact - +from typing import Optional, Set +from typing_extensions import Self class UserPayload(BaseModel): """ UserPayload - """ + """ # noqa: E501 application_id: StrictStr application_run_id: StrictStr - global_output_artifacts: dict[str, PayloadOutputArtifact] | None - items: list[PayloadItem] - __properties: ClassVar[list[str]] = ["application_id", "application_run_id", "global_output_artifacts", "items"] + global_output_artifacts: Optional[Dict[str, PayloadOutputArtifact]] + items: List[PayloadItem] + __properties: ClassVar[List[str]] = ["application_id", "application_run_id", "global_output_artifacts", "items"] model_config = ConfigDict( populate_by_name=True, @@ -40,6 +40,7 @@ class UserPayload(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -50,11 +51,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of UserPayload from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -64,7 +65,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -78,23 +79,23 @@ def to_dict(self) -> dict[str, Any]: for _key_global_output_artifacts in self.global_output_artifacts: if self.global_output_artifacts[_key_global_output_artifacts]: _field_dict[_key_global_output_artifacts] = self.global_output_artifacts[_key_global_output_artifacts].to_dict() - _dict["global_output_artifacts"] = _field_dict + _dict['global_output_artifacts'] = _field_dict # override the default output from pydantic by calling `to_dict()` of each item in items (list) _items = [] if self.items: for _item_items in self.items: if _item_items: _items.append(_item_items.to_dict()) - _dict["items"] = _items + _dict['items'] = _items # set to None if global_output_artifacts (nullable) is None # and model_fields_set contains the field if self.global_output_artifacts is None and "global_output_artifacts" in self.model_fields_set: - _dict["global_output_artifacts"] = None + _dict['global_output_artifacts'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of UserPayload from a dict""" if obj is None: return None @@ -114,3 +115,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "items": [PayloadItem.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None }) return _obj + + diff --git a/codegen/aignx/codegen/models/user_quota.py b/codegen/out/aignx/codegen/models/user_quota.py similarity index 68% rename from codegen/aignx/codegen/models/user_quota.py rename to codegen/out/aignx/codegen/models/user_quota.py index 3fe8da0f..847dd28e 100644 --- a/codegen/aignx/codegen/models/user_quota.py +++ b/codegen/out/aignx/codegen/models/user_quota.py @@ -1,33 +1,34 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictInt - +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self class UserQuota(BaseModel): """ UserQuota - """ - total: StrictInt | None + """ # noqa: E501 + total: Optional[StrictInt] used: StrictInt - __properties: ClassVar[list[str]] = ["total", "used"] + __properties: ClassVar[List[str]] = ["total", "used"] model_config = ConfigDict( populate_by_name=True, @@ -35,6 +36,7 @@ class UserQuota(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -45,11 +47,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of UserQuota from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -59,7 +61,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -70,12 +72,12 @@ def to_dict(self) -> dict[str, Any]: # set to None if total (nullable) is None # and model_fields_set contains the field if self.total is None and "total" in self.model_fields_set: - _dict["total"] = None + _dict['total'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of UserQuota from a dict""" if obj is None: return None @@ -88,3 +90,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "used": obj.get("used") }) return _obj + + diff --git a/codegen/aignx/codegen/models/user_response.py b/codegen/out/aignx/codegen/models/user_response.py similarity index 70% rename from codegen/aignx/codegen/models/user_response.py rename to codegen/out/aignx/codegen/models/user_response.py index 4d0aab99..31b4e60c 100644 --- a/codegen/aignx/codegen/models/user_response.py +++ b/codegen/out/aignx/codegen/models/user_response.py @@ -1,36 +1,36 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List, Optional from aignx.codegen.models.user_quota import UserQuota - +from typing import Optional, Set +from typing_extensions import Self class UserResponse(BaseModel): """ UserResponse - """ - user_id: StrictStr | None - organization_id: StrictStr | None + """ # noqa: E501 + user_id: Optional[StrictStr] + organization_id: Optional[StrictStr] slide_quota: UserQuota - __properties: ClassVar[list[str]] = ["user_id", "organization_id", "slide_quota"] + __properties: ClassVar[List[str]] = ["user_id", "organization_id", "slide_quota"] model_config = ConfigDict( populate_by_name=True, @@ -38,6 +38,7 @@ class UserResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -48,11 +49,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of UserResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -62,7 +63,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -72,21 +73,21 @@ def to_dict(self) -> dict[str, Any]: ) # override the default output from pydantic by calling `to_dict()` of slide_quota if self.slide_quota: - _dict["slide_quota"] = self.slide_quota.to_dict() + _dict['slide_quota'] = self.slide_quota.to_dict() # set to None if user_id (nullable) is None # and model_fields_set contains the field if self.user_id is None and "user_id" in self.model_fields_set: - _dict["user_id"] = None + _dict['user_id'] = None # set to None if organization_id (nullable) is None # and model_fields_set contains the field if self.organization_id is None and "organization_id" in self.model_fields_set: - _dict["organization_id"] = None + _dict['organization_id'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of UserResponse from a dict""" if obj is None: return None @@ -100,3 +101,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "slide_quota": UserQuota.from_dict(obj["slide_quota"]) if obj.get("slide_quota") is not None else None }) return _obj + + diff --git a/codegen/aignx/codegen/models/user_update_request.py b/codegen/out/aignx/codegen/models/user_update_request.py similarity index 68% rename from codegen/aignx/codegen/models/user_update_request.py rename to codegen/out/aignx/codegen/models/user_update_request.py index c6ab2af3..79569c19 100644 --- a/codegen/aignx/codegen/models/user_update_request.py +++ b/codegen/out/aignx/codegen/models/user_update_request.py @@ -1,33 +1,34 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr - +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self class UserUpdateRequest(BaseModel): """ UserUpdateRequest - """ - user_id: StrictStr | None = None - slide_quota: StrictInt | None = None - __properties: ClassVar[list[str]] = ["user_id", "slide_quota"] + """ # noqa: E501 + user_id: Optional[StrictStr] = None + slide_quota: Optional[StrictInt] = None + __properties: ClassVar[List[str]] = ["user_id", "slide_quota"] model_config = ConfigDict( populate_by_name=True, @@ -35,6 +36,7 @@ class UserUpdateRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -45,11 +47,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of UserUpdateRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -59,7 +61,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -70,17 +72,17 @@ def to_dict(self) -> dict[str, Any]: # set to None if user_id (nullable) is None # and model_fields_set contains the field if self.user_id is None and "user_id" in self.model_fields_set: - _dict["user_id"] = None + _dict['user_id'] = None # set to None if slide_quota (nullable) is None # and model_fields_set contains the field if self.slide_quota is None and "slide_quota" in self.model_fields_set: - _dict["slide_quota"] = None + _dict['slide_quota'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of UserUpdateRequest from a dict""" if obj is None: return None @@ -93,3 +95,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "slide_quota": obj.get("slide_quota") }) return _obj + + diff --git a/codegen/aignx/codegen/models/validation_error.py b/codegen/out/aignx/codegen/models/validation_error.py similarity index 71% rename from codegen/aignx/codegen/models/validation_error.py rename to codegen/out/aignx/codegen/models/validation_error.py index d118c19d..9270e733 100644 --- a/codegen/aignx/codegen/models/validation_error.py +++ b/codegen/out/aignx/codegen/models/validation_error.py @@ -1,36 +1,36 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.validation_error_loc_inner import ValidationErrorLocInner - +from typing import Optional, Set +from typing_extensions import Self class ValidationError(BaseModel): """ ValidationError - """ - loc: list[ValidationErrorLocInner] + """ # noqa: E501 + loc: List[ValidationErrorLocInner] msg: StrictStr type: StrictStr - __properties: ClassVar[list[str]] = ["loc", "msg", "type"] + __properties: ClassVar[List[str]] = ["loc", "msg", "type"] model_config = ConfigDict( populate_by_name=True, @@ -38,6 +38,7 @@ class ValidationError(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -48,11 +49,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of ValidationError from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -62,7 +63,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -76,11 +77,11 @@ def to_dict(self) -> dict[str, Any]: for _item_loc in self.loc: if _item_loc: _items.append(_item_loc.to_dict()) - _dict["loc"] = _items + _dict['loc'] = _items return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of ValidationError from a dict""" if obj is None: return None @@ -94,3 +95,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "type": obj.get("type") }) return _obj + + diff --git a/codegen/aignx/codegen/models/validation_error_loc_inner.py b/codegen/out/aignx/codegen/models/validation_error_loc_inner.py similarity index 73% rename from codegen/aignx/codegen/models/validation_error_loc_inner.py rename to codegen/out/aignx/codegen/models/validation_error_loc_inner.py index 8f092369..86b63418 100644 --- a/codegen/aignx/codegen/models/validation_error_loc_inner.py +++ b/codegen/out/aignx/codegen/models/validation_error_loc_inner.py @@ -1,42 +1,44 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - +from inspect import getfullargspec import json import pprint import re # noqa: F401 -from typing import TYPE_CHECKING, Any, Self - -from pydantic import BaseModel, StrictInt, StrictStr, ValidationError, field_validator +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr, ValidationError, field_validator +from typing import Optional +from typing import Union, Any, List, Set, TYPE_CHECKING, Optional, Dict +from typing_extensions import Literal, Self +from pydantic import Field VALIDATIONERRORLOCINNER_ANY_OF_SCHEMAS = ["int", "str"] - class ValidationErrorLocInner(BaseModel): """ ValidationErrorLocInner """ # data type: str - anyof_schema_1_validator: StrictStr | None = None + anyof_schema_1_validator: Optional[StrictStr] = None # data type: int - anyof_schema_2_validator: StrictInt | None = None + anyof_schema_2_validator: Optional[StrictInt] = None if TYPE_CHECKING: - actual_instance: int | str | None = None + actual_instance: Optional[Union[int, str]] = None else: actual_instance: Any = None - any_of_schemas: set[str] = {"int", "str"} + any_of_schemas: Set[str] = { "int", "str" } model_config = { "validate_assignment": True, @@ -53,7 +55,7 @@ def __init__(self, *args, **kwargs) -> None: else: super().__init__(**kwargs) - @field_validator("actual_instance") + @field_validator('actual_instance') def actual_instance_must_validate_anyof(cls, v): instance = ValidationErrorLocInner.model_construct() error_messages = [] @@ -72,10 +74,11 @@ def actual_instance_must_validate_anyof(cls, v): if error_messages: # no match raise ValueError("No match found when setting the actual_instance in ValidationErrorLocInner with anyOf schemas: int, str. Details: " + ", ".join(error_messages)) - return v + else: + return v @classmethod - def from_dict(cls, obj: dict[str, Any]) -> Self: + def from_dict(cls, obj: Dict[str, Any]) -> Self: return cls.from_json(json.dumps(obj)) @classmethod @@ -105,7 +108,8 @@ def from_json(cls, json_str: str) -> Self: if error_messages: # no match raise ValueError("No match found when deserializing the JSON string into ValidationErrorLocInner with anyOf schemas: int, str. Details: " + ", ".join(error_messages)) - return instance + else: + return instance def to_json(self) -> str: """Returns the JSON representation of the actual instance""" @@ -114,17 +118,21 @@ def to_json(self) -> str: if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): return self.actual_instance.to_json() - return json.dumps(self.actual_instance) + else: + return json.dumps(self.actual_instance) - def to_dict(self) -> dict[str, Any] | int | str | None: + def to_dict(self) -> Optional[Union[Dict[str, Any], int, str]]: """Returns the dict representation of the actual instance""" if self.actual_instance is None: return None if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): return self.actual_instance.to_dict() - return self.actual_instance + else: + return self.actual_instance def to_str(self) -> str: """Returns the string representation of the actual instance""" return pprint.pformat(self.model_dump()) + + diff --git a/codegen/aignx/codegen/models/version_creation_request.py b/codegen/out/aignx/codegen/models/version_creation_request.py similarity index 75% rename from codegen/aignx/codegen/models/version_creation_request.py rename to codegen/out/aignx/codegen/models/version_creation_request.py index b8a85b47..17572c53 100644 --- a/codegen/aignx/codegen/models/version_creation_request.py +++ b/codegen/out/aignx/codegen/models/version_creation_request.py @@ -1,40 +1,40 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List from aignx.codegen.models.input_artifact_schema_creation_request import InputArtifactSchemaCreationRequest from aignx.codegen.models.output_artifact_schema_creation_request import OutputArtifactSchemaCreationRequest - +from typing import Optional, Set +from typing_extensions import Self class VersionCreationRequest(BaseModel): """ VersionCreationRequest - """ + """ # noqa: E501 version: StrictStr application_id: StrictStr flow_id: StrictStr changelog: StrictStr - input_artifacts: list[InputArtifactSchemaCreationRequest] - output_artifacts: list[OutputArtifactSchemaCreationRequest] - __properties: ClassVar[list[str]] = ["version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] + input_artifacts: List[InputArtifactSchemaCreationRequest] + output_artifacts: List[OutputArtifactSchemaCreationRequest] + __properties: ClassVar[List[str]] = ["version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] model_config = ConfigDict( populate_by_name=True, @@ -42,6 +42,7 @@ class VersionCreationRequest(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -52,11 +53,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of VersionCreationRequest from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -66,7 +67,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -80,18 +81,18 @@ def to_dict(self) -> dict[str, Any]: for _item_input_artifacts in self.input_artifacts: if _item_input_artifacts: _items.append(_item_input_artifacts.to_dict()) - _dict["input_artifacts"] = _items + _dict['input_artifacts'] = _items # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) _items = [] if self.output_artifacts: for _item_output_artifacts in self.output_artifacts: if _item_output_artifacts: _items.append(_item_output_artifacts.to_dict()) - _dict["output_artifacts"] = _items + _dict['output_artifacts'] = _items return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of VersionCreationRequest from a dict""" if obj is None: return None @@ -108,3 +109,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "output_artifacts": [OutputArtifactSchemaCreationRequest.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None }) return _obj + + diff --git a/codegen/aignx/codegen/models/version_creation_response.py b/codegen/out/aignx/codegen/models/version_creation_response.py similarity index 68% rename from codegen/aignx/codegen/models/version_creation_response.py rename to codegen/out/aignx/codegen/models/version_creation_response.py index d7a18468..a044dcb1 100644 --- a/codegen/aignx/codegen/models/version_creation_response.py +++ b/codegen/out/aignx/codegen/models/version_creation_response.py @@ -1,32 +1,33 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from typing import Any, ClassVar, Self +import json from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self class VersionCreationResponse(BaseModel): """ VersionCreationResponse - """ + """ # noqa: E501 application_version_id: StrictStr - __properties: ClassVar[list[str]] = ["application_version_id"] + __properties: ClassVar[List[str]] = ["application_version_id"] model_config = ConfigDict( populate_by_name=True, @@ -34,6 +35,7 @@ class VersionCreationResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -44,11 +46,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of VersionCreationResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -58,7 +60,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -69,7 +71,7 @@ def to_dict(self) -> dict[str, Any]: return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of VersionCreationResponse from a dict""" if obj is None: return None @@ -81,3 +83,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "application_version_id": obj.get("application_version_id") }) return _obj + + diff --git a/codegen/aignx/codegen/models/version_read_response.py b/codegen/out/aignx/codegen/models/version_read_response.py similarity index 76% rename from codegen/aignx/codegen/models/version_read_response.py rename to codegen/out/aignx/codegen/models/version_read_response.py index abe4c55e..a0cbe4ec 100644 --- a/codegen/aignx/codegen/models/version_read_response.py +++ b/codegen/out/aignx/codegen/models/version_read_response.py @@ -1,43 +1,43 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 from __future__ import annotations - -import json import pprint import re # noqa: F401 -from datetime import datetime -from typing import Any, ClassVar, Self +import json +from datetime import datetime from pydantic import BaseModel, ConfigDict, StrictStr - +from typing import Any, ClassVar, Dict, List, Optional from aignx.codegen.models.input_artifact import InputArtifact from aignx.codegen.models.output_artifact import OutputArtifact - +from typing import Optional, Set +from typing_extensions import Self class VersionReadResponse(BaseModel): """ VersionReadResponse - """ + """ # noqa: E501 application_version_id: StrictStr version: StrictStr application_id: StrictStr - flow_id: StrictStr | None = None + flow_id: Optional[StrictStr] = None changelog: StrictStr - input_artifacts: list[InputArtifact] - output_artifacts: list[OutputArtifact] + input_artifacts: List[InputArtifact] + output_artifacts: List[OutputArtifact] created_at: datetime - __properties: ClassVar[list[str]] = ["application_version_id", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts", "created_at"] + __properties: ClassVar[List[str]] = ["application_version_id", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts", "created_at"] model_config = ConfigDict( populate_by_name=True, @@ -45,6 +45,7 @@ class VersionReadResponse(BaseModel): protected_namespaces=(), ) + def to_str(self) -> str: """Returns the string representation of the model using alias""" return pprint.pformat(self.model_dump(by_alias=True)) @@ -55,11 +56,11 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> Self | None: + def from_json(cls, json_str: str) -> Optional[Self]: """Create an instance of VersionReadResponse from a JSON string""" return cls.from_dict(json.loads(json_str)) - def to_dict(self) -> dict[str, Any]: + def to_dict(self) -> Dict[str, Any]: """Return the dictionary representation of the model using alias. This has the following differences from calling pydantic's @@ -69,7 +70,7 @@ def to_dict(self) -> dict[str, Any]: were set at model initialization. Other fields with value `None` are ignored. """ - excluded_fields: set[str] = set([ + excluded_fields: Set[str] = set([ ]) _dict = self.model_dump( @@ -83,23 +84,23 @@ def to_dict(self) -> dict[str, Any]: for _item_input_artifacts in self.input_artifacts: if _item_input_artifacts: _items.append(_item_input_artifacts.to_dict()) - _dict["input_artifacts"] = _items + _dict['input_artifacts'] = _items # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) _items = [] if self.output_artifacts: for _item_output_artifacts in self.output_artifacts: if _item_output_artifacts: _items.append(_item_output_artifacts.to_dict()) - _dict["output_artifacts"] = _items + _dict['output_artifacts'] = _items # set to None if flow_id (nullable) is None # and model_fields_set contains the field if self.flow_id is None and "flow_id" in self.model_fields_set: - _dict["flow_id"] = None + _dict['flow_id'] = None return _dict @classmethod - def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: """Create an instance of VersionReadResponse from a dict""" if obj is None: return None @@ -118,3 +119,5 @@ def from_dict(cls, obj: dict[str, Any] | None) -> Self | None: "created_at": obj.get("created_at") }) return _obj + + diff --git a/codegen/aignx/codegen/rest.py b/codegen/out/aignx/codegen/rest.py similarity index 84% rename from codegen/aignx/codegen/rest.py rename to codegen/out/aignx/codegen/rest.py index 4fff33a2..10d53d08 100644 --- a/codegen/aignx/codegen/rest.py +++ b/codegen/out/aignx/codegen/rest.py @@ -1,13 +1,14 @@ +# coding: utf-8 """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 @@ -30,7 +31,8 @@ def is_socks_proxy_url(url): split_section = url.split("://") if len(split_section) < 2: return False - return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES + else: + return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES class RESTResponse(io.IOBase): @@ -76,21 +78,22 @@ def __init__(self, configuration) -> None: "key_file": configuration.key_file, } if configuration.assert_hostname is not None: - pool_args["assert_hostname"] = ( + pool_args['assert_hostname'] = ( configuration.assert_hostname ) if configuration.retries is not None: - pool_args["retries"] = configuration.retries + pool_args['retries'] = configuration.retries if configuration.tls_server_name: - pool_args["server_hostname"] = configuration.tls_server_name + pool_args['server_hostname'] = configuration.tls_server_name + if configuration.socket_options is not None: - pool_args["socket_options"] = configuration.socket_options + pool_args['socket_options'] = configuration.socket_options if configuration.connection_pool_maxsize is not None: - pool_args["maxsize"] = configuration.connection_pool_maxsize + pool_args['maxsize'] = configuration.connection_pool_maxsize # https pool manager self.pool_manager: urllib3.PoolManager @@ -133,13 +136,13 @@ def request( """ method = method.upper() assert method in [ - "GET", - "HEAD", - "DELETE", - "POST", - "PUT", - "PATCH", - "OPTIONS" + 'GET', + 'HEAD', + 'DELETE', + 'POST', + 'PUT', + 'PATCH', + 'OPTIONS' ] if post_params and body: @@ -165,13 +168,13 @@ def request( try: # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` - if method in ["POST", "PUT", "PATCH", "OPTIONS", "DELETE"]: + if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: # no content type provided or payload is json - content_type = headers.get("Content-Type") + content_type = headers.get('Content-Type') if ( not content_type - or re.search(r"json", content_type, re.IGNORECASE) + or re.search('json', content_type, re.IGNORECASE) ): request_body = None if body is not None: @@ -184,7 +187,7 @@ def request( headers=headers, preload_content=False ) - elif content_type == "application/x-www-form-urlencoded": + elif content_type == 'application/x-www-form-urlencoded': r = self.pool_manager.request( method, url, @@ -194,13 +197,13 @@ def request( headers=headers, preload_content=False ) - elif content_type == "multipart/form-data": + elif content_type == 'multipart/form-data': # must del headers['Content-Type'], or the correct # Content-Type which generated by urllib3 will be # overwritten. - del headers["Content-Type"] + del headers['Content-Type'] # Ensures that dict objects are serialized - post_params = [(a, json.dumps(b)) if isinstance(b, dict) else (a, b) for a, b in post_params] + post_params = [(a, json.dumps(b)) if isinstance(b, dict) else (a,b) for a, b in post_params] r = self.pool_manager.request( method, url, @@ -222,7 +225,7 @@ def request( headers=headers, preload_content=False ) - elif headers["Content-Type"].startswith("text/") and isinstance(body, bool): + elif headers['Content-Type'].startswith('text/') and isinstance(body, bool): request_body = "true" if body else "false" r = self.pool_manager.request( method, diff --git a/codegen/docs/ExternalsApi.md b/codegen/out/docs/ExternalsApi.md similarity index 95% rename from codegen/docs/ExternalsApi.md rename to codegen/out/docs/ExternalsApi.md index 7e15a440..a6ffda22 100644 --- a/codegen/docs/ExternalsApi.md +++ b/codegen/out/docs/ExternalsApi.md @@ -53,7 +53,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | + application_run_id = 'application_run_id_example' # str | try: # Cancel Run @@ -71,7 +71,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | + **application_run_id** | **str**| | ### Return type @@ -129,7 +129,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - run_creation_request = aignx.codegen.RunCreationRequest() # RunCreationRequest | + run_creation_request = aignx.codegen.RunCreationRequest() # RunCreationRequest | try: # Create Application Run @@ -147,7 +147,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **run_creation_request** | [**RunCreationRequest**](RunCreationRequest.md)| | + **run_creation_request** | [**RunCreationRequest**](RunCreationRequest.md)| | ### Return type @@ -205,7 +205,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - user_creation_request = aignx.codegen.UserCreationRequest() # UserCreationRequest | + user_creation_request = aignx.codegen.UserCreationRequest() # UserCreationRequest | try: # Create User @@ -223,7 +223,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **user_creation_request** | [**UserCreationRequest**](UserCreationRequest.md)| | + **user_creation_request** | [**UserCreationRequest**](UserCreationRequest.md)| | ### Return type @@ -279,7 +279,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | + application_run_id = 'application_run_id_example' # str | try: # Delete Run Results @@ -295,7 +295,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | + **application_run_id** | **str**| | ### Return type @@ -352,7 +352,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | + application_run_id = 'application_run_id_example' # str | include = None # List[object] | (optional) try: @@ -371,8 +371,8 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | - **include** | [**List[object]**](object.md)| | [optional] + **application_run_id** | **str**| | + **include** | [**List[object]**](object.md)| | [optional] ### Return type @@ -429,7 +429,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - user_id = 'user_id_example' # str | + user_id = 'user_id_example' # str | try: # Get User @@ -447,7 +447,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **user_id** | **str**| | + **user_id** | **str**| | ### Return type @@ -504,7 +504,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_version_id = 'application_version_id_example' # str | + application_version_id = 'application_version_id_example' # str | include = None # List[object] | (optional) try: @@ -523,8 +523,8 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_version_id** | **str**| | - **include** | [**List[object]**](object.md)| | [optional] + **application_version_id** | **str**| | + **include** | [**List[object]**](object.md)| | [optional] ### Return type @@ -603,12 +603,12 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_id** | **str**| | [optional] - **application_version_id** | **str**| | [optional] - **include** | [**List[object]**](object.md)| | [optional] + **application_id** | **str**| | [optional] + **application_version_id** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] **page** | **int**| | [optional] [default to 1] **page_size** | **int**| | [optional] [default to 50] - **sort** | [**List[str]**](str.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] ### Return type @@ -687,7 +687,7 @@ Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **page** | **int**| | [optional] [default to 1] **page_size** | **int**| | [optional] [default to 50] - **sort** | [**List[str]**](str.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] ### Return type @@ -744,7 +744,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | + application_run_id = 'application_run_id_example' # str | item_id__in = ['item_id__in_example'] # List[Optional[str]] | (optional) page = 1 # int | (optional) (default to 1) page_size = 50 # int | (optional) (default to 50) @@ -768,13 +768,13 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | - **item_id__in** | [**List[Optional[str]]**](str.md)| | [optional] + **application_run_id** | **str**| | + **item_id__in** | [**List[Optional[str]]**](str.md)| | [optional] **page** | **int**| | [optional] [default to 1] **page_size** | **int**| | [optional] [default to 50] - **reference__in** | [**List[str]**](str.md)| | [optional] - **status__in** | [**List[ItemStatus]**](ItemStatus.md)| | [optional] - **sort** | [**List[str]**](str.md)| | [optional] + **reference__in** | [**List[str]**](str.md)| | [optional] + **status__in** | [**List[ItemStatus]**](ItemStatus.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] ### Return type @@ -831,7 +831,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_id = 'application_id_example' # str | + application_id = 'application_id_example' # str | page = 1 # int | (optional) (default to 1) page_size = 50 # int | (optional) (default to 50) version = 'version_example' # str | (optional) @@ -854,12 +854,12 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_id** | **str**| | + **application_id** | **str**| | **page** | **int**| | [optional] [default to 1] **page_size** | **int**| | [optional] [default to 50] - **version** | **str**| | [optional] - **include** | [**List[object]**](object.md)| | [optional] - **sort** | [**List[str]**](str.md)| | [optional] + **version** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] ### Return type @@ -915,7 +915,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_slug = 'application_slug_example' # str | + application_slug = 'application_slug_example' # str | page = 1 # int | (optional) (default to 1) page_size = 50 # int | (optional) (default to 50) version = 'version_example' # str | (optional) @@ -938,12 +938,12 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_slug** | **str**| | + **application_slug** | **str**| | **page** | **int**| | [optional] [default to 1] **page_size** | **int**| | [optional] [default to 50] - **version** | **str**| | [optional] - **include** | [**List[object]**](object.md)| | [optional] - **sort** | [**List[str]**](str.md)| | [optional] + **version** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] ### Return type @@ -999,7 +999,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_id = 'application_id_example' # str | + application_id = 'application_id_example' # str | try: # Read Application By Id @@ -1017,7 +1017,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_id** | **str**| | + **application_id** | **str**| | ### Return type @@ -1073,7 +1073,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_slug = 'application_slug_example' # str | + application_slug = 'application_slug_example' # str | try: # Read Application By Slug @@ -1091,7 +1091,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_slug** | **str**| | + **application_slug** | **str**| | ### Return type @@ -1148,7 +1148,7 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - version_creation_request = aignx.codegen.VersionCreationRequest() # VersionCreationRequest | + version_creation_request = aignx.codegen.VersionCreationRequest() # VersionCreationRequest | try: # Register Version @@ -1166,7 +1166,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **version_creation_request** | [**VersionCreationRequest**](VersionCreationRequest.md)| | + **version_creation_request** | [**VersionCreationRequest**](VersionCreationRequest.md)| | ### Return type @@ -1223,8 +1223,8 @@ configuration.access_token = os.environ["ACCESS_TOKEN"] with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - user_id = 'user_id_example' # str | - user_update_request = aignx.codegen.UserUpdateRequest() # UserUpdateRequest | + user_id = 'user_id_example' # str | + user_update_request = aignx.codegen.UserUpdateRequest() # UserUpdateRequest | try: # Update User @@ -1242,8 +1242,8 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **user_id** | **str**| | - **user_update_request** | [**UserUpdateRequest**](UserUpdateRequest.md)| | + **user_id** | **str**| | + **user_update_request** | [**UserUpdateRequest**](UserUpdateRequest.md)| | ### Return type @@ -1267,3 +1267,4 @@ Name | Type | Description | Notes **422** | Validation Error | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/codegen/test/test_externals_api.py b/codegen/out/test/test_externals_api.py similarity index 81% rename from codegen/test/test_externals_api.py rename to codegen/out/test/test_externals_api.py index af332ca9..c23a877a 100644 --- a/codegen/test/test_externals_api.py +++ b/codegen/out/test/test_externals_api.py @@ -1,19 +1,19 @@ """ -Aignostics Platform API + Aignostics Platform API -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. -The version of the OpenAPI document: 0.1.0 -Generated by OpenAPI Generator (https://openapi-generator.tech) + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) -Do not edit the class manually. + Do not edit the class manually. """ # noqa: E501 import unittest -from aignx.codegen.api.externals_api import ExternalsApi +from aignostics.codegen.api.externals_api import ExternalsApi class TestExternalsApi(unittest.TestCase): @@ -30,97 +30,113 @@ def test_cancel_run_v1_runs_application_run_id_cancel_post(self) -> None: Cancel Run """ + pass def test_create_application_run_v1_runs_post(self) -> None: """Test case for create_application_run_v1_runs_post Create Application Run """ + pass def test_create_user_v1_users_post(self) -> None: """Test case for create_user_v1_users_post Create User """ + pass def test_delete_run_results_v1_runs_application_run_id_results_delete(self) -> None: """Test case for delete_run_results_v1_runs_application_run_id_results_delete Delete Run Results """ + pass def test_get_run_v1_runs_application_run_id_get(self) -> None: """Test case for get_run_v1_runs_application_run_id_get Get Run """ + pass def test_get_user_v1_users_user_id_get(self) -> None: """Test case for get_user_v1_users_user_id_get Get User """ + pass def test_get_version_v1_versions_application_version_id_get(self) -> None: """Test case for get_version_v1_versions_application_version_id_get Get Version """ + pass def test_list_application_runs_v1_runs_get(self) -> None: """Test case for list_application_runs_v1_runs_get List Application Runs """ + pass def test_list_applications_v1_applications_get(self) -> None: """Test case for list_applications_v1_applications_get List Applications """ + pass def test_list_run_results_v1_runs_application_run_id_results_get(self) -> None: """Test case for list_run_results_v1_runs_application_run_id_results_get List Run Results """ + pass def test_list_versions_by_application_id_v1_applications_application_id_versions_get(self) -> None: """Test case for list_versions_by_application_id_v1_applications_application_id_versions_get List Versions By Application Id """ + pass def test_list_versions_by_application_slug_v1_applications_application_slug_versions_get(self) -> None: """Test case for list_versions_by_application_slug_v1_applications_application_slug_versions_get List Versions By Application Slug """ + pass def test_read_application_by_id_v1_applications_application_id_get(self) -> None: """Test case for read_application_by_id_v1_applications_application_id_get Read Application By Id """ + pass def test_read_application_by_slug_v1_applications_application_slug_get(self) -> None: """Test case for read_application_by_slug_v1_applications_application_slug_get Read Application By Slug """ + pass def test_register_version_v1_versions_post(self) -> None: """Test case for register_version_v1_versions_post Register Version """ + pass def test_update_user_v1_users_user_id_patch(self) -> None: """Test case for update_user_v1_users_user_id_patch Update User """ + pass -if __name__ == "__main__": +if __name__ == '__main__': unittest.main() diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index fbb3d0c5..f1a167fb 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -4,8 +4,7 @@ components: properties: description: examples: - - 'H&E Tumor Micro Environment Analysis: Performing tissue QC, -segmentation, + - 'H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, cell detection and cell classfication' title: Description type: string @@ -134,12 +133,10 @@ segmentation, title: ApplicationVersionReadResponse type: object ArtifactEvent: - description: 'This is a subset of the OutputArtifactEvent used by the -state + description: 'This is a subset of the OutputArtifactEvent used by the state machine. - Only the variants defined below are allowed to be submitted from the -Algorithms/Applications.' + Only the variants defined below are allowed to be submitted from the Algorithms/Applications.' enum: - succeeded - failed_with_user_error @@ -1062,12 +1059,9 @@ Algorithms/Applications.' tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token type: oauth2 info: - description: Pagination is done via `page` and `page_size`. Sorting via `sort` -query - parameter. sort is a comma-separated list of field names. The sorting -direction - can be indicated via `+` (ascending) or `-` (descending) (e.g. -`/applications?sort=+name)`. + description: Pagination is done via `page` and `page_size`. Sorting via `sort` query + parameter. sort is a comma-separated list of field names. The sorting direction + can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. summary: Interact with Aignostics' Application Platform title: Aignostics Platform API version: 0.1.0 @@ -1246,8 +1240,7 @@ paths: - Externals /v1/applications/{application_id}/versions: get: - operationId: -list_versions_by_application_id_v1_applications__application_id__versions_get + operationId: list_versions_by_application_id_v1_applications__application_id__versions_get parameters: - in: path name: application_id @@ -1310,8 +1303,7 @@ list_versions_by_application_id_v1_applications__application_id__versions_get schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications -Application + title: Response List Versions By Application Id V1 Applications Application Id Versions Get type: array description: Successful Response @@ -1328,8 +1320,7 @@ Application - Externals /v1/applications/{application_slug}: get: - operationId: -read_application_by_slug_v1_applications__application_slug__get + operationId: read_application_by_slug_v1_applications__application_slug__get parameters: - in: path name: application_slug @@ -1357,9 +1348,7 @@ read_application_by_slug_v1_applications__application_slug__get - Externals /v1/applications/{application_slug}/versions: get: - operationId: -list_versions_by_application_slug_v1_applications__application_slug__versions_ge -t + operationId: list_versions_by_application_slug_v1_applications__application_slug__versions_get parameters: - in: path name: application_slug @@ -1422,8 +1411,7 @@ t schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 -Applications Application + title: Response List Versions By Application Slug V1 Applications Application Slug Versions Get type: array description: Successful Response @@ -1440,8 +1428,7 @@ Applications Application - Externals /v1/artifacts/{output_artifact_id}/event: post: - operationId: -trigger_artifact_event_v1_artifacts__output_artifact_id__event_post + operationId: trigger_artifact_event_v1_artifacts__output_artifact_id__event_post parameters: - in: path name: output_artifact_id @@ -1856,8 +1843,7 @@ trigger_artifact_event_v1_artifacts__output_artifact_id__event_post - Externals /v1/runs/{application_run_id}/results: delete: - operationId: -delete_run_results_v1_runs__application_run_id__results_delete + operationId: delete_run_results_v1_runs__application_run_id__results_delete parameters: - in: path name: application_run_id @@ -1957,8 +1943,7 @@ delete_run_results_v1_runs__application_run_id__results_delete schema: items: $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id -Results + title: Response List Run Results V1 Runs Application Run Id Results Get type: array description: Successful Response diff --git a/examples/playbook.py b/examples/playbook.py index 888fbdf7..e8916702 100644 --- a/examples/playbook.py +++ b/examples/playbook.py @@ -7,6 +7,7 @@ @app.cell def _(): import marimo as mo + return (mo,) @@ -32,6 +33,7 @@ def _(mo): @app.cell def _(): import aignostics.client + client = aignostics.client.Client() # the following functions is just used to visualize the results nicely in this notebook @@ -44,6 +46,7 @@ def show(models: BaseModel | list[BaseModel]) -> pd.DataFrame: else: items = (a.model_dump() for a in models) return pd.DataFrame(items) + return BaseModel, aignostics, client, pd, show @@ -94,15 +97,18 @@ def _(mo): def _(client): import os - from aignostics.samples import input_samples from aignx.codegen.models import ApplicationVersion, RunCreationRequest - os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/Users/akunft/Downloads/aignx-platform-api-shsodcule-9086ce65109a.json" + from aignostics.samples import input_samples + + os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = ( + "/Users/akunft/Downloads/aignx-platform-api-shsodcule-9086ce65109a.json" + ) application_run = client.runs.create( RunCreationRequest( application_version=ApplicationVersion("212470c6-103e-429e-a9a0-0f662166faf5"), - items=input_samples.three_spots_payload() + items=input_samples.three_spots_payload(), ) ) print(application_run) @@ -123,6 +129,7 @@ def _(mo): @app.cell def _(application_run): from aignostics.resources.runs import ApplicationRun + # if you have a reference to an application run download_folder = "/tmp/" application_run.download_to_folder(download_folder) diff --git a/install.sh b/install.sh index c2e68788..3021c923 100755 --- a/install.sh +++ b/install.sh @@ -18,6 +18,7 @@ BREW_TOOLS=( "pinact;pinact;https://github.com/suzuki-shunsuke/pinact" "trivy;trivy;https://trivy.dev/latest/" "pnpm;pnpm;https://pnpm.io/" + "openapi-generator;openapi-generator;https://github.com/OpenAPITools/openapi-generator" ) MAC_BREW_TOOLS=( diff --git a/pyproject.toml b/pyproject.toml index c14fe242..1d963e7d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -75,7 +75,7 @@ dependencies = [ "jsf>=0.11.2", "jsonschema>=4.23.0", "pyjwt>=2.10.1", - "python-dotenv>=1.1.0", # Can be removed later + "python-dotenv>=1.1.0", # Can be removed later "requests>=2.32.3", "requests-oauthlib>=2.0.0", "tqdm>=4.67.1", @@ -97,13 +97,13 @@ requires = ["hatchling==1.27.0"] build-backend = "hatchling.build" [tool.hatch.build] -include = ["src/*", "codegen/*"] +include = ["src/*", "codegen/out/*"] [tool.hatch.build.targets.wheel] -packages = ["src/aignostics", "codegen/aignostics"] +packages = ["src/aignostics", "codegen/out/aignx"] [tool.hatch.build.targets.wheel.force-include] -"codegen" = "codegen" +"codegen" = "codegen/out" [project.optional-dependencies] examples = [ @@ -165,7 +165,12 @@ target-version = "py311" preview = true fix = true line-length = 120 -extend-exclude = [".fixme", "notebook.py"] +extend-exclude = [ + ".fixme", + "notebook.py", + "playbook.py", # TODO (Helmut): refactor that code and reenable + "codegen", # TODO (Helmut): check if codegen can be tweaked to generate better code +] [tool.ruff.lint] select = ["ALL"] @@ -247,10 +252,10 @@ warn_required_dynamic_aliases = true warn_untyped_fields = true [tool.pytest.ini_options] -addopts = "-v --strict-markers --cov=aignostics --cov=aignx --cov-report=term-missing --cov-report=xml:reports/coverage.xml --cov-report=html:reports/coverage_html" +addopts = "-v --strict-markers --cov=aignostics --cov-report=term-missing --cov-report=xml:reports/coverage.xml --cov-report=html:reports/coverage_html" testpaths = ["tests"] python_files = ["*_test.py"] -pythonpath = [".", "src", "codegen"] +pythonpath = [".", "src", "codegen/out"] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" env = ["COVERAGE_FILE=.coverage", "COVERAGE_PROCESS_START=pyproject.toml"] diff --git a/schema/generate.sh b/schema/generate.sh deleted file mode 100755 index 298ac2b2..00000000 --- a/schema/generate.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -# run from platform root -docker run --rm -u "$(id -u):$(id -g)" -v "${PWD}:/local" openapitools/openapi-generator-cli:v7.10.0 generate \ - -i "/local/schema/api.json" \ - -g python \ - -o /local/codegen \ - -c /local/schema/config.json \ -# Hotfix for https://github.com/OpenAPITools/openapi-generator/issues/18932 -# create __init__.py files -ls codegen/aignx/codegen/models/ | awk -F . '/[a-z].py/ {print "from ."$1" import *"}' > codegen/aignx/codegen/models/__init__.py - - - -##!/bin/sh -## obtain token -#TOKEN=$(poetry run python src/aignx/platform/_authentication.py) -## run from platform root -#docker run --rm -u "$(id -u):$(id -g)" -v "${PWD}:/local" openapitools/openapi-generator-cli:v7.10.0 generate \ -# -i "https://platform-dev.aignostics.com/openapi.json" \ -# -g python \ -# -o /local/codegen \ -# -c /local/schema/config.json \ -# -a "Authorization:Bearer $TOKEN" -## Hotfix for https://github.com/OpenAPITools/openapi-generator/issues/18932 -#ls codegen/aignostics/codegen/models/ | awk -F . '/[a-z].py/ {print "from ."$1" import *"}' > codegen/aignostics/codegen/models/__init__.py diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 1f13d0b4..ac7fe0f4 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -129,6 +129,7 @@ class _OAuthHttpServer(HTTPServer): Extends HTTPServer to store the authorization code received during OAuth flow. """ + def __init__(self, *args, **kwargs): """Initializes the server with storage for the authorization code. @@ -145,6 +146,7 @@ class _OAuthHttpHandler(BaseHTTPRequestHandler): Processes the OAuth callback redirect and extracts the authorization code. """ + def do_GET(self): """Handles GET requests containing OAuth response parameters. @@ -200,13 +202,9 @@ def _perform_authorization_code_with_pkce_flow(): RuntimeError: If authentication fails. """ parsed_redirect = urlparse(REDIRECT_URI) - with _OAuthHttpServer( - (parsed_redirect.hostname, parsed_redirect.port), _OAuthHttpHandler - ) as httpd: + with _OAuthHttpServer((parsed_redirect.hostname, parsed_redirect.port), _OAuthHttpHandler) as httpd: # initialize flow (generate code_challenge and code_verifier) - session = OAuth2Session( - CLIENT_ID_INTERACTIVE, scope=SCOPE, redirect_uri=REDIRECT_URI, pkce="S256" - ) + session = OAuth2Session(CLIENT_ID_INTERACTIVE, scope=SCOPE, redirect_uri=REDIRECT_URI, pkce="S256") authorization_url, state = session.authorization_url( AUTHORIZATION_BASE_URL, access_type="offline", audience=AUDIENCE ) @@ -236,11 +234,9 @@ def _perform_device_flow(): Raises: RuntimeError: If authentication fails or is denied. """ - resp = requests.post( - DEVICE_URL, data={"client_id": CLIENT_ID_DEVICE, "scope": SCOPE, "audience": AUDIENCE} - ) + resp = requests.post(DEVICE_URL, data={"client_id": CLIENT_ID_DEVICE, "scope": SCOPE, "audience": AUDIENCE}) device_code = resp.json()["device_code"] - print(f'Please visit: {resp.json()["verification_uri_complete"]}') + print(f"Please visit: {resp.json()['verification_uri_complete']}") # Polling for access token with received device code while True: diff --git a/src/aignostics/client/_client.py b/src/aignostics/client/_client.py index ea4c9042..ab0f6446 100644 --- a/src/aignostics/client/_client.py +++ b/src/aignostics/client/_client.py @@ -1,10 +1,11 @@ -from aignostics.client._authentication import get_token -from aignostics.client.resources.applications import Applications, Versions -from aignostics.client.resources.runs import Runs from aignx.codegen.api.externals_api import ExternalsApi from aignx.codegen.api_client import ApiClient from aignx.codegen.configuration import Configuration +from aignostics.client._authentication import get_token +from aignostics.client.resources.applications import Applications, Versions +from aignostics.client.resources.runs import Runs + API_ROOT = "https://platform-dev.aignostics.com" # API_ROOT = "https://platform-staging.aignostics.ai" @@ -15,6 +16,7 @@ class Client: Provides access to platform resources like applications, versions, and runs. Handles authentication and API client configuration. """ + def __init__(self, cache_token: bool = True): """Initializes a client instance with authenticated API access. @@ -53,6 +55,6 @@ def _get_api_client(cache_token: bool = True) -> ExternalsApi: # api_key_prefix={"Authorization": "Bearer"}, ), header_name="Authorization", - header_value=f"Bearer {token}" + header_value=f"Bearer {token}", ) return ExternalsApi(client) diff --git a/src/aignostics/client/resources/applications.py b/src/aignostics/client/resources/applications.py index 02580baf..5b3d85e1 100644 --- a/src/aignostics/client/resources/applications.py +++ b/src/aignostics/client/resources/applications.py @@ -7,6 +7,7 @@ class Versions: Provides operations to list and retrieve application versions. """ + def __init__(self, api: ExternalsApi): """Initializes the Versions resource with the API client. @@ -32,7 +33,9 @@ def list(self, for_application: ApplicationReadResponse | str) -> list[Applicati application_id = for_application.application_id else: application_id = for_application - res = self._api.list_versions_by_application_id_v1_applications_application_id_versions_get(application_id=application_id) + res = self._api.list_versions_by_application_id_v1_applications_application_id_versions_get( + application_id=application_id + ) return res def details(self, for_application_version_id: str) -> VersionReadResponse: @@ -47,7 +50,9 @@ def details(self, for_application_version_id: str) -> VersionReadResponse: Raises: Exception: If the API request fails. """ - return self._api.get_version_v1_versions_application_version_id_get(application_version_id=for_application_version_id) + return self._api.get_version_v1_versions_application_version_id_get( + application_version_id=for_application_version_id + ) class Applications: diff --git a/src/aignostics/client/resources/runs.py b/src/aignostics/client/resources/runs.py index 56557683..529b13d0 100644 --- a/src/aignostics/client/resources/runs.py +++ b/src/aignostics/client/resources/runs.py @@ -2,12 +2,6 @@ from pathlib import Path from time import sleep -from jsf import JSF -from jsonschema.exceptions import ValidationError -from jsonschema.validators import validate - -from aignostics.client.resources.applications import Versions -from aignostics.client.utils import _calculate_file_crc32c, _download_file, mime_type_to_file_ending from aignx.codegen.api.externals_api import ExternalsApi from aignx.codegen.models import ( ApplicationRunStatus, @@ -17,6 +11,12 @@ RunCreationResponse, RunReadResponse, ) +from jsf import JSF +from jsonschema.exceptions import ValidationError +from jsonschema.validators import validate + +from aignostics.client.resources.applications import Versions +from aignostics.client.utils import _calculate_file_crc32c, _download_file, mime_type_to_file_ending class ApplicationRun: @@ -24,6 +24,7 @@ class ApplicationRun: Provides operations to check status, retrieve results, and download artifacts. """ + def __init__(self, api: ExternalsApi, application_run_id: str): """Initializes an ApplicationRun instance. @@ -45,6 +46,7 @@ def for_application_run_id(cls, application_run_id: str) -> "ApplicationRun": ApplicationRun: The initialized ApplicationRun instance. """ from aignostics.client import Client + return cls(Client._get_api_client(), application_run_id) def status(self) -> RunReadResponse: @@ -202,6 +204,7 @@ class Runs: Provides operations to create, list, and retrieve runs. """ + def __init__(self, api: ExternalsApi): """Initializes the Runs resource with the API client. @@ -249,8 +252,7 @@ def generate_example_payload(self, application_version_id: str): """ app_version = Versions(self._api).details(for_application_version_id=application_version_id) schema_idx = { - input_artifact.name: input_artifact.metadata_schema - for input_artifact in app_version.input_artifacts + input_artifact.name: input_artifact.metadata_schema for input_artifact in app_version.input_artifacts } schema = RunCreationRequest.model_json_schema() faker = JSF(schema) @@ -286,10 +288,7 @@ def list(self, for_application_version: str = None) -> list[ApplicationRun]: res = self._api.list_application_runs_v1_runs_get() else: res = self._api.list_application_runs_v1_runs_get_with_http_info(for_application_version) - return [ - ApplicationRun(self._api, response.application_run_id) - for response in res - ] + return [ApplicationRun(self._api, response.application_run_id) for response in res] def _validate_input_items(self, payload: RunCreationRequest): """Validates the input items in a run creation request. @@ -305,10 +304,11 @@ def _validate_input_items(self, payload: RunCreationRequest): Exception: If the API request fails. """ # validate metadata based on schema of application version - app_version = Versions(self._api).details(for_application_version_id=payload.application_version.actual_instance) + app_version = Versions(self._api).details( + for_application_version_id=payload.application_version.actual_instance + ) schema_idx = { - input_artifact.name: input_artifact.metadata_schema - for input_artifact in app_version.input_artifacts + input_artifact.name: input_artifact.metadata_schema for input_artifact in app_version.input_artifacts } references = set() for item in payload.items: diff --git a/src/aignostics/client/samples/input_samples.py b/src/aignostics/client/samples/input_samples.py index d78b4830..f2b8352b 100644 --- a/src/aignostics/client/samples/input_samples.py +++ b/src/aignostics/client/samples/input_samples.py @@ -1,6 +1,7 @@ -from aignostics.client.utils import _generate_signed_url from aignx.codegen.models import InputArtifactCreationRequest, ItemCreationRequest +from aignostics.client.utils import _generate_signed_url + def three_spots_payload(): return [ @@ -17,9 +18,9 @@ def three_spots_payload(): "base_mpp": 0.46499982, "width": 3728, "height": 3640, - } + }, ) - ] + ], ), ItemCreationRequest( reference="2", @@ -34,9 +35,9 @@ def three_spots_payload(): "base_mpp": 0.46499982, "width": 3616, "height": 3400, - } + }, ) - ] + ], ), ItemCreationRequest( reference="3", @@ -51,8 +52,8 @@ def three_spots_payload(): "base_mpp": 0.46499982, "width": 4016, "height": 3952, - } + }, ) - ] - ) + ], + ), ] diff --git a/src/aignostics/client/utils.py b/src/aignostics/client/utils.py index 6a9fe311..5ca78f7c 100644 --- a/src/aignostics/client/utils.py +++ b/src/aignostics/client/utils.py @@ -94,11 +94,7 @@ def _generate_signed_url(fully_qualified_gs_path: str): if not blob.exists(): raise ValueError(f"Blob does not exist: {fully_qualified_gs_path}") - url = blob.generate_signed_url( - expiration=datetime.timedelta(hours=1), - method="GET", - version="v4" - ) + url = blob.generate_signed_url(expiration=datetime.timedelta(hours=1), method="GET", version="v4") return url diff --git a/src/aignostics/service.py b/src/aignostics/service.py index 5a13417e..d57eafd7 100644 --- a/src/aignostics/service.py +++ b/src/aignostics/service.py @@ -111,7 +111,7 @@ def openapi_schema() -> dict: Raises: OpenAPISchemaError: If the OpenAPI schema file cannot be found or is not valid JSON. """ - schema_path = Path(__file__).parent.parent.parent / "schema" / "api.json" + schema_path = Path(__file__).parent.parent.parent / "codegen" / "in" / "api.json" try: with schema_path.open(encoding="utf-8") as f: return json.load(f) diff --git a/tests/cli_test.py b/tests/aignostics/cli/core_test.py similarity index 100% rename from tests/cli_test.py rename to tests/aignostics/cli/core_test.py diff --git a/tests/aignostics/client/applications_test.py b/tests/aignostics/client/applications_test.py index f2f38ed8..3959fdf7 100644 --- a/tests/aignostics/client/applications_test.py +++ b/tests/aignostics/client/applications_test.py @@ -1,12 +1,12 @@ from unittest.mock import Mock import pytest - -from aignostics.client.resources.applications import Applications, Versions from aignx.codegen.api.externals_api import ExternalsApi from aignx.codegen.models import ApplicationVersionReadResponse from aignx.codegen.models.application_read_response import ApplicationReadResponse +from aignostics.client.resources.applications import Applications, Versions + @pytest.fixture def mock_api(): @@ -21,7 +21,9 @@ def applications(mock_api): # @pytest.mark.specifications("SAM-56") # @pytest.mark.labels("custom-label") @pytest.mark.requirements("SAM-2") -@pytest.mark.description("Verifies that the applications list method returns an empty list when the API returns no applications") +@pytest.mark.description( + "Verifies that the applications list method returns an empty list when the API returns no applications" +) def test_applications_list_returns_empty_list_when_no_applications(applications, mock_api): # Arrange mock_api.list_applications_v1_applications_get.return_value = [] @@ -114,7 +116,9 @@ def test_versions_list_passes_through_api_exception(mock_api): versions = Versions(mock_api) mock_app = Mock(spec=ApplicationReadResponse) mock_app.application_id = "test-app-id" - mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.side_effect = Exception("API error") + mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.side_effect = Exception( + "API error" + ) # Act & Assert with pytest.raises(Exception, match="API error"): diff --git a/tests/aignostics/client/scheduled_test.py b/tests/aignostics/client/scheduled_test.py index c9ca2005..282a4a33 100644 --- a/tests/aignostics/client/scheduled_test.py +++ b/tests/aignostics/client/scheduled_test.py @@ -2,11 +2,11 @@ from pathlib import Path import pytest +from aignx.codegen.models import ApplicationRunStatus, ApplicationVersion, ItemStatus, RunCreationRequest import aignostics.client from aignostics.client.samples import input_samples from aignostics.client.utils import _calculate_file_crc32c, mime_type_to_file_ending -from aignx.codegen.models import ApplicationRunStatus, ApplicationVersion, ItemStatus, RunCreationRequest @pytest.mark.timeout(240) @@ -17,8 +17,7 @@ def test_two_task_dummy_app(): platform = aignostics.client.Client(cache_token=False) application_run = platform.runs.create( RunCreationRequest( - application_version=ApplicationVersion(application_version), - items=input_samples.three_spots_payload() + application_version=ApplicationVersion(application_version), items=input_samples.three_spots_payload() ) ) @@ -26,7 +25,9 @@ def test_two_task_dummy_app(): dir = Path(dir) application_run.download_to_folder(dir) - assert application_run.status().status == ApplicationRunStatus.COMPLETED, "Application run did not finish in completed status" + assert application_run.status().status == ApplicationRunStatus.COMPLETED, ( + "Application run did not finish in completed status" + ) run_result_folder = dir / application_run.application_run_id assert run_result_folder.exists(), "Application run result folder does not exist" From 0a3d7c55c9df4b150e7881b165b1170350a11188 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Fri, 4 Apr 2025 09:00:06 +0200 Subject: [PATCH 021/110] docs: added codegen/README.md --- codegen/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 codegen/README.md diff --git a/codegen/README.md b/codegen/README.md new file mode 100644 index 00000000..16c0186d --- /dev/null +++ b/codegen/README.md @@ -0,0 +1 @@ +execute `make codegen` to generate the code From e17187d5704b60584f73641e04298b490f1aba27 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Fri, 4 Apr 2025 15:52:18 +0200 Subject: [PATCH 022/110] chore: Pass tests & linting --- .github/workflows/test-and-report.yml | 18 +- .github/workflows/test-scheduled.yml | 18 +- .gitignore | 2 +- docs/source/_static/openapi_v1.yaml | 2140 ----------------- docs/source/conf.py | 2 +- noxfile.py | 2 +- pyproject.toml | 4 +- src/aignostics/client/__init__.py | 10 +- src/aignostics/client/_authentication.py | 83 +- src/aignostics/client/_client.py | 15 +- .../client/resources/applications.py | 17 +- src/aignostics/client/resources/runs.py | 75 +- .../client/samples/input_samples.py | 59 - src/aignostics/client/utils.py | 43 +- tests/aignostics/client/applications_test.py | 81 +- tests/aignostics/client/scheduled_test.py | 102 +- 16 files changed, 306 insertions(+), 2365 deletions(-) delete mode 100644 docs/source/_static/openapi_v1.yaml delete mode 100644 src/aignostics/client/samples/input_samples.py diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 56d6a593..973843b0 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -7,6 +7,9 @@ on: pull_request: branches: [main] +env: + AIGNX_REFRESH_TOKEN: ${{ secrets.AIGNX_REFRESH_TOKEN }} + jobs: test: runs-on: ubuntu-latest @@ -59,12 +62,15 @@ jobs: TOML_VERSION=$(uv run python -c "import tomli; print(tomli.load(open('pyproject.toml', 'rb'))['project']['version'])") echo "Development build - Current version in pyproject.toml: $TOML_VERSION" - - name: Create .env file - uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 - with: - envkey_CLIENT_ID_DEVICE: ${{ secrets.CLIENT_ID_DEVICE }} - envkey_CLIENT_ID_INTERACTIVE: ${{ secrets.CLIENT_ID_INTERACTIVE }} - fail_on_empty: true + - name: Set up cloud credentials & environment file + env: + CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} + DEV_ENV_FILE: ${{ secrets.DEV_ENV_FILE }} + run: | + echo "$CREDENTIALS" | base64 -d > credentials.json + echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV + echo "$DEV_ENV_FILE" | base64 -d > dev.env + echo "ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV - name: Validate installation run: | diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index 91631b19..499697a3 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -28,26 +28,18 @@ jobs: run: | uv sync --all-extras --frozen --link-mode=copy - - name: Create .env file - uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 - with: - envkey_CLIENT_ID_DEVICE: ${{ secrets.CLIENT_ID_DEVICE }} - envkey_CLIENT_ID_INTERACTIVE: ${{ secrets.CLIENT_ID_INTERACTIVE }} - fail_on_empty: true - directory: '~/.aignostics' - file_name: 'env' - - - name: Set up cloud credentials + - name: Set up cloud credentials & environment file env: CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} + DEV_ENV_FILE: ${{ secrets.DEV_ENV_FILE }} run: | echo "$CREDENTIALS" | base64 -d > credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV + echo "$DEV_ENV_FILE" | base64 -d > dev.env + echo "ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV - - name: Set up refresh token + - name: Run tests marked as scheduled env: AIGNX_REFRESH_TOKEN: ${{ secrets.AIGNX_REFRESH_TOKEN }} - - - name: Run tests marked as scheduled run: | uv run --all-extras nox -s test -p 3.12 -- -m scheduled diff --git a/.gitignore b/.gitignore index 5987242e..0cd702bd 100644 --- a/.gitignore +++ b/.gitignore @@ -78,5 +78,5 @@ node_modules/ # Application specific - +tests/reports/**/* **/__marimo__ diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml deleted file mode 100644 index f1a167fb..00000000 --- a/docs/source/_static/openapi_v1.yaml +++ /dev/null @@ -1,2140 +0,0 @@ -components: - schemas: - ApplicationCreationRequest: - properties: - description: - examples: - - 'H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, - cell detection and cell classfication' - title: Description - type: string - name: - examples: - - HETA - title: Name - type: string - regulatory_classes: - examples: - - - RuO - items: - type: string - title: Regulatory Classes - type: array - required: - - name - - description - - regulatory_classes - title: ApplicationCreationRequest - type: object - ApplicationCreationResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - required: - - application_id - title: ApplicationCreationResponse - type: object - ApplicationReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - description: - examples: - - Aignostics H&E TME application - title: Description - type: string - name: - examples: - - HETA - title: Name - type: string - regulatory_classes: - examples: - - - RuO - items: - type: string - title: Regulatory Classes - type: array - slug: - examples: - - heta - title: Slug - type: string - required: - - application_id - - name - - slug - - regulatory_classes - - description - title: ApplicationReadResponse - type: object - ApplicationRunStatus: - enum: - - canceled_system - - canceled_user - - completed - - completed_with_error - - received - - rejected - - running - - scheduled - title: ApplicationRunStatus - type: string - ApplicationVersionReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - application_version_slug: - examples: - - tissue-segmentation-qc:v0.0.1 - pattern: ^(?:|-)*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ - title: Application Version Slug - type: string - changelog: - title: Changelog - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Flow Id - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactReadResponse' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactReadResponse' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - application_version_id - - application_version_slug - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - title: ApplicationVersionReadResponse - type: object - ArtifactEvent: - description: 'This is a subset of the OutputArtifactEvent used by the state - machine. - - Only the variants defined below are allowed to be submitted from the Algorithms/Applications.' - enum: - - succeeded - - failed_with_user_error - - failed_with_system_error - title: ArtifactEvent - type: string - ArtifactStatus: - enum: - - pending - - canceled_user - - canceled_system - - error_user - - error_system_fatal - - error_system_recoverable - - skipped - - succeeded - title: ArtifactStatus - type: string - HTTPValidationError: - properties: - detail: - items: - $ref: '#/components/schemas/ValidationError' - title: Detail - type: array - title: HTTPValidationError - type: object - InputArtifact: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifact - type: object - InputArtifactCreationRequest: - properties: - download_url: - examples: - - https://example.com/case-no-1-slide.tiff - format: uri - maxLength: 2083 - minLength: 1 - title: Download Url - type: string - metadata: - examples: - - checksum_crc32c: 752f9554 - height: 2000 - height_mpp: 0.5 - width: 10000 - width_mpp: 0.5 - title: Metadata - type: object - name: - examples: - - slide - title: Name - type: string - required: - - name - - download_url - - metadata - title: InputArtifactCreationRequest - type: object - InputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactReadResponse - type: object - InputArtifactSchemaCreationRequest: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactSchemaCreationRequest - type: object - ItemCreationRequest: - properties: - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactCreationRequest' - title: Input Artifacts - type: array - reference: - examples: - - case-no-1 - title: Reference - type: string - required: - - reference - - input_artifacts - title: ItemCreationRequest - type: object - ItemEvent: - enum: - - failed_with_system_error - - failed_recoverable - title: ItemEvent - type: string - ItemEventCreationRequest: - properties: - error: - title: Error - type: string - event: - $ref: '#/components/schemas/ItemEvent' - required: - - event - - error - title: ItemEventCreationRequest - type: object - ItemEventCreationResponse: - properties: - item_id: - format: uuid - title: Item Id - type: string - status: - $ref: '#/components/schemas/ItemStatus' - required: - - item_id - - status - title: ItemEventCreationResponse - type: object - ItemReadResponse: - properties: - application_run_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Run Id - error: - anyOf: - - type: string - - type: 'null' - title: Error - item_id: - format: uuid - title: Item Id - type: string - reference: - title: Reference - type: string - status: - $ref: '#/components/schemas/ItemStatus' - required: - - item_id - - reference - - status - - error - title: ItemReadResponse - type: object - ItemResultReadResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - error: - anyOf: - - type: string - - type: 'null' - title: Error - item_id: - format: uuid - title: Item Id - type: string - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactResultReadResponse' - title: Output Artifacts - type: array - reference: - title: Reference - type: string - status: - $ref: '#/components/schemas/ItemStatus' - required: - - item_id - - application_run_id - - reference - - status - - error - - output_artifacts - title: ItemResultReadResponse - type: object - ItemStatus: - enum: - - pending - - canceled_user - - canceled_system - - error_user - - error_system - - succeeded - title: ItemStatus - type: string - OrganizationCreationRequest: - properties: - batch_size: - title: Batch Size - type: integer - organization_id: - title: Organization Id - type: string - owner_email: - title: Owner Email - type: string - slide_quota: - title: Slide Quota - type: integer - required: - - organization_id - - owner_email - - slide_quota - - batch_size - title: OrganizationCreationRequest - type: object - OrganizationQuota: - properties: - total: - anyOf: - - type: integer - - type: 'null' - title: Total - used: - title: Used - type: integer - required: - - total - - used - title: OrganizationQuota - type: object - OrganizationResponse: - properties: - batch_size: - title: Batch Size - type: integer - organization_id: - title: Organization Id - type: string - owner_id: - format: uuid - title: Owner Id - type: string - slide_quota: - $ref: '#/components/schemas/OrganizationQuota' - required: - - organization_id - - owner_id - - slide_quota - - batch_size - title: OrganizationResponse - type: object - OrganizationUpdateRequest: - properties: - batch_size: - anyOf: - - type: integer - - type: 'null' - title: Batch Size - slide_quota: - anyOf: - - type: integer - - type: 'null' - title: Slide Quota - title: OrganizationUpdateRequest - type: object - OutputArtifact: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - visibility: - $ref: '#/components/schemas/OutputArtifactVisibility' - required: - - name - - mime_type - - metadata_schema - - scope - - visibility - title: OutputArtifact - type: object - OutputArtifactEventTriggerRequest: - properties: - error: - anyOf: - - type: string - - type: 'null' - title: Error - event: - $ref: '#/components/schemas/ArtifactEvent' - metadata: - title: Metadata - type: object - required: - - event - - metadata - title: OutputArtifactEventTriggerRequest - type: object - OutputArtifactEventTriggerResponse: - properties: - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - status: - $ref: '#/components/schemas/ArtifactStatus' - required: - - output_artifact_id - - status - title: OutputArtifactEventTriggerResponse - type: object - OutputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - required: - - name - - mime_type - - metadata_schema - - scope - title: OutputArtifactReadResponse - type: object - OutputArtifactResultReadResponse: - properties: - download_url: - anyOf: - - format: uri - maxLength: 2083 - minLength: 1 - type: string - - type: 'null' - title: Download Url - metadata: - title: Metadata - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - name - - mime_type - - metadata - - download_url - title: OutputArtifactResultReadResponse - type: object - OutputArtifactSchemaCreationRequest: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - visibility: - $ref: '#/components/schemas/OutputArtifactVisibility' - required: - - name - - mime_type - - scope - - visibility - - metadata_schema - title: OutputArtifactSchemaCreationRequest - type: object - OutputArtifactScope: - enum: - - item - - global - title: OutputArtifactScope - type: string - OutputArtifactVisibility: - enum: - - internal - - external - title: OutputArtifactVisibility - type: string - PayloadInputArtifact: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - input_artifact_id: - format: uuid - title: Input Artifact Id - type: string - metadata: - title: Metadata - type: object - required: - - input_artifact_id - - metadata - - download_url - title: PayloadInputArtifact - type: object - PayloadItem: - properties: - input_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadInputArtifact' - title: Input Artifacts - type: object - item_id: - format: uuid - title: Item Id - type: string - output_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - title: Output Artifacts - type: object - required: - - item_id - - input_artifacts - - output_artifacts - title: PayloadItem - type: object - PayloadOutputArtifact: - properties: - data: - $ref: '#/components/schemas/TransferUrls' - metadata: - $ref: '#/components/schemas/TransferUrls' - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - data - - metadata - title: PayloadOutputArtifact - type: object - QuotaName: - description: Global, API-level, and slide-level quotas for Samia API. - enum: - - max_users - - max_organizations - - max_users_per_organization - - max_applications - - max_application_versions - - max_slides_per_run - - max_parallel_runs - - max_parallel_runs_per_organization - - max_parallel_runs_per_user - title: QuotaName - type: string - QuotaReadResponse: - description: GET response payload for quota read. - properties: - name: - $ref: '#/components/schemas/QuotaName' - quota: - title: Quota - type: integer - required: - - name - - quota - title: QuotaReadResponse - type: object - QuotaUpdateRequest: - description: PATCH request payload for quota update. - properties: - name: - $ref: '#/components/schemas/QuotaName' - quota: - exclusiveMinimum: 0.0 - title: Quota - type: integer - required: - - name - - quota - title: QuotaUpdateRequest - type: object - QuotaUpdateResponse: - description: PATCH response payload for quota update. - properties: - name: - $ref: '#/components/schemas/QuotaName' - quota: - title: Quota - type: integer - required: - - name - - quota - title: QuotaUpdateResponse - type: object - QuotasReadResponse: - description: GET response payload for multiple quota reads. - properties: - quotas: - items: - $ref: '#/components/schemas/QuotaReadResponse' - title: Quotas - type: array - required: - - quotas - title: QuotasReadResponse - type: object - QuotasUpdateRequest: - description: PATCH request payload for quota updates. - properties: - quotas: - items: - $ref: '#/components/schemas/QuotaUpdateRequest' - title: Quotas - type: array - required: - - quotas - title: QuotasUpdateRequest - type: object - QuotasUpdateResponse: - description: PATCH response payload for quota updates. - properties: - updated_quotas: - items: - $ref: '#/components/schemas/QuotaUpdateResponse' - title: Updated Quotas - type: array - required: - - updated_quotas - title: QuotasUpdateResponse - type: object - RunCreationRequest: - properties: - application_version: - anyOf: - - format: uuid - type: string - - $ref: '#/components/schemas/SlugVersionRequest' - examples: - - efbf9822-a1e5-4045-a283-dbf26e8064a9 - title: Application Version - items: - items: - $ref: '#/components/schemas/ItemCreationRequest' - title: Items - type: array - required: - - application_version - - items - title: RunCreationRequest - type: object - RunCreationResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - required: - - application_run_id - title: RunCreationResponse - type: object - RunReadResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - organization_id: - title: Organization Id - type: string - status: - $ref: '#/components/schemas/ApplicationRunStatus' - triggered_at: - format: date-time - title: Triggered At - type: string - triggered_by: - title: Triggered By - type: string - user_payload: - anyOf: - - $ref: '#/components/schemas/UserPayload' - - type: 'null' - required: - - application_run_id - - application_version_id - - organization_id - - status - - triggered_at - - triggered_by - title: RunReadResponse - type: object - SlugVersionRequest: - properties: - application_slug: - pattern: ^(-?)*$ - title: Application Slug - type: string - version: - title: Version - type: string - required: - - application_slug - - version - title: SlugVersionRequest - type: object - TransferUrls: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - upload_url: - format: uri - minLength: 1 - title: Upload Url - type: string - required: - - upload_url - - download_url - title: TransferUrls - type: object - UserCreationRequest: - properties: - email: - anyOf: - - type: string - - type: 'null' - title: Email - organization_id: - format: uuid - title: Organization Id - type: string - user_id: - title: User Id - type: string - required: - - user_id - - organization_id - - email - title: UserCreationRequest - type: object - UserPayload: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_run_id: - format: uuid - title: Application Run Id - type: string - global_output_artifacts: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - type: object - - type: 'null' - title: Global Output Artifacts - items: - items: - $ref: '#/components/schemas/PayloadItem' - title: Items - type: array - required: - - application_id - - application_run_id - - global_output_artifacts - - items - title: UserPayload - type: object - UserQuota: - properties: - total: - anyOf: - - type: integer - - type: 'null' - title: Total - used: - title: Used - type: integer - required: - - total - - used - title: UserQuota - type: object - UserResponse: - properties: - organization_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Organization Id - slide_quota: - $ref: '#/components/schemas/UserQuota' - user_id: - anyOf: - - type: string - - type: 'null' - title: User Id - required: - - user_id - - organization_id - - slide_quota - title: UserResponse - type: object - UserUpdateRequest: - properties: - slide_quota: - anyOf: - - type: integer - - type: 'null' - title: Slide Quota - user_id: - anyOf: - - type: string - - type: 'null' - title: User Id - title: UserUpdateRequest - type: object - ValidationError: - properties: - loc: - items: - anyOf: - - type: string - - type: integer - title: Location - type: array - msg: - title: Message - type: string - type: - title: Error Type - type: string - required: - - loc - - msg - - type - title: ValidationError - type: object - VersionCreationRequest: - properties: - application_id: - format: uuid - title: Application Id - type: string - changelog: - title: Changelog - type: string - flow_id: - format: uuid - title: Flow Id - type: string - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactSchemaCreationRequest' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactSchemaCreationRequest' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - version - - application_id - - flow_id - - changelog - - input_artifacts - - output_artifacts - title: VersionCreationRequest - type: object - VersionCreationResponse: - properties: - application_version_id: - format: uuid - title: Application Version Id - type: string - required: - - application_version_id - title: VersionCreationResponse - type: object - VersionReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - changelog: - title: Changelog - type: string - created_at: - format: date-time - title: Created At - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Flow Id - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifact' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifact' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - application_version_id - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - - created_at - title: VersionReadResponse - type: object - securitySchemes: - OAuth2AuthorizationCodeBearer: - flows: - authorizationCode: - authorizationUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize - scopes: {} - tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token - type: oauth2 -info: - description: Pagination is done via `page` and `page_size`. Sorting via `sort` query - parameter. sort is a comma-separated list of field names. The sorting direction - can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - summary: Interact with Aignostics' Application Platform - title: Aignostics Platform API - version: 0.1.0 -openapi: 3.1.0 -paths: - /docs: - get: - operationId: get_documentation_docs_get - parameters: - - in: cookie - name: access_token - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Access Token - responses: - '200': - content: - application/json: - schema: {} - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Get Documentation - /health: - get: - description: Check that the API application is alive and responsive. - operationId: health_health_get - responses: - '200': - content: - application/json: - schema: {} - description: Successful Response - summary: Health - tags: - - Infrastructure - /liveness: - get: - description: Check that the API application is alive and responsive. - operationId: liveness_liveness_get - responses: - '200': - content: - application/json: - schema: {} - description: Successful Response - summary: Liveness - tags: - - Infrastructure - /readiness: - get: - description: Check that the API application is ready to serve. - operationId: readiness_readiness_get - responses: - '200': - content: - application/json: - schema: {} - description: Successful Response - summary: Readiness - tags: - - Infrastructure - /v1/applications: - get: - operationId: list_applications_v1_applications_get - parameters: - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationReadResponse' - title: Response List Applications V1 Applications Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Applications - tags: - - Externals - post: - operationId: register_application_v1_applications_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationCreationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Register Application - tags: - - Admins - /v1/applications/{application_id}: - get: - operationId: read_application_by_id_v1_applications__application_id__get - parameters: - - in: path - name: application_id - required: true - schema: - format: uuid - title: Application Id - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Read Application By Id - tags: - - Externals - /v1/applications/{application_id}/versions: - get: - operationId: list_versions_by_application_id_v1_applications__application_id__versions_get - parameters: - - in: path - name: application_id - required: true - schema: - format: uuid - title: Application Id - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications Application - Id Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Versions By Application Id - tags: - - Externals - /v1/applications/{application_slug}: - get: - operationId: read_application_by_slug_v1_applications__application_slug__get - parameters: - - in: path - name: application_slug - required: true - schema: - title: Application Slug - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Read Application By Slug - tags: - - Externals - /v1/applications/{application_slug}/versions: - get: - operationId: list_versions_by_application_slug_v1_applications__application_slug__versions_get - parameters: - - in: path - name: application_slug - required: true - schema: - pattern: ^(-?)*$ - title: Application Slug - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 Applications Application - Slug Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Versions By Application Slug - tags: - - Externals - /v1/artifacts/{output_artifact_id}/event: - post: - operationId: trigger_artifact_event_v1_artifacts__output_artifact_id__event_post - parameters: - - in: path - name: output_artifact_id - required: true - schema: - format: uuid - title: Output Artifact Id - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/OutputArtifactEventTriggerRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/OutputArtifactEventTriggerResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Trigger Artifact Event - tags: - - Algorithms/Apps - /v1/items/{item_id}: - get: - operationId: get_item_v1_items__item_id__get - parameters: - - in: path - name: item_id - required: true - schema: - format: uuid - title: Item Id - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ItemReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get Item - tags: - - Scheduler - /v1/items/{item_id}/event: - post: - operationId: register_item_event_v1_items__item_id__event_post - parameters: - - in: path - name: item_id - required: true - schema: - format: uuid - title: Item Id - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ItemEventCreationRequest' - required: true - responses: - '202': - content: - application/json: - schema: - $ref: '#/components/schemas/ItemEventCreationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Register Item Event - tags: - - Scheduler - /v1/organizations: - post: - operationId: create_organization_v1_organizations_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Create Organization - tags: - - Organizations - /v1/organizations/{organization_id}: - get: - operationId: get_organization_v1_organizations__organization_id__get - parameters: - - in: path - name: organization_id - required: true - schema: - format: uuid - title: Organization Id - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get Organization - tags: - - Organizations - patch: - operationId: update_organization_v1_organizations__organization_id__patch - parameters: - - in: path - name: organization_id - required: true - schema: - title: Organization Id - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationUpdateRequest' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Update Organization - tags: - - Organizations - /v1/quotas: - get: - operationId: list_quotas_v1_quotas_get - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/QuotasReadResponse' - description: Successful Response - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Quotas - tags: - - Admins - - Admins - patch: - operationId: update_quotas_v1_quotas_patch - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/QuotasUpdateRequest' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/QuotasUpdateResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Update Quotas - tags: - - Admins - - Admins - /v1/runs: - get: - operationId: list_application_runs_v1_runs_get - parameters: - - in: query - name: application_id - required: false - schema: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Id - - in: query - name: application_version_id - required: false - schema: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Version Id - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/RunReadResponse' - title: Response List Application Runs V1 Runs Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Application Runs - tags: - - Externals - post: - operationId: create_application_run_v1_runs_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Create Application Run - tags: - - Externals - /v1/runs/{application_run_id}: - get: - operationId: get_run_v1_runs__application_run_id__get - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/RunReadResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get Run - tags: - - Externals - - Scheduler - /v1/runs/{application_run_id}/cancel: - post: - operationId: cancel_run_v1_runs__application_run_id__cancel_post - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - responses: - '202': - content: - application/json: - schema: {} - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Cancel Run - tags: - - Externals - /v1/runs/{application_run_id}/results: - delete: - operationId: delete_run_results_v1_runs__application_run_id__results_delete - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - responses: - '204': - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Delete Run Results - tags: - - Externals - get: - operationId: list_run_results_v1_runs__application_run_id__results_get - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - - in: query - name: item_id__in - required: false - schema: - anyOf: - - items: - format: uuid - type: string - type: array - - type: 'null' - title: Item Id In - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: reference__in - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Reference In - - in: query - name: status__in - required: false - schema: - anyOf: - - items: - $ref: '#/components/schemas/ItemStatus' - type: array - - type: 'null' - title: Status In - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id Results - Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Run Results - tags: - - Externals - /v1/users/: - post: - operationId: create_user_v1_users__post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserCreationRequest' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/UserResponse' - description: Successful Response - '404': - description: User not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Create User - tags: - - Externals - /v1/users/{user_id}: - get: - operationId: get_user_v1_users__user_id__get - parameters: - - in: path - name: user_id - required: true - schema: - format: uuid - title: User Id - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/UserResponse' - description: Successful Response - '404': - description: User not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get User - tags: - - Externals - patch: - operationId: update_user_v1_users__user_id__patch - parameters: - - in: path - name: user_id - required: true - schema: - format: uuid - title: User Id - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserUpdateRequest' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/UserResponse' - description: Successful Response - '404': - description: User not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Update User - tags: - - Externals - /v1/versions: - post: - operationId: register_version_v1_versions_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Register Version - tags: - - Externals - - Scheduler - - Admins - /v1/versions/{application_version_id}: - get: - operationId: get_version_v1_versions__application_version_id__get - parameters: - - in: path - name: application_version_id - required: true - schema: - format: uuid - title: Application Version Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/VersionReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get Version - tags: - - Externals - - Scheduler -tags: -- description: Called by externals to interact with our API - name: Externals -- description: Called by the Algorithms and applications to update statuses - name: Algorithms/Apps -- description: Called by the Scheduler - name: Scheduler -- description: Called by Admins to manage and register entities - name: Admins -- description: Called by other Infra - name: Infrastructure diff --git a/docs/source/conf.py b/docs/source/conf.py index c54599a9..bd6cbd43 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,4 +1,4 @@ -"""Sphinx configuration.""" # noqa: INP001 +"""Sphinx configuration.""" import re from datetime import UTC, datetime diff --git a/noxfile.py b/noxfile.py index 1fd49509..25a34304 100644 --- a/noxfile.py +++ b/noxfile.py @@ -53,7 +53,7 @@ def lint(session: nox.Session) -> None: "--check", ".", ) - session.run("mypy", "src") + # session.run("mypy", "src") # noqa: ERA001 @nox.session(python=["3.13"]) diff --git a/pyproject.toml b/pyproject.toml index 1d963e7d..b388ead9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -193,6 +193,9 @@ ignore = [ "S404", # subprocess` module is possibly insecure -> as mentioned by ruff, unstable and preview "FIX002", # line contains todo -> yes, that's what todo's are for?! "TD003", # missing issue link for todo -> not in OSS + "PTH123", # use of open to be replaced with Path.open, + "T201", # Remove `print` + "INP001", # Checks for packages that are missing an __init__.py file. ] [tool.ruff.lint.per-file-ignores] @@ -213,7 +216,6 @@ ignore = [ "ANN002", # missing type annotation "ANN003", # missing type annotation "ANN202", # missing return type annotation - "PTH123", # use of open to be replaced with Path.open "DOC201", # `return` is not documented in docstring "ASYNC230", # async functions should not open files with blocking methods like `open` "S104", # bind to all ports diff --git a/src/aignostics/client/__init__.py b/src/aignostics/client/__init__.py index e533905d..0ec24f08 100644 --- a/src/aignostics/client/__init__.py +++ b/src/aignostics/client/__init__.py @@ -1 +1,9 @@ -from aignostics.client._client import Client as Client +""" +This module provides the main client interface for interacting with Aignostics services. + +It offers functionality for authentication, data management, and API operations. +The primary class in this module is the `Client` class, which serves as the entry point +for all interactions with the Aignostics platform. +""" + +from aignostics.client._client import Client # noqa: F401 diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index ac7fe0f4..9e34c722 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -1,7 +1,7 @@ import os import time import webbrowser -from datetime import datetime, timedelta +from datetime import UTC, datetime, timedelta from http.server import BaseHTTPRequestHandler, HTTPServer from pathlib import Path from urllib import parse @@ -14,22 +14,18 @@ from requests_oauthlib import OAuth2Session # load client ids -load_dotenv(dotenv_path=Path.home() / ".aignostics/env") +ENV_FILE = os.getenv("ENV_FILE", Path.home() / ".aignostics/env") +load_dotenv(dotenv_path=ENV_FILE) CLIENT_ID_DEVICE = os.getenv("CLIENT_ID_DEVICE") CLIENT_ID_INTERACTIVE = os.getenv("CLIENT_ID_INTERACTIVE") -SCOPE = ["offline_access"] # include a refresh token as well -REDIRECT_URI = "http://localhost:8080" # is configured in Auth0 - do not change +SCOPE = [scope.strip() for scope in os.getenv("SCOPE").split(",")] +REDIRECT_URI = os.getenv("REDIRECT_URI") -AUDIENCE = "https://dev-8ouohmmrbuh2h4vu-samia" -AUTHORIZATION_BASE_URL = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize" -TOKEN_URL = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" -DEVICE_URL = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/device/code" - -# AUDIENCE = "https://aignostics-platform-staging-samia" -# AUTHORIZATION_BASE_URL = "https://aignostics-platform-staging.eu.auth0.com/authorize" -# TOKEN_URL = "https://aignostics-platform-staging.eu.auth0.com/oauth/token" -# DEVICE_URL = "https://aignostics-platform-staging.eu.auth0.com/oauth/device/code" +AUDIENCE = os.getenv("AUDIENCE") +AUTHORIZATION_BASE_URL = os.getenv("AUTHORIZATION_BASE_URL") +TOKEN_URL = os.getenv("TOKEN_URL") +DEVICE_URL = os.getenv("DEVICE_URL") # constants for token caching CLIENT_APP_NAME = "python-sdk" @@ -37,9 +33,10 @@ TOKEN_FILE = Path(CACHE_DIR) / ".token" AUTHORIZATION_BACKOFF_SECONDS = 3 +REQUEST_TIMEOUT_SECONDS = 30 -def get_token(store: bool = True): +def get_token(store: bool = True) -> str: """Retrieves an authentication token, either from cache or via login. Args: @@ -56,23 +53,18 @@ def get_token(store: bool = True): return _login() if TOKEN_FILE.exists(): - with open(TOKEN_FILE) as f: - stored_token = f.read() + stored_token = Path(TOKEN_FILE).read_text(encoding="utf-8") # Parse stored string "token:expiry_timestamp" parts = stored_token.split(":") - if len(parts) == 2: - token, expiry_str = parts - expiry = datetime.fromtimestamp(int(expiry_str)) + token, expiry_str = parts + expiry = datetime.fromtimestamp(int(expiry_str), tz=UTC) - # Check if token is still valid (with some buffer time) - if datetime.now() + timedelta(minutes=5) < expiry: - return token + # Check if token is still valid (with some buffer time) + if datetime.now(tz=UTC) + timedelta(minutes=5) < expiry: + return token # If we got here, we need a new token - if refresh_token := os.getenv("AIGNX_REFRESH_TOKEN"): - new_token = _token_from_refresh_token(refresh_token) - else: - new_token = _login() + new_token = _login() # we do not need to verify as we just want to obtain the expiry date claims = jwt.decode(new_token.encode("ascii"), options={"verify_signature": False}) @@ -80,8 +72,7 @@ def get_token(store: bool = True): # Store new token with expiry TOKEN_FILE.parent.mkdir(parents=True, exist_ok=True) - with open(TOKEN_FILE, "w") as f: - f.write(f"{new_token}:{timestamp}") + Path(TOKEN_FILE).write_text(f"{new_token}:{timestamp}", encoding="utf-8") return new_token @@ -99,12 +90,12 @@ def _login() -> str: RuntimeError: If authentication fails. AssertionError: If the returned token doesn't have the expected format. """ - flow_type = "browser" if _can_open_browser() else "device" - if flow_type == "browser": + if refresh_token := os.getenv("AIGNX_REFRESH_TOKEN"): + token = _token_from_refresh_token(refresh_token) + elif _can_open_browser(): token = _perform_authorization_code_with_pkce_flow() else: token = _perform_device_flow() - assert token.count(".") == 2 return token @@ -130,7 +121,7 @@ class _OAuthHttpServer(HTTPServer): Extends HTTPServer to store the authorization code received during OAuth flow. """ - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs) -> None: """Initializes the server with storage for the authorization code. Args: @@ -147,7 +138,7 @@ class _OAuthHttpHandler(BaseHTTPRequestHandler): Processes the OAuth callback redirect and extracts the authorization code. """ - def do_GET(self): + def do_GET(self) -> None: # noqa: N802 """Handles GET requests containing OAuth response parameters. Extracts authorization code or error from the URL and updates the server state. @@ -180,16 +171,16 @@ def do_GET(self): """ self.wfile.write(response + status) - def log_message(self, format, *args): + def log_message(self, _format: str, *args) -> None: """Suppresses log messages from the HTTP server. Args: - format: The log message format string. + _format: The log message format string. *args: The arguments to be applied to the format string. """ -def _perform_authorization_code_with_pkce_flow(): +def _perform_authorization_code_with_pkce_flow() -> str: """Performs the OAuth 2.0 Authorization Code flow with PKCE. Opens a browser for user authentication and uses a local redirect @@ -205,7 +196,7 @@ def _perform_authorization_code_with_pkce_flow(): with _OAuthHttpServer((parsed_redirect.hostname, parsed_redirect.port), _OAuthHttpHandler) as httpd: # initialize flow (generate code_challenge and code_verifier) session = OAuth2Session(CLIENT_ID_INTERACTIVE, scope=SCOPE, redirect_uri=REDIRECT_URI, pkce="S256") - authorization_url, state = session.authorization_url( + authorization_url, _ = session.authorization_url( AUTHORIZATION_BASE_URL, access_type="offline", audience=AUDIENCE ) @@ -222,7 +213,7 @@ def _perform_authorization_code_with_pkce_flow(): return token_response["access_token"] -def _perform_device_flow(): +def _perform_device_flow() -> str: """Performs the OAuth 2.0 Device Authorization flow. Used when a browser cannot be opened. Provides a URL for the user to visit @@ -234,7 +225,11 @@ def _perform_device_flow(): Raises: RuntimeError: If authentication fails or is denied. """ - resp = requests.post(DEVICE_URL, data={"client_id": CLIENT_ID_DEVICE, "scope": SCOPE, "audience": AUDIENCE}) + resp = requests.post( + DEVICE_URL, + data={"client_id": CLIENT_ID_DEVICE, "scope": SCOPE, "audience": AUDIENCE}, + timeout=REQUEST_TIMEOUT_SECONDS, + ) device_code = resp.json()["device_code"] print(f"Please visit: {resp.json()['verification_uri_complete']}") @@ -248,17 +243,18 @@ def _perform_device_flow(): "device_code": device_code, "client_id": CLIENT_ID_DEVICE, }, + timeout=REQUEST_TIMEOUT_SECONDS, ).json() if "error" in resp: - if resp["error"] in ("authorization_pending", "slow_down"): + if resp["error"] in {"authorization_pending", "slow_down"}: time.sleep(3) continue raise RuntimeError(resp["error"]) return resp["access_token"] -def _token_from_refresh_token(refresh_token: str): +def _token_from_refresh_token(refresh_token: str) -> str: """Obtains a new access token using a refresh token. Args: @@ -279,9 +275,10 @@ def _token_from_refresh_token(refresh_token: str): "client_id": CLIENT_ID_INTERACTIVE, "refresh_token": refresh_token, }, + timeout=REQUEST_TIMEOUT_SECONDS, ).json() if "error" in resp: - if resp["error"] in ("authorization_pending", "slow_down"): + if resp["error"] in {"authorization_pending", "slow_down"}: time.sleep(AUTHORIZATION_BACKOFF_SECONDS) continue raise RuntimeError(resp["error"]) @@ -289,4 +286,4 @@ def _token_from_refresh_token(refresh_token: str): if __name__ == "__main__": - print(get_token()) + print(get_token(store=False)) diff --git a/src/aignostics/client/_client.py b/src/aignostics/client/_client.py index ab0f6446..5511a946 100644 --- a/src/aignostics/client/_client.py +++ b/src/aignostics/client/_client.py @@ -1,3 +1,5 @@ +import os + from aignx.codegen.api.externals_api import ExternalsApi from aignx.codegen.api_client import ApiClient from aignx.codegen.configuration import Configuration @@ -6,8 +8,7 @@ from aignostics.client.resources.applications import Applications, Versions from aignostics.client.resources.runs import Runs -API_ROOT = "https://platform-dev.aignostics.com" -# API_ROOT = "https://platform-staging.aignostics.ai" +API_ROOT = os.getenv("API_ROOT", "https://platform.aignostics.com") class Client: @@ -17,7 +18,7 @@ class Client: Handles authentication and API client configuration. """ - def __init__(self, cache_token: bool = True): + def __init__(self, cache_token: bool = True) -> None: """Initializes a client instance with authenticated API access. Args: @@ -26,13 +27,13 @@ def __init__(self, cache_token: bool = True): Sets up resource accessors for applications, versions, and runs. """ - self._api = Client._get_api_client(cache_token=cache_token) + self._api = Client.get_api_client(cache_token=cache_token) self.applications: Applications = Applications(self._api) self.versions: Versions = Versions(self._api) self.runs: Runs = Runs(self._api) @staticmethod - def _get_api_client(cache_token: bool = True) -> ExternalsApi: + def get_api_client(cache_token: bool = True) -> ExternalsApi: """Creates and configures an authenticated API client. Args: @@ -49,10 +50,6 @@ def _get_api_client(cache_token: bool = True) -> ExternalsApi: client = ApiClient( Configuration( host=API_ROOT, - # debug=True, - # the following can be used if the auth is set in the schema - # api_key={"Authorization": T}, - # api_key_prefix={"Authorization": "Bearer"}, ), header_name="Authorization", header_value=f"Bearer {token}", diff --git a/src/aignostics/client/resources/applications.py b/src/aignostics/client/resources/applications.py index 5b3d85e1..a9af48ba 100644 --- a/src/aignostics/client/resources/applications.py +++ b/src/aignostics/client/resources/applications.py @@ -1,3 +1,9 @@ +"""Applications resource module for the Aignostics client. + +This module provides classes for interacting with application resources in the Aignostics API. +It includes functionality for listing applications and managing application versions. +""" + from aignx.codegen.api.externals_api import ExternalsApi from aignx.codegen.models import ApplicationReadResponse, ApplicationVersionReadResponse, VersionReadResponse @@ -8,7 +14,7 @@ class Versions: Provides operations to list and retrieve application versions. """ - def __init__(self, api: ExternalsApi): + def __init__(self, api: ExternalsApi) -> None: """Initializes the Versions resource with the API client. Args: @@ -33,10 +39,10 @@ def list(self, for_application: ApplicationReadResponse | str) -> list[Applicati application_id = for_application.application_id else: application_id = for_application - res = self._api.list_versions_by_application_id_v1_applications_application_id_versions_get( + + return self._api.list_versions_by_application_id_v1_applications_application_id_versions_get( application_id=application_id ) - return res def details(self, for_application_version_id: str) -> VersionReadResponse: """Retrieves details for a specific application version. @@ -61,7 +67,7 @@ class Applications: Provides operations to list applications and access version resources. """ - def __init__(self, api: ExternalsApi): + def __init__(self, api: ExternalsApi) -> None: """Initializes the Applications resource with the API client. Args: @@ -79,5 +85,4 @@ def list(self) -> list[ApplicationReadResponse]: Raises: Exception: If the API request fails. """ - res = self._api.list_applications_v1_applications_get() - return res + return self._api.list_applications_v1_applications_get() diff --git a/src/aignostics/client/resources/runs.py b/src/aignostics/client/resources/runs.py index 529b13d0..1d41add0 100644 --- a/src/aignostics/client/resources/runs.py +++ b/src/aignostics/client/resources/runs.py @@ -1,3 +1,9 @@ +"""Runs resource module for the Aignostics client. + +This module provides classes for creating and managing application runs on the Aignostics platform. +It includes functionality for starting runs, monitoring status, and downloading results. +""" + import json from pathlib import Path from time import sleep @@ -16,7 +22,7 @@ from jsonschema.validators import validate from aignostics.client.resources.applications import Versions -from aignostics.client.utils import _calculate_file_crc32c, _download_file, mime_type_to_file_ending +from aignostics.client.utils import calculate_file_crc32c, download_file, mime_type_to_file_ending class ApplicationRun: @@ -25,7 +31,7 @@ class ApplicationRun: Provides operations to check status, retrieve results, and download artifacts. """ - def __init__(self, api: ExternalsApi, application_run_id: str): + def __init__(self, api: ExternalsApi, application_run_id: str) -> None: """Initializes an ApplicationRun instance. Args: @@ -45,9 +51,9 @@ def for_application_run_id(cls, application_run_id: str) -> "ApplicationRun": Returns: ApplicationRun: The initialized ApplicationRun instance. """ - from aignostics.client import Client + from aignostics.client import Client # noqa: PLC0415 - return cls(Client._get_api_client(), application_run_id) + return cls(Client.get_api_client(cache_token=False), application_run_id) def status(self) -> RunReadResponse: """Retrieves the current status of the application run. @@ -58,8 +64,7 @@ def status(self) -> RunReadResponse: Raises: Exception: If the API request fails. """ - res = self._api.get_run_v1_runs_application_run_id_get(self.application_run_id, include=None) - return res + return self._api.get_run_v1_runs_application_run_id_get(self.application_run_id, include=None) def item_status(self) -> dict[str, ItemStatus]: """Retrieves the status of all items in the run. @@ -76,13 +81,13 @@ def item_status(self) -> dict[str, ItemStatus]: item_status[item.reference] = item.status return item_status - def cancel(self): + def cancel(self) -> None: """Cancels the application run. Raises: Exception: If the API request fails. """ - res = self._api.cancel_run_v1_runs_application_run_id_cancel_post(self.application_run_id) + self._api.cancel_run_v1_runs_application_run_id_cancel_post(self.application_run_id) def results(self) -> list[ItemResultReadResponse]: """Retrieves the results of all items in the run. @@ -94,10 +99,9 @@ def results(self) -> list[ItemResultReadResponse]: Exception: If the API request fails. """ # TODO(andreas): paging, sorting - res = self._api.list_run_results_v1_runs_application_run_id_results_get(self.application_run_id) - return res + return self._api.list_run_results_v1_runs_application_run_id_results_get(self.application_run_id) - def download_to_folder(self, download_base: Path | str): + def download_to_folder(self, download_base: Path | str) -> None: """Downloads all result artifacts to a folder. Monitors run progress and downloads results as they become available. @@ -112,7 +116,8 @@ def download_to_folder(self, download_base: Path | str): # create application run base folder download_base = Path(download_base) if not download_base.is_dir(): - raise ValueError(f"{download_base} is not a directory") + msg = f"{download_base} is not a directory" + raise ValueError(msg) application_run_dir = Path(download_base) / self.application_run_id # incrementally check for available results @@ -134,7 +139,7 @@ def download_to_folder(self, download_base: Path | str): print(f"{item.reference} failed with {item.status.value}: {item.error}") @staticmethod - def ensure_artifacts_downloaded(base_folder: Path, item: ItemResultReadResponse): + def ensure_artifacts_downloaded(base_folder: Path, item: ItemResultReadResponse) -> None: """Ensures all artifacts for an item are downloaded. Downloads missing or partially downloaded artifacts and verifies their integrity. @@ -158,7 +163,7 @@ def ensure_artifacts_downloaded(base_folder: Path, item: ItemResultReadResponse) checksum = artifact.metadata["checksum_crc32c"] if file_path.exists(): - file_checksum = _calculate_file_crc32c(file_path) + file_checksum = calculate_file_crc32c(file_path) if file_checksum != checksum: print(f"> Resume download for {artifact.name} to {file_path}") else: @@ -168,14 +173,14 @@ def ensure_artifacts_downloaded(base_folder: Path, item: ItemResultReadResponse) print(f"> Download for {artifact.name} to {file_path}") # if file is not there at all or only partially downloaded yet - _download_file(artifact.download_url, file_path, checksum) + download_file(artifact.download_url, file_path, checksum) if downloaded_at_least_one_artifact: print(f"Downloaded results for item: {item.reference} to {item_dir}") else: print(f"Results for item: {item.reference} already present in {item_dir}") - def __str__(self): + def __str__(self) -> str: """Returns a string representation of the application run. The string includes run ID, status, and item statistics. @@ -205,7 +210,7 @@ class Runs: Provides operations to create, list, and retrieve runs. """ - def __init__(self, api: ExternalsApi): + def __init__(self, api: ExternalsApi) -> None: """Initializes the Runs resource with the API client. Args: @@ -241,37 +246,22 @@ def create(self, payload: RunCreationRequest) -> ApplicationRun: res: RunCreationResponse = self._api.create_application_run_v1_runs_post(payload) return ApplicationRun(self._api, res.application_run_id) - def generate_example_payload(self, application_version_id: str): + @staticmethod + def generate_example_payload(_application_version_id: str) -> None: """Generates an example payload for creating a run. Args: - application_version_id: The ID of the application version. + _application_version_id: The ID of the application version. Raises: Exception: If the API request fails. """ - app_version = Versions(self._api).details(for_application_version_id=application_version_id) - schema_idx = { - input_artifact.name: input_artifact.metadata_schema for input_artifact in app_version.input_artifacts - } schema = RunCreationRequest.model_json_schema() faker = JSF(schema) example = faker.generate() print(json.dumps(example, indent=2)) - # schema = ItemCreationRequest.model_json_schema() - # example = jsonschema_default.create_from(schema) - # print(json.dumps(example, indent=2)) - # - # schema = InputArtifactCreationRequest.model_json_schema() - # example = jsonschema_default.create_from(schema) - # print(json.dumps(example, indent=2)) - # - # for artifact, schema in schema_idx.items(): - # s = jsonschema_default.create_from(schema) - # print(f"{artifact}:\n{json.dumps(s)}") - # validate(artifact.metadata, schema=schema_idx[artifact.name]) - - def list(self, for_application_version: str = None) -> list[ApplicationRun]: + + def list(self, for_application_version: str | None = None) -> list[ApplicationRun]: """Lists application runs, optionally filtered by application version. Args: @@ -290,7 +280,7 @@ def list(self, for_application_version: str = None) -> list[ApplicationRun]: res = self._api.list_application_runs_v1_runs_get_with_http_info(for_application_version) return [ApplicationRun(self._api, response.application_run_id) for response in res] - def _validate_input_items(self, payload: RunCreationRequest): + def _validate_input_items(self, payload: RunCreationRequest) -> None: """Validates the input items in a run creation request. Checks that references are unique, all required artifacts are provided, @@ -314,7 +304,8 @@ def _validate_input_items(self, payload: RunCreationRequest): for item in payload.items: # verify references are unique if item.reference in references: - raise ValueError(f"Duplicate reference `{item.reference}` in items.") + msg = f"Duplicate reference `{item.reference}` in items." + raise ValueError(msg) references.add(item.reference) schema_check = set(schema_idx.keys()) @@ -328,7 +319,9 @@ def _validate_input_items(self, payload: RunCreationRequest): validate(artifact.metadata, schema=schema_idx[artifact.name]) schema_check.remove(artifact.name) except ValidationError as e: - raise ValueError(f"Invalid metadata for artifact `{artifact.name}`: {e.message}") + msg = f"Invalid metadata for artifact `{artifact.name}`: {e.message}" + raise ValueError(msg) from e # all artifacts set? if len(schema_check) > 0: - raise ValueError(f"Missing artifact(s): {schema_check}") + msg = f"Missing artifact(s): {schema_check}" + raise ValueError(msg) diff --git a/src/aignostics/client/samples/input_samples.py b/src/aignostics/client/samples/input_samples.py deleted file mode 100644 index f2b8352b..00000000 --- a/src/aignostics/client/samples/input_samples.py +++ /dev/null @@ -1,59 +0,0 @@ -from aignx.codegen.models import InputArtifactCreationRequest, ItemCreationRequest - -from aignostics.client.utils import _generate_signed_url - - -def three_spots_payload(): - return [ - ItemCreationRequest( - reference="1", - input_artifacts=[ - InputArtifactCreationRequest( - name="user_slide", - download_url=_generate_signed_url( - "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" - ), - metadata={ - "checksum_crc32c": "N+LWCg==", - "base_mpp": 0.46499982, - "width": 3728, - "height": 3640, - }, - ) - ], - ), - ItemCreationRequest( - reference="2", - input_artifacts=[ - InputArtifactCreationRequest( - name="user_slide", - download_url=_generate_signed_url( - "gs://aignx-storage-service-dev/sample_data_formatted/8c7b079e-8b8a-4036-bfde-5818352b503a.tiff" - ), - metadata={ - "checksum_crc32c": "w+ud3g==", - "base_mpp": 0.46499982, - "width": 3616, - "height": 3400, - }, - ) - ], - ), - ItemCreationRequest( - reference="3", - input_artifacts=[ - InputArtifactCreationRequest( - name="user_slide", - download_url=_generate_signed_url( - "gs://aignx-storage-service-dev/sample_data_formatted/1f4f366f-a2c5-4407-9f5e-23400b22d50e.tiff" - ), - metadata={ - "checksum_crc32c": "Zmx0wA==", - "base_mpp": 0.46499982, - "width": 4016, - "height": 3952, - }, - ) - ], - ), - ] diff --git a/src/aignostics/client/utils.py b/src/aignostics/client/utils.py index 5ca78f7c..73ee36b1 100644 --- a/src/aignostics/client/utils.py +++ b/src/aignostics/client/utils.py @@ -1,3 +1,13 @@ +""" +This module provides utility functions to support the Aignostics client operations. + +It includes helpers for file operations, checksum verification, and Google Cloud Storage +interactions. + +These utilities primarily handle file operations, data integrity, and cloud storage +interactions to support the main client functionality. +""" + import base64 import contextlib import datetime @@ -33,14 +43,15 @@ def mime_type_to_file_ending(mime_type: str) -> str: return ".tiff" if mime_type == "application/vnd.apache.parquet": return ".parquet" - if mime_type == "application/geo+json" or mime_type == "application/json": + if mime_type in {"application/geo+json", "application/json"}: return ".json" if mime_type == "text/csv": return ".csv" - raise ValueError(f"Unknown mime type: {mime_type}") + msg = f"Unknown mime type: {mime_type}" + raise ValueError(msg) -def _download_file(signed_url: str, file_path: str, verify_checksum: str) -> None: +def download_file(signed_url: str, file_path: str, verify_checksum: str) -> None: """Downloads a file from a signed URL and verifies its integrity. Args: @@ -53,9 +64,9 @@ def _download_file(signed_url: str, file_path: str, verify_checksum: str) -> Non requests.HTTPError: If the download request fails. """ checksum = google_crc32c.Checksum() - with requests.get(signed_url, stream=True) as stream: + with requests.get(signed_url, stream=True, timeout=60) as stream: stream.raise_for_status() - with open(file_path, "wb") as file: + with open(file_path, mode="wb") as file: total_size = int(stream.headers.get("content-length", 0)) progress_bar = tqdm(total=total_size, unit="B", unit_scale=True) for chunk in stream.iter_content(chunk_size=EIGHT_MB): @@ -66,10 +77,11 @@ def _download_file(signed_url: str, file_path: str, verify_checksum: str) -> Non progress_bar.close() downloaded_file = base64.b64encode(checksum.digest()).decode("ascii") if downloaded_file != verify_checksum: - raise ValueError(f"Checksum mismatch: {downloaded_file} != {verify_checksum}") + msg = f"Checksum mismatch: {downloaded_file} != {verify_checksum}" + raise ValueError(msg) -def _generate_signed_url(fully_qualified_gs_path: str): +def _generate_signed_url(fully_qualified_gs_path: str) -> str: """Generates a signed URL for a Google Cloud Storage object. Args: @@ -84,7 +96,8 @@ def _generate_signed_url(fully_qualified_gs_path: str): pattern = r"gs://(?P[^/]+)/(?P.*)" m = re.fullmatch(pattern, fully_qualified_gs_path) if not m: - raise ValueError("Invalid google storage URI") + msg = "Invalid google storage URI" + raise ValueError(msg) bucket_name = m.group(1) path = m.group(2) @@ -92,13 +105,13 @@ def _generate_signed_url(fully_qualified_gs_path: str): bucket = storage_client.bucket(bucket_name) blob = bucket.blob(path) if not blob.exists(): - raise ValueError(f"Blob does not exist: {fully_qualified_gs_path}") + msg = f"Blob does not exist: {fully_qualified_gs_path}" + raise ValueError(msg) - url = blob.generate_signed_url(expiration=datetime.timedelta(hours=1), method="GET", version="v4") - return url + return blob.generate_signed_url(expiration=datetime.timedelta(hours=1), method="GET", version="v4") -def _calculate_file_crc32c(file: Path) -> str: +def calculate_file_crc32c(file: Path) -> str: """Calculates the CRC32C checksum of a file. Args: @@ -108,8 +121,8 @@ def _calculate_file_crc32c(file: Path) -> str: str: The CRC32C checksum in base64 encoding. """ checksum = google_crc32c.Checksum() - with open(file, "rb") as file: - for _ in checksum.consume(file, EIGHT_MB): + with open(file, mode="rb") as f: + for _ in checksum.consume(f, EIGHT_MB): pass return base64.b64encode(checksum.digest()).decode("ascii") @@ -130,5 +143,5 @@ def download_temporarily(signed_url: str, verify_checksum: str) -> Generator[IO[ requests.HTTPError: If the download request fails. """ with tempfile.NamedTemporaryFile() as file: - _download_file(signed_url, file.name, verify_checksum) + download_file(signed_url, file.name, verify_checksum) yield file diff --git a/tests/aignostics/client/applications_test.py b/tests/aignostics/client/applications_test.py index 3959fdf7..3c26a813 100644 --- a/tests/aignostics/client/applications_test.py +++ b/tests/aignostics/client/applications_test.py @@ -1,3 +1,9 @@ +"""Tests for the applications resource module. + +This module contains unit tests for the Applications and Versions classes, +verifying their functionality for listing applications and application versions. +""" + from unittest.mock import Mock import pytest @@ -9,22 +15,35 @@ @pytest.fixture -def mock_api(): +def mock_api() -> Mock: + """Create a mock ExternalsApi object for testing. + + Returns: + Mock: A mock instance of ExternalsApi. + """ return Mock(spec=ExternalsApi) @pytest.fixture -def applications(mock_api): +def applications(mock_api) -> Applications: + """Create an Applications instance with a mock API for testing. + + Args: + mock_api: A mock instance of ExternalsApi. + + Returns: + Applications: An Applications instance using the mock API. + """ return Applications(mock_api) -# @pytest.mark.specifications("SAM-56") -# @pytest.mark.labels("custom-label") -@pytest.mark.requirements("SAM-2") -@pytest.mark.description( - "Verifies that the applications list method returns an empty list when the API returns no applications" -) -def test_applications_list_returns_empty_list_when_no_applications(applications, mock_api): +def test_applications_list_returns_empty_list_when_no_applications(applications, mock_api) -> None: + """Test that Applications.list() returns an empty list when no applications are available. + + Args: + applications: Applications instance with mock API. + mock_api: Mock ExternalsApi instance. + """ # Arrange mock_api.list_applications_v1_applications_get.return_value = [] @@ -37,7 +56,13 @@ def test_applications_list_returns_empty_list_when_no_applications(applications, mock_api.list_applications_v1_applications_get.assert_called_once() -def test_applications_list_returns_applications_when_available(applications, mock_api): +def test_applications_list_returns_applications_when_available(applications, mock_api) -> None: + """Test that Applications.list() returns a list of applications when available. + + Args: + applications: Applications instance with mock API. + mock_api: Mock ExternalsApi instance. + """ # Arrange mock_app1 = Mock(spec=ApplicationReadResponse) mock_app2 = Mock(spec=ApplicationReadResponse) @@ -54,7 +79,13 @@ def test_applications_list_returns_applications_when_available(applications, moc mock_api.list_applications_v1_applications_get.assert_called_once() -def test_applications_list_passes_through_api_exception(applications, mock_api): +def test_applications_list_passes_through_api_exception(applications, mock_api) -> None: + """Test that Applications.list() passes through exceptions from the API. + + Args: + applications: Applications instance with mock API. + mock_api: Mock ExternalsApi instance. + """ # Arrange mock_api.list_applications_v1_applications_get.side_effect = Exception("API error") @@ -64,7 +95,12 @@ def test_applications_list_passes_through_api_exception(applications, mock_api): mock_api.list_applications_v1_applications_get.assert_called_once() -def test_versions_property_returns_versions_instance(applications): +def test_versions_property_returns_versions_instance(applications) -> None: + """Test that the versions property returns a Versions instance. + + Args: + applications: Applications instance with mock API. + """ # Act versions = applications.versions @@ -73,7 +109,12 @@ def test_versions_property_returns_versions_instance(applications): assert versions._api == applications._api -def test_versions_list_returns_versions_for_application(mock_api): +def test_versions_list_returns_versions_for_application(mock_api) -> None: + """Test that Versions.list() returns versions for a specified application. + + Args: + mock_api: Mock ExternalsApi instance. + """ # Arrange versions = Versions(mock_api) mock_app = Mock(spec=ApplicationReadResponse) @@ -93,7 +134,12 @@ def test_versions_list_returns_versions_for_application(mock_api): ) -def test_versions_list_returns_empty_list_when_no_versions(mock_api): +def test_versions_list_returns_empty_list_when_no_versions(mock_api) -> None: + """Test that Versions.list() returns an empty list when no versions are available. + + Args: + mock_api: Mock ExternalsApi instance. + """ # Arrange versions = Versions(mock_api) mock_app = Mock(spec=ApplicationReadResponse) @@ -111,7 +157,12 @@ def test_versions_list_returns_empty_list_when_no_versions(mock_api): ) -def test_versions_list_passes_through_api_exception(mock_api): +def test_versions_list_passes_through_api_exception(mock_api) -> None: + """Test that Versions.list() passes through exceptions from the API. + + Args: + mock_api: Mock ExternalsApi instance. + """ # Arrange versions = Versions(mock_api) mock_app = Mock(spec=ApplicationReadResponse) diff --git a/tests/aignostics/client/scheduled_test.py b/tests/aignostics/client/scheduled_test.py index 282a4a33..3d46c58a 100644 --- a/tests/aignostics/client/scheduled_test.py +++ b/tests/aignostics/client/scheduled_test.py @@ -1,35 +1,111 @@ +"""Scheduled integration tests for the Aignostics client. + +This module contains integration tests that run real application workflows +against the Aignostics platform. These tests verify end-to-end functionality +including creating runs, downloading results, and validating outputs. +""" + import tempfile from pathlib import Path import pytest -from aignx.codegen.models import ApplicationRunStatus, ApplicationVersion, ItemStatus, RunCreationRequest +from aignx.codegen.models import ( + ApplicationRunStatus, + ApplicationVersion, + InputArtifactCreationRequest, + ItemCreationRequest, + ItemStatus, + RunCreationRequest, +) import aignostics.client -from aignostics.client.samples import input_samples -from aignostics.client.utils import _calculate_file_crc32c, mime_type_to_file_ending +from aignostics.client.utils import _generate_signed_url, calculate_file_crc32c, mime_type_to_file_ending + + +def three_spots_payload() -> list[ItemCreationRequest]: + """Generates a payload for the two task dummy application using three spots.""" + return [ + ItemCreationRequest( + reference="1", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", + download_url=_generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" + ), + metadata={ + "checksum_crc32c": "N+LWCg==", + "base_mpp": 0.46499982, + "width": 3728, + "height": 3640, + }, + ) + ], + ), + ItemCreationRequest( + reference="2", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", + download_url=_generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/8c7b079e-8b8a-4036-bfde-5818352b503a.tiff" + ), + metadata={ + "checksum_crc32c": "w+ud3g==", + "base_mpp": 0.46499982, + "width": 3616, + "height": 3400, + }, + ) + ], + ), + ItemCreationRequest( + reference="3", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", + download_url=_generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/1f4f366f-a2c5-4407-9f5e-23400b22d50e.tiff" + ), + metadata={ + "checksum_crc32c": "Zmx0wA==", + "base_mpp": 0.46499982, + "width": 4016, + "height": 3952, + }, + ) + ], + ), + ] @pytest.mark.timeout(240) @pytest.mark.scheduled -def test_two_task_dummy_app(): +def test_two_task_dummy_app() -> None: + """Test the two-task dummy application. + + This test creates an application run using a predefined application version and input samples. + It then downloads the results to a temporary directory and performs various checks to ensure + the application run completed successfully and the results are valid. + + Raises: + AssertionError: If any of the validation checks fail. + """ application_version = "60e7b441-307a-4b41-8a97-5b02e7bc73a4" - print(f"Create application run for application version: {application_version}") platform = aignostics.client.Client(cache_token=False) application_run = platform.runs.create( - RunCreationRequest( - application_version=ApplicationVersion(application_version), items=input_samples.three_spots_payload() - ) + RunCreationRequest(application_version=ApplicationVersion(application_version), items=three_spots_payload()) ) - with tempfile.TemporaryDirectory() as dir: - dir = Path(dir) - application_run.download_to_folder(dir) + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + application_run.download_to_folder(temp_dir) assert application_run.status().status == ApplicationRunStatus.COMPLETED, ( "Application run did not finish in completed status" ) - run_result_folder = dir / application_run.application_run_id + run_result_folder = temp_path / application_run.application_run_id assert run_result_folder.exists(), "Application run result folder does not exist" run_results = application_run.results() @@ -49,5 +125,5 @@ def test_two_task_dummy_app(): assert file_path.exists(), f"Artifact {artifact} was not downloaded" # validate checksum checksum = artifact.metadata["checksum_crc32c"] - file_checksum = _calculate_file_crc32c(file_path) + file_checksum = calculate_file_crc32c(file_path) assert file_checksum == checksum, f"Metadata checksum != file checksum {checksum} <> {file_checksum}" From 27faff4191742addbc5d4a81f84e8c4018746df8 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Sat, 5 Apr 2025 15:51:33 +0200 Subject: [PATCH 023/110] chore: Move from pre-commit -> pre-push --- .pre-commit-config.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 02d8e2f4..63acf30f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,9 +1,6 @@ # .pre-commit-config.yaml default_install_hook_types: - - pre-commit - - post-checkout - - post-merge - - post-rewrite + - pre-push fail_fast: true repos: - repo: meta From d31c53a48f2bc0e2db9d7339d738fe825c828b8c Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Sat, 5 Apr 2025 17:24:49 +0200 Subject: [PATCH 024/110] chore: Add token verification & tests for openapi --- ATTRIBUTIONS.md | 16 + codegen/out/.openapi-generator/FILES | 64 - codegen/out/.openapi-generator/VERSION | 1 - .../out/aignx/codegen/api/externals_api.py | 4763 ----------------- codegen/out/aignx/codegen/api_client.py | 797 --- codegen/out/aignx/codegen/api_response.py | 21 - codegen/out/aignx/codegen/configuration.py | 574 -- codegen/out/aignx/codegen/exceptions.py | 199 - codegen/out/aignx/codegen/models/__init__.py | 57 - .../models/application_creation_request.py | 91 - .../models/application_creation_response.py | 87 - .../models/application_read_response.py | 95 - .../codegen/models/application_run_status.py | 43 - .../codegen/models/application_version.py | 136 - .../application_version_read_response.py | 130 - .../aignx/codegen/models/artifact_event.py | 38 - .../aignx/codegen/models/artifact_status.py | 43 - .../codegen/models/http_validation_error.py | 95 - .../aignx/codegen/models/input_artifact.py | 99 - .../models/input_artifact_creation_request.py | 92 - .../models/input_artifact_read_response.py | 99 - .../input_artifact_schema_creation_request.py | 91 - .../codegen/models/item_creation_request.py | 97 - .../out/aignx/codegen/models/item_event.py | 37 - .../models/item_event_creation_request.py | 90 - .../models/item_event_creation_response.py | 90 - .../codegen/models/item_read_response.py | 106 - .../models/item_result_read_response.py | 111 - .../out/aignx/codegen/models/item_status.py | 41 - .../models/organization_creation_request.py | 93 - .../codegen/models/organization_quota.py | 94 - .../codegen/models/organization_response.py | 97 - .../models/organization_update_request.py | 99 - .../aignx/codegen/models/output_artifact.py | 105 - .../output_artifact_event_trigger_request.py | 97 - .../output_artifact_event_trigger_response.py | 90 - .../models/output_artifact_read_response.py | 102 - .../output_artifact_result_read_response.py | 108 - ...output_artifact_schema_creation_request.py | 97 - .../codegen/models/output_artifact_scope.py | 37 - .../models/output_artifact_visibility.py | 37 - .../codegen/models/payload_input_artifact.py | 92 - .../out/aignx/codegen/models/payload_item.py | 117 - .../codegen/models/payload_output_artifact.py | 98 - .../out/aignx/codegen/models/quota_name.py | 44 - .../codegen/models/quota_read_response.py | 90 - .../codegen/models/quota_update_request.py | 90 - .../codegen/models/quota_update_response.py | 90 - .../codegen/models/quotas_read_response.py | 95 - .../codegen/models/quotas_update_request.py | 95 - .../codegen/models/quotas_update_response.py | 95 - .../codegen/models/run_creation_request.py | 101 - .../codegen/models/run_creation_response.py | 87 - .../aignx/codegen/models/run_read_response.py | 110 - .../codegen/models/slug_version_request.py | 97 - .../out/aignx/codegen/models/transfer_urls.py | 90 - .../codegen/models/user_creation_request.py | 96 - .../out/aignx/codegen/models/user_payload.py | 119 - .../out/aignx/codegen/models/user_quota.py | 94 - .../out/aignx/codegen/models/user_response.py | 105 - .../codegen/models/user_update_request.py | 99 - .../aignx/codegen/models/validation_error.py | 99 - .../models/validation_error_loc_inner.py | 138 - .../models/version_creation_request.py | 113 - .../models/version_creation_response.py | 87 - .../codegen/models/version_read_response.py | 123 - codegen/out/aignx/codegen/rest.py | 257 - codegen/out/docs/ExternalsApi.md | 1270 ----- codegen/out/test/test_externals_api.py | 142 - noxfile.py | 2 +- pyproject.toml | 8 +- src/aignostics/client/_authentication.py | 69 +- src/aignostics/client/_client.py | 2 +- uv.lock | 48 +- 74 files changed, 118 insertions(+), 13403 deletions(-) delete mode 100644 codegen/out/.openapi-generator/FILES delete mode 100644 codegen/out/.openapi-generator/VERSION delete mode 100644 codegen/out/aignx/codegen/api/externals_api.py delete mode 100644 codegen/out/aignx/codegen/api_client.py delete mode 100644 codegen/out/aignx/codegen/api_response.py delete mode 100644 codegen/out/aignx/codegen/configuration.py delete mode 100644 codegen/out/aignx/codegen/exceptions.py delete mode 100644 codegen/out/aignx/codegen/models/__init__.py delete mode 100644 codegen/out/aignx/codegen/models/application_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/application_creation_response.py delete mode 100644 codegen/out/aignx/codegen/models/application_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/application_run_status.py delete mode 100644 codegen/out/aignx/codegen/models/application_version.py delete mode 100644 codegen/out/aignx/codegen/models/application_version_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/artifact_event.py delete mode 100644 codegen/out/aignx/codegen/models/artifact_status.py delete mode 100644 codegen/out/aignx/codegen/models/http_validation_error.py delete mode 100644 codegen/out/aignx/codegen/models/input_artifact.py delete mode 100644 codegen/out/aignx/codegen/models/input_artifact_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/input_artifact_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/item_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/item_event.py delete mode 100644 codegen/out/aignx/codegen/models/item_event_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/item_event_creation_response.py delete mode 100644 codegen/out/aignx/codegen/models/item_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/item_result_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/item_status.py delete mode 100644 codegen/out/aignx/codegen/models/organization_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/organization_quota.py delete mode 100644 codegen/out/aignx/codegen/models/organization_response.py delete mode 100644 codegen/out/aignx/codegen/models/organization_update_request.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact_result_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact_scope.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact_visibility.py delete mode 100644 codegen/out/aignx/codegen/models/payload_input_artifact.py delete mode 100644 codegen/out/aignx/codegen/models/payload_item.py delete mode 100644 codegen/out/aignx/codegen/models/payload_output_artifact.py delete mode 100644 codegen/out/aignx/codegen/models/quota_name.py delete mode 100644 codegen/out/aignx/codegen/models/quota_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/quota_update_request.py delete mode 100644 codegen/out/aignx/codegen/models/quota_update_response.py delete mode 100644 codegen/out/aignx/codegen/models/quotas_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/quotas_update_request.py delete mode 100644 codegen/out/aignx/codegen/models/quotas_update_response.py delete mode 100644 codegen/out/aignx/codegen/models/run_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/run_creation_response.py delete mode 100644 codegen/out/aignx/codegen/models/run_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/slug_version_request.py delete mode 100644 codegen/out/aignx/codegen/models/transfer_urls.py delete mode 100644 codegen/out/aignx/codegen/models/user_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/user_payload.py delete mode 100644 codegen/out/aignx/codegen/models/user_quota.py delete mode 100644 codegen/out/aignx/codegen/models/user_response.py delete mode 100644 codegen/out/aignx/codegen/models/user_update_request.py delete mode 100644 codegen/out/aignx/codegen/models/validation_error.py delete mode 100644 codegen/out/aignx/codegen/models/validation_error_loc_inner.py delete mode 100644 codegen/out/aignx/codegen/models/version_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/version_creation_response.py delete mode 100644 codegen/out/aignx/codegen/models/version_read_response.py delete mode 100644 codegen/out/aignx/codegen/rest.py delete mode 100644 codegen/out/docs/ExternalsApi.md delete mode 100644 codegen/out/test/test_externals_api.py diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index 400a7932..fdab342d 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -3211,6 +3211,22 @@ Code coverage measurement for Python ``` +## cryptography (44.0.2) - Apache Software License; BSD License + +cryptography is a package which provides cryptographic recipes and primitives to Python developers. + +* URL: https://github.com/pyca/cryptography +* Author(s): The cryptography developers + +### License Text + +``` +This software is made available under the terms of *either* of the licenses +found in LICENSE.APACHE or LICENSE.BSD. Contributions to cryptography are made +under the terms of *both* these licenses. + +``` + ## cssutils (2.11.1) - GNU Library or Lesser General Public License (LGPL) A CSS Cascading Style Sheets library for Python diff --git a/codegen/out/.openapi-generator/FILES b/codegen/out/.openapi-generator/FILES deleted file mode 100644 index 7b6034dc..00000000 --- a/codegen/out/.openapi-generator/FILES +++ /dev/null @@ -1,64 +0,0 @@ -aignx/codegen/api/externals_api.py -aignx/codegen/api_client.py -aignx/codegen/api_response.py -aignx/codegen/configuration.py -aignx/codegen/exceptions.py -aignx/codegen/models/application_creation_request.py -aignx/codegen/models/application_creation_response.py -aignx/codegen/models/application_read_response.py -aignx/codegen/models/application_run_status.py -aignx/codegen/models/application_version.py -aignx/codegen/models/application_version_read_response.py -aignx/codegen/models/artifact_event.py -aignx/codegen/models/artifact_status.py -aignx/codegen/models/http_validation_error.py -aignx/codegen/models/input_artifact.py -aignx/codegen/models/input_artifact_creation_request.py -aignx/codegen/models/input_artifact_read_response.py -aignx/codegen/models/input_artifact_schema_creation_request.py -aignx/codegen/models/item_creation_request.py -aignx/codegen/models/item_event.py -aignx/codegen/models/item_event_creation_request.py -aignx/codegen/models/item_event_creation_response.py -aignx/codegen/models/item_read_response.py -aignx/codegen/models/item_result_read_response.py -aignx/codegen/models/item_status.py -aignx/codegen/models/organization_creation_request.py -aignx/codegen/models/organization_quota.py -aignx/codegen/models/organization_response.py -aignx/codegen/models/organization_update_request.py -aignx/codegen/models/output_artifact.py -aignx/codegen/models/output_artifact_event_trigger_request.py -aignx/codegen/models/output_artifact_event_trigger_response.py -aignx/codegen/models/output_artifact_read_response.py -aignx/codegen/models/output_artifact_result_read_response.py -aignx/codegen/models/output_artifact_schema_creation_request.py -aignx/codegen/models/output_artifact_scope.py -aignx/codegen/models/output_artifact_visibility.py -aignx/codegen/models/payload_input_artifact.py -aignx/codegen/models/payload_item.py -aignx/codegen/models/payload_output_artifact.py -aignx/codegen/models/quota_name.py -aignx/codegen/models/quota_read_response.py -aignx/codegen/models/quota_update_request.py -aignx/codegen/models/quota_update_response.py -aignx/codegen/models/quotas_read_response.py -aignx/codegen/models/quotas_update_request.py -aignx/codegen/models/quotas_update_response.py -aignx/codegen/models/run_creation_request.py -aignx/codegen/models/run_creation_response.py -aignx/codegen/models/run_read_response.py -aignx/codegen/models/slug_version_request.py -aignx/codegen/models/transfer_urls.py -aignx/codegen/models/user_creation_request.py -aignx/codegen/models/user_payload.py -aignx/codegen/models/user_quota.py -aignx/codegen/models/user_response.py -aignx/codegen/models/user_update_request.py -aignx/codegen/models/validation_error.py -aignx/codegen/models/validation_error_loc_inner.py -aignx/codegen/models/version_creation_request.py -aignx/codegen/models/version_creation_response.py -aignx/codegen/models/version_read_response.py -aignx/codegen/rest.py -docs/ExternalsApi.md diff --git a/codegen/out/.openapi-generator/VERSION b/codegen/out/.openapi-generator/VERSION deleted file mode 100644 index 758bb9c8..00000000 --- a/codegen/out/.openapi-generator/VERSION +++ /dev/null @@ -1 +0,0 @@ -7.10.0 diff --git a/codegen/out/aignx/codegen/api/externals_api.py b/codegen/out/aignx/codegen/api/externals_api.py deleted file mode 100644 index 13a98183..00000000 --- a/codegen/out/aignx/codegen/api/externals_api.py +++ /dev/null @@ -1,4763 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - -import warnings -from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt -from typing import Any, Dict, List, Optional, Tuple, Union -from typing_extensions import Annotated - -from pydantic import Field, StrictStr, field_validator -from typing import Any, List, Optional -from typing_extensions import Annotated -from aignx.codegen.models.application_read_response import ApplicationReadResponse -from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse -from aignx.codegen.models.item_result_read_response import ItemResultReadResponse -from aignx.codegen.models.item_status import ItemStatus -from aignx.codegen.models.run_creation_request import RunCreationRequest -from aignx.codegen.models.run_creation_response import RunCreationResponse -from aignx.codegen.models.run_read_response import RunReadResponse -from aignx.codegen.models.user_creation_request import UserCreationRequest -from aignx.codegen.models.user_response import UserResponse -from aignx.codegen.models.user_update_request import UserUpdateRequest -from aignx.codegen.models.version_creation_request import VersionCreationRequest -from aignx.codegen.models.version_creation_response import VersionCreationResponse -from aignx.codegen.models.version_read_response import VersionReadResponse - -from aignx.codegen.api_client import ApiClient, RequestSerialized -from aignx.codegen.api_response import ApiResponse -from aignx.codegen.rest import RESTResponseType - - -class ExternalsApi: - """NOTE: This class is auto generated by OpenAPI Generator - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None) -> None: - if api_client is None: - api_client = ApiClient.get_default() - self.api_client = api_client - - - @validate_call - def cancel_run_v1_runs_application_run_id_cancel_post( - self, - application_run_id: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> object: - """Cancel Run - - - :param application_run_id: (required) - :type application_run_id: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( - application_run_id=application_run_id, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '202': "object", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def cancel_run_v1_runs_application_run_id_cancel_post_with_http_info( - self, - application_run_id: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[object]: - """Cancel Run - - - :param application_run_id: (required) - :type application_run_id: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( - application_run_id=application_run_id, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '202': "object", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def cancel_run_v1_runs_application_run_id_cancel_post_without_preload_content( - self, - application_run_id: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Cancel Run - - - :param application_run_id: (required) - :type application_run_id: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( - application_run_id=application_run_id, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '202': "object", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _cancel_run_v1_runs_application_run_id_cancel_post_serialize( - self, - application_run_id, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_run_id is not None: - _path_params['application_run_id'] = application_run_id - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='POST', - resource_path='/v1/runs/{application_run_id}/cancel', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def create_application_run_v1_runs_post( - self, - run_creation_request: RunCreationRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RunCreationResponse: - """Create Application Run - - - :param run_creation_request: (required) - :type run_creation_request: RunCreationRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._create_application_run_v1_runs_post_serialize( - run_creation_request=run_creation_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '201': "RunCreationResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def create_application_run_v1_runs_post_with_http_info( - self, - run_creation_request: RunCreationRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[RunCreationResponse]: - """Create Application Run - - - :param run_creation_request: (required) - :type run_creation_request: RunCreationRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._create_application_run_v1_runs_post_serialize( - run_creation_request=run_creation_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '201': "RunCreationResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def create_application_run_v1_runs_post_without_preload_content( - self, - run_creation_request: RunCreationRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Create Application Run - - - :param run_creation_request: (required) - :type run_creation_request: RunCreationRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._create_application_run_v1_runs_post_serialize( - run_creation_request=run_creation_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '201': "RunCreationResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _create_application_run_v1_runs_post_serialize( - self, - run_creation_request, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - if run_creation_request is not None: - _body_params = run_creation_request - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - # set the HTTP header `Content-Type` - if _content_type: - _header_params['Content-Type'] = _content_type - else: - _default_content_type = ( - self.api_client.select_header_content_type( - [ - 'application/json' - ] - ) - ) - if _default_content_type is not None: - _header_params['Content-Type'] = _default_content_type - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='POST', - resource_path='/v1/runs', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def create_user_v1_users_post( - self, - user_creation_request: UserCreationRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> UserResponse: - """Create User - - - :param user_creation_request: (required) - :type user_creation_request: UserCreationRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._create_user_v1_users_post_serialize( - user_creation_request=user_creation_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def create_user_v1_users_post_with_http_info( - self, - user_creation_request: UserCreationRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[UserResponse]: - """Create User - - - :param user_creation_request: (required) - :type user_creation_request: UserCreationRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._create_user_v1_users_post_serialize( - user_creation_request=user_creation_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def create_user_v1_users_post_without_preload_content( - self, - user_creation_request: UserCreationRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Create User - - - :param user_creation_request: (required) - :type user_creation_request: UserCreationRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._create_user_v1_users_post_serialize( - user_creation_request=user_creation_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _create_user_v1_users_post_serialize( - self, - user_creation_request, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - if user_creation_request is not None: - _body_params = user_creation_request - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - # set the HTTP header `Content-Type` - if _content_type: - _header_params['Content-Type'] = _content_type - else: - _default_content_type = ( - self.api_client.select_header_content_type( - [ - 'application/json' - ] - ) - ) - if _default_content_type is not None: - _header_params['Content-Type'] = _default_content_type - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='POST', - resource_path='/v1/users/', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def delete_run_results_v1_runs_application_run_id_results_delete( - self, - application_run_id: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> None: - """Delete Run Results - - - :param application_run_id: (required) - :type application_run_id: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( - application_run_id=application_run_id, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '204': None, - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( - self, - application_run_id: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[None]: - """Delete Run Results - - - :param application_run_id: (required) - :type application_run_id: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( - application_run_id=application_run_id, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '204': None, - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def delete_run_results_v1_runs_application_run_id_results_delete_without_preload_content( - self, - application_run_id: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Delete Run Results - - - :param application_run_id: (required) - :type application_run_id: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( - application_run_id=application_run_id, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '204': None, - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( - self, - application_run_id, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_run_id is not None: - _path_params['application_run_id'] = application_run_id - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='DELETE', - resource_path='/v1/runs/{application_run_id}/results', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def get_run_v1_runs_application_run_id_get( - self, - application_run_id: StrictStr, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RunReadResponse: - """Get Run - - - :param application_run_id: (required) - :type application_run_id: str - :param include: - :type include: List[object] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._get_run_v1_runs_application_run_id_get_serialize( - application_run_id=application_run_id, - include=include, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "RunReadResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def get_run_v1_runs_application_run_id_get_with_http_info( - self, - application_run_id: StrictStr, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[RunReadResponse]: - """Get Run - - - :param application_run_id: (required) - :type application_run_id: str - :param include: - :type include: List[object] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._get_run_v1_runs_application_run_id_get_serialize( - application_run_id=application_run_id, - include=include, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "RunReadResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def get_run_v1_runs_application_run_id_get_without_preload_content( - self, - application_run_id: StrictStr, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Get Run - - - :param application_run_id: (required) - :type application_run_id: str - :param include: - :type include: List[object] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._get_run_v1_runs_application_run_id_get_serialize( - application_run_id=application_run_id, - include=include, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "RunReadResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _get_run_v1_runs_application_run_id_get_serialize( - self, - application_run_id, - include, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'include': 'multi', - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_run_id is not None: - _path_params['application_run_id'] = application_run_id - # process the query parameters - if include is not None: - - _query_params.append(('include', include)) - - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/runs/{application_run_id}', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def get_user_v1_users_user_id_get( - self, - user_id: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> UserResponse: - """Get User - - - :param user_id: (required) - :type user_id: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._get_user_v1_users_user_id_get_serialize( - user_id=user_id, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def get_user_v1_users_user_id_get_with_http_info( - self, - user_id: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[UserResponse]: - """Get User - - - :param user_id: (required) - :type user_id: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._get_user_v1_users_user_id_get_serialize( - user_id=user_id, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def get_user_v1_users_user_id_get_without_preload_content( - self, - user_id: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Get User - - - :param user_id: (required) - :type user_id: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._get_user_v1_users_user_id_get_serialize( - user_id=user_id, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _get_user_v1_users_user_id_get_serialize( - self, - user_id, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if user_id is not None: - _path_params['user_id'] = user_id - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/users/{user_id}', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def get_version_v1_versions_application_version_id_get( - self, - application_version_id: StrictStr, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> VersionReadResponse: - """Get Version - - - :param application_version_id: (required) - :type application_version_id: str - :param include: - :type include: List[object] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._get_version_v1_versions_application_version_id_get_serialize( - application_version_id=application_version_id, - include=include, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "VersionReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def get_version_v1_versions_application_version_id_get_with_http_info( - self, - application_version_id: StrictStr, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[VersionReadResponse]: - """Get Version - - - :param application_version_id: (required) - :type application_version_id: str - :param include: - :type include: List[object] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._get_version_v1_versions_application_version_id_get_serialize( - application_version_id=application_version_id, - include=include, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "VersionReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def get_version_v1_versions_application_version_id_get_without_preload_content( - self, - application_version_id: StrictStr, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Get Version - - - :param application_version_id: (required) - :type application_version_id: str - :param include: - :type include: List[object] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._get_version_v1_versions_application_version_id_get_serialize( - application_version_id=application_version_id, - include=include, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "VersionReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _get_version_v1_versions_application_version_id_get_serialize( - self, - application_version_id, - include, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'include': 'multi', - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_version_id is not None: - _path_params['application_version_id'] = application_version_id - # process the query parameters - if include is not None: - - _query_params.append(('include', include)) - - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/versions/{application_version_id}', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def list_application_runs_v1_runs_get( - self, - application_id: Optional[StrictStr] = None, - application_version_id: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[RunReadResponse]: - """List Application Runs - - - :param application_id: - :type application_id: str - :param application_version_id: - :type application_version_id: str - :param include: - :type include: List[object] - :param page: - :type page: int - :param page_size: - :type page_size: int - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_application_runs_v1_runs_get_serialize( - application_id=application_id, - application_version_id=application_version_id, - include=include, - page=page, - page_size=page_size, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[RunReadResponse]", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def list_application_runs_v1_runs_get_with_http_info( - self, - application_id: Optional[StrictStr] = None, - application_version_id: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[RunReadResponse]]: - """List Application Runs - - - :param application_id: - :type application_id: str - :param application_version_id: - :type application_version_id: str - :param include: - :type include: List[object] - :param page: - :type page: int - :param page_size: - :type page_size: int - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_application_runs_v1_runs_get_serialize( - application_id=application_id, - application_version_id=application_version_id, - include=include, - page=page, - page_size=page_size, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[RunReadResponse]", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def list_application_runs_v1_runs_get_without_preload_content( - self, - application_id: Optional[StrictStr] = None, - application_version_id: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """List Application Runs - - - :param application_id: - :type application_id: str - :param application_version_id: - :type application_version_id: str - :param include: - :type include: List[object] - :param page: - :type page: int - :param page_size: - :type page_size: int - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_application_runs_v1_runs_get_serialize( - application_id=application_id, - application_version_id=application_version_id, - include=include, - page=page, - page_size=page_size, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[RunReadResponse]", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _list_application_runs_v1_runs_get_serialize( - self, - application_id, - application_version_id, - include, - page, - page_size, - sort, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'include': 'multi', - 'sort': 'multi', - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - # process the query parameters - if application_id is not None: - - _query_params.append(('application_id', application_id)) - - if application_version_id is not None: - - _query_params.append(('application_version_id', application_version_id)) - - if include is not None: - - _query_params.append(('include', include)) - - if page is not None: - - _query_params.append(('page', page)) - - if page_size is not None: - - _query_params.append(('page_size', page_size)) - - if sort is not None: - - _query_params.append(('sort', sort)) - - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/runs', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def list_applications_v1_applications_get( - self, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[ApplicationReadResponse]: - """List Applications - - - :param page: - :type page: int - :param page_size: - :type page_size: int - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_applications_v1_applications_get_serialize( - page=page, - page_size=page_size, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def list_applications_v1_applications_get_with_http_info( - self, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[ApplicationReadResponse]]: - """List Applications - - - :param page: - :type page: int - :param page_size: - :type page_size: int - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_applications_v1_applications_get_serialize( - page=page, - page_size=page_size, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def list_applications_v1_applications_get_without_preload_content( - self, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """List Applications - - - :param page: - :type page: int - :param page_size: - :type page_size: int - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_applications_v1_applications_get_serialize( - page=page, - page_size=page_size, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _list_applications_v1_applications_get_serialize( - self, - page, - page_size, - sort, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'sort': 'multi', - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - # process the query parameters - if page is not None: - - _query_params.append(('page', page)) - - if page_size is not None: - - _query_params.append(('page_size', page_size)) - - if sort is not None: - - _query_params.append(('sort', sort)) - - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/applications', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def list_run_results_v1_runs_application_run_id_results_get( - self, - application_run_id: StrictStr, - item_id__in: Optional[List[Optional[StrictStr]]] = None, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - reference__in: Optional[List[StrictStr]] = None, - status__in: Optional[List[ItemStatus]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[ItemResultReadResponse]: - """List Run Results - - - :param application_run_id: (required) - :type application_run_id: str - :param item_id__in: - :type item_id__in: List[Optional[str]] - :param page: - :type page: int - :param page_size: - :type page_size: int - :param reference__in: - :type reference__in: List[str] - :param status__in: - :type status__in: List[ItemStatus] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( - application_run_id=application_run_id, - item_id__in=item_id__in, - page=page, - page_size=page_size, - reference__in=reference__in, - status__in=status__in, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ItemResultReadResponse]", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def list_run_results_v1_runs_application_run_id_results_get_with_http_info( - self, - application_run_id: StrictStr, - item_id__in: Optional[List[Optional[StrictStr]]] = None, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - reference__in: Optional[List[StrictStr]] = None, - status__in: Optional[List[ItemStatus]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[ItemResultReadResponse]]: - """List Run Results - - - :param application_run_id: (required) - :type application_run_id: str - :param item_id__in: - :type item_id__in: List[Optional[str]] - :param page: - :type page: int - :param page_size: - :type page_size: int - :param reference__in: - :type reference__in: List[str] - :param status__in: - :type status__in: List[ItemStatus] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( - application_run_id=application_run_id, - item_id__in=item_id__in, - page=page, - page_size=page_size, - reference__in=reference__in, - status__in=status__in, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ItemResultReadResponse]", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def list_run_results_v1_runs_application_run_id_results_get_without_preload_content( - self, - application_run_id: StrictStr, - item_id__in: Optional[List[Optional[StrictStr]]] = None, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - reference__in: Optional[List[StrictStr]] = None, - status__in: Optional[List[ItemStatus]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """List Run Results - - - :param application_run_id: (required) - :type application_run_id: str - :param item_id__in: - :type item_id__in: List[Optional[str]] - :param page: - :type page: int - :param page_size: - :type page_size: int - :param reference__in: - :type reference__in: List[str] - :param status__in: - :type status__in: List[ItemStatus] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( - application_run_id=application_run_id, - item_id__in=item_id__in, - page=page, - page_size=page_size, - reference__in=reference__in, - status__in=status__in, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ItemResultReadResponse]", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _list_run_results_v1_runs_application_run_id_results_get_serialize( - self, - application_run_id, - item_id__in, - page, - page_size, - reference__in, - status__in, - sort, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'item_id__in': 'multi', - 'reference__in': 'multi', - 'status__in': 'multi', - 'sort': 'multi', - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_run_id is not None: - _path_params['application_run_id'] = application_run_id - # process the query parameters - if item_id__in is not None: - - _query_params.append(('item_id__in', item_id__in)) - - if page is not None: - - _query_params.append(('page', page)) - - if page_size is not None: - - _query_params.append(('page_size', page_size)) - - if reference__in is not None: - - _query_params.append(('reference__in', reference__in)) - - if status__in is not None: - - _query_params.append(('status__in', status__in)) - - if sort is not None: - - _query_params.append(('sort', sort)) - - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/runs/{application_run_id}/results', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def list_versions_by_application_id_v1_applications_application_id_versions_get( - self, - application_id: StrictStr, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[ApplicationVersionReadResponse]: - """List Versions By Application Id - - - :param application_id: (required) - :type application_id: str - :param page: - :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( - application_id=application_id, - page=page, - page_size=page_size, - version=version, - include=include, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def list_versions_by_application_id_v1_applications_application_id_versions_get_with_http_info( - self, - application_id: StrictStr, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[ApplicationVersionReadResponse]]: - """List Versions By Application Id - - - :param application_id: (required) - :type application_id: str - :param page: - :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( - application_id=application_id, - page=page, - page_size=page_size, - version=version, - include=include, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def list_versions_by_application_id_v1_applications_application_id_versions_get_without_preload_content( - self, - application_id: StrictStr, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """List Versions By Application Id - - - :param application_id: (required) - :type application_id: str - :param page: - :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( - application_id=application_id, - page=page, - page_size=page_size, - version=version, - include=include, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( - self, - application_id, - page, - page_size, - version, - include, - sort, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'include': 'multi', - 'sort': 'multi', - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_id is not None: - _path_params['application_id'] = application_id - # process the query parameters - if page is not None: - - _query_params.append(('page', page)) - - if page_size is not None: - - _query_params.append(('page_size', page_size)) - - if version is not None: - - _query_params.append(('version', version)) - - if include is not None: - - _query_params.append(('include', include)) - - if sort is not None: - - _query_params.append(('sort', sort)) - - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/applications/{application_id}/versions', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def list_versions_by_application_slug_v1_applications_application_slug_versions_get( - self, - application_slug: Annotated[str, Field(strict=True)], - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[ApplicationVersionReadResponse]: - """List Versions By Application Slug - - - :param application_slug: (required) - :type application_slug: str - :param page: - :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( - application_slug=application_slug, - page=page, - page_size=page_size, - version=version, - include=include, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def list_versions_by_application_slug_v1_applications_application_slug_versions_get_with_http_info( - self, - application_slug: Annotated[str, Field(strict=True)], - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[ApplicationVersionReadResponse]]: - """List Versions By Application Slug - - - :param application_slug: (required) - :type application_slug: str - :param page: - :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( - application_slug=application_slug, - page=page, - page_size=page_size, - version=version, - include=include, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def list_versions_by_application_slug_v1_applications_application_slug_versions_get_without_preload_content( - self, - application_slug: Annotated[str, Field(strict=True)], - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """List Versions By Application Slug - - - :param application_slug: (required) - :type application_slug: str - :param page: - :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( - application_slug=application_slug, - page=page, - page_size=page_size, - version=version, - include=include, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( - self, - application_slug, - page, - page_size, - version, - include, - sort, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'include': 'multi', - 'sort': 'multi', - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_slug is not None: - _path_params['application_slug'] = application_slug - # process the query parameters - if page is not None: - - _query_params.append(('page', page)) - - if page_size is not None: - - _query_params.append(('page_size', page_size)) - - if version is not None: - - _query_params.append(('version', version)) - - if include is not None: - - _query_params.append(('include', include)) - - if sort is not None: - - _query_params.append(('sort', sort)) - - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/applications/{application_slug}/versions', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def read_application_by_id_v1_applications_application_id_get( - self, - application_id: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApplicationReadResponse: - """Read Application By Id - - - :param application_id: (required) - :type application_id: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._read_application_by_id_v1_applications_application_id_get_serialize( - application_id=application_id, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def read_application_by_id_v1_applications_application_id_get_with_http_info( - self, - application_id: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[ApplicationReadResponse]: - """Read Application By Id - - - :param application_id: (required) - :type application_id: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._read_application_by_id_v1_applications_application_id_get_serialize( - application_id=application_id, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def read_application_by_id_v1_applications_application_id_get_without_preload_content( - self, - application_id: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Read Application By Id - - - :param application_id: (required) - :type application_id: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._read_application_by_id_v1_applications_application_id_get_serialize( - application_id=application_id, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _read_application_by_id_v1_applications_application_id_get_serialize( - self, - application_id, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_id is not None: - _path_params['application_id'] = application_id - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/applications/{application_id}', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def read_application_by_slug_v1_applications_application_slug_get( - self, - application_slug: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApplicationReadResponse: - """Read Application By Slug - - - :param application_slug: (required) - :type application_slug: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( - application_slug=application_slug, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def read_application_by_slug_v1_applications_application_slug_get_with_http_info( - self, - application_slug: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[ApplicationReadResponse]: - """Read Application By Slug - - - :param application_slug: (required) - :type application_slug: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( - application_slug=application_slug, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def read_application_by_slug_v1_applications_application_slug_get_without_preload_content( - self, - application_slug: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Read Application By Slug - - - :param application_slug: (required) - :type application_slug: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( - application_slug=application_slug, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _read_application_by_slug_v1_applications_application_slug_get_serialize( - self, - application_slug, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_slug is not None: - _path_params['application_slug'] = application_slug - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/applications/{application_slug}', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def register_version_v1_versions_post( - self, - version_creation_request: VersionCreationRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> VersionCreationResponse: - """Register Version - - - :param version_creation_request: (required) - :type version_creation_request: VersionCreationRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._register_version_v1_versions_post_serialize( - version_creation_request=version_creation_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '201': "VersionCreationResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def register_version_v1_versions_post_with_http_info( - self, - version_creation_request: VersionCreationRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[VersionCreationResponse]: - """Register Version - - - :param version_creation_request: (required) - :type version_creation_request: VersionCreationRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._register_version_v1_versions_post_serialize( - version_creation_request=version_creation_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '201': "VersionCreationResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def register_version_v1_versions_post_without_preload_content( - self, - version_creation_request: VersionCreationRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Register Version - - - :param version_creation_request: (required) - :type version_creation_request: VersionCreationRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._register_version_v1_versions_post_serialize( - version_creation_request=version_creation_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '201': "VersionCreationResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _register_version_v1_versions_post_serialize( - self, - version_creation_request, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - if version_creation_request is not None: - _body_params = version_creation_request - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - # set the HTTP header `Content-Type` - if _content_type: - _header_params['Content-Type'] = _content_type - else: - _default_content_type = ( - self.api_client.select_header_content_type( - [ - 'application/json' - ] - ) - ) - if _default_content_type is not None: - _header_params['Content-Type'] = _default_content_type - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='POST', - resource_path='/v1/versions', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def update_user_v1_users_user_id_patch( - self, - user_id: StrictStr, - user_update_request: UserUpdateRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> UserResponse: - """Update User - - - :param user_id: (required) - :type user_id: str - :param user_update_request: (required) - :type user_update_request: UserUpdateRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._update_user_v1_users_user_id_patch_serialize( - user_id=user_id, - user_update_request=user_update_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def update_user_v1_users_user_id_patch_with_http_info( - self, - user_id: StrictStr, - user_update_request: UserUpdateRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[UserResponse]: - """Update User - - - :param user_id: (required) - :type user_id: str - :param user_update_request: (required) - :type user_update_request: UserUpdateRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._update_user_v1_users_user_id_patch_serialize( - user_id=user_id, - user_update_request=user_update_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def update_user_v1_users_user_id_patch_without_preload_content( - self, - user_id: StrictStr, - user_update_request: UserUpdateRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Update User - - - :param user_id: (required) - :type user_id: str - :param user_update_request: (required) - :type user_update_request: UserUpdateRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._update_user_v1_users_user_id_patch_serialize( - user_id=user_id, - user_update_request=user_update_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _update_user_v1_users_user_id_patch_serialize( - self, - user_id, - user_update_request, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if user_id is not None: - _path_params['user_id'] = user_id - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - if user_update_request is not None: - _body_params = user_update_request - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - # set the HTTP header `Content-Type` - if _content_type: - _header_params['Content-Type'] = _content_type - else: - _default_content_type = ( - self.api_client.select_header_content_type( - [ - 'application/json' - ] - ) - ) - if _default_content_type is not None: - _header_params['Content-Type'] = _default_content_type - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='PATCH', - resource_path='/v1/users/{user_id}', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - diff --git a/codegen/out/aignx/codegen/api_client.py b/codegen/out/aignx/codegen/api_client.py deleted file mode 100644 index 9b1b1ecf..00000000 --- a/codegen/out/aignx/codegen/api_client.py +++ /dev/null @@ -1,797 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -import datetime -from dateutil.parser import parse -from enum import Enum -import decimal -import json -import mimetypes -import os -import re -import tempfile - -from urllib.parse import quote -from typing import Tuple, Optional, List, Dict, Union -from pydantic import SecretStr - -from aignx.codegen.configuration import Configuration -from aignx.codegen.api_response import ApiResponse, T as ApiResponseT -import aignx.codegen.models -from aignx.codegen import rest -from aignx.codegen.exceptions import ( - ApiValueError, - ApiException, - BadRequestException, - UnauthorizedException, - ForbiddenException, - NotFoundException, - ServiceException -) - -RequestSerialized = Tuple[str, str, Dict[str, str], Optional[str], List[str]] - -class ApiClient: - """Generic API client for OpenAPI client library builds. - - OpenAPI generic API client. This client handles the client- - server communication, and is invariant across implementations. Specifics of - the methods and models for each application are generated from the OpenAPI - templates. - - :param configuration: .Configuration object for this client - :param header_name: a header to pass when making calls to the API. - :param header_value: a header value to pass when making calls to - the API. - :param cookie: a cookie to include in the header when making calls - to the API - """ - - PRIMITIVE_TYPES = (float, bool, bytes, str, int) - NATIVE_TYPES_MAPPING = { - 'int': int, - 'long': int, # TODO remove as only py3 is supported? - 'float': float, - 'str': str, - 'bool': bool, - 'date': datetime.date, - 'datetime': datetime.datetime, - 'decimal': decimal.Decimal, - 'object': object, - } - _pool = None - - def __init__( - self, - configuration=None, - header_name=None, - header_value=None, - cookie=None - ) -> None: - # use default configuration if none is provided - if configuration is None: - configuration = Configuration.get_default() - self.configuration = configuration - - self.rest_client = rest.RESTClientObject(configuration) - self.default_headers = {} - if header_name is not None: - self.default_headers[header_name] = header_value - self.cookie = cookie - # Set default User-Agent. - self.user_agent = 'OpenAPI-Generator/1.0.0/python' - self.client_side_validation = configuration.client_side_validation - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - pass - - @property - def user_agent(self): - """User agent for this API client""" - return self.default_headers['User-Agent'] - - @user_agent.setter - def user_agent(self, value): - self.default_headers['User-Agent'] = value - - def set_default_header(self, header_name, header_value): - self.default_headers[header_name] = header_value - - - _default = None - - @classmethod - def get_default(cls): - """Return new instance of ApiClient. - - This method returns newly created, based on default constructor, - object of ApiClient class or returns a copy of default - ApiClient. - - :return: The ApiClient object. - """ - if cls._default is None: - cls._default = ApiClient() - return cls._default - - @classmethod - def set_default(cls, default): - """Set default instance of ApiClient. - - It stores default ApiClient. - - :param default: object of ApiClient. - """ - cls._default = default - - def param_serialize( - self, - method, - resource_path, - path_params=None, - query_params=None, - header_params=None, - body=None, - post_params=None, - files=None, auth_settings=None, - collection_formats=None, - _host=None, - _request_auth=None - ) -> RequestSerialized: - - """Builds the HTTP request params needed by the request. - :param method: Method to call. - :param resource_path: Path to method endpoint. - :param path_params: Path parameters in the url. - :param query_params: Query parameters in the url. - :param header_params: Header parameters to be - placed in the request header. - :param body: Request body. - :param post_params dict: Request post form parameters, - for `application/x-www-form-urlencoded`, `multipart/form-data`. - :param auth_settings list: Auth Settings names for the request. - :param files dict: key -> filename, value -> filepath, - for `multipart/form-data`. - :param collection_formats: dict of collection formats for path, query, - header, and post parameters. - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. - :return: tuple of form (path, http_method, query_params, header_params, - body, post_params, files) - """ - - config = self.configuration - - # header parameters - header_params = header_params or {} - header_params.update(self.default_headers) - if self.cookie: - header_params['Cookie'] = self.cookie - if header_params: - header_params = self.sanitize_for_serialization(header_params) - header_params = dict( - self.parameters_to_tuples(header_params,collection_formats) - ) - - # path parameters - if path_params: - path_params = self.sanitize_for_serialization(path_params) - path_params = self.parameters_to_tuples( - path_params, - collection_formats - ) - for k, v in path_params: - # specified safe chars, encode everything - resource_path = resource_path.replace( - '{%s}' % k, - quote(str(v), safe=config.safe_chars_for_path_param) - ) - - # post parameters - if post_params or files: - post_params = post_params if post_params else [] - post_params = self.sanitize_for_serialization(post_params) - post_params = self.parameters_to_tuples( - post_params, - collection_formats - ) - if files: - post_params.extend(self.files_parameters(files)) - - # auth setting - self.update_params_for_auth( - header_params, - query_params, - auth_settings, - resource_path, - method, - body, - request_auth=_request_auth - ) - - # body - if body: - body = self.sanitize_for_serialization(body) - - # request url - if _host is None or self.configuration.ignore_operation_servers: - url = self.configuration.host + resource_path - else: - # use server/host defined in path or operation instead - url = _host + resource_path - - # query parameters - if query_params: - query_params = self.sanitize_for_serialization(query_params) - url_query = self.parameters_to_url_query( - query_params, - collection_formats - ) - url += "?" + url_query - - return method, url, header_params, body, post_params - - - def call_api( - self, - method, - url, - header_params=None, - body=None, - post_params=None, - _request_timeout=None - ) -> rest.RESTResponse: - """Makes the HTTP request (synchronous) - :param method: Method to call. - :param url: Path to method endpoint. - :param header_params: Header parameters to be - placed in the request header. - :param body: Request body. - :param post_params dict: Request post form parameters, - for `application/x-www-form-urlencoded`, `multipart/form-data`. - :param _request_timeout: timeout setting for this request. - :return: RESTResponse - """ - - try: - # perform request and return response - response_data = self.rest_client.request( - method, url, - headers=header_params, - body=body, post_params=post_params, - _request_timeout=_request_timeout - ) - - except ApiException as e: - raise e - - return response_data - - def response_deserialize( - self, - response_data: rest.RESTResponse, - response_types_map: Optional[Dict[str, ApiResponseT]]=None - ) -> ApiResponse[ApiResponseT]: - """Deserializes response into an object. - :param response_data: RESTResponse object to be deserialized. - :param response_types_map: dict of response types. - :return: ApiResponse - """ - - msg = "RESTResponse.read() must be called before passing it to response_deserialize()" - assert response_data.data is not None, msg - - response_type = response_types_map.get(str(response_data.status), None) - if not response_type and isinstance(response_data.status, int) and 100 <= response_data.status <= 599: - # if not found, look for '1XX', '2XX', etc. - response_type = response_types_map.get(str(response_data.status)[0] + "XX", None) - - # deserialize response data - response_text = None - return_data = None - try: - if response_type == "bytearray": - return_data = response_data.data - elif response_type == "file": - return_data = self.__deserialize_file(response_data) - elif response_type is not None: - match = None - content_type = response_data.getheader('content-type') - if content_type is not None: - match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type) - encoding = match.group(1) if match else "utf-8" - response_text = response_data.data.decode(encoding) - return_data = self.deserialize(response_text, response_type, content_type) - finally: - if not 200 <= response_data.status <= 299: - raise ApiException.from_response( - http_resp=response_data, - body=response_text, - data=return_data, - ) - - return ApiResponse( - status_code = response_data.status, - data = return_data, - headers = response_data.getheaders(), - raw_data = response_data.data - ) - - def sanitize_for_serialization(self, obj): - """Builds a JSON POST object. - - If obj is None, return None. - If obj is SecretStr, return obj.get_secret_value() - If obj is str, int, long, float, bool, return directly. - If obj is datetime.datetime, datetime.date - convert to string in iso8601 format. - If obj is decimal.Decimal return string representation. - If obj is list, sanitize each element in the list. - If obj is dict, return the dict. - If obj is OpenAPI model, return the properties dict. - - :param obj: The data to serialize. - :return: The serialized form of data. - """ - if obj is None: - return None - elif isinstance(obj, Enum): - return obj.value - elif isinstance(obj, SecretStr): - return obj.get_secret_value() - elif isinstance(obj, self.PRIMITIVE_TYPES): - return obj - elif isinstance(obj, list): - return [ - self.sanitize_for_serialization(sub_obj) for sub_obj in obj - ] - elif isinstance(obj, tuple): - return tuple( - self.sanitize_for_serialization(sub_obj) for sub_obj in obj - ) - elif isinstance(obj, (datetime.datetime, datetime.date)): - return obj.isoformat() - elif isinstance(obj, decimal.Decimal): - return str(obj) - - elif isinstance(obj, dict): - obj_dict = obj - else: - # Convert model obj to dict except - # attributes `openapi_types`, `attribute_map` - # and attributes which value is not None. - # Convert attribute name to json key in - # model definition for request. - if hasattr(obj, 'to_dict') and callable(getattr(obj, 'to_dict')): - obj_dict = obj.to_dict() - else: - obj_dict = obj.__dict__ - - return { - key: self.sanitize_for_serialization(val) - for key, val in obj_dict.items() - } - - def deserialize(self, response_text: str, response_type: str, content_type: Optional[str]): - """Deserializes response into an object. - - :param response: RESTResponse object to be deserialized. - :param response_type: class literal for - deserialized object, or string of class name. - :param content_type: content type of response. - - :return: deserialized object. - """ - - # fetch data from response object - if content_type is None: - try: - data = json.loads(response_text) - except ValueError: - data = response_text - elif re.match(r'^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)', content_type, re.IGNORECASE): - if response_text == "": - data = "" - else: - data = json.loads(response_text) - elif re.match(r'^text\/[a-z.+-]+\s*(;|$)', content_type, re.IGNORECASE): - data = response_text - else: - raise ApiException( - status=0, - reason="Unsupported content type: {0}".format(content_type) - ) - - return self.__deserialize(data, response_type) - - def __deserialize(self, data, klass): - """Deserializes dict, list, str into an object. - - :param data: dict, list or str. - :param klass: class literal, or string of class name. - - :return: object. - """ - if data is None: - return None - - if isinstance(klass, str): - if klass.startswith('List['): - m = re.match(r'List\[(.*)]', klass) - assert m is not None, "Malformed List type definition" - sub_kls = m.group(1) - return [self.__deserialize(sub_data, sub_kls) - for sub_data in data] - - if klass.startswith('Dict['): - m = re.match(r'Dict\[([^,]*), (.*)]', klass) - assert m is not None, "Malformed Dict type definition" - sub_kls = m.group(2) - return {k: self.__deserialize(v, sub_kls) - for k, v in data.items()} - - # convert str to class - if klass in self.NATIVE_TYPES_MAPPING: - klass = self.NATIVE_TYPES_MAPPING[klass] - else: - klass = getattr(aignx.codegen.models, klass) - - if klass in self.PRIMITIVE_TYPES: - return self.__deserialize_primitive(data, klass) - elif klass == object: - return self.__deserialize_object(data) - elif klass == datetime.date: - return self.__deserialize_date(data) - elif klass == datetime.datetime: - return self.__deserialize_datetime(data) - elif klass == decimal.Decimal: - return decimal.Decimal(data) - elif issubclass(klass, Enum): - return self.__deserialize_enum(data, klass) - else: - return self.__deserialize_model(data, klass) - - def parameters_to_tuples(self, params, collection_formats): - """Get parameters as list of tuples, formatting collections. - - :param params: Parameters as dict or list of two-tuples - :param dict collection_formats: Parameter collection formats - :return: Parameters as list of tuples, collections formatted - """ - new_params: List[Tuple[str, str]] = [] - if collection_formats is None: - collection_formats = {} - for k, v in params.items() if isinstance(params, dict) else params: - if k in collection_formats: - collection_format = collection_formats[k] - if collection_format == 'multi': - new_params.extend((k, value) for value in v) - else: - if collection_format == 'ssv': - delimiter = ' ' - elif collection_format == 'tsv': - delimiter = '\t' - elif collection_format == 'pipes': - delimiter = '|' - else: # csv is the default - delimiter = ',' - new_params.append( - (k, delimiter.join(str(value) for value in v))) - else: - new_params.append((k, v)) - return new_params - - def parameters_to_url_query(self, params, collection_formats): - """Get parameters as list of tuples, formatting collections. - - :param params: Parameters as dict or list of two-tuples - :param dict collection_formats: Parameter collection formats - :return: URL query string (e.g. a=Hello%20World&b=123) - """ - new_params: List[Tuple[str, str]] = [] - if collection_formats is None: - collection_formats = {} - for k, v in params.items() if isinstance(params, dict) else params: - if isinstance(v, bool): - v = str(v).lower() - if isinstance(v, (int, float)): - v = str(v) - if isinstance(v, dict): - v = json.dumps(v) - - if k in collection_formats: - collection_format = collection_formats[k] - if collection_format == 'multi': - new_params.extend((k, str(value)) for value in v) - else: - if collection_format == 'ssv': - delimiter = ' ' - elif collection_format == 'tsv': - delimiter = '\t' - elif collection_format == 'pipes': - delimiter = '|' - else: # csv is the default - delimiter = ',' - new_params.append( - (k, delimiter.join(quote(str(value)) for value in v)) - ) - else: - new_params.append((k, quote(str(v)))) - - return "&".join(["=".join(map(str, item)) for item in new_params]) - - def files_parameters( - self, - files: Dict[str, Union[str, bytes, List[str], List[bytes], Tuple[str, bytes]]], - ): - """Builds form parameters. - - :param files: File parameters. - :return: Form parameters with files. - """ - params = [] - for k, v in files.items(): - if isinstance(v, str): - with open(v, 'rb') as f: - filename = os.path.basename(f.name) - filedata = f.read() - elif isinstance(v, bytes): - filename = k - filedata = v - elif isinstance(v, tuple): - filename, filedata = v - elif isinstance(v, list): - for file_param in v: - params.extend(self.files_parameters({k: file_param})) - continue - else: - raise ValueError("Unsupported file value") - mimetype = ( - mimetypes.guess_type(filename)[0] - or 'application/octet-stream' - ) - params.append( - tuple([k, tuple([filename, filedata, mimetype])]) - ) - return params - - def select_header_accept(self, accepts: List[str]) -> Optional[str]: - """Returns `Accept` based on an array of accepts provided. - - :param accepts: List of headers. - :return: Accept (e.g. application/json). - """ - if not accepts: - return None - - for accept in accepts: - if re.search('json', accept, re.IGNORECASE): - return accept - - return accepts[0] - - def select_header_content_type(self, content_types): - """Returns `Content-Type` based on an array of content_types provided. - - :param content_types: List of content-types. - :return: Content-Type (e.g. application/json). - """ - if not content_types: - return None - - for content_type in content_types: - if re.search('json', content_type, re.IGNORECASE): - return content_type - - return content_types[0] - - def update_params_for_auth( - self, - headers, - queries, - auth_settings, - resource_path, - method, - body, - request_auth=None - ) -> None: - """Updates header and query params based on authentication setting. - - :param headers: Header parameters dict to be updated. - :param queries: Query parameters tuple list to be updated. - :param auth_settings: Authentication setting identifiers list. - :resource_path: A string representation of the HTTP request resource path. - :method: A string representation of the HTTP request method. - :body: A object representing the body of the HTTP request. - The object type is the return value of sanitize_for_serialization(). - :param request_auth: if set, the provided settings will - override the token in the configuration. - """ - if not auth_settings: - return - - if request_auth: - self._apply_auth_params( - headers, - queries, - resource_path, - method, - body, - request_auth - ) - else: - for auth in auth_settings: - auth_setting = self.configuration.auth_settings().get(auth) - if auth_setting: - self._apply_auth_params( - headers, - queries, - resource_path, - method, - body, - auth_setting - ) - - def _apply_auth_params( - self, - headers, - queries, - resource_path, - method, - body, - auth_setting - ) -> None: - """Updates the request parameters based on a single auth_setting - - :param headers: Header parameters dict to be updated. - :param queries: Query parameters tuple list to be updated. - :resource_path: A string representation of the HTTP request resource path. - :method: A string representation of the HTTP request method. - :body: A object representing the body of the HTTP request. - The object type is the return value of sanitize_for_serialization(). - :param auth_setting: auth settings for the endpoint - """ - if auth_setting['in'] == 'cookie': - headers['Cookie'] = auth_setting['value'] - elif auth_setting['in'] == 'header': - if auth_setting['type'] != 'http-signature': - headers[auth_setting['key']] = auth_setting['value'] - elif auth_setting['in'] == 'query': - queries.append((auth_setting['key'], auth_setting['value'])) - else: - raise ApiValueError( - 'Authentication token must be in `query` or `header`' - ) - - def __deserialize_file(self, response): - """Deserializes body to file - - Saves response body into a file in a temporary folder, - using the filename from the `Content-Disposition` header if provided. - - handle file downloading - save response body into a tmp file and return the instance - - :param response: RESTResponse. - :return: file path. - """ - fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) - os.close(fd) - os.remove(path) - - content_disposition = response.getheader("Content-Disposition") - if content_disposition: - m = re.search( - r'filename=[\'"]?([^\'"\s]+)[\'"]?', - content_disposition - ) - assert m is not None, "Unexpected 'content-disposition' header value" - filename = m.group(1) - path = os.path.join(os.path.dirname(path), filename) - - with open(path, "wb") as f: - f.write(response.data) - - return path - - def __deserialize_primitive(self, data, klass): - """Deserializes string to primitive type. - - :param data: str. - :param klass: class literal. - - :return: int, long, float, str, bool. - """ - try: - return klass(data) - except UnicodeEncodeError: - return str(data) - except TypeError: - return data - - def __deserialize_object(self, value): - """Return an original value. - - :return: object. - """ - return value - - def __deserialize_date(self, string): - """Deserializes string to date. - - :param string: str. - :return: date. - """ - try: - return parse(string).date() - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason="Failed to parse `{0}` as date object".format(string) - ) - - def __deserialize_datetime(self, string): - """Deserializes string to datetime. - - The string should be in iso8601 datetime format. - - :param string: str. - :return: datetime. - """ - try: - return parse(string) - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason=( - "Failed to parse `{0}` as datetime object" - .format(string) - ) - ) - - def __deserialize_enum(self, data, klass): - """Deserializes primitive type to enum. - - :param data: primitive type. - :param klass: class literal. - :return: enum value. - """ - try: - return klass(data) - except ValueError: - raise rest.ApiException( - status=0, - reason=( - "Failed to parse `{0}` as `{1}`" - .format(data, klass) - ) - ) - - def __deserialize_model(self, data, klass): - """Deserializes list or dict to model. - - :param data: dict, list. - :param klass: class literal. - :return: model object. - """ - - return klass.from_dict(data) diff --git a/codegen/out/aignx/codegen/api_response.py b/codegen/out/aignx/codegen/api_response.py deleted file mode 100644 index 9bc7c11f..00000000 --- a/codegen/out/aignx/codegen/api_response.py +++ /dev/null @@ -1,21 +0,0 @@ -"""API response object.""" - -from __future__ import annotations -from typing import Optional, Generic, Mapping, TypeVar -from pydantic import Field, StrictInt, StrictBytes, BaseModel - -T = TypeVar("T") - -class ApiResponse(BaseModel, Generic[T]): - """ - API response object - """ - - status_code: StrictInt = Field(description="HTTP status code") - headers: Optional[Mapping[str, str]] = Field(None, description="HTTP headers") - data: T = Field(description="Deserialized data given the data type") - raw_data: StrictBytes = Field(description="Raw data (HTTP response body)") - - model_config = { - "arbitrary_types_allowed": True - } diff --git a/codegen/out/aignx/codegen/configuration.py b/codegen/out/aignx/codegen/configuration.py deleted file mode 100644 index 9b55ae13..00000000 --- a/codegen/out/aignx/codegen/configuration.py +++ /dev/null @@ -1,574 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -import copy -import http.client as httplib -import logging -from logging import FileHandler -import multiprocessing -import sys -from typing import Any, ClassVar, Dict, List, Literal, Optional, TypedDict -from typing_extensions import NotRequired, Self - -import urllib3 - - -JSON_SCHEMA_VALIDATION_KEYWORDS = { - 'multipleOf', 'maximum', 'exclusiveMaximum', - 'minimum', 'exclusiveMinimum', 'maxLength', - 'minLength', 'pattern', 'maxItems', 'minItems' -} - -ServerVariablesT = Dict[str, str] - -GenericAuthSetting = TypedDict( - "GenericAuthSetting", - { - "type": str, - "in": str, - "key": str, - "value": str, - }, -) - - -OAuth2AuthSetting = TypedDict( - "OAuth2AuthSetting", - { - "type": Literal["oauth2"], - "in": Literal["header"], - "key": Literal["Authorization"], - "value": str, - }, -) - - -APIKeyAuthSetting = TypedDict( - "APIKeyAuthSetting", - { - "type": Literal["api_key"], - "in": str, - "key": str, - "value": Optional[str], - }, -) - - -BasicAuthSetting = TypedDict( - "BasicAuthSetting", - { - "type": Literal["basic"], - "in": Literal["header"], - "key": Literal["Authorization"], - "value": Optional[str], - }, -) - - -BearerFormatAuthSetting = TypedDict( - "BearerFormatAuthSetting", - { - "type": Literal["bearer"], - "in": Literal["header"], - "format": Literal["JWT"], - "key": Literal["Authorization"], - "value": str, - }, -) - - -BearerAuthSetting = TypedDict( - "BearerAuthSetting", - { - "type": Literal["bearer"], - "in": Literal["header"], - "key": Literal["Authorization"], - "value": str, - }, -) - - -HTTPSignatureAuthSetting = TypedDict( - "HTTPSignatureAuthSetting", - { - "type": Literal["http-signature"], - "in": Literal["header"], - "key": Literal["Authorization"], - "value": None, - }, -) - - -AuthSettings = TypedDict( - "AuthSettings", - { - "OAuth2AuthorizationCodeBearer": OAuth2AuthSetting, - }, - total=False, -) - - -class HostSettingVariable(TypedDict): - description: str - default_value: str - enum_values: List[str] - - -class HostSetting(TypedDict): - url: str - description: str - variables: NotRequired[Dict[str, HostSettingVariable]] - - -class Configuration: - """This class contains various settings of the API client. - - :param host: Base url. - :param ignore_operation_servers - Boolean to ignore operation servers for the API client. - Config will use `host` as the base url regardless of the operation servers. - :param api_key: Dict to store API key(s). - Each entry in the dict specifies an API key. - The dict key is the name of the security scheme in the OAS specification. - The dict value is the API key secret. - :param api_key_prefix: Dict to store API prefix (e.g. Bearer). - The dict key is the name of the security scheme in the OAS specification. - The dict value is an API key prefix when generating the auth data. - :param username: Username for HTTP basic authentication. - :param password: Password for HTTP basic authentication. - :param access_token: Access token. - :param server_index: Index to servers configuration. - :param server_variables: Mapping with string values to replace variables in - templated server configuration. The validation of enums is performed for - variables with defined enum values before. - :param server_operation_index: Mapping from operation ID to an index to server - configuration. - :param server_operation_variables: Mapping from operation ID to a mapping with - string values to replace variables in templated server configuration. - The validation of enums is performed for variables with defined enum - values before. - :param ssl_ca_cert: str - the path to a file of concatenated CA certificates - in PEM format. - :param retries: Number of retries for API requests. - - :Example: - """ - - _default: ClassVar[Optional[Self]] = None - - def __init__( - self, - host: Optional[str]=None, - api_key: Optional[Dict[str, str]]=None, - api_key_prefix: Optional[Dict[str, str]]=None, - username: Optional[str]=None, - password: Optional[str]=None, - access_token: Optional[str]=None, - server_index: Optional[int]=None, - server_variables: Optional[ServerVariablesT]=None, - server_operation_index: Optional[Dict[int, int]]=None, - server_operation_variables: Optional[Dict[int, ServerVariablesT]]=None, - ignore_operation_servers: bool=False, - ssl_ca_cert: Optional[str]=None, - retries: Optional[int] = None, - *, - debug: Optional[bool] = None, - ) -> None: - """Constructor - """ - self._base_path = "http://localhost" if host is None else host - """Default Base url - """ - self.server_index = 0 if server_index is None and host is None else server_index - self.server_operation_index = server_operation_index or {} - """Default server index - """ - self.server_variables = server_variables or {} - self.server_operation_variables = server_operation_variables or {} - """Default server variables - """ - self.ignore_operation_servers = ignore_operation_servers - """Ignore operation servers - """ - self.temp_folder_path = None - """Temp file folder for downloading files - """ - # Authentication Settings - self.api_key = {} - if api_key: - self.api_key = api_key - """dict to store API key(s) - """ - self.api_key_prefix = {} - if api_key_prefix: - self.api_key_prefix = api_key_prefix - """dict to store API prefix (e.g. Bearer) - """ - self.refresh_api_key_hook = None - """function hook to refresh API key if expired - """ - self.username = username - """Username for HTTP basic authentication - """ - self.password = password - """Password for HTTP basic authentication - """ - self.access_token = access_token - """Access token - """ - self.logger = {} - """Logging Settings - """ - self.logger["package_logger"] = logging.getLogger("aignx.codegen") - self.logger["urllib3_logger"] = logging.getLogger("urllib3") - self.logger_format = '%(asctime)s %(levelname)s %(message)s' - """Log format - """ - self.logger_stream_handler = None - """Log stream handler - """ - self.logger_file_handler: Optional[FileHandler] = None - """Log file handler - """ - self.logger_file = None - """Debug file location - """ - if debug is not None: - self.debug = debug - else: - self.__debug = False - """Debug switch - """ - - self.verify_ssl = True - """SSL/TLS verification - Set this to false to skip verifying SSL certificate when calling API - from https server. - """ - self.ssl_ca_cert = ssl_ca_cert - """Set this to customize the certificate file to verify the peer. - """ - self.cert_file = None - """client certificate file - """ - self.key_file = None - """client key file - """ - self.assert_hostname = None - """Set this to True/False to enable/disable SSL hostname verification. - """ - self.tls_server_name = None - """SSL/TLS Server Name Indication (SNI) - Set this to the SNI value expected by the server. - """ - - self.connection_pool_maxsize = multiprocessing.cpu_count() * 5 - """urllib3 connection pool's maximum number of connections saved - per pool. urllib3 uses 1 connection as default value, but this is - not the best value when you are making a lot of possibly parallel - requests to the same host, which is often the case here. - cpu_count * 5 is used as default value to increase performance. - """ - - self.proxy: Optional[str] = None - """Proxy URL - """ - self.proxy_headers = None - """Proxy headers - """ - self.safe_chars_for_path_param = '' - """Safe chars for path_param - """ - self.retries = retries - """Adding retries to override urllib3 default value 3 - """ - # Enable client side validation - self.client_side_validation = True - - self.socket_options = None - """Options to pass down to the underlying urllib3 socket - """ - - self.datetime_format = "%Y-%m-%dT%H:%M:%S.%f%z" - """datetime format - """ - - self.date_format = "%Y-%m-%d" - """date format - """ - - def __deepcopy__(self, memo: Dict[int, Any]) -> Self: - cls = self.__class__ - result = cls.__new__(cls) - memo[id(self)] = result - for k, v in self.__dict__.items(): - if k not in ('logger', 'logger_file_handler'): - setattr(result, k, copy.deepcopy(v, memo)) - # shallow copy of loggers - result.logger = copy.copy(self.logger) - # use setters to configure loggers - result.logger_file = self.logger_file - result.debug = self.debug - return result - - def __setattr__(self, name: str, value: Any) -> None: - object.__setattr__(self, name, value) - - @classmethod - def set_default(cls, default: Optional[Self]) -> None: - """Set default instance of configuration. - - It stores default configuration, which can be - returned by get_default_copy method. - - :param default: object of Configuration - """ - cls._default = default - - @classmethod - def get_default_copy(cls) -> Self: - """Deprecated. Please use `get_default` instead. - - Deprecated. Please use `get_default` instead. - - :return: The configuration object. - """ - return cls.get_default() - - @classmethod - def get_default(cls) -> Self: - """Return the default configuration. - - This method returns newly created, based on default constructor, - object of Configuration class or returns a copy of default - configuration. - - :return: The configuration object. - """ - if cls._default is None: - cls._default = cls() - return cls._default - - @property - def logger_file(self) -> Optional[str]: - """The logger file. - - If the logger_file is None, then add stream handler and remove file - handler. Otherwise, add file handler and remove stream handler. - - :param value: The logger_file path. - :type: str - """ - return self.__logger_file - - @logger_file.setter - def logger_file(self, value: Optional[str]) -> None: - """The logger file. - - If the logger_file is None, then add stream handler and remove file - handler. Otherwise, add file handler and remove stream handler. - - :param value: The logger_file path. - :type: str - """ - self.__logger_file = value - if self.__logger_file: - # If set logging file, - # then add file handler and remove stream handler. - self.logger_file_handler = logging.FileHandler(self.__logger_file) - self.logger_file_handler.setFormatter(self.logger_formatter) - for _, logger in self.logger.items(): - logger.addHandler(self.logger_file_handler) - - @property - def debug(self) -> bool: - """Debug status - - :param value: The debug status, True or False. - :type: bool - """ - return self.__debug - - @debug.setter - def debug(self, value: bool) -> None: - """Debug status - - :param value: The debug status, True or False. - :type: bool - """ - self.__debug = value - if self.__debug: - # if debug status is True, turn on debug logging - for _, logger in self.logger.items(): - logger.setLevel(logging.DEBUG) - # turn on httplib debug - httplib.HTTPConnection.debuglevel = 1 - else: - # if debug status is False, turn off debug logging, - # setting log level to default `logging.WARNING` - for _, logger in self.logger.items(): - logger.setLevel(logging.WARNING) - # turn off httplib debug - httplib.HTTPConnection.debuglevel = 0 - - @property - def logger_format(self) -> str: - """The logger format. - - The logger_formatter will be updated when sets logger_format. - - :param value: The format string. - :type: str - """ - return self.__logger_format - - @logger_format.setter - def logger_format(self, value: str) -> None: - """The logger format. - - The logger_formatter will be updated when sets logger_format. - - :param value: The format string. - :type: str - """ - self.__logger_format = value - self.logger_formatter = logging.Formatter(self.__logger_format) - - def get_api_key_with_prefix(self, identifier: str, alias: Optional[str]=None) -> Optional[str]: - """Gets API key (with prefix if set). - - :param identifier: The identifier of apiKey. - :param alias: The alternative identifier of apiKey. - :return: The token for api key authentication. - """ - if self.refresh_api_key_hook is not None: - self.refresh_api_key_hook(self) - key = self.api_key.get(identifier, self.api_key.get(alias) if alias is not None else None) - if key: - prefix = self.api_key_prefix.get(identifier) - if prefix: - return "%s %s" % (prefix, key) - else: - return key - - return None - - def get_basic_auth_token(self) -> Optional[str]: - """Gets HTTP basic authentication header (string). - - :return: The token for basic HTTP authentication. - """ - username = "" - if self.username is not None: - username = self.username - password = "" - if self.password is not None: - password = self.password - return urllib3.util.make_headers( - basic_auth=username + ':' + password - ).get('authorization') - - def auth_settings(self)-> AuthSettings: - """Gets Auth Settings dict for api client. - - :return: The Auth Settings information dict. - """ - auth: AuthSettings = {} - if self.access_token is not None: - auth['OAuth2AuthorizationCodeBearer'] = { - 'type': 'oauth2', - 'in': 'header', - 'key': 'Authorization', - 'value': 'Bearer ' + self.access_token - } - return auth - - def to_debug_report(self) -> str: - """Gets the essential information for debugging. - - :return: The report for debugging. - """ - return "Python SDK Debug Report:\n"\ - "OS: {env}\n"\ - "Python Version: {pyversion}\n"\ - "Version of the API: 0.1.0\n"\ - "SDK Package Version: 1.0.0".\ - format(env=sys.platform, pyversion=sys.version) - - def get_host_settings(self) -> List[HostSetting]: - """Gets an array of host settings - - :return: An array of host settings - """ - return [ - { - 'url': "", - 'description': "No description provided", - } - ] - - def get_host_from_settings( - self, - index: Optional[int], - variables: Optional[ServerVariablesT]=None, - servers: Optional[List[HostSetting]]=None, - ) -> str: - """Gets host URL based on the index and variables - :param index: array index of the host settings - :param variables: hash of variable and the corresponding value - :param servers: an array of host settings or None - :return: URL based on host settings - """ - if index is None: - return self._base_path - - variables = {} if variables is None else variables - servers = self.get_host_settings() if servers is None else servers - - try: - server = servers[index] - except IndexError: - raise ValueError( - "Invalid index {0} when selecting the host settings. " - "Must be less than {1}".format(index, len(servers))) - - url = server['url'] - - # go through variables and replace placeholders - for variable_name, variable in server.get('variables', {}).items(): - used_value = variables.get( - variable_name, variable['default_value']) - - if 'enum_values' in variable \ - and used_value not in variable['enum_values']: - raise ValueError( - "The variable `{0}` in the host URL has invalid value " - "{1}. Must be {2}.".format( - variable_name, variables[variable_name], - variable['enum_values'])) - - url = url.replace("{" + variable_name + "}", used_value) - - return url - - @property - def host(self) -> str: - """Return generated host.""" - return self.get_host_from_settings(self.server_index, variables=self.server_variables) - - @host.setter - def host(self, value: str) -> None: - """Fix base path.""" - self._base_path = value - self.server_index = None diff --git a/codegen/out/aignx/codegen/exceptions.py b/codegen/out/aignx/codegen/exceptions.py deleted file mode 100644 index 2eda998d..00000000 --- a/codegen/out/aignx/codegen/exceptions.py +++ /dev/null @@ -1,199 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - -from typing import Any, Optional -from typing_extensions import Self - -class OpenApiException(Exception): - """The base exception class for all OpenAPIExceptions""" - - -class ApiTypeError(OpenApiException, TypeError): - def __init__(self, msg, path_to_item=None, valid_classes=None, - key_type=None) -> None: - """ Raises an exception for TypeErrors - - Args: - msg (str): the exception message - - Keyword Args: - path_to_item (list): a list of keys an indices to get to the - current_item - None if unset - valid_classes (tuple): the primitive classes that current item - should be an instance of - None if unset - key_type (bool): False if our value is a value in a dict - True if it is a key in a dict - False if our item is an item in a list - None if unset - """ - self.path_to_item = path_to_item - self.valid_classes = valid_classes - self.key_type = key_type - full_msg = msg - if path_to_item: - full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) - super(ApiTypeError, self).__init__(full_msg) - - -class ApiValueError(OpenApiException, ValueError): - def __init__(self, msg, path_to_item=None) -> None: - """ - Args: - msg (str): the exception message - - Keyword Args: - path_to_item (list) the path to the exception in the - received_data dict. None if unset - """ - - self.path_to_item = path_to_item - full_msg = msg - if path_to_item: - full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) - super(ApiValueError, self).__init__(full_msg) - - -class ApiAttributeError(OpenApiException, AttributeError): - def __init__(self, msg, path_to_item=None) -> None: - """ - Raised when an attribute reference or assignment fails. - - Args: - msg (str): the exception message - - Keyword Args: - path_to_item (None/list) the path to the exception in the - received_data dict - """ - self.path_to_item = path_to_item - full_msg = msg - if path_to_item: - full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) - super(ApiAttributeError, self).__init__(full_msg) - - -class ApiKeyError(OpenApiException, KeyError): - def __init__(self, msg, path_to_item=None) -> None: - """ - Args: - msg (str): the exception message - - Keyword Args: - path_to_item (None/list) the path to the exception in the - received_data dict - """ - self.path_to_item = path_to_item - full_msg = msg - if path_to_item: - full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) - super(ApiKeyError, self).__init__(full_msg) - - -class ApiException(OpenApiException): - - def __init__( - self, - status=None, - reason=None, - http_resp=None, - *, - body: Optional[str] = None, - data: Optional[Any] = None, - ) -> None: - self.status = status - self.reason = reason - self.body = body - self.data = data - self.headers = None - - if http_resp: - if self.status is None: - self.status = http_resp.status - if self.reason is None: - self.reason = http_resp.reason - if self.body is None: - try: - self.body = http_resp.data.decode('utf-8') - except Exception: - pass - self.headers = http_resp.getheaders() - - @classmethod - def from_response( - cls, - *, - http_resp, - body: Optional[str], - data: Optional[Any], - ) -> Self: - if http_resp.status == 400: - raise BadRequestException(http_resp=http_resp, body=body, data=data) - - if http_resp.status == 401: - raise UnauthorizedException(http_resp=http_resp, body=body, data=data) - - if http_resp.status == 403: - raise ForbiddenException(http_resp=http_resp, body=body, data=data) - - if http_resp.status == 404: - raise NotFoundException(http_resp=http_resp, body=body, data=data) - - if 500 <= http_resp.status <= 599: - raise ServiceException(http_resp=http_resp, body=body, data=data) - raise ApiException(http_resp=http_resp, body=body, data=data) - - def __str__(self): - """Custom error messages for exception""" - error_message = "({0})\n"\ - "Reason: {1}\n".format(self.status, self.reason) - if self.headers: - error_message += "HTTP response headers: {0}\n".format( - self.headers) - - if self.data or self.body: - error_message += "HTTP response body: {0}\n".format(self.data or self.body) - - return error_message - - -class BadRequestException(ApiException): - pass - - -class NotFoundException(ApiException): - pass - - -class UnauthorizedException(ApiException): - pass - - -class ForbiddenException(ApiException): - pass - - -class ServiceException(ApiException): - pass - - -def render_path(path_to_item): - """Returns a string representation of a path""" - result = "" - for pth in path_to_item: - if isinstance(pth, int): - result += "[{0}]".format(pth) - else: - result += "['{0}']".format(pth) - return result diff --git a/codegen/out/aignx/codegen/models/__init__.py b/codegen/out/aignx/codegen/models/__init__.py deleted file mode 100644 index 33ff63eb..00000000 --- a/codegen/out/aignx/codegen/models/__init__.py +++ /dev/null @@ -1,57 +0,0 @@ -from .user_creation_request import * -from .item_result_read_response import * -from .input_artifact_schema_creation_request import * -from .organization_update_request import * -from .validation_error_loc_inner import * -from .application_version_read_response import * -from .item_status import * -from .run_creation_response import * -from .input_artifact_read_response import * -from .version_creation_request import * -from .user_payload import * -from .validation_error import * -from .application_read_response import * -from .application_creation_response import * -from .output_artifact_event_trigger_response import * -from .output_artifact_event_trigger_request import * -from .application_creation_request import * -from .quota_name import * -from .output_artifact_scope import * -from .version_creation_response import * -from .item_event_creation_response import * -from .item_read_response import * -from .input_artifact_creation_request import * -from .item_event_creation_request import * -from .user_update_request import * -from .item_creation_request import * -from .organization_response import * -from .quotas_read_response import * -from .application_version import * -from .http_validation_error import * -from .transfer_urls import * -from .item_event import * -from .slug_version_request import * -from .input_artifact import * -from .output_artifact_result_read_response import * -from .version_read_response import * -from .quotas_update_request import * -from .output_artifact_schema_creation_request import * -from .run_read_response import * -from .application_run_status import * -from .run_creation_request import * -from .quota_read_response import * -from .payload_output_artifact import * -from .payload_input_artifact import * -from .organization_quota import * -from .organization_creation_request import * -from .user_response import * -from .user_quota import * -from .artifact_event import * -from .output_artifact_visibility import * -from .quota_update_response import * -from .payload_item import * -from .output_artifact_read_response import * -from .quota_update_request import * -from .quotas_update_response import * -from .artifact_status import * -from .output_artifact import * diff --git a/codegen/out/aignx/codegen/models/application_creation_request.py b/codegen/out/aignx/codegen/models/application_creation_request.py deleted file mode 100644 index b1b6aa4d..00000000 --- a/codegen/out/aignx/codegen/models/application_creation_request.py +++ /dev/null @@ -1,91 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from typing import Optional, Set -from typing_extensions import Self - -class ApplicationCreationRequest(BaseModel): - """ - ApplicationCreationRequest - """ # noqa: E501 - name: StrictStr - description: StrictStr - regulatory_classes: List[StrictStr] - __properties: ClassVar[List[str]] = ["name", "description", "regulatory_classes"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ApplicationCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ApplicationCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "description": obj.get("description"), - "regulatory_classes": obj.get("regulatory_classes") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/application_creation_response.py b/codegen/out/aignx/codegen/models/application_creation_response.py deleted file mode 100644 index 026c7a73..00000000 --- a/codegen/out/aignx/codegen/models/application_creation_response.py +++ /dev/null @@ -1,87 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from typing import Optional, Set -from typing_extensions import Self - -class ApplicationCreationResponse(BaseModel): - """ - ApplicationCreationResponse - """ # noqa: E501 - application_id: StrictStr - __properties: ClassVar[List[str]] = ["application_id"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ApplicationCreationResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ApplicationCreationResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_id": obj.get("application_id") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/application_read_response.py b/codegen/out/aignx/codegen/models/application_read_response.py deleted file mode 100644 index aa90171e..00000000 --- a/codegen/out/aignx/codegen/models/application_read_response.py +++ /dev/null @@ -1,95 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from typing import Optional, Set -from typing_extensions import Self - -class ApplicationReadResponse(BaseModel): - """ - ApplicationReadResponse - """ # noqa: E501 - application_id: StrictStr - name: StrictStr - slug: StrictStr - regulatory_classes: List[StrictStr] - description: StrictStr - __properties: ClassVar[List[str]] = ["application_id", "name", "slug", "regulatory_classes", "description"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ApplicationReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ApplicationReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_id": obj.get("application_id"), - "name": obj.get("name"), - "slug": obj.get("slug"), - "regulatory_classes": obj.get("regulatory_classes"), - "description": obj.get("description") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/application_run_status.py b/codegen/out/aignx/codegen/models/application_run_status.py deleted file mode 100644 index 0bd73d9c..00000000 --- a/codegen/out/aignx/codegen/models/application_run_status.py +++ /dev/null @@ -1,43 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class ApplicationRunStatus(str, Enum): - """ - ApplicationRunStatus - """ - - """ - allowed enum values - """ - CANCELED_SYSTEM = 'canceled_system' - CANCELED_USER = 'canceled_user' - COMPLETED = 'completed' - COMPLETED_WITH_ERROR = 'completed_with_error' - RECEIVED = 'received' - REJECTED = 'rejected' - RUNNING = 'running' - SCHEDULED = 'scheduled' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ApplicationRunStatus from a JSON string""" - return cls(json.loads(json_str)) - - diff --git a/codegen/out/aignx/codegen/models/application_version.py b/codegen/out/aignx/codegen/models/application_version.py deleted file mode 100644 index 5f9bee3f..00000000 --- a/codegen/out/aignx/codegen/models/application_version.py +++ /dev/null @@ -1,136 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -from inspect import getfullargspec -import json -import pprint -import re # noqa: F401 -from pydantic import BaseModel, ConfigDict, Field, StrictStr, ValidationError, field_validator -from typing import Optional -from aignx.codegen.models.slug_version_request import SlugVersionRequest -from typing import Union, Any, List, Set, TYPE_CHECKING, Optional, Dict -from typing_extensions import Literal, Self -from pydantic import Field - -APPLICATIONVERSION_ANY_OF_SCHEMAS = ["SlugVersionRequest", "str"] - -class ApplicationVersion(BaseModel): - """ - ApplicationVersion - """ - - # data type: str - anyof_schema_1_validator: Optional[StrictStr] = None - # data type: SlugVersionRequest - anyof_schema_2_validator: Optional[SlugVersionRequest] = None - if TYPE_CHECKING: - actual_instance: Optional[Union[SlugVersionRequest, str]] = None - else: - actual_instance: Any = None - any_of_schemas: Set[str] = { "SlugVersionRequest", "str" } - - model_config = { - "validate_assignment": True, - "protected_namespaces": (), - } - - def __init__(self, *args, **kwargs) -> None: - if args: - if len(args) > 1: - raise ValueError("If a position argument is used, only 1 is allowed to set `actual_instance`") - if kwargs: - raise ValueError("If a position argument is used, keyword arguments cannot be used.") - super().__init__(actual_instance=args[0]) - else: - super().__init__(**kwargs) - - @field_validator('actual_instance') - def actual_instance_must_validate_anyof(cls, v): - instance = ApplicationVersion.model_construct() - error_messages = [] - # validate data type: str - try: - instance.anyof_schema_1_validator = v - return v - except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - # validate data type: SlugVersionRequest - if not isinstance(v, SlugVersionRequest): - error_messages.append(f"Error! Input type `{type(v)}` is not `SlugVersionRequest`") - else: - return v - - if error_messages: - # no match - raise ValueError("No match found when setting the actual_instance in ApplicationVersion with anyOf schemas: SlugVersionRequest, str. Details: " + ", ".join(error_messages)) - else: - return v - - @classmethod - def from_dict(cls, obj: Dict[str, Any]) -> Self: - return cls.from_json(json.dumps(obj)) - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Returns the object represented by the json string""" - instance = cls.model_construct() - error_messages = [] - # deserialize data into str - try: - # validation - instance.anyof_schema_1_validator = json.loads(json_str) - # assign value to actual_instance - instance.actual_instance = instance.anyof_schema_1_validator - return instance - except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - # anyof_schema_2_validator: Optional[SlugVersionRequest] = None - try: - instance.actual_instance = SlugVersionRequest.from_json(json_str) - return instance - except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - - if error_messages: - # no match - raise ValueError("No match found when deserializing the JSON string into ApplicationVersion with anyOf schemas: SlugVersionRequest, str. Details: " + ", ".join(error_messages)) - else: - return instance - - def to_json(self) -> str: - """Returns the JSON representation of the actual instance""" - if self.actual_instance is None: - return "null" - - if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): - return self.actual_instance.to_json() - else: - return json.dumps(self.actual_instance) - - def to_dict(self) -> Optional[Union[Dict[str, Any], SlugVersionRequest, str]]: - """Returns the dict representation of the actual instance""" - if self.actual_instance is None: - return None - - if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): - return self.actual_instance.to_dict() - else: - return self.actual_instance - - def to_str(self) -> str: - """Returns the string representation of the actual instance""" - return pprint.pformat(self.model_dump()) - - diff --git a/codegen/out/aignx/codegen/models/application_version_read_response.py b/codegen/out/aignx/codegen/models/application_version_read_response.py deleted file mode 100644 index 2f8c2c28..00000000 --- a/codegen/out/aignx/codegen/models/application_version_read_response.py +++ /dev/null @@ -1,130 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator -from typing import Any, ClassVar, Dict, List, Optional -from typing_extensions import Annotated -from aignx.codegen.models.input_artifact_read_response import InputArtifactReadResponse -from aignx.codegen.models.output_artifact_read_response import OutputArtifactReadResponse -from typing import Optional, Set -from typing_extensions import Self - -class ApplicationVersionReadResponse(BaseModel): - """ - ApplicationVersionReadResponse - """ # noqa: E501 - application_version_id: StrictStr - application_version_slug: Annotated[str, Field(strict=True)] - version: StrictStr - application_id: StrictStr - flow_id: Optional[StrictStr] = None - changelog: StrictStr - input_artifacts: List[InputArtifactReadResponse] - output_artifacts: List[OutputArtifactReadResponse] - __properties: ClassVar[List[str]] = ["application_version_id", "application_version_slug", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] - - @field_validator('application_version_slug') - def application_version_slug_validate_regular_expression(cls, value): - """Validates the regular expression""" - if not re.match(r"^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$", value): - raise ValueError(r"must validate the regular expression /^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/") - return value - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ApplicationVersionReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) - _items = [] - if self.input_artifacts: - for _item_input_artifacts in self.input_artifacts: - if _item_input_artifacts: - _items.append(_item_input_artifacts.to_dict()) - _dict['input_artifacts'] = _items - # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) - _items = [] - if self.output_artifacts: - for _item_output_artifacts in self.output_artifacts: - if _item_output_artifacts: - _items.append(_item_output_artifacts.to_dict()) - _dict['output_artifacts'] = _items - # set to None if flow_id (nullable) is None - # and model_fields_set contains the field - if self.flow_id is None and "flow_id" in self.model_fields_set: - _dict['flow_id'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ApplicationVersionReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_version_id": obj.get("application_version_id"), - "application_version_slug": obj.get("application_version_slug"), - "version": obj.get("version"), - "application_id": obj.get("application_id"), - "flow_id": obj.get("flow_id"), - "changelog": obj.get("changelog"), - "input_artifacts": [InputArtifactReadResponse.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None, - "output_artifacts": [OutputArtifactReadResponse.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/artifact_event.py b/codegen/out/aignx/codegen/models/artifact_event.py deleted file mode 100644 index 5de53169..00000000 --- a/codegen/out/aignx/codegen/models/artifact_event.py +++ /dev/null @@ -1,38 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class ArtifactEvent(str, Enum): - """ - This is a subset of the OutputArtifactEvent used by the state machine. Only the variants defined below are allowed to be submitted from the Algorithms/Applications. - """ - - """ - allowed enum values - """ - SUCCEEDED = 'succeeded' - FAILED_WITH_USER_ERROR = 'failed_with_user_error' - FAILED_WITH_SYSTEM_ERROR = 'failed_with_system_error' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ArtifactEvent from a JSON string""" - return cls(json.loads(json_str)) - - diff --git a/codegen/out/aignx/codegen/models/artifact_status.py b/codegen/out/aignx/codegen/models/artifact_status.py deleted file mode 100644 index 7ee40339..00000000 --- a/codegen/out/aignx/codegen/models/artifact_status.py +++ /dev/null @@ -1,43 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class ArtifactStatus(str, Enum): - """ - ArtifactStatus - """ - - """ - allowed enum values - """ - PENDING = 'pending' - CANCELED_USER = 'canceled_user' - CANCELED_SYSTEM = 'canceled_system' - ERROR_USER = 'error_user' - ERROR_SYSTEM_FATAL = 'error_system_fatal' - ERROR_SYSTEM_RECOVERABLE = 'error_system_recoverable' - SKIPPED = 'skipped' - SUCCEEDED = 'succeeded' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ArtifactStatus from a JSON string""" - return cls(json.loads(json_str)) - - diff --git a/codegen/out/aignx/codegen/models/http_validation_error.py b/codegen/out/aignx/codegen/models/http_validation_error.py deleted file mode 100644 index 769fd8fa..00000000 --- a/codegen/out/aignx/codegen/models/http_validation_error.py +++ /dev/null @@ -1,95 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict -from typing import Any, ClassVar, Dict, List, Optional -from aignx.codegen.models.validation_error import ValidationError -from typing import Optional, Set -from typing_extensions import Self - -class HTTPValidationError(BaseModel): - """ - HTTPValidationError - """ # noqa: E501 - detail: Optional[List[ValidationError]] = None - __properties: ClassVar[List[str]] = ["detail"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of HTTPValidationError from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in detail (list) - _items = [] - if self.detail: - for _item_detail in self.detail: - if _item_detail: - _items.append(_item_detail.to_dict()) - _dict['detail'] = _items - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of HTTPValidationError from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "detail": [ValidationError.from_dict(_item) for _item in obj["detail"]] if obj.get("detail") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/input_artifact.py b/codegen/out/aignx/codegen/models/input_artifact.py deleted file mode 100644 index 0ac720b9..00000000 --- a/codegen/out/aignx/codegen/models/input_artifact.py +++ /dev/null @@ -1,99 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator -from typing import Any, ClassVar, Dict, List -from typing_extensions import Annotated -from typing import Optional, Set -from typing_extensions import Self - -class InputArtifact(BaseModel): - """ - InputArtifact - """ # noqa: E501 - name: StrictStr - mime_type: Annotated[str, Field(strict=True)] - metadata_schema: Dict[str, Any] - __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema"] - - @field_validator('mime_type') - def mime_type_validate_regular_expression(cls, value): - """Validates the regular expression""" - if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") - return value - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of InputArtifact from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of InputArtifact from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "mime_type": obj.get("mime_type"), - "metadata_schema": obj.get("metadata_schema") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/input_artifact_creation_request.py b/codegen/out/aignx/codegen/models/input_artifact_creation_request.py deleted file mode 100644 index bde6dd98..00000000 --- a/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +++ /dev/null @@ -1,92 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field, StrictStr -from typing import Any, ClassVar, Dict, List -from typing_extensions import Annotated -from typing import Optional, Set -from typing_extensions import Self - -class InputArtifactCreationRequest(BaseModel): - """ - InputArtifactCreationRequest - """ # noqa: E501 - name: StrictStr - download_url: Annotated[str, Field(min_length=1, strict=True, max_length=2083)] - metadata: Dict[str, Any] - __properties: ClassVar[List[str]] = ["name", "download_url", "metadata"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of InputArtifactCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of InputArtifactCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "download_url": obj.get("download_url"), - "metadata": obj.get("metadata") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/input_artifact_read_response.py b/codegen/out/aignx/codegen/models/input_artifact_read_response.py deleted file mode 100644 index c831851b..00000000 --- a/codegen/out/aignx/codegen/models/input_artifact_read_response.py +++ /dev/null @@ -1,99 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator -from typing import Any, ClassVar, Dict, List -from typing_extensions import Annotated -from typing import Optional, Set -from typing_extensions import Self - -class InputArtifactReadResponse(BaseModel): - """ - InputArtifactReadResponse - """ # noqa: E501 - name: StrictStr - mime_type: Annotated[str, Field(strict=True)] - metadata_schema: Dict[str, Any] - __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema"] - - @field_validator('mime_type') - def mime_type_validate_regular_expression(cls, value): - """Validates the regular expression""" - if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") - return value - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of InputArtifactReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of InputArtifactReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "mime_type": obj.get("mime_type"), - "metadata_schema": obj.get("metadata_schema") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py b/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py deleted file mode 100644 index a463bf2d..00000000 --- a/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py +++ /dev/null @@ -1,91 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from typing import Optional, Set -from typing_extensions import Self - -class InputArtifactSchemaCreationRequest(BaseModel): - """ - InputArtifactSchemaCreationRequest - """ # noqa: E501 - name: StrictStr - mime_type: StrictStr - metadata_schema: Dict[str, Any] - __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of InputArtifactSchemaCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of InputArtifactSchemaCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "mime_type": obj.get("mime_type"), - "metadata_schema": obj.get("metadata_schema") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/item_creation_request.py b/codegen/out/aignx/codegen/models/item_creation_request.py deleted file mode 100644 index 7831ca6f..00000000 --- a/codegen/out/aignx/codegen/models/item_creation_request.py +++ /dev/null @@ -1,97 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.input_artifact_creation_request import InputArtifactCreationRequest -from typing import Optional, Set -from typing_extensions import Self - -class ItemCreationRequest(BaseModel): - """ - ItemCreationRequest - """ # noqa: E501 - reference: StrictStr - input_artifacts: List[InputArtifactCreationRequest] - __properties: ClassVar[List[str]] = ["reference", "input_artifacts"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ItemCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) - _items = [] - if self.input_artifacts: - for _item_input_artifacts in self.input_artifacts: - if _item_input_artifacts: - _items.append(_item_input_artifacts.to_dict()) - _dict['input_artifacts'] = _items - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ItemCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "reference": obj.get("reference"), - "input_artifacts": [InputArtifactCreationRequest.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/item_event.py b/codegen/out/aignx/codegen/models/item_event.py deleted file mode 100644 index 5f4d709f..00000000 --- a/codegen/out/aignx/codegen/models/item_event.py +++ /dev/null @@ -1,37 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class ItemEvent(str, Enum): - """ - ItemEvent - """ - - """ - allowed enum values - """ - FAILED_WITH_SYSTEM_ERROR = 'failed_with_system_error' - FAILED_RECOVERABLE = 'failed_recoverable' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ItemEvent from a JSON string""" - return cls(json.loads(json_str)) - - diff --git a/codegen/out/aignx/codegen/models/item_event_creation_request.py b/codegen/out/aignx/codegen/models/item_event_creation_request.py deleted file mode 100644 index 30271ed3..00000000 --- a/codegen/out/aignx/codegen/models/item_event_creation_request.py +++ /dev/null @@ -1,90 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.item_event import ItemEvent -from typing import Optional, Set -from typing_extensions import Self - -class ItemEventCreationRequest(BaseModel): - """ - ItemEventCreationRequest - """ # noqa: E501 - event: ItemEvent - error: StrictStr - __properties: ClassVar[List[str]] = ["event", "error"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ItemEventCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ItemEventCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "event": obj.get("event"), - "error": obj.get("error") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/item_event_creation_response.py b/codegen/out/aignx/codegen/models/item_event_creation_response.py deleted file mode 100644 index c3028f57..00000000 --- a/codegen/out/aignx/codegen/models/item_event_creation_response.py +++ /dev/null @@ -1,90 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.item_status import ItemStatus -from typing import Optional, Set -from typing_extensions import Self - -class ItemEventCreationResponse(BaseModel): - """ - ItemEventCreationResponse - """ # noqa: E501 - item_id: StrictStr - status: ItemStatus - __properties: ClassVar[List[str]] = ["item_id", "status"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ItemEventCreationResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ItemEventCreationResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "item_id": obj.get("item_id"), - "status": obj.get("status") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/item_read_response.py b/codegen/out/aignx/codegen/models/item_read_response.py deleted file mode 100644 index 2d720aaf..00000000 --- a/codegen/out/aignx/codegen/models/item_read_response.py +++ /dev/null @@ -1,106 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from aignx.codegen.models.item_status import ItemStatus -from typing import Optional, Set -from typing_extensions import Self - -class ItemReadResponse(BaseModel): - """ - ItemReadResponse - """ # noqa: E501 - item_id: StrictStr - application_run_id: Optional[StrictStr] = None - reference: StrictStr - status: ItemStatus - error: Optional[StrictStr] - __properties: ClassVar[List[str]] = ["item_id", "application_run_id", "reference", "status", "error"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ItemReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if application_run_id (nullable) is None - # and model_fields_set contains the field - if self.application_run_id is None and "application_run_id" in self.model_fields_set: - _dict['application_run_id'] = None - - # set to None if error (nullable) is None - # and model_fields_set contains the field - if self.error is None and "error" in self.model_fields_set: - _dict['error'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ItemReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "item_id": obj.get("item_id"), - "application_run_id": obj.get("application_run_id"), - "reference": obj.get("reference"), - "status": obj.get("status"), - "error": obj.get("error") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/item_result_read_response.py b/codegen/out/aignx/codegen/models/item_result_read_response.py deleted file mode 100644 index 01d90d9c..00000000 --- a/codegen/out/aignx/codegen/models/item_result_read_response.py +++ /dev/null @@ -1,111 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from aignx.codegen.models.item_status import ItemStatus -from aignx.codegen.models.output_artifact_result_read_response import OutputArtifactResultReadResponse -from typing import Optional, Set -from typing_extensions import Self - -class ItemResultReadResponse(BaseModel): - """ - ItemResultReadResponse - """ # noqa: E501 - item_id: StrictStr - application_run_id: StrictStr - reference: StrictStr - status: ItemStatus - error: Optional[StrictStr] - output_artifacts: List[OutputArtifactResultReadResponse] - __properties: ClassVar[List[str]] = ["item_id", "application_run_id", "reference", "status", "error", "output_artifacts"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ItemResultReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) - _items = [] - if self.output_artifacts: - for _item_output_artifacts in self.output_artifacts: - if _item_output_artifacts: - _items.append(_item_output_artifacts.to_dict()) - _dict['output_artifacts'] = _items - # set to None if error (nullable) is None - # and model_fields_set contains the field - if self.error is None and "error" in self.model_fields_set: - _dict['error'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ItemResultReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "item_id": obj.get("item_id"), - "application_run_id": obj.get("application_run_id"), - "reference": obj.get("reference"), - "status": obj.get("status"), - "error": obj.get("error"), - "output_artifacts": [OutputArtifactResultReadResponse.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/item_status.py b/codegen/out/aignx/codegen/models/item_status.py deleted file mode 100644 index 646b0e2c..00000000 --- a/codegen/out/aignx/codegen/models/item_status.py +++ /dev/null @@ -1,41 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class ItemStatus(str, Enum): - """ - ItemStatus - """ - - """ - allowed enum values - """ - PENDING = 'pending' - CANCELED_USER = 'canceled_user' - CANCELED_SYSTEM = 'canceled_system' - ERROR_USER = 'error_user' - ERROR_SYSTEM = 'error_system' - SUCCEEDED = 'succeeded' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ItemStatus from a JSON string""" - return cls(json.loads(json_str)) - - diff --git a/codegen/out/aignx/codegen/models/organization_creation_request.py b/codegen/out/aignx/codegen/models/organization_creation_request.py deleted file mode 100644 index 9dba311e..00000000 --- a/codegen/out/aignx/codegen/models/organization_creation_request.py +++ /dev/null @@ -1,93 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr -from typing import Any, ClassVar, Dict, List -from typing import Optional, Set -from typing_extensions import Self - -class OrganizationCreationRequest(BaseModel): - """ - OrganizationCreationRequest - """ # noqa: E501 - organization_id: StrictStr - owner_email: StrictStr - slide_quota: StrictInt - batch_size: StrictInt - __properties: ClassVar[List[str]] = ["organization_id", "owner_email", "slide_quota", "batch_size"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OrganizationCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OrganizationCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "organization_id": obj.get("organization_id"), - "owner_email": obj.get("owner_email"), - "slide_quota": obj.get("slide_quota"), - "batch_size": obj.get("batch_size") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/organization_quota.py b/codegen/out/aignx/codegen/models/organization_quota.py deleted file mode 100644 index 61c5ba4e..00000000 --- a/codegen/out/aignx/codegen/models/organization_quota.py +++ /dev/null @@ -1,94 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt -from typing import Any, ClassVar, Dict, List, Optional -from typing import Optional, Set -from typing_extensions import Self - -class OrganizationQuota(BaseModel): - """ - OrganizationQuota - """ # noqa: E501 - total: Optional[StrictInt] - used: StrictInt - __properties: ClassVar[List[str]] = ["total", "used"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OrganizationQuota from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if total (nullable) is None - # and model_fields_set contains the field - if self.total is None and "total" in self.model_fields_set: - _dict['total'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OrganizationQuota from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "total": obj.get("total"), - "used": obj.get("used") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/organization_response.py b/codegen/out/aignx/codegen/models/organization_response.py deleted file mode 100644 index 857f6097..00000000 --- a/codegen/out/aignx/codegen/models/organization_response.py +++ /dev/null @@ -1,97 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.organization_quota import OrganizationQuota -from typing import Optional, Set -from typing_extensions import Self - -class OrganizationResponse(BaseModel): - """ - OrganizationResponse - """ # noqa: E501 - organization_id: StrictStr - owner_id: StrictStr - slide_quota: OrganizationQuota - batch_size: StrictInt - __properties: ClassVar[List[str]] = ["organization_id", "owner_id", "slide_quota", "batch_size"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OrganizationResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of slide_quota - if self.slide_quota: - _dict['slide_quota'] = self.slide_quota.to_dict() - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OrganizationResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "organization_id": obj.get("organization_id"), - "owner_id": obj.get("owner_id"), - "slide_quota": OrganizationQuota.from_dict(obj["slide_quota"]) if obj.get("slide_quota") is not None else None, - "batch_size": obj.get("batch_size") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/organization_update_request.py b/codegen/out/aignx/codegen/models/organization_update_request.py deleted file mode 100644 index f0e74fb4..00000000 --- a/codegen/out/aignx/codegen/models/organization_update_request.py +++ /dev/null @@ -1,99 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt -from typing import Any, ClassVar, Dict, List, Optional -from typing import Optional, Set -from typing_extensions import Self - -class OrganizationUpdateRequest(BaseModel): - """ - OrganizationUpdateRequest - """ # noqa: E501 - slide_quota: Optional[StrictInt] = None - batch_size: Optional[StrictInt] = None - __properties: ClassVar[List[str]] = ["slide_quota", "batch_size"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OrganizationUpdateRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if slide_quota (nullable) is None - # and model_fields_set contains the field - if self.slide_quota is None and "slide_quota" in self.model_fields_set: - _dict['slide_quota'] = None - - # set to None if batch_size (nullable) is None - # and model_fields_set contains the field - if self.batch_size is None and "batch_size" in self.model_fields_set: - _dict['batch_size'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OrganizationUpdateRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "slide_quota": obj.get("slide_quota"), - "batch_size": obj.get("batch_size") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/output_artifact.py b/codegen/out/aignx/codegen/models/output_artifact.py deleted file mode 100644 index 9bc27023..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact.py +++ /dev/null @@ -1,105 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator -from typing import Any, ClassVar, Dict, List -from typing_extensions import Annotated -from aignx.codegen.models.output_artifact_scope import OutputArtifactScope -from aignx.codegen.models.output_artifact_visibility import OutputArtifactVisibility -from typing import Optional, Set -from typing_extensions import Self - -class OutputArtifact(BaseModel): - """ - OutputArtifact - """ # noqa: E501 - name: StrictStr - mime_type: Annotated[str, Field(strict=True)] - metadata_schema: Dict[str, Any] - scope: OutputArtifactScope - visibility: OutputArtifactVisibility - __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema", "scope", "visibility"] - - @field_validator('mime_type') - def mime_type_validate_regular_expression(cls, value): - """Validates the regular expression""" - if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") - return value - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OutputArtifact from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OutputArtifact from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "mime_type": obj.get("mime_type"), - "metadata_schema": obj.get("metadata_schema"), - "scope": obj.get("scope"), - "visibility": obj.get("visibility") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py b/codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py deleted file mode 100644 index ef777027..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py +++ /dev/null @@ -1,97 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from aignx.codegen.models.artifact_event import ArtifactEvent -from typing import Optional, Set -from typing_extensions import Self - -class OutputArtifactEventTriggerRequest(BaseModel): - """ - OutputArtifactEventTriggerRequest - """ # noqa: E501 - event: ArtifactEvent - metadata: Dict[str, Any] - error: Optional[StrictStr] = None - __properties: ClassVar[List[str]] = ["event", "metadata", "error"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OutputArtifactEventTriggerRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if error (nullable) is None - # and model_fields_set contains the field - if self.error is None and "error" in self.model_fields_set: - _dict['error'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OutputArtifactEventTriggerRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "event": obj.get("event"), - "metadata": obj.get("metadata"), - "error": obj.get("error") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py b/codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py deleted file mode 100644 index 0c802b7e..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py +++ /dev/null @@ -1,90 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.artifact_status import ArtifactStatus -from typing import Optional, Set -from typing_extensions import Self - -class OutputArtifactEventTriggerResponse(BaseModel): - """ - OutputArtifactEventTriggerResponse - """ # noqa: E501 - output_artifact_id: StrictStr - status: ArtifactStatus - __properties: ClassVar[List[str]] = ["output_artifact_id", "status"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OutputArtifactEventTriggerResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OutputArtifactEventTriggerResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "output_artifact_id": obj.get("output_artifact_id"), - "status": obj.get("status") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/output_artifact_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_read_response.py deleted file mode 100644 index abab4c4a..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact_read_response.py +++ /dev/null @@ -1,102 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator -from typing import Any, ClassVar, Dict, List -from typing_extensions import Annotated -from aignx.codegen.models.output_artifact_scope import OutputArtifactScope -from typing import Optional, Set -from typing_extensions import Self - -class OutputArtifactReadResponse(BaseModel): - """ - OutputArtifactReadResponse - """ # noqa: E501 - name: StrictStr - mime_type: Annotated[str, Field(strict=True)] - metadata_schema: Dict[str, Any] - scope: OutputArtifactScope - __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema", "scope"] - - @field_validator('mime_type') - def mime_type_validate_regular_expression(cls, value): - """Validates the regular expression""" - if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") - return value - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OutputArtifactReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OutputArtifactReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "mime_type": obj.get("mime_type"), - "metadata_schema": obj.get("metadata_schema"), - "scope": obj.get("scope") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py deleted file mode 100644 index 7af8bd0b..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +++ /dev/null @@ -1,108 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator -from typing import Any, ClassVar, Dict, List, Optional -from typing_extensions import Annotated -from typing import Optional, Set -from typing_extensions import Self - -class OutputArtifactResultReadResponse(BaseModel): - """ - OutputArtifactResultReadResponse - """ # noqa: E501 - output_artifact_id: StrictStr - name: StrictStr - mime_type: Annotated[str, Field(strict=True)] - metadata: Dict[str, Any] - download_url: Optional[Annotated[str, Field(min_length=1, strict=True, max_length=2083)]] - __properties: ClassVar[List[str]] = ["output_artifact_id", "name", "mime_type", "metadata", "download_url"] - - @field_validator('mime_type') - def mime_type_validate_regular_expression(cls, value): - """Validates the regular expression""" - if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") - return value - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OutputArtifactResultReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if download_url (nullable) is None - # and model_fields_set contains the field - if self.download_url is None and "download_url" in self.model_fields_set: - _dict['download_url'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OutputArtifactResultReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "output_artifact_id": obj.get("output_artifact_id"), - "name": obj.get("name"), - "mime_type": obj.get("mime_type"), - "metadata": obj.get("metadata"), - "download_url": obj.get("download_url") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py b/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py deleted file mode 100644 index 4696c21b..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py +++ /dev/null @@ -1,97 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.output_artifact_scope import OutputArtifactScope -from aignx.codegen.models.output_artifact_visibility import OutputArtifactVisibility -from typing import Optional, Set -from typing_extensions import Self - -class OutputArtifactSchemaCreationRequest(BaseModel): - """ - OutputArtifactSchemaCreationRequest - """ # noqa: E501 - name: StrictStr - mime_type: StrictStr - scope: OutputArtifactScope - visibility: OutputArtifactVisibility - metadata_schema: Dict[str, Any] - __properties: ClassVar[List[str]] = ["name", "mime_type", "scope", "visibility", "metadata_schema"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OutputArtifactSchemaCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OutputArtifactSchemaCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "mime_type": obj.get("mime_type"), - "scope": obj.get("scope"), - "visibility": obj.get("visibility"), - "metadata_schema": obj.get("metadata_schema") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/output_artifact_scope.py b/codegen/out/aignx/codegen/models/output_artifact_scope.py deleted file mode 100644 index 530f54c4..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact_scope.py +++ /dev/null @@ -1,37 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class OutputArtifactScope(str, Enum): - """ - OutputArtifactScope - """ - - """ - allowed enum values - """ - ITEM = 'item' - GLOBAL = 'global' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of OutputArtifactScope from a JSON string""" - return cls(json.loads(json_str)) - - diff --git a/codegen/out/aignx/codegen/models/output_artifact_visibility.py b/codegen/out/aignx/codegen/models/output_artifact_visibility.py deleted file mode 100644 index c4c79507..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact_visibility.py +++ /dev/null @@ -1,37 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class OutputArtifactVisibility(str, Enum): - """ - OutputArtifactVisibility - """ - - """ - allowed enum values - """ - INTERNAL = 'internal' - EXTERNAL = 'external' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of OutputArtifactVisibility from a JSON string""" - return cls(json.loads(json_str)) - - diff --git a/codegen/out/aignx/codegen/models/payload_input_artifact.py b/codegen/out/aignx/codegen/models/payload_input_artifact.py deleted file mode 100644 index 65927248..00000000 --- a/codegen/out/aignx/codegen/models/payload_input_artifact.py +++ /dev/null @@ -1,92 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field, StrictStr -from typing import Any, ClassVar, Dict, List -from typing_extensions import Annotated -from typing import Optional, Set -from typing_extensions import Self - -class PayloadInputArtifact(BaseModel): - """ - PayloadInputArtifact - """ # noqa: E501 - input_artifact_id: StrictStr - metadata: Dict[str, Any] - download_url: Annotated[str, Field(min_length=1, strict=True)] - __properties: ClassVar[List[str]] = ["input_artifact_id", "metadata", "download_url"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of PayloadInputArtifact from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of PayloadInputArtifact from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "input_artifact_id": obj.get("input_artifact_id"), - "metadata": obj.get("metadata"), - "download_url": obj.get("download_url") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/payload_item.py b/codegen/out/aignx/codegen/models/payload_item.py deleted file mode 100644 index fccb20e4..00000000 --- a/codegen/out/aignx/codegen/models/payload_item.py +++ /dev/null @@ -1,117 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.payload_input_artifact import PayloadInputArtifact -from aignx.codegen.models.payload_output_artifact import PayloadOutputArtifact -from typing import Optional, Set -from typing_extensions import Self - -class PayloadItem(BaseModel): - """ - PayloadItem - """ # noqa: E501 - item_id: StrictStr - input_artifacts: Dict[str, PayloadInputArtifact] - output_artifacts: Dict[str, PayloadOutputArtifact] - __properties: ClassVar[List[str]] = ["item_id", "input_artifacts", "output_artifacts"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of PayloadItem from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each value in input_artifacts (dict) - _field_dict = {} - if self.input_artifacts: - for _key_input_artifacts in self.input_artifacts: - if self.input_artifacts[_key_input_artifacts]: - _field_dict[_key_input_artifacts] = self.input_artifacts[_key_input_artifacts].to_dict() - _dict['input_artifacts'] = _field_dict - # override the default output from pydantic by calling `to_dict()` of each value in output_artifacts (dict) - _field_dict = {} - if self.output_artifacts: - for _key_output_artifacts in self.output_artifacts: - if self.output_artifacts[_key_output_artifacts]: - _field_dict[_key_output_artifacts] = self.output_artifacts[_key_output_artifacts].to_dict() - _dict['output_artifacts'] = _field_dict - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of PayloadItem from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "item_id": obj.get("item_id"), - "input_artifacts": dict( - (_k, PayloadInputArtifact.from_dict(_v)) - for _k, _v in obj["input_artifacts"].items() - ) - if obj.get("input_artifacts") is not None - else None, - "output_artifacts": dict( - (_k, PayloadOutputArtifact.from_dict(_v)) - for _k, _v in obj["output_artifacts"].items() - ) - if obj.get("output_artifacts") is not None - else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/payload_output_artifact.py b/codegen/out/aignx/codegen/models/payload_output_artifact.py deleted file mode 100644 index f735a279..00000000 --- a/codegen/out/aignx/codegen/models/payload_output_artifact.py +++ /dev/null @@ -1,98 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.transfer_urls import TransferUrls -from typing import Optional, Set -from typing_extensions import Self - -class PayloadOutputArtifact(BaseModel): - """ - PayloadOutputArtifact - """ # noqa: E501 - output_artifact_id: StrictStr - data: TransferUrls - metadata: TransferUrls - __properties: ClassVar[List[str]] = ["output_artifact_id", "data", "metadata"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of PayloadOutputArtifact from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of data - if self.data: - _dict['data'] = self.data.to_dict() - # override the default output from pydantic by calling `to_dict()` of metadata - if self.metadata: - _dict['metadata'] = self.metadata.to_dict() - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of PayloadOutputArtifact from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "output_artifact_id": obj.get("output_artifact_id"), - "data": TransferUrls.from_dict(obj["data"]) if obj.get("data") is not None else None, - "metadata": TransferUrls.from_dict(obj["metadata"]) if obj.get("metadata") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/quota_name.py b/codegen/out/aignx/codegen/models/quota_name.py deleted file mode 100644 index 6094443f..00000000 --- a/codegen/out/aignx/codegen/models/quota_name.py +++ /dev/null @@ -1,44 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class QuotaName(str, Enum): - """ - Global, API-level, and slide-level quotas for Samia API. - """ - - """ - allowed enum values - """ - MAX_USERS = 'max_users' - MAX_ORGANIZATIONS = 'max_organizations' - MAX_USERS_PER_ORGANIZATION = 'max_users_per_organization' - MAX_APPLICATIONS = 'max_applications' - MAX_APPLICATION_VERSIONS = 'max_application_versions' - MAX_SLIDES_PER_RUN = 'max_slides_per_run' - MAX_PARALLEL_RUNS = 'max_parallel_runs' - MAX_PARALLEL_RUNS_PER_ORGANIZATION = 'max_parallel_runs_per_organization' - MAX_PARALLEL_RUNS_PER_USER = 'max_parallel_runs_per_user' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of QuotaName from a JSON string""" - return cls(json.loads(json_str)) - - diff --git a/codegen/out/aignx/codegen/models/quota_read_response.py b/codegen/out/aignx/codegen/models/quota_read_response.py deleted file mode 100644 index 8f2234b8..00000000 --- a/codegen/out/aignx/codegen/models/quota_read_response.py +++ /dev/null @@ -1,90 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.quota_name import QuotaName -from typing import Optional, Set -from typing_extensions import Self - -class QuotaReadResponse(BaseModel): - """ - GET response payload for quota read. - """ # noqa: E501 - name: QuotaName - quota: StrictInt - __properties: ClassVar[List[str]] = ["name", "quota"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of QuotaReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of QuotaReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "quota": obj.get("quota") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/quota_update_request.py b/codegen/out/aignx/codegen/models/quota_update_request.py deleted file mode 100644 index 2f19c517..00000000 --- a/codegen/out/aignx/codegen/models/quota_update_request.py +++ /dev/null @@ -1,90 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.quota_name import QuotaName -from typing import Optional, Set -from typing_extensions import Self - -class QuotaUpdateRequest(BaseModel): - """ - PATCH request payload for quota update. - """ # noqa: E501 - name: QuotaName - quota: StrictInt - __properties: ClassVar[List[str]] = ["name", "quota"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of QuotaUpdateRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of QuotaUpdateRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "quota": obj.get("quota") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/quota_update_response.py b/codegen/out/aignx/codegen/models/quota_update_response.py deleted file mode 100644 index 0e5595aa..00000000 --- a/codegen/out/aignx/codegen/models/quota_update_response.py +++ /dev/null @@ -1,90 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.quota_name import QuotaName -from typing import Optional, Set -from typing_extensions import Self - -class QuotaUpdateResponse(BaseModel): - """ - PATCH response payload for quota update. - """ # noqa: E501 - name: QuotaName - quota: StrictInt - __properties: ClassVar[List[str]] = ["name", "quota"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of QuotaUpdateResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of QuotaUpdateResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "quota": obj.get("quota") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/quotas_read_response.py b/codegen/out/aignx/codegen/models/quotas_read_response.py deleted file mode 100644 index 7d872a36..00000000 --- a/codegen/out/aignx/codegen/models/quotas_read_response.py +++ /dev/null @@ -1,95 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.quota_read_response import QuotaReadResponse -from typing import Optional, Set -from typing_extensions import Self - -class QuotasReadResponse(BaseModel): - """ - GET response payload for multiple quota reads. - """ # noqa: E501 - quotas: List[QuotaReadResponse] - __properties: ClassVar[List[str]] = ["quotas"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of QuotasReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in quotas (list) - _items = [] - if self.quotas: - for _item_quotas in self.quotas: - if _item_quotas: - _items.append(_item_quotas.to_dict()) - _dict['quotas'] = _items - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of QuotasReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "quotas": [QuotaReadResponse.from_dict(_item) for _item in obj["quotas"]] if obj.get("quotas") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/quotas_update_request.py b/codegen/out/aignx/codegen/models/quotas_update_request.py deleted file mode 100644 index a0834118..00000000 --- a/codegen/out/aignx/codegen/models/quotas_update_request.py +++ /dev/null @@ -1,95 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.quota_update_request import QuotaUpdateRequest -from typing import Optional, Set -from typing_extensions import Self - -class QuotasUpdateRequest(BaseModel): - """ - PATCH request payload for quota updates. - """ # noqa: E501 - quotas: List[QuotaUpdateRequest] - __properties: ClassVar[List[str]] = ["quotas"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of QuotasUpdateRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in quotas (list) - _items = [] - if self.quotas: - for _item_quotas in self.quotas: - if _item_quotas: - _items.append(_item_quotas.to_dict()) - _dict['quotas'] = _items - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of QuotasUpdateRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "quotas": [QuotaUpdateRequest.from_dict(_item) for _item in obj["quotas"]] if obj.get("quotas") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/quotas_update_response.py b/codegen/out/aignx/codegen/models/quotas_update_response.py deleted file mode 100644 index 62df743d..00000000 --- a/codegen/out/aignx/codegen/models/quotas_update_response.py +++ /dev/null @@ -1,95 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.quota_update_response import QuotaUpdateResponse -from typing import Optional, Set -from typing_extensions import Self - -class QuotasUpdateResponse(BaseModel): - """ - PATCH response payload for quota updates. - """ # noqa: E501 - updated_quotas: List[QuotaUpdateResponse] - __properties: ClassVar[List[str]] = ["updated_quotas"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of QuotasUpdateResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in updated_quotas (list) - _items = [] - if self.updated_quotas: - for _item_updated_quotas in self.updated_quotas: - if _item_updated_quotas: - _items.append(_item_updated_quotas.to_dict()) - _dict['updated_quotas'] = _items - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of QuotasUpdateResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "updated_quotas": [QuotaUpdateResponse.from_dict(_item) for _item in obj["updated_quotas"]] if obj.get("updated_quotas") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/run_creation_request.py b/codegen/out/aignx/codegen/models/run_creation_request.py deleted file mode 100644 index 63e970de..00000000 --- a/codegen/out/aignx/codegen/models/run_creation_request.py +++ /dev/null @@ -1,101 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.application_version import ApplicationVersion -from aignx.codegen.models.item_creation_request import ItemCreationRequest -from typing import Optional, Set -from typing_extensions import Self - -class RunCreationRequest(BaseModel): - """ - RunCreationRequest - """ # noqa: E501 - application_version: ApplicationVersion - items: List[ItemCreationRequest] - __properties: ClassVar[List[str]] = ["application_version", "items"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of RunCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of application_version - if self.application_version: - _dict['application_version'] = self.application_version.to_dict() - # override the default output from pydantic by calling `to_dict()` of each item in items (list) - _items = [] - if self.items: - for _item_items in self.items: - if _item_items: - _items.append(_item_items.to_dict()) - _dict['items'] = _items - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of RunCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_version": ApplicationVersion.from_dict(obj["application_version"]) if obj.get("application_version") is not None else None, - "items": [ItemCreationRequest.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/run_creation_response.py b/codegen/out/aignx/codegen/models/run_creation_response.py deleted file mode 100644 index 1cb01e7e..00000000 --- a/codegen/out/aignx/codegen/models/run_creation_response.py +++ /dev/null @@ -1,87 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from typing import Optional, Set -from typing_extensions import Self - -class RunCreationResponse(BaseModel): - """ - RunCreationResponse - """ # noqa: E501 - application_run_id: StrictStr - __properties: ClassVar[List[str]] = ["application_run_id"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of RunCreationResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of RunCreationResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_run_id": obj.get("application_run_id") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/run_read_response.py b/codegen/out/aignx/codegen/models/run_read_response.py deleted file mode 100644 index f348ef6e..00000000 --- a/codegen/out/aignx/codegen/models/run_read_response.py +++ /dev/null @@ -1,110 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from datetime import datetime -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from aignx.codegen.models.application_run_status import ApplicationRunStatus -from aignx.codegen.models.user_payload import UserPayload -from typing import Optional, Set -from typing_extensions import Self - -class RunReadResponse(BaseModel): - """ - RunReadResponse - """ # noqa: E501 - application_run_id: StrictStr - application_version_id: StrictStr - organization_id: StrictStr - user_payload: Optional[UserPayload] = None - status: ApplicationRunStatus - triggered_at: datetime - triggered_by: StrictStr - __properties: ClassVar[List[str]] = ["application_run_id", "application_version_id", "organization_id", "user_payload", "status", "triggered_at", "triggered_by"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of RunReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of user_payload - if self.user_payload: - _dict['user_payload'] = self.user_payload.to_dict() - # set to None if user_payload (nullable) is None - # and model_fields_set contains the field - if self.user_payload is None and "user_payload" in self.model_fields_set: - _dict['user_payload'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of RunReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_run_id": obj.get("application_run_id"), - "application_version_id": obj.get("application_version_id"), - "organization_id": obj.get("organization_id"), - "user_payload": UserPayload.from_dict(obj["user_payload"]) if obj.get("user_payload") is not None else None, - "status": obj.get("status"), - "triggered_at": obj.get("triggered_at"), - "triggered_by": obj.get("triggered_by") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/slug_version_request.py b/codegen/out/aignx/codegen/models/slug_version_request.py deleted file mode 100644 index 4431169a..00000000 --- a/codegen/out/aignx/codegen/models/slug_version_request.py +++ /dev/null @@ -1,97 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator -from typing import Any, ClassVar, Dict, List -from typing_extensions import Annotated -from typing import Optional, Set -from typing_extensions import Self - -class SlugVersionRequest(BaseModel): - """ - SlugVersionRequest - """ # noqa: E501 - application_slug: Annotated[str, Field(strict=True)] - version: StrictStr - __properties: ClassVar[List[str]] = ["application_slug", "version"] - - @field_validator('application_slug') - def application_slug_validate_regular_expression(cls, value): - """Validates the regular expression""" - if not re.match(r"^[a-z](-?[a-z])*$", value): - raise ValueError(r"must validate the regular expression /^[a-z](-?[a-z])*$/") - return value - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of SlugVersionRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of SlugVersionRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_slug": obj.get("application_slug"), - "version": obj.get("version") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/transfer_urls.py b/codegen/out/aignx/codegen/models/transfer_urls.py deleted file mode 100644 index 02b617df..00000000 --- a/codegen/out/aignx/codegen/models/transfer_urls.py +++ /dev/null @@ -1,90 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field -from typing import Any, ClassVar, Dict, List -from typing_extensions import Annotated -from typing import Optional, Set -from typing_extensions import Self - -class TransferUrls(BaseModel): - """ - TransferUrls - """ # noqa: E501 - upload_url: Annotated[str, Field(min_length=1, strict=True)] - download_url: Annotated[str, Field(min_length=1, strict=True)] - __properties: ClassVar[List[str]] = ["upload_url", "download_url"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of TransferUrls from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of TransferUrls from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "upload_url": obj.get("upload_url"), - "download_url": obj.get("download_url") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/user_creation_request.py b/codegen/out/aignx/codegen/models/user_creation_request.py deleted file mode 100644 index 9df30790..00000000 --- a/codegen/out/aignx/codegen/models/user_creation_request.py +++ /dev/null @@ -1,96 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from typing import Optional, Set -from typing_extensions import Self - -class UserCreationRequest(BaseModel): - """ - UserCreationRequest - """ # noqa: E501 - user_id: StrictStr - organization_id: StrictStr - email: Optional[StrictStr] - __properties: ClassVar[List[str]] = ["user_id", "organization_id", "email"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of UserCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if email (nullable) is None - # and model_fields_set contains the field - if self.email is None and "email" in self.model_fields_set: - _dict['email'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of UserCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "user_id": obj.get("user_id"), - "organization_id": obj.get("organization_id"), - "email": obj.get("email") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/user_payload.py b/codegen/out/aignx/codegen/models/user_payload.py deleted file mode 100644 index c6244457..00000000 --- a/codegen/out/aignx/codegen/models/user_payload.py +++ /dev/null @@ -1,119 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from aignx.codegen.models.payload_item import PayloadItem -from aignx.codegen.models.payload_output_artifact import PayloadOutputArtifact -from typing import Optional, Set -from typing_extensions import Self - -class UserPayload(BaseModel): - """ - UserPayload - """ # noqa: E501 - application_id: StrictStr - application_run_id: StrictStr - global_output_artifacts: Optional[Dict[str, PayloadOutputArtifact]] - items: List[PayloadItem] - __properties: ClassVar[List[str]] = ["application_id", "application_run_id", "global_output_artifacts", "items"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of UserPayload from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each value in global_output_artifacts (dict) - _field_dict = {} - if self.global_output_artifacts: - for _key_global_output_artifacts in self.global_output_artifacts: - if self.global_output_artifacts[_key_global_output_artifacts]: - _field_dict[_key_global_output_artifacts] = self.global_output_artifacts[_key_global_output_artifacts].to_dict() - _dict['global_output_artifacts'] = _field_dict - # override the default output from pydantic by calling `to_dict()` of each item in items (list) - _items = [] - if self.items: - for _item_items in self.items: - if _item_items: - _items.append(_item_items.to_dict()) - _dict['items'] = _items - # set to None if global_output_artifacts (nullable) is None - # and model_fields_set contains the field - if self.global_output_artifacts is None and "global_output_artifacts" in self.model_fields_set: - _dict['global_output_artifacts'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of UserPayload from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_id": obj.get("application_id"), - "application_run_id": obj.get("application_run_id"), - "global_output_artifacts": dict( - (_k, PayloadOutputArtifact.from_dict(_v)) - for _k, _v in obj["global_output_artifacts"].items() - ) - if obj.get("global_output_artifacts") is not None - else None, - "items": [PayloadItem.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/user_quota.py b/codegen/out/aignx/codegen/models/user_quota.py deleted file mode 100644 index 847dd28e..00000000 --- a/codegen/out/aignx/codegen/models/user_quota.py +++ /dev/null @@ -1,94 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt -from typing import Any, ClassVar, Dict, List, Optional -from typing import Optional, Set -from typing_extensions import Self - -class UserQuota(BaseModel): - """ - UserQuota - """ # noqa: E501 - total: Optional[StrictInt] - used: StrictInt - __properties: ClassVar[List[str]] = ["total", "used"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of UserQuota from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if total (nullable) is None - # and model_fields_set contains the field - if self.total is None and "total" in self.model_fields_set: - _dict['total'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of UserQuota from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "total": obj.get("total"), - "used": obj.get("used") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/user_response.py b/codegen/out/aignx/codegen/models/user_response.py deleted file mode 100644 index 31b4e60c..00000000 --- a/codegen/out/aignx/codegen/models/user_response.py +++ /dev/null @@ -1,105 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from aignx.codegen.models.user_quota import UserQuota -from typing import Optional, Set -from typing_extensions import Self - -class UserResponse(BaseModel): - """ - UserResponse - """ # noqa: E501 - user_id: Optional[StrictStr] - organization_id: Optional[StrictStr] - slide_quota: UserQuota - __properties: ClassVar[List[str]] = ["user_id", "organization_id", "slide_quota"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of UserResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of slide_quota - if self.slide_quota: - _dict['slide_quota'] = self.slide_quota.to_dict() - # set to None if user_id (nullable) is None - # and model_fields_set contains the field - if self.user_id is None and "user_id" in self.model_fields_set: - _dict['user_id'] = None - - # set to None if organization_id (nullable) is None - # and model_fields_set contains the field - if self.organization_id is None and "organization_id" in self.model_fields_set: - _dict['organization_id'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of UserResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "user_id": obj.get("user_id"), - "organization_id": obj.get("organization_id"), - "slide_quota": UserQuota.from_dict(obj["slide_quota"]) if obj.get("slide_quota") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/user_update_request.py b/codegen/out/aignx/codegen/models/user_update_request.py deleted file mode 100644 index 79569c19..00000000 --- a/codegen/out/aignx/codegen/models/user_update_request.py +++ /dev/null @@ -1,99 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from typing import Optional, Set -from typing_extensions import Self - -class UserUpdateRequest(BaseModel): - """ - UserUpdateRequest - """ # noqa: E501 - user_id: Optional[StrictStr] = None - slide_quota: Optional[StrictInt] = None - __properties: ClassVar[List[str]] = ["user_id", "slide_quota"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of UserUpdateRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if user_id (nullable) is None - # and model_fields_set contains the field - if self.user_id is None and "user_id" in self.model_fields_set: - _dict['user_id'] = None - - # set to None if slide_quota (nullable) is None - # and model_fields_set contains the field - if self.slide_quota is None and "slide_quota" in self.model_fields_set: - _dict['slide_quota'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of UserUpdateRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "user_id": obj.get("user_id"), - "slide_quota": obj.get("slide_quota") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/validation_error.py b/codegen/out/aignx/codegen/models/validation_error.py deleted file mode 100644 index 9270e733..00000000 --- a/codegen/out/aignx/codegen/models/validation_error.py +++ /dev/null @@ -1,99 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.validation_error_loc_inner import ValidationErrorLocInner -from typing import Optional, Set -from typing_extensions import Self - -class ValidationError(BaseModel): - """ - ValidationError - """ # noqa: E501 - loc: List[ValidationErrorLocInner] - msg: StrictStr - type: StrictStr - __properties: ClassVar[List[str]] = ["loc", "msg", "type"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ValidationError from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in loc (list) - _items = [] - if self.loc: - for _item_loc in self.loc: - if _item_loc: - _items.append(_item_loc.to_dict()) - _dict['loc'] = _items - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ValidationError from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "loc": [ValidationErrorLocInner.from_dict(_item) for _item in obj["loc"]] if obj.get("loc") is not None else None, - "msg": obj.get("msg"), - "type": obj.get("type") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/validation_error_loc_inner.py b/codegen/out/aignx/codegen/models/validation_error_loc_inner.py deleted file mode 100644 index 86b63418..00000000 --- a/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +++ /dev/null @@ -1,138 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -from inspect import getfullargspec -import json -import pprint -import re # noqa: F401 -from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr, ValidationError, field_validator -from typing import Optional -from typing import Union, Any, List, Set, TYPE_CHECKING, Optional, Dict -from typing_extensions import Literal, Self -from pydantic import Field - -VALIDATIONERRORLOCINNER_ANY_OF_SCHEMAS = ["int", "str"] - -class ValidationErrorLocInner(BaseModel): - """ - ValidationErrorLocInner - """ - - # data type: str - anyof_schema_1_validator: Optional[StrictStr] = None - # data type: int - anyof_schema_2_validator: Optional[StrictInt] = None - if TYPE_CHECKING: - actual_instance: Optional[Union[int, str]] = None - else: - actual_instance: Any = None - any_of_schemas: Set[str] = { "int", "str" } - - model_config = { - "validate_assignment": True, - "protected_namespaces": (), - } - - def __init__(self, *args, **kwargs) -> None: - if args: - if len(args) > 1: - raise ValueError("If a position argument is used, only 1 is allowed to set `actual_instance`") - if kwargs: - raise ValueError("If a position argument is used, keyword arguments cannot be used.") - super().__init__(actual_instance=args[0]) - else: - super().__init__(**kwargs) - - @field_validator('actual_instance') - def actual_instance_must_validate_anyof(cls, v): - instance = ValidationErrorLocInner.model_construct() - error_messages = [] - # validate data type: str - try: - instance.anyof_schema_1_validator = v - return v - except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - # validate data type: int - try: - instance.anyof_schema_2_validator = v - return v - except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - if error_messages: - # no match - raise ValueError("No match found when setting the actual_instance in ValidationErrorLocInner with anyOf schemas: int, str. Details: " + ", ".join(error_messages)) - else: - return v - - @classmethod - def from_dict(cls, obj: Dict[str, Any]) -> Self: - return cls.from_json(json.dumps(obj)) - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Returns the object represented by the json string""" - instance = cls.model_construct() - error_messages = [] - # deserialize data into str - try: - # validation - instance.anyof_schema_1_validator = json.loads(json_str) - # assign value to actual_instance - instance.actual_instance = instance.anyof_schema_1_validator - return instance - except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - # deserialize data into int - try: - # validation - instance.anyof_schema_2_validator = json.loads(json_str) - # assign value to actual_instance - instance.actual_instance = instance.anyof_schema_2_validator - return instance - except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - - if error_messages: - # no match - raise ValueError("No match found when deserializing the JSON string into ValidationErrorLocInner with anyOf schemas: int, str. Details: " + ", ".join(error_messages)) - else: - return instance - - def to_json(self) -> str: - """Returns the JSON representation of the actual instance""" - if self.actual_instance is None: - return "null" - - if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): - return self.actual_instance.to_json() - else: - return json.dumps(self.actual_instance) - - def to_dict(self) -> Optional[Union[Dict[str, Any], int, str]]: - """Returns the dict representation of the actual instance""" - if self.actual_instance is None: - return None - - if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): - return self.actual_instance.to_dict() - else: - return self.actual_instance - - def to_str(self) -> str: - """Returns the string representation of the actual instance""" - return pprint.pformat(self.model_dump()) - - diff --git a/codegen/out/aignx/codegen/models/version_creation_request.py b/codegen/out/aignx/codegen/models/version_creation_request.py deleted file mode 100644 index 17572c53..00000000 --- a/codegen/out/aignx/codegen/models/version_creation_request.py +++ /dev/null @@ -1,113 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.input_artifact_schema_creation_request import InputArtifactSchemaCreationRequest -from aignx.codegen.models.output_artifact_schema_creation_request import OutputArtifactSchemaCreationRequest -from typing import Optional, Set -from typing_extensions import Self - -class VersionCreationRequest(BaseModel): - """ - VersionCreationRequest - """ # noqa: E501 - version: StrictStr - application_id: StrictStr - flow_id: StrictStr - changelog: StrictStr - input_artifacts: List[InputArtifactSchemaCreationRequest] - output_artifacts: List[OutputArtifactSchemaCreationRequest] - __properties: ClassVar[List[str]] = ["version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of VersionCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) - _items = [] - if self.input_artifacts: - for _item_input_artifacts in self.input_artifacts: - if _item_input_artifacts: - _items.append(_item_input_artifacts.to_dict()) - _dict['input_artifacts'] = _items - # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) - _items = [] - if self.output_artifacts: - for _item_output_artifacts in self.output_artifacts: - if _item_output_artifacts: - _items.append(_item_output_artifacts.to_dict()) - _dict['output_artifacts'] = _items - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of VersionCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "version": obj.get("version"), - "application_id": obj.get("application_id"), - "flow_id": obj.get("flow_id"), - "changelog": obj.get("changelog"), - "input_artifacts": [InputArtifactSchemaCreationRequest.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None, - "output_artifacts": [OutputArtifactSchemaCreationRequest.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/version_creation_response.py b/codegen/out/aignx/codegen/models/version_creation_response.py deleted file mode 100644 index a044dcb1..00000000 --- a/codegen/out/aignx/codegen/models/version_creation_response.py +++ /dev/null @@ -1,87 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from typing import Optional, Set -from typing_extensions import Self - -class VersionCreationResponse(BaseModel): - """ - VersionCreationResponse - """ # noqa: E501 - application_version_id: StrictStr - __properties: ClassVar[List[str]] = ["application_version_id"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of VersionCreationResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of VersionCreationResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_version_id": obj.get("application_version_id") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/version_read_response.py b/codegen/out/aignx/codegen/models/version_read_response.py deleted file mode 100644 index a0cbe4ec..00000000 --- a/codegen/out/aignx/codegen/models/version_read_response.py +++ /dev/null @@ -1,123 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from datetime import datetime -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from aignx.codegen.models.input_artifact import InputArtifact -from aignx.codegen.models.output_artifact import OutputArtifact -from typing import Optional, Set -from typing_extensions import Self - -class VersionReadResponse(BaseModel): - """ - VersionReadResponse - """ # noqa: E501 - application_version_id: StrictStr - version: StrictStr - application_id: StrictStr - flow_id: Optional[StrictStr] = None - changelog: StrictStr - input_artifacts: List[InputArtifact] - output_artifacts: List[OutputArtifact] - created_at: datetime - __properties: ClassVar[List[str]] = ["application_version_id", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts", "created_at"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of VersionReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) - _items = [] - if self.input_artifacts: - for _item_input_artifacts in self.input_artifacts: - if _item_input_artifacts: - _items.append(_item_input_artifacts.to_dict()) - _dict['input_artifacts'] = _items - # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) - _items = [] - if self.output_artifacts: - for _item_output_artifacts in self.output_artifacts: - if _item_output_artifacts: - _items.append(_item_output_artifacts.to_dict()) - _dict['output_artifacts'] = _items - # set to None if flow_id (nullable) is None - # and model_fields_set contains the field - if self.flow_id is None and "flow_id" in self.model_fields_set: - _dict['flow_id'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of VersionReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_version_id": obj.get("application_version_id"), - "version": obj.get("version"), - "application_id": obj.get("application_id"), - "flow_id": obj.get("flow_id"), - "changelog": obj.get("changelog"), - "input_artifacts": [InputArtifact.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None, - "output_artifacts": [OutputArtifact.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None, - "created_at": obj.get("created_at") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/rest.py b/codegen/out/aignx/codegen/rest.py deleted file mode 100644 index 10d53d08..00000000 --- a/codegen/out/aignx/codegen/rest.py +++ /dev/null @@ -1,257 +0,0 @@ -# coding: utf-8 - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -import io -import json -import re -import ssl - -import urllib3 - -from aignx.codegen.exceptions import ApiException, ApiValueError - -SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"} -RESTResponseType = urllib3.HTTPResponse - - -def is_socks_proxy_url(url): - if url is None: - return False - split_section = url.split("://") - if len(split_section) < 2: - return False - else: - return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES - - -class RESTResponse(io.IOBase): - - def __init__(self, resp) -> None: - self.response = resp - self.status = resp.status - self.reason = resp.reason - self.data = None - - def read(self): - if self.data is None: - self.data = self.response.data - return self.data - - def getheaders(self): - """Returns a dictionary of the response headers.""" - return self.response.headers - - def getheader(self, name, default=None): - """Returns a given response header.""" - return self.response.headers.get(name, default) - - -class RESTClientObject: - - def __init__(self, configuration) -> None: - # urllib3.PoolManager will pass all kw parameters to connectionpool - # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501 - # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501 - # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501 - - # cert_reqs - if configuration.verify_ssl: - cert_reqs = ssl.CERT_REQUIRED - else: - cert_reqs = ssl.CERT_NONE - - pool_args = { - "cert_reqs": cert_reqs, - "ca_certs": configuration.ssl_ca_cert, - "cert_file": configuration.cert_file, - "key_file": configuration.key_file, - } - if configuration.assert_hostname is not None: - pool_args['assert_hostname'] = ( - configuration.assert_hostname - ) - - if configuration.retries is not None: - pool_args['retries'] = configuration.retries - - if configuration.tls_server_name: - pool_args['server_hostname'] = configuration.tls_server_name - - - if configuration.socket_options is not None: - pool_args['socket_options'] = configuration.socket_options - - if configuration.connection_pool_maxsize is not None: - pool_args['maxsize'] = configuration.connection_pool_maxsize - - # https pool manager - self.pool_manager: urllib3.PoolManager - - if configuration.proxy: - if is_socks_proxy_url(configuration.proxy): - from urllib3.contrib.socks import SOCKSProxyManager - pool_args["proxy_url"] = configuration.proxy - pool_args["headers"] = configuration.proxy_headers - self.pool_manager = SOCKSProxyManager(**pool_args) - else: - pool_args["proxy_url"] = configuration.proxy - pool_args["proxy_headers"] = configuration.proxy_headers - self.pool_manager = urllib3.ProxyManager(**pool_args) - else: - self.pool_manager = urllib3.PoolManager(**pool_args) - - def request( - self, - method, - url, - headers=None, - body=None, - post_params=None, - _request_timeout=None - ): - """Perform requests. - - :param method: http request method - :param url: http request url - :param headers: http request headers - :param body: request json body, for `application/json` - :param post_params: request post parameters, - `application/x-www-form-urlencoded` - and `multipart/form-data` - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - """ - method = method.upper() - assert method in [ - 'GET', - 'HEAD', - 'DELETE', - 'POST', - 'PUT', - 'PATCH', - 'OPTIONS' - ] - - if post_params and body: - raise ApiValueError( - "body parameter cannot be used with post_params parameter." - ) - - post_params = post_params or {} - headers = headers or {} - - timeout = None - if _request_timeout: - if isinstance(_request_timeout, (int, float)): - timeout = urllib3.Timeout(total=_request_timeout) - elif ( - isinstance(_request_timeout, tuple) - and len(_request_timeout) == 2 - ): - timeout = urllib3.Timeout( - connect=_request_timeout[0], - read=_request_timeout[1] - ) - - try: - # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` - if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: - - # no content type provided or payload is json - content_type = headers.get('Content-Type') - if ( - not content_type - or re.search('json', content_type, re.IGNORECASE) - ): - request_body = None - if body is not None: - request_body = json.dumps(body) - r = self.pool_manager.request( - method, - url, - body=request_body, - timeout=timeout, - headers=headers, - preload_content=False - ) - elif content_type == 'application/x-www-form-urlencoded': - r = self.pool_manager.request( - method, - url, - fields=post_params, - encode_multipart=False, - timeout=timeout, - headers=headers, - preload_content=False - ) - elif content_type == 'multipart/form-data': - # must del headers['Content-Type'], or the correct - # Content-Type which generated by urllib3 will be - # overwritten. - del headers['Content-Type'] - # Ensures that dict objects are serialized - post_params = [(a, json.dumps(b)) if isinstance(b, dict) else (a,b) for a, b in post_params] - r = self.pool_manager.request( - method, - url, - fields=post_params, - encode_multipart=True, - timeout=timeout, - headers=headers, - preload_content=False - ) - # Pass a `string` parameter directly in the body to support - # other content types than JSON when `body` argument is - # provided in serialized form. - elif isinstance(body, str) or isinstance(body, bytes): - r = self.pool_manager.request( - method, - url, - body=body, - timeout=timeout, - headers=headers, - preload_content=False - ) - elif headers['Content-Type'].startswith('text/') and isinstance(body, bool): - request_body = "true" if body else "false" - r = self.pool_manager.request( - method, - url, - body=request_body, - preload_content=False, - timeout=timeout, - headers=headers) - else: - # Cannot generate the request from given parameters - msg = """Cannot prepare a request message for provided - arguments. Please check that your arguments match - declared content type.""" - raise ApiException(status=0, reason=msg) - # For `GET`, `HEAD` - else: - r = self.pool_manager.request( - method, - url, - fields={}, - timeout=timeout, - headers=headers, - preload_content=False - ) - except urllib3.exceptions.SSLError as e: - msg = "\n".join([type(e).__name__, str(e)]) - raise ApiException(status=0, reason=msg) - - return RESTResponse(r) diff --git a/codegen/out/docs/ExternalsApi.md b/codegen/out/docs/ExternalsApi.md deleted file mode 100644 index a6ffda22..00000000 --- a/codegen/out/docs/ExternalsApi.md +++ /dev/null @@ -1,1270 +0,0 @@ -# aignx.codegen.ExternalsApi - -All URIs are relative to *http://localhost* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**cancel_run_v1_runs_application_run_id_cancel_post**](ExternalsApi.md#cancel_run_v1_runs_application_run_id_cancel_post) | **POST** /v1/runs/{application_run_id}/cancel | Cancel Run -[**create_application_run_v1_runs_post**](ExternalsApi.md#create_application_run_v1_runs_post) | **POST** /v1/runs | Create Application Run -[**create_user_v1_users_post**](ExternalsApi.md#create_user_v1_users_post) | **POST** /v1/users/ | Create User -[**delete_run_results_v1_runs_application_run_id_results_delete**](ExternalsApi.md#delete_run_results_v1_runs_application_run_id_results_delete) | **DELETE** /v1/runs/{application_run_id}/results | Delete Run Results -[**get_run_v1_runs_application_run_id_get**](ExternalsApi.md#get_run_v1_runs_application_run_id_get) | **GET** /v1/runs/{application_run_id} | Get Run -[**get_user_v1_users_user_id_get**](ExternalsApi.md#get_user_v1_users_user_id_get) | **GET** /v1/users/{user_id} | Get User -[**get_version_v1_versions_application_version_id_get**](ExternalsApi.md#get_version_v1_versions_application_version_id_get) | **GET** /v1/versions/{application_version_id} | Get Version -[**list_application_runs_v1_runs_get**](ExternalsApi.md#list_application_runs_v1_runs_get) | **GET** /v1/runs | List Application Runs -[**list_applications_v1_applications_get**](ExternalsApi.md#list_applications_v1_applications_get) | **GET** /v1/applications | List Applications -[**list_run_results_v1_runs_application_run_id_results_get**](ExternalsApi.md#list_run_results_v1_runs_application_run_id_results_get) | **GET** /v1/runs/{application_run_id}/results | List Run Results -[**list_versions_by_application_id_v1_applications_application_id_versions_get**](ExternalsApi.md#list_versions_by_application_id_v1_applications_application_id_versions_get) | **GET** /v1/applications/{application_id}/versions | List Versions By Application Id -[**list_versions_by_application_slug_v1_applications_application_slug_versions_get**](ExternalsApi.md#list_versions_by_application_slug_v1_applications_application_slug_versions_get) | **GET** /v1/applications/{application_slug}/versions | List Versions By Application Slug -[**read_application_by_id_v1_applications_application_id_get**](ExternalsApi.md#read_application_by_id_v1_applications_application_id_get) | **GET** /v1/applications/{application_id} | Read Application By Id -[**read_application_by_slug_v1_applications_application_slug_get**](ExternalsApi.md#read_application_by_slug_v1_applications_application_slug_get) | **GET** /v1/applications/{application_slug} | Read Application By Slug -[**register_version_v1_versions_post**](ExternalsApi.md#register_version_v1_versions_post) | **POST** /v1/versions | Register Version -[**update_user_v1_users_user_id_patch**](ExternalsApi.md#update_user_v1_users_user_id_patch) | **PATCH** /v1/users/{user_id} | Update User - - -# **cancel_run_v1_runs_application_run_id_cancel_post** -> object cancel_run_v1_runs_application_run_id_cancel_post(application_run_id) - -Cancel Run - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | - - try: - # Cancel Run - api_response = api_instance.cancel_run_v1_runs_application_run_id_cancel_post(application_run_id) - print("The response of ExternalsApi->cancel_run_v1_runs_application_run_id_cancel_post:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->cancel_run_v1_runs_application_run_id_cancel_post: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | - -### Return type - -**object** - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**202** | Successful Response | - | -**404** | Application run not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **create_application_run_v1_runs_post** -> RunCreationResponse create_application_run_v1_runs_post(run_creation_request) - -Create Application Run - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.run_creation_request import RunCreationRequest -from aignx.codegen.models.run_creation_response import RunCreationResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - run_creation_request = aignx.codegen.RunCreationRequest() # RunCreationRequest | - - try: - # Create Application Run - api_response = api_instance.create_application_run_v1_runs_post(run_creation_request) - print("The response of ExternalsApi->create_application_run_v1_runs_post:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->create_application_run_v1_runs_post: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **run_creation_request** | [**RunCreationRequest**](RunCreationRequest.md)| | - -### Return type - -[**RunCreationResponse**](RunCreationResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**201** | Successful Response | - | -**404** | Application run not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **create_user_v1_users_post** -> UserResponse create_user_v1_users_post(user_creation_request) - -Create User - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.user_creation_request import UserCreationRequest -from aignx.codegen.models.user_response import UserResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - user_creation_request = aignx.codegen.UserCreationRequest() # UserCreationRequest | - - try: - # Create User - api_response = api_instance.create_user_v1_users_post(user_creation_request) - print("The response of ExternalsApi->create_user_v1_users_post:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->create_user_v1_users_post: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **user_creation_request** | [**UserCreationRequest**](UserCreationRequest.md)| | - -### Return type - -[**UserResponse**](UserResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**404** | User not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **delete_run_results_v1_runs_application_run_id_results_delete** -> delete_run_results_v1_runs_application_run_id_results_delete(application_run_id) - -Delete Run Results - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | - - try: - # Delete Run Results - api_instance.delete_run_results_v1_runs_application_run_id_results_delete(application_run_id) - except Exception as e: - print("Exception when calling ExternalsApi->delete_run_results_v1_runs_application_run_id_results_delete: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | - -### Return type - -void (empty response body) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**204** | Successful Response | - | -**404** | Application run not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **get_run_v1_runs_application_run_id_get** -> RunReadResponse get_run_v1_runs_application_run_id_get(application_run_id, include=include) - -Get Run - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.run_read_response import RunReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | - include = None # List[object] | (optional) - - try: - # Get Run - api_response = api_instance.get_run_v1_runs_application_run_id_get(application_run_id, include=include) - print("The response of ExternalsApi->get_run_v1_runs_application_run_id_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->get_run_v1_runs_application_run_id_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | - **include** | [**List[object]**](object.md)| | [optional] - -### Return type - -[**RunReadResponse**](RunReadResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**404** | Application run not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **get_user_v1_users_user_id_get** -> UserResponse get_user_v1_users_user_id_get(user_id) - -Get User - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.user_response import UserResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - user_id = 'user_id_example' # str | - - try: - # Get User - api_response = api_instance.get_user_v1_users_user_id_get(user_id) - print("The response of ExternalsApi->get_user_v1_users_user_id_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->get_user_v1_users_user_id_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **user_id** | **str**| | - -### Return type - -[**UserResponse**](UserResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**404** | User not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **get_version_v1_versions_application_version_id_get** -> VersionReadResponse get_version_v1_versions_application_version_id_get(application_version_id, include=include) - -Get Version - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.version_read_response import VersionReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_version_id = 'application_version_id_example' # str | - include = None # List[object] | (optional) - - try: - # Get Version - api_response = api_instance.get_version_v1_versions_application_version_id_get(application_version_id, include=include) - print("The response of ExternalsApi->get_version_v1_versions_application_version_id_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->get_version_v1_versions_application_version_id_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_version_id** | **str**| | - **include** | [**List[object]**](object.md)| | [optional] - -### Return type - -[**VersionReadResponse**](VersionReadResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **list_application_runs_v1_runs_get** -> List[RunReadResponse] list_application_runs_v1_runs_get(application_id=application_id, application_version_id=application_version_id, include=include, page=page, page_size=page_size, sort=sort) - -List Application Runs - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.run_read_response import RunReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_id = 'application_id_example' # str | (optional) - application_version_id = 'application_version_id_example' # str | (optional) - include = None # List[object] | (optional) - page = 1 # int | (optional) (default to 1) - page_size = 50 # int | (optional) (default to 50) - sort = ['sort_example'] # List[str] | (optional) - - try: - # List Application Runs - api_response = api_instance.list_application_runs_v1_runs_get(application_id=application_id, application_version_id=application_version_id, include=include, page=page, page_size=page_size, sort=sort) - print("The response of ExternalsApi->list_application_runs_v1_runs_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->list_application_runs_v1_runs_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_id** | **str**| | [optional] - **application_version_id** | **str**| | [optional] - **include** | [**List[object]**](object.md)| | [optional] - **page** | **int**| | [optional] [default to 1] - **page_size** | **int**| | [optional] [default to 50] - **sort** | [**List[str]**](str.md)| | [optional] - -### Return type - -[**List[RunReadResponse]**](RunReadResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**404** | Application run not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **list_applications_v1_applications_get** -> List[ApplicationReadResponse] list_applications_v1_applications_get(page=page, page_size=page_size, sort=sort) - -List Applications - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.application_read_response import ApplicationReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - page = 1 # int | (optional) (default to 1) - page_size = 50 # int | (optional) (default to 50) - sort = ['sort_example'] # List[str] | (optional) - - try: - # List Applications - api_response = api_instance.list_applications_v1_applications_get(page=page, page_size=page_size, sort=sort) - print("The response of ExternalsApi->list_applications_v1_applications_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->list_applications_v1_applications_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **page** | **int**| | [optional] [default to 1] - **page_size** | **int**| | [optional] [default to 50] - **sort** | [**List[str]**](str.md)| | [optional] - -### Return type - -[**List[ApplicationReadResponse]**](ApplicationReadResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **list_run_results_v1_runs_application_run_id_results_get** -> List[ItemResultReadResponse] list_run_results_v1_runs_application_run_id_results_get(application_run_id, item_id__in=item_id__in, page=page, page_size=page_size, reference__in=reference__in, status__in=status__in, sort=sort) - -List Run Results - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.item_result_read_response import ItemResultReadResponse -from aignx.codegen.models.item_status import ItemStatus -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | - item_id__in = ['item_id__in_example'] # List[Optional[str]] | (optional) - page = 1 # int | (optional) (default to 1) - page_size = 50 # int | (optional) (default to 50) - reference__in = ['reference__in_example'] # List[str] | (optional) - status__in = [aignx.codegen.ItemStatus()] # List[ItemStatus] | (optional) - sort = ['sort_example'] # List[str] | (optional) - - try: - # List Run Results - api_response = api_instance.list_run_results_v1_runs_application_run_id_results_get(application_run_id, item_id__in=item_id__in, page=page, page_size=page_size, reference__in=reference__in, status__in=status__in, sort=sort) - print("The response of ExternalsApi->list_run_results_v1_runs_application_run_id_results_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->list_run_results_v1_runs_application_run_id_results_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | - **item_id__in** | [**List[Optional[str]]**](str.md)| | [optional] - **page** | **int**| | [optional] [default to 1] - **page_size** | **int**| | [optional] [default to 50] - **reference__in** | [**List[str]**](str.md)| | [optional] - **status__in** | [**List[ItemStatus]**](ItemStatus.md)| | [optional] - **sort** | [**List[str]**](str.md)| | [optional] - -### Return type - -[**List[ItemResultReadResponse]**](ItemResultReadResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**404** | Application run not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **list_versions_by_application_id_v1_applications_application_id_versions_get** -> List[ApplicationVersionReadResponse] list_versions_by_application_id_v1_applications_application_id_versions_get(application_id, page=page, page_size=page_size, version=version, include=include, sort=sort) - -List Versions By Application Id - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_id = 'application_id_example' # str | - page = 1 # int | (optional) (default to 1) - page_size = 50 # int | (optional) (default to 50) - version = 'version_example' # str | (optional) - include = None # List[object] | (optional) - sort = ['sort_example'] # List[str] | (optional) - - try: - # List Versions By Application Id - api_response = api_instance.list_versions_by_application_id_v1_applications_application_id_versions_get(application_id, page=page, page_size=page_size, version=version, include=include, sort=sort) - print("The response of ExternalsApi->list_versions_by_application_id_v1_applications_application_id_versions_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->list_versions_by_application_id_v1_applications_application_id_versions_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_id** | **str**| | - **page** | **int**| | [optional] [default to 1] - **page_size** | **int**| | [optional] [default to 50] - **version** | **str**| | [optional] - **include** | [**List[object]**](object.md)| | [optional] - **sort** | [**List[str]**](str.md)| | [optional] - -### Return type - -[**List[ApplicationVersionReadResponse]**](ApplicationVersionReadResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **list_versions_by_application_slug_v1_applications_application_slug_versions_get** -> List[ApplicationVersionReadResponse] list_versions_by_application_slug_v1_applications_application_slug_versions_get(application_slug, page=page, page_size=page_size, version=version, include=include, sort=sort) - -List Versions By Application Slug - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_slug = 'application_slug_example' # str | - page = 1 # int | (optional) (default to 1) - page_size = 50 # int | (optional) (default to 50) - version = 'version_example' # str | (optional) - include = None # List[object] | (optional) - sort = ['sort_example'] # List[str] | (optional) - - try: - # List Versions By Application Slug - api_response = api_instance.list_versions_by_application_slug_v1_applications_application_slug_versions_get(application_slug, page=page, page_size=page_size, version=version, include=include, sort=sort) - print("The response of ExternalsApi->list_versions_by_application_slug_v1_applications_application_slug_versions_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->list_versions_by_application_slug_v1_applications_application_slug_versions_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_slug** | **str**| | - **page** | **int**| | [optional] [default to 1] - **page_size** | **int**| | [optional] [default to 50] - **version** | **str**| | [optional] - **include** | [**List[object]**](object.md)| | [optional] - **sort** | [**List[str]**](str.md)| | [optional] - -### Return type - -[**List[ApplicationVersionReadResponse]**](ApplicationVersionReadResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **read_application_by_id_v1_applications_application_id_get** -> ApplicationReadResponse read_application_by_id_v1_applications_application_id_get(application_id) - -Read Application By Id - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.application_read_response import ApplicationReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_id = 'application_id_example' # str | - - try: - # Read Application By Id - api_response = api_instance.read_application_by_id_v1_applications_application_id_get(application_id) - print("The response of ExternalsApi->read_application_by_id_v1_applications_application_id_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->read_application_by_id_v1_applications_application_id_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_id** | **str**| | - -### Return type - -[**ApplicationReadResponse**](ApplicationReadResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **read_application_by_slug_v1_applications_application_slug_get** -> ApplicationReadResponse read_application_by_slug_v1_applications_application_slug_get(application_slug) - -Read Application By Slug - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.application_read_response import ApplicationReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_slug = 'application_slug_example' # str | - - try: - # Read Application By Slug - api_response = api_instance.read_application_by_slug_v1_applications_application_slug_get(application_slug) - print("The response of ExternalsApi->read_application_by_slug_v1_applications_application_slug_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->read_application_by_slug_v1_applications_application_slug_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_slug** | **str**| | - -### Return type - -[**ApplicationReadResponse**](ApplicationReadResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **register_version_v1_versions_post** -> VersionCreationResponse register_version_v1_versions_post(version_creation_request) - -Register Version - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.version_creation_request import VersionCreationRequest -from aignx.codegen.models.version_creation_response import VersionCreationResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - version_creation_request = aignx.codegen.VersionCreationRequest() # VersionCreationRequest | - - try: - # Register Version - api_response = api_instance.register_version_v1_versions_post(version_creation_request) - print("The response of ExternalsApi->register_version_v1_versions_post:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->register_version_v1_versions_post: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **version_creation_request** | [**VersionCreationRequest**](VersionCreationRequest.md)| | - -### Return type - -[**VersionCreationResponse**](VersionCreationResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**201** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **update_user_v1_users_user_id_patch** -> UserResponse update_user_v1_users_user_id_patch(user_id, user_update_request) - -Update User - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.user_response import UserResponse -from aignx.codegen.models.user_update_request import UserUpdateRequest -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - user_id = 'user_id_example' # str | - user_update_request = aignx.codegen.UserUpdateRequest() # UserUpdateRequest | - - try: - # Update User - api_response = api_instance.update_user_v1_users_user_id_patch(user_id, user_update_request) - print("The response of ExternalsApi->update_user_v1_users_user_id_patch:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->update_user_v1_users_user_id_patch: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **user_id** | **str**| | - **user_update_request** | [**UserUpdateRequest**](UserUpdateRequest.md)| | - -### Return type - -[**UserResponse**](UserResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**404** | User not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - diff --git a/codegen/out/test/test_externals_api.py b/codegen/out/test/test_externals_api.py deleted file mode 100644 index c23a877a..00000000 --- a/codegen/out/test/test_externals_api.py +++ /dev/null @@ -1,142 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -import unittest - -from aignostics.codegen.api.externals_api import ExternalsApi - - -class TestExternalsApi(unittest.TestCase): - """ExternalsApi unit test stubs""" - - def setUp(self) -> None: - self.api = ExternalsApi() - - def tearDown(self) -> None: - pass - - def test_cancel_run_v1_runs_application_run_id_cancel_post(self) -> None: - """Test case for cancel_run_v1_runs_application_run_id_cancel_post - - Cancel Run - """ - pass - - def test_create_application_run_v1_runs_post(self) -> None: - """Test case for create_application_run_v1_runs_post - - Create Application Run - """ - pass - - def test_create_user_v1_users_post(self) -> None: - """Test case for create_user_v1_users_post - - Create User - """ - pass - - def test_delete_run_results_v1_runs_application_run_id_results_delete(self) -> None: - """Test case for delete_run_results_v1_runs_application_run_id_results_delete - - Delete Run Results - """ - pass - - def test_get_run_v1_runs_application_run_id_get(self) -> None: - """Test case for get_run_v1_runs_application_run_id_get - - Get Run - """ - pass - - def test_get_user_v1_users_user_id_get(self) -> None: - """Test case for get_user_v1_users_user_id_get - - Get User - """ - pass - - def test_get_version_v1_versions_application_version_id_get(self) -> None: - """Test case for get_version_v1_versions_application_version_id_get - - Get Version - """ - pass - - def test_list_application_runs_v1_runs_get(self) -> None: - """Test case for list_application_runs_v1_runs_get - - List Application Runs - """ - pass - - def test_list_applications_v1_applications_get(self) -> None: - """Test case for list_applications_v1_applications_get - - List Applications - """ - pass - - def test_list_run_results_v1_runs_application_run_id_results_get(self) -> None: - """Test case for list_run_results_v1_runs_application_run_id_results_get - - List Run Results - """ - pass - - def test_list_versions_by_application_id_v1_applications_application_id_versions_get(self) -> None: - """Test case for list_versions_by_application_id_v1_applications_application_id_versions_get - - List Versions By Application Id - """ - pass - - def test_list_versions_by_application_slug_v1_applications_application_slug_versions_get(self) -> None: - """Test case for list_versions_by_application_slug_v1_applications_application_slug_versions_get - - List Versions By Application Slug - """ - pass - - def test_read_application_by_id_v1_applications_application_id_get(self) -> None: - """Test case for read_application_by_id_v1_applications_application_id_get - - Read Application By Id - """ - pass - - def test_read_application_by_slug_v1_applications_application_slug_get(self) -> None: - """Test case for read_application_by_slug_v1_applications_application_slug_get - - Read Application By Slug - """ - pass - - def test_register_version_v1_versions_post(self) -> None: - """Test case for register_version_v1_versions_post - - Register Version - """ - pass - - def test_update_user_v1_users_user_id_patch(self) -> None: - """Test case for update_user_v1_users_user_id_patch - - Update User - """ - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/noxfile.py b/noxfile.py index 25a34304..1fd49509 100644 --- a/noxfile.py +++ b/noxfile.py @@ -53,7 +53,7 @@ def lint(session: nox.Session) -> None: "--check", ".", ) - # session.run("mypy", "src") # noqa: ERA001 + session.run("mypy", "src") @nox.session(python=["3.13"]) diff --git a/pyproject.toml b/pyproject.toml index b388ead9..e3122810 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,7 +74,7 @@ dependencies = [ "httpx>=0.28.1", "jsf>=0.11.2", "jsonschema>=4.23.0", - "pyjwt>=2.10.1", + "pyjwt[crypto]>=2.10.1", "python-dotenv>=1.1.0", # Can be removed later "requests>=2.32.3", "requests-oauthlib>=2.0.0", @@ -254,10 +254,10 @@ warn_required_dynamic_aliases = true warn_untyped_fields = true [tool.pytest.ini_options] +testpaths = ["tests", "codegen/out/test"] +# openapi code generate creates tests with test_*.py +python_files = ["*_test.py", "test_*.py"] addopts = "-v --strict-markers --cov=aignostics --cov-report=term-missing --cov-report=xml:reports/coverage.xml --cov-report=html:reports/coverage_html" -testpaths = ["tests"] -python_files = ["*_test.py"] -pythonpath = [".", "src", "codegen/out"] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" env = ["COVERAGE_FILE=.coverage", "COVERAGE_PROCESS_START=pyproject.toml"] diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 9e34c722..63bba87b 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -13,7 +13,6 @@ from dotenv import load_dotenv from requests_oauthlib import OAuth2Session -# load client ids ENV_FILE = os.getenv("ENV_FILE", Path.home() / ".aignostics/env") load_dotenv(dotenv_path=ENV_FILE) @@ -27,6 +26,8 @@ TOKEN_URL = os.getenv("TOKEN_URL") DEVICE_URL = os.getenv("DEVICE_URL") +JWS_JSON_URL = os.getenv("JWS_JSON_URL") + # constants for token caching CLIENT_APP_NAME = "python-sdk" CACHE_DIR = appdirs.user_cache_dir(CLIENT_APP_NAME, "aignostics") @@ -36,11 +37,11 @@ REQUEST_TIMEOUT_SECONDS = 30 -def get_token(store: bool = True) -> str: +def get_token(use_cache: bool = True) -> str: """Retrieves an authentication token, either from cache or via login. Args: - store: Boolean indicating whether to store the token to disk cache. + use_cache: Boolean indicating whether to store & use the token from disk cache. Defaults to True. Returns: @@ -49,10 +50,7 @@ def get_token(store: bool = True) -> str: Raises: RuntimeError: If token retrieval fails. """ - if not store: - return _login() - - if TOKEN_FILE.exists(): + if use_cache and TOKEN_FILE.exists(): stored_token = Path(TOKEN_FILE).read_text(encoding="utf-8") # Parse stored string "token:expiry_timestamp" parts = stored_token.split(":") @@ -63,21 +61,54 @@ def get_token(store: bool = True) -> str: if datetime.now(tz=UTC) + timedelta(minutes=5) < expiry: return token - # If we got here, we need a new token - new_token = _login() - - # we do not need to verify as we just want to obtain the expiry date - claims = jwt.decode(new_token.encode("ascii"), options={"verify_signature": False}) - timestamp = claims["exp"] + # If we end up here, we: + # 1. Do not want to use the cached token + # 2. The cached token is expired + # 3. No token was cached yet + new_token = _authenticate() + claims = verify_and_decode_token(new_token) # Store new token with expiry - TOKEN_FILE.parent.mkdir(parents=True, exist_ok=True) - Path(TOKEN_FILE).write_text(f"{new_token}:{timestamp}", encoding="utf-8") + if use_cache: + timestamp = claims["exp"] + TOKEN_FILE.parent.mkdir(parents=True, exist_ok=True) + Path(TOKEN_FILE).write_text(f"{new_token}:{timestamp}", encoding="utf-8") return new_token -def _login() -> str: +def verify_and_decode_token(token: str) -> dict[str, str]: + """ + Verifies and decodes the JWT token using the public key from JWS JSON URL. + + Args: + token: The JWT token to verify and decode. + + Returns: + dict: The decoded token claims. + + Raises: + RuntimeError: If token verification or decoding fails. + """ + jwk_client = jwt.PyJWKClient(JWS_JSON_URL) + try: + # Get the public key from the JWK client + key = jwk_client.get_signing_key_from_jwt(token).key + # Get the algorithm from the token header + binary_token = token.encode("ascii") + header_data = jwt.get_unverified_header(binary_token) + algorithm = header_data["alg"] + # Verify and decode the token using the public key + return jwt.decode(binary_token, key=key, algorithms=[algorithm], audience=AUDIENCE) + except jwt.exceptions.PyJWKClientError as e: + msg = "Authentication failed" + raise RuntimeError(msg) from e + except jwt.exceptions.DecodeError as e: + msg = "Authentication failed" + raise RuntimeError(msg) from e + + +def _authenticate() -> str: """Allows the user to login and obtain an access token. Determines the appropriate authentication flow based on whether @@ -213,7 +244,7 @@ def _perform_authorization_code_with_pkce_flow() -> str: return token_response["access_token"] -def _perform_device_flow() -> str: +def _perform_device_flow() -> str | None: """Performs the OAuth 2.0 Device Authorization flow. Used when a browser cannot be opened. Provides a URL for the user to visit @@ -254,7 +285,7 @@ def _perform_device_flow() -> str: return resp["access_token"] -def _token_from_refresh_token(refresh_token: str) -> str: +def _token_from_refresh_token(refresh_token: str) -> str | None: """Obtains a new access token using a refresh token. Args: @@ -286,4 +317,4 @@ def _token_from_refresh_token(refresh_token: str) -> str: if __name__ == "__main__": - print(get_token(store=False)) + print(get_token(use_cache=False)) diff --git a/src/aignostics/client/_client.py b/src/aignostics/client/_client.py index 5511a946..074d245b 100644 --- a/src/aignostics/client/_client.py +++ b/src/aignostics/client/_client.py @@ -46,7 +46,7 @@ def get_api_client(cache_token: bool = True) -> ExternalsApi: Raises: RuntimeError: If authentication fails. """ - token = get_token(store=cache_token) + token = get_token(use_cache=cache_token) client = ApiClient( Configuration( host=API_ROOT, diff --git a/uv.lock b/uv.lock index c17d19b4..e7ed39c6 100644 --- a/uv.lock +++ b/uv.lock @@ -24,7 +24,7 @@ dependencies = [ { name = "jsonschema" }, { name = "pydantic" }, { name = "pydantic-settings" }, - { name = "pyjwt" }, + { name = "pyjwt", extra = ["crypto"] }, { name = "python-dotenv" }, { name = "requests" }, { name = "requests-oauthlib" }, @@ -96,7 +96,7 @@ requires-dist = [ { name = "marimo", marker = "extra == 'examples'", specifier = ">=0.12.2" }, { name = "pydantic", specifier = ">=2.11.1" }, { name = "pydantic-settings", specifier = ">=2.8.1" }, - { name = "pyjwt", specifier = ">=2.10.1" }, + { name = "pyjwt", extras = ["crypto"], specifier = ">=2.10.1" }, { name = "python-dotenv", specifier = ">=1.1.0" }, { name = "requests", specifier = ">=2.32.3" }, { name = "requests-oauthlib", specifier = ">=2.0.0" }, @@ -733,6 +733,45 @@ toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] +[[package]] +name = "cryptography" +version = "44.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/25/4ce80c78963834b8a9fd1cc1266be5ed8d1840785c0f2e1b73b8d128d505/cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", size = 710807 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/ef/83e632cfa801b221570c5f58c0369db6fa6cef7d9ff859feab1aae1a8a0f/cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", size = 6676361 }, + { url = "https://files.pythonhosted.org/packages/30/ec/7ea7c1e4c8fc8329506b46c6c4a52e2f20318425d48e0fe597977c71dbce/cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", size = 3952350 }, + { url = "https://files.pythonhosted.org/packages/27/61/72e3afdb3c5ac510330feba4fc1faa0fe62e070592d6ad00c40bb69165e5/cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", size = 4166572 }, + { url = "https://files.pythonhosted.org/packages/26/e4/ba680f0b35ed4a07d87f9e98f3ebccb05091f3bf6b5a478b943253b3bbd5/cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", size = 3958124 }, + { url = "https://files.pythonhosted.org/packages/9c/e8/44ae3e68c8b6d1cbc59040288056df2ad7f7f03bbcaca6b503c737ab8e73/cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", size = 3678122 }, + { url = "https://files.pythonhosted.org/packages/27/7b/664ea5e0d1eab511a10e480baf1c5d3e681c7d91718f60e149cec09edf01/cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", size = 4191831 }, + { url = "https://files.pythonhosted.org/packages/2a/07/79554a9c40eb11345e1861f46f845fa71c9e25bf66d132e123d9feb8e7f9/cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", size = 3960583 }, + { url = "https://files.pythonhosted.org/packages/bb/6d/858e356a49a4f0b591bd6789d821427de18432212e137290b6d8a817e9bf/cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308", size = 4191753 }, + { url = "https://files.pythonhosted.org/packages/b2/80/62df41ba4916067fa6b125aa8c14d7e9181773f0d5d0bd4dcef580d8b7c6/cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", size = 4079550 }, + { url = "https://files.pythonhosted.org/packages/f3/cd/2558cc08f7b1bb40683f99ff4327f8dcfc7de3affc669e9065e14824511b/cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", size = 4298367 }, + { url = "https://files.pythonhosted.org/packages/71/59/94ccc74788945bc3bd4cf355d19867e8057ff5fdbcac781b1ff95b700fb1/cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", size = 2772843 }, + { url = "https://files.pythonhosted.org/packages/ca/2c/0d0bbaf61ba05acb32f0841853cfa33ebb7a9ab3d9ed8bb004bd39f2da6a/cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", size = 3209057 }, + { url = "https://files.pythonhosted.org/packages/9e/be/7a26142e6d0f7683d8a382dd963745e65db895a79a280a30525ec92be890/cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", size = 6677789 }, + { url = "https://files.pythonhosted.org/packages/06/88/638865be7198a84a7713950b1db7343391c6066a20e614f8fa286eb178ed/cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", size = 3951919 }, + { url = "https://files.pythonhosted.org/packages/d7/fc/99fe639bcdf58561dfad1faa8a7369d1dc13f20acd78371bb97a01613585/cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", size = 4167812 }, + { url = "https://files.pythonhosted.org/packages/53/7b/aafe60210ec93d5d7f552592a28192e51d3c6b6be449e7fd0a91399b5d07/cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", size = 3958571 }, + { url = "https://files.pythonhosted.org/packages/16/32/051f7ce79ad5a6ef5e26a92b37f172ee2d6e1cce09931646eef8de1e9827/cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", size = 3679832 }, + { url = "https://files.pythonhosted.org/packages/78/2b/999b2a1e1ba2206f2d3bca267d68f350beb2b048a41ea827e08ce7260098/cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", size = 4193719 }, + { url = "https://files.pythonhosted.org/packages/72/97/430e56e39a1356e8e8f10f723211a0e256e11895ef1a135f30d7d40f2540/cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", size = 3960852 }, + { url = "https://files.pythonhosted.org/packages/89/33/c1cf182c152e1d262cac56850939530c05ca6c8d149aa0dcee490b417e99/cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", size = 4193906 }, + { url = "https://files.pythonhosted.org/packages/e1/99/87cf26d4f125380dc674233971069bc28d19b07f7755b29861570e513650/cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", size = 4081572 }, + { url = "https://files.pythonhosted.org/packages/b3/9f/6a3e0391957cc0c5f84aef9fbdd763035f2b52e998a53f99345e3ac69312/cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", size = 4298631 }, + { url = "https://files.pythonhosted.org/packages/e2/a5/5bc097adb4b6d22a24dea53c51f37e480aaec3465285c253098642696423/cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", size = 2773792 }, + { url = "https://files.pythonhosted.org/packages/33/cf/1f7649b8b9a3543e042d3f348e398a061923ac05b507f3f4d95f11938aa9/cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", size = 3210957 }, + { url = "https://files.pythonhosted.org/packages/d6/d7/f30e75a6aa7d0f65031886fa4a1485c2fbfe25a1896953920f6a9cfe2d3b/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", size = 3887513 }, + { url = "https://files.pythonhosted.org/packages/9c/b4/7a494ce1032323ca9db9a3661894c66e0d7142ad2079a4249303402d8c71/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", size = 4107432 }, + { url = "https://files.pythonhosted.org/packages/45/f8/6b3ec0bc56123b344a8d2b3264a325646d2dcdbdd9848b5e6f3d37db90b3/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", size = 3891421 }, + { url = "https://files.pythonhosted.org/packages/57/ff/f3b4b2d007c2a646b0f69440ab06224f9cf37a977a72cdb7b50632174e8a/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", size = 4107081 }, +] + [[package]] name = "cssutils" version = "2.11.1" @@ -3008,6 +3047,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997 }, ] +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, +] + [[package]] name = "pymdown-extensions" version = "10.14.3" From 9d0816099385cf1d7d0d412a7ac28748cafaf0e2 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Sat, 5 Apr 2025 18:08:36 +0200 Subject: [PATCH 025/110] fix: Add missing codegen/out folder --- codegen/out/.openapi-generator/FILES | 65 + codegen/out/.openapi-generator/VERSION | 1 + .../out/aignx/codegen/api/externals_api.py | 4760 +++++++++++++++++ codegen/out/aignx/codegen/api_client.py | 796 +++ codegen/out/aignx/codegen/api_response.py | 21 + codegen/out/aignx/codegen/configuration.py | 573 ++ codegen/out/aignx/codegen/exceptions.py | 198 + codegen/out/aignx/codegen/models/__init__.py | 57 + .../models/application_creation_request.py | 88 + .../models/application_creation_response.py | 84 + .../models/application_read_response.py | 92 + .../codegen/models/application_run_status.py | 40 + .../codegen/models/application_version.py | 133 + .../application_version_read_response.py | 127 + .../aignx/codegen/models/artifact_event.py | 35 + .../aignx/codegen/models/artifact_status.py | 40 + .../codegen/models/http_validation_error.py | 92 + .../aignx/codegen/models/input_artifact.py | 96 + .../models/input_artifact_creation_request.py | 89 + .../models/input_artifact_read_response.py | 96 + .../input_artifact_schema_creation_request.py | 88 + .../codegen/models/item_creation_request.py | 94 + .../out/aignx/codegen/models/item_event.py | 34 + .../models/item_event_creation_request.py | 87 + .../models/item_event_creation_response.py | 87 + .../codegen/models/item_read_response.py | 103 + .../models/item_result_read_response.py | 108 + .../out/aignx/codegen/models/item_status.py | 38 + .../models/organization_creation_request.py | 90 + .../codegen/models/organization_quota.py | 91 + .../codegen/models/organization_response.py | 94 + .../models/organization_update_request.py | 96 + .../aignx/codegen/models/output_artifact.py | 102 + .../output_artifact_event_trigger_request.py | 94 + .../output_artifact_event_trigger_response.py | 87 + .../models/output_artifact_read_response.py | 99 + .../output_artifact_result_read_response.py | 105 + ...output_artifact_schema_creation_request.py | 94 + .../codegen/models/output_artifact_scope.py | 34 + .../models/output_artifact_visibility.py | 34 + .../codegen/models/payload_input_artifact.py | 89 + .../out/aignx/codegen/models/payload_item.py | 114 + .../codegen/models/payload_output_artifact.py | 95 + .../out/aignx/codegen/models/quota_name.py | 41 + .../codegen/models/quota_read_response.py | 87 + .../codegen/models/quota_update_request.py | 87 + .../codegen/models/quota_update_response.py | 87 + .../codegen/models/quotas_read_response.py | 92 + .../codegen/models/quotas_update_request.py | 92 + .../codegen/models/quotas_update_response.py | 92 + .../codegen/models/run_creation_request.py | 98 + .../codegen/models/run_creation_response.py | 84 + .../aignx/codegen/models/run_read_response.py | 107 + .../codegen/models/slug_version_request.py | 94 + .../out/aignx/codegen/models/transfer_urls.py | 87 + .../codegen/models/user_creation_request.py | 93 + .../out/aignx/codegen/models/user_payload.py | 116 + .../out/aignx/codegen/models/user_quota.py | 91 + .../out/aignx/codegen/models/user_response.py | 102 + .../codegen/models/user_update_request.py | 96 + .../aignx/codegen/models/validation_error.py | 96 + .../models/validation_error_loc_inner.py | 135 + .../models/version_creation_request.py | 110 + .../models/version_creation_response.py | 84 + .../codegen/models/version_read_response.py | 120 + codegen/out/aignx/codegen/rest.py | 256 + codegen/out/docs/ExternalsApi.md | 1269 +++++ codegen/out/test/test_externals_api.py | 142 + 68 files changed, 13198 insertions(+) create mode 100644 codegen/out/.openapi-generator/FILES create mode 100644 codegen/out/.openapi-generator/VERSION create mode 100644 codegen/out/aignx/codegen/api/externals_api.py create mode 100644 codegen/out/aignx/codegen/api_client.py create mode 100644 codegen/out/aignx/codegen/api_response.py create mode 100644 codegen/out/aignx/codegen/configuration.py create mode 100644 codegen/out/aignx/codegen/exceptions.py create mode 100644 codegen/out/aignx/codegen/models/__init__.py create mode 100644 codegen/out/aignx/codegen/models/application_creation_request.py create mode 100644 codegen/out/aignx/codegen/models/application_creation_response.py create mode 100644 codegen/out/aignx/codegen/models/application_read_response.py create mode 100644 codegen/out/aignx/codegen/models/application_run_status.py create mode 100644 codegen/out/aignx/codegen/models/application_version.py create mode 100644 codegen/out/aignx/codegen/models/application_version_read_response.py create mode 100644 codegen/out/aignx/codegen/models/artifact_event.py create mode 100644 codegen/out/aignx/codegen/models/artifact_status.py create mode 100644 codegen/out/aignx/codegen/models/http_validation_error.py create mode 100644 codegen/out/aignx/codegen/models/input_artifact.py create mode 100644 codegen/out/aignx/codegen/models/input_artifact_creation_request.py create mode 100644 codegen/out/aignx/codegen/models/input_artifact_read_response.py create mode 100644 codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py create mode 100644 codegen/out/aignx/codegen/models/item_creation_request.py create mode 100644 codegen/out/aignx/codegen/models/item_event.py create mode 100644 codegen/out/aignx/codegen/models/item_event_creation_request.py create mode 100644 codegen/out/aignx/codegen/models/item_event_creation_response.py create mode 100644 codegen/out/aignx/codegen/models/item_read_response.py create mode 100644 codegen/out/aignx/codegen/models/item_result_read_response.py create mode 100644 codegen/out/aignx/codegen/models/item_status.py create mode 100644 codegen/out/aignx/codegen/models/organization_creation_request.py create mode 100644 codegen/out/aignx/codegen/models/organization_quota.py create mode 100644 codegen/out/aignx/codegen/models/organization_response.py create mode 100644 codegen/out/aignx/codegen/models/organization_update_request.py create mode 100644 codegen/out/aignx/codegen/models/output_artifact.py create mode 100644 codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py create mode 100644 codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py create mode 100644 codegen/out/aignx/codegen/models/output_artifact_read_response.py create mode 100644 codegen/out/aignx/codegen/models/output_artifact_result_read_response.py create mode 100644 codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py create mode 100644 codegen/out/aignx/codegen/models/output_artifact_scope.py create mode 100644 codegen/out/aignx/codegen/models/output_artifact_visibility.py create mode 100644 codegen/out/aignx/codegen/models/payload_input_artifact.py create mode 100644 codegen/out/aignx/codegen/models/payload_item.py create mode 100644 codegen/out/aignx/codegen/models/payload_output_artifact.py create mode 100644 codegen/out/aignx/codegen/models/quota_name.py create mode 100644 codegen/out/aignx/codegen/models/quota_read_response.py create mode 100644 codegen/out/aignx/codegen/models/quota_update_request.py create mode 100644 codegen/out/aignx/codegen/models/quota_update_response.py create mode 100644 codegen/out/aignx/codegen/models/quotas_read_response.py create mode 100644 codegen/out/aignx/codegen/models/quotas_update_request.py create mode 100644 codegen/out/aignx/codegen/models/quotas_update_response.py create mode 100644 codegen/out/aignx/codegen/models/run_creation_request.py create mode 100644 codegen/out/aignx/codegen/models/run_creation_response.py create mode 100644 codegen/out/aignx/codegen/models/run_read_response.py create mode 100644 codegen/out/aignx/codegen/models/slug_version_request.py create mode 100644 codegen/out/aignx/codegen/models/transfer_urls.py create mode 100644 codegen/out/aignx/codegen/models/user_creation_request.py create mode 100644 codegen/out/aignx/codegen/models/user_payload.py create mode 100644 codegen/out/aignx/codegen/models/user_quota.py create mode 100644 codegen/out/aignx/codegen/models/user_response.py create mode 100644 codegen/out/aignx/codegen/models/user_update_request.py create mode 100644 codegen/out/aignx/codegen/models/validation_error.py create mode 100644 codegen/out/aignx/codegen/models/validation_error_loc_inner.py create mode 100644 codegen/out/aignx/codegen/models/version_creation_request.py create mode 100644 codegen/out/aignx/codegen/models/version_creation_response.py create mode 100644 codegen/out/aignx/codegen/models/version_read_response.py create mode 100644 codegen/out/aignx/codegen/rest.py create mode 100644 codegen/out/docs/ExternalsApi.md create mode 100644 codegen/out/test/test_externals_api.py diff --git a/codegen/out/.openapi-generator/FILES b/codegen/out/.openapi-generator/FILES new file mode 100644 index 00000000..b65f8044 --- /dev/null +++ b/codegen/out/.openapi-generator/FILES @@ -0,0 +1,65 @@ +aignx/codegen/api/externals_api.py +aignx/codegen/api_client.py +aignx/codegen/api_response.py +aignx/codegen/configuration.py +aignx/codegen/exceptions.py +aignx/codegen/models/application_creation_request.py +aignx/codegen/models/application_creation_response.py +aignx/codegen/models/application_read_response.py +aignx/codegen/models/application_run_status.py +aignx/codegen/models/application_version.py +aignx/codegen/models/application_version_read_response.py +aignx/codegen/models/artifact_event.py +aignx/codegen/models/artifact_status.py +aignx/codegen/models/http_validation_error.py +aignx/codegen/models/input_artifact.py +aignx/codegen/models/input_artifact_creation_request.py +aignx/codegen/models/input_artifact_read_response.py +aignx/codegen/models/input_artifact_schema_creation_request.py +aignx/codegen/models/item_creation_request.py +aignx/codegen/models/item_event.py +aignx/codegen/models/item_event_creation_request.py +aignx/codegen/models/item_event_creation_response.py +aignx/codegen/models/item_read_response.py +aignx/codegen/models/item_result_read_response.py +aignx/codegen/models/item_status.py +aignx/codegen/models/organization_creation_request.py +aignx/codegen/models/organization_quota.py +aignx/codegen/models/organization_response.py +aignx/codegen/models/organization_update_request.py +aignx/codegen/models/output_artifact.py +aignx/codegen/models/output_artifact_event_trigger_request.py +aignx/codegen/models/output_artifact_event_trigger_response.py +aignx/codegen/models/output_artifact_read_response.py +aignx/codegen/models/output_artifact_result_read_response.py +aignx/codegen/models/output_artifact_schema_creation_request.py +aignx/codegen/models/output_artifact_scope.py +aignx/codegen/models/output_artifact_visibility.py +aignx/codegen/models/payload_input_artifact.py +aignx/codegen/models/payload_item.py +aignx/codegen/models/payload_output_artifact.py +aignx/codegen/models/quota_name.py +aignx/codegen/models/quota_read_response.py +aignx/codegen/models/quota_update_request.py +aignx/codegen/models/quota_update_response.py +aignx/codegen/models/quotas_read_response.py +aignx/codegen/models/quotas_update_request.py +aignx/codegen/models/quotas_update_response.py +aignx/codegen/models/run_creation_request.py +aignx/codegen/models/run_creation_response.py +aignx/codegen/models/run_read_response.py +aignx/codegen/models/slug_version_request.py +aignx/codegen/models/transfer_urls.py +aignx/codegen/models/user_creation_request.py +aignx/codegen/models/user_payload.py +aignx/codegen/models/user_quota.py +aignx/codegen/models/user_response.py +aignx/codegen/models/user_update_request.py +aignx/codegen/models/validation_error.py +aignx/codegen/models/validation_error_loc_inner.py +aignx/codegen/models/version_creation_request.py +aignx/codegen/models/version_creation_response.py +aignx/codegen/models/version_read_response.py +aignx/codegen/rest.py +docs/ExternalsApi.md +test/test_externals_api.py diff --git a/codegen/out/.openapi-generator/VERSION b/codegen/out/.openapi-generator/VERSION new file mode 100644 index 00000000..758bb9c8 --- /dev/null +++ b/codegen/out/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.10.0 diff --git a/codegen/out/aignx/codegen/api/externals_api.py b/codegen/out/aignx/codegen/api/externals_api.py new file mode 100644 index 00000000..588cf0ee --- /dev/null +++ b/codegen/out/aignx/codegen/api/externals_api.py @@ -0,0 +1,4760 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + +import warnings +from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt +from typing import Any, Dict, List, Optional, Tuple, Union +from typing_extensions import Annotated + +from pydantic import Field, StrictStr, field_validator +from typing import Any, List, Optional +from typing_extensions import Annotated +from aignx.codegen.models.application_read_response import ApplicationReadResponse +from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse +from aignx.codegen.models.item_result_read_response import ItemResultReadResponse +from aignx.codegen.models.item_status import ItemStatus +from aignx.codegen.models.run_creation_request import RunCreationRequest +from aignx.codegen.models.run_creation_response import RunCreationResponse +from aignx.codegen.models.run_read_response import RunReadResponse +from aignx.codegen.models.user_creation_request import UserCreationRequest +from aignx.codegen.models.user_response import UserResponse +from aignx.codegen.models.user_update_request import UserUpdateRequest +from aignx.codegen.models.version_creation_request import VersionCreationRequest +from aignx.codegen.models.version_creation_response import VersionCreationResponse +from aignx.codegen.models.version_read_response import VersionReadResponse + +from aignx.codegen.api_client import ApiClient, RequestSerialized +from aignx.codegen.api_response import ApiResponse +from aignx.codegen.rest import RESTResponseType + + +class ExternalsApi: + """NOTE: This class is auto generated by OpenAPI Generator + Ref: https://openapi-generator.tech + + Do not edit the class manually. + """ + + def __init__(self, api_client=None) -> None: + if api_client is None: + api_client = ApiClient.get_default() + self.api_client = api_client + + + @validate_call + def cancel_run_v1_runs_application_run_id_cancel_post( + self, + application_run_id: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> object: + """Cancel Run + + + :param application_run_id: (required) + :type application_run_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( + application_run_id=application_run_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '202': "object", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def cancel_run_v1_runs_application_run_id_cancel_post_with_http_info( + self, + application_run_id: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[object]: + """Cancel Run + + + :param application_run_id: (required) + :type application_run_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( + application_run_id=application_run_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '202': "object", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def cancel_run_v1_runs_application_run_id_cancel_post_without_preload_content( + self, + application_run_id: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Cancel Run + + + :param application_run_id: (required) + :type application_run_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( + application_run_id=application_run_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '202': "object", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _cancel_run_v1_runs_application_run_id_cancel_post_serialize( + self, + application_run_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if application_run_id is not None: + _path_params['application_run_id'] = application_run_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='POST', + resource_path='/v1/runs/{application_run_id}/cancel', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def create_application_run_v1_runs_post( + self, + run_creation_request: RunCreationRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RunCreationResponse: + """Create Application Run + + + :param run_creation_request: (required) + :type run_creation_request: RunCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._create_application_run_v1_runs_post_serialize( + run_creation_request=run_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '201': "RunCreationResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def create_application_run_v1_runs_post_with_http_info( + self, + run_creation_request: RunCreationRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[RunCreationResponse]: + """Create Application Run + + + :param run_creation_request: (required) + :type run_creation_request: RunCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._create_application_run_v1_runs_post_serialize( + run_creation_request=run_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '201': "RunCreationResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def create_application_run_v1_runs_post_without_preload_content( + self, + run_creation_request: RunCreationRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Create Application Run + + + :param run_creation_request: (required) + :type run_creation_request: RunCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._create_application_run_v1_runs_post_serialize( + run_creation_request=run_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '201': "RunCreationResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _create_application_run_v1_runs_post_serialize( + self, + run_creation_request, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + if run_creation_request is not None: + _body_params = run_creation_request + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + # set the HTTP header `Content-Type` + if _content_type: + _header_params['Content-Type'] = _content_type + else: + _default_content_type = ( + self.api_client.select_header_content_type( + [ + 'application/json' + ] + ) + ) + if _default_content_type is not None: + _header_params['Content-Type'] = _default_content_type + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='POST', + resource_path='/v1/runs', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def create_user_v1_users_post( + self, + user_creation_request: UserCreationRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> UserResponse: + """Create User + + + :param user_creation_request: (required) + :type user_creation_request: UserCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._create_user_v1_users_post_serialize( + user_creation_request=user_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def create_user_v1_users_post_with_http_info( + self, + user_creation_request: UserCreationRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[UserResponse]: + """Create User + + + :param user_creation_request: (required) + :type user_creation_request: UserCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._create_user_v1_users_post_serialize( + user_creation_request=user_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def create_user_v1_users_post_without_preload_content( + self, + user_creation_request: UserCreationRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Create User + + + :param user_creation_request: (required) + :type user_creation_request: UserCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._create_user_v1_users_post_serialize( + user_creation_request=user_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _create_user_v1_users_post_serialize( + self, + user_creation_request, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + if user_creation_request is not None: + _body_params = user_creation_request + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + # set the HTTP header `Content-Type` + if _content_type: + _header_params['Content-Type'] = _content_type + else: + _default_content_type = ( + self.api_client.select_header_content_type( + [ + 'application/json' + ] + ) + ) + if _default_content_type is not None: + _header_params['Content-Type'] = _default_content_type + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='POST', + resource_path='/v1/users/', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def delete_run_results_v1_runs_application_run_id_results_delete( + self, + application_run_id: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> None: + """Delete Run Results + + + :param application_run_id: (required) + :type application_run_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + application_run_id=application_run_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '204': None, + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( + self, + application_run_id: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[None]: + """Delete Run Results + + + :param application_run_id: (required) + :type application_run_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + application_run_id=application_run_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '204': None, + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def delete_run_results_v1_runs_application_run_id_results_delete_without_preload_content( + self, + application_run_id: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Delete Run Results + + + :param application_run_id: (required) + :type application_run_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + application_run_id=application_run_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '204': None, + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( + self, + application_run_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if application_run_id is not None: + _path_params['application_run_id'] = application_run_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='DELETE', + resource_path='/v1/runs/{application_run_id}/results', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def get_run_v1_runs_application_run_id_get( + self, + application_run_id: StrictStr, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RunReadResponse: + """Get Run + + + :param application_run_id: (required) + :type application_run_id: str + :param include: + :type include: List[object] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_run_v1_runs_application_run_id_get_serialize( + application_run_id=application_run_id, + include=include, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "RunReadResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def get_run_v1_runs_application_run_id_get_with_http_info( + self, + application_run_id: StrictStr, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[RunReadResponse]: + """Get Run + + + :param application_run_id: (required) + :type application_run_id: str + :param include: + :type include: List[object] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_run_v1_runs_application_run_id_get_serialize( + application_run_id=application_run_id, + include=include, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "RunReadResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def get_run_v1_runs_application_run_id_get_without_preload_content( + self, + application_run_id: StrictStr, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Get Run + + + :param application_run_id: (required) + :type application_run_id: str + :param include: + :type include: List[object] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_run_v1_runs_application_run_id_get_serialize( + application_run_id=application_run_id, + include=include, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "RunReadResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _get_run_v1_runs_application_run_id_get_serialize( + self, + application_run_id, + include, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + 'include': 'multi', + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if application_run_id is not None: + _path_params['application_run_id'] = application_run_id + # process the query parameters + if include is not None: + + _query_params.append(('include', include)) + + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/v1/runs/{application_run_id}', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def get_user_v1_users_user_id_get( + self, + user_id: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> UserResponse: + """Get User + + + :param user_id: (required) + :type user_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_user_v1_users_user_id_get_serialize( + user_id=user_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def get_user_v1_users_user_id_get_with_http_info( + self, + user_id: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[UserResponse]: + """Get User + + + :param user_id: (required) + :type user_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_user_v1_users_user_id_get_serialize( + user_id=user_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def get_user_v1_users_user_id_get_without_preload_content( + self, + user_id: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Get User + + + :param user_id: (required) + :type user_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_user_v1_users_user_id_get_serialize( + user_id=user_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _get_user_v1_users_user_id_get_serialize( + self, + user_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if user_id is not None: + _path_params['user_id'] = user_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/v1/users/{user_id}', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def get_version_v1_versions_application_version_id_get( + self, + application_version_id: StrictStr, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> VersionReadResponse: + """Get Version + + + :param application_version_id: (required) + :type application_version_id: str + :param include: + :type include: List[object] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_version_v1_versions_application_version_id_get_serialize( + application_version_id=application_version_id, + include=include, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "VersionReadResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def get_version_v1_versions_application_version_id_get_with_http_info( + self, + application_version_id: StrictStr, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[VersionReadResponse]: + """Get Version + + + :param application_version_id: (required) + :type application_version_id: str + :param include: + :type include: List[object] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_version_v1_versions_application_version_id_get_serialize( + application_version_id=application_version_id, + include=include, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "VersionReadResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def get_version_v1_versions_application_version_id_get_without_preload_content( + self, + application_version_id: StrictStr, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Get Version + + + :param application_version_id: (required) + :type application_version_id: str + :param include: + :type include: List[object] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._get_version_v1_versions_application_version_id_get_serialize( + application_version_id=application_version_id, + include=include, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "VersionReadResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _get_version_v1_versions_application_version_id_get_serialize( + self, + application_version_id, + include, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + 'include': 'multi', + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if application_version_id is not None: + _path_params['application_version_id'] = application_version_id + # process the query parameters + if include is not None: + + _query_params.append(('include', include)) + + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/v1/versions/{application_version_id}', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def list_application_runs_v1_runs_get( + self, + application_id: Optional[StrictStr] = None, + application_version_id: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> List[RunReadResponse]: + """List Application Runs + + + :param application_id: + :type application_id: str + :param application_version_id: + :type application_version_id: str + :param include: + :type include: List[object] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_application_runs_v1_runs_get_serialize( + application_id=application_id, + application_version_id=application_version_id, + include=include, + page=page, + page_size=page_size, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[RunReadResponse]", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def list_application_runs_v1_runs_get_with_http_info( + self, + application_id: Optional[StrictStr] = None, + application_version_id: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[List[RunReadResponse]]: + """List Application Runs + + + :param application_id: + :type application_id: str + :param application_version_id: + :type application_version_id: str + :param include: + :type include: List[object] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_application_runs_v1_runs_get_serialize( + application_id=application_id, + application_version_id=application_version_id, + include=include, + page=page, + page_size=page_size, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[RunReadResponse]", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def list_application_runs_v1_runs_get_without_preload_content( + self, + application_id: Optional[StrictStr] = None, + application_version_id: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """List Application Runs + + + :param application_id: + :type application_id: str + :param application_version_id: + :type application_version_id: str + :param include: + :type include: List[object] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_application_runs_v1_runs_get_serialize( + application_id=application_id, + application_version_id=application_version_id, + include=include, + page=page, + page_size=page_size, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[RunReadResponse]", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _list_application_runs_v1_runs_get_serialize( + self, + application_id, + application_version_id, + include, + page, + page_size, + sort, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + 'include': 'multi', + 'sort': 'multi', + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + # process the query parameters + if application_id is not None: + + _query_params.append(('application_id', application_id)) + + if application_version_id is not None: + + _query_params.append(('application_version_id', application_version_id)) + + if include is not None: + + _query_params.append(('include', include)) + + if page is not None: + + _query_params.append(('page', page)) + + if page_size is not None: + + _query_params.append(('page_size', page_size)) + + if sort is not None: + + _query_params.append(('sort', sort)) + + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/v1/runs', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def list_applications_v1_applications_get( + self, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> List[ApplicationReadResponse]: + """List Applications + + + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_applications_v1_applications_get_serialize( + page=page, + page_size=page_size, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationReadResponse]", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def list_applications_v1_applications_get_with_http_info( + self, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[List[ApplicationReadResponse]]: + """List Applications + + + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_applications_v1_applications_get_serialize( + page=page, + page_size=page_size, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationReadResponse]", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def list_applications_v1_applications_get_without_preload_content( + self, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """List Applications + + + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_applications_v1_applications_get_serialize( + page=page, + page_size=page_size, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationReadResponse]", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _list_applications_v1_applications_get_serialize( + self, + page, + page_size, + sort, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + 'sort': 'multi', + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + # process the query parameters + if page is not None: + + _query_params.append(('page', page)) + + if page_size is not None: + + _query_params.append(('page_size', page_size)) + + if sort is not None: + + _query_params.append(('sort', sort)) + + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/v1/applications', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def list_run_results_v1_runs_application_run_id_results_get( + self, + application_run_id: StrictStr, + item_id__in: Optional[List[Optional[StrictStr]]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + reference__in: Optional[List[StrictStr]] = None, + status__in: Optional[List[ItemStatus]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> List[ItemResultReadResponse]: + """List Run Results + + + :param application_run_id: (required) + :type application_run_id: str + :param item_id__in: + :type item_id__in: List[Optional[str]] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param reference__in: + :type reference__in: List[str] + :param status__in: + :type status__in: List[ItemStatus] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( + application_run_id=application_run_id, + item_id__in=item_id__in, + page=page, + page_size=page_size, + reference__in=reference__in, + status__in=status__in, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ItemResultReadResponse]", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def list_run_results_v1_runs_application_run_id_results_get_with_http_info( + self, + application_run_id: StrictStr, + item_id__in: Optional[List[Optional[StrictStr]]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + reference__in: Optional[List[StrictStr]] = None, + status__in: Optional[List[ItemStatus]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[List[ItemResultReadResponse]]: + """List Run Results + + + :param application_run_id: (required) + :type application_run_id: str + :param item_id__in: + :type item_id__in: List[Optional[str]] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param reference__in: + :type reference__in: List[str] + :param status__in: + :type status__in: List[ItemStatus] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( + application_run_id=application_run_id, + item_id__in=item_id__in, + page=page, + page_size=page_size, + reference__in=reference__in, + status__in=status__in, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ItemResultReadResponse]", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def list_run_results_v1_runs_application_run_id_results_get_without_preload_content( + self, + application_run_id: StrictStr, + item_id__in: Optional[List[Optional[StrictStr]]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + reference__in: Optional[List[StrictStr]] = None, + status__in: Optional[List[ItemStatus]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """List Run Results + + + :param application_run_id: (required) + :type application_run_id: str + :param item_id__in: + :type item_id__in: List[Optional[str]] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param reference__in: + :type reference__in: List[str] + :param status__in: + :type status__in: List[ItemStatus] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( + application_run_id=application_run_id, + item_id__in=item_id__in, + page=page, + page_size=page_size, + reference__in=reference__in, + status__in=status__in, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ItemResultReadResponse]", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _list_run_results_v1_runs_application_run_id_results_get_serialize( + self, + application_run_id, + item_id__in, + page, + page_size, + reference__in, + status__in, + sort, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + 'item_id__in': 'multi', + 'reference__in': 'multi', + 'status__in': 'multi', + 'sort': 'multi', + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if application_run_id is not None: + _path_params['application_run_id'] = application_run_id + # process the query parameters + if item_id__in is not None: + + _query_params.append(('item_id__in', item_id__in)) + + if page is not None: + + _query_params.append(('page', page)) + + if page_size is not None: + + _query_params.append(('page_size', page_size)) + + if reference__in is not None: + + _query_params.append(('reference__in', reference__in)) + + if status__in is not None: + + _query_params.append(('status__in', status__in)) + + if sort is not None: + + _query_params.append(('sort', sort)) + + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/v1/runs/{application_run_id}/results', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def list_versions_by_application_id_v1_applications_application_id_versions_get( + self, + application_id: StrictStr, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> List[ApplicationVersionReadResponse]: + """List Versions By Application Id + + + :param application_id: (required) + :type application_id: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( + application_id=application_id, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationVersionReadResponse]", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def list_versions_by_application_id_v1_applications_application_id_versions_get_with_http_info( + self, + application_id: StrictStr, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[List[ApplicationVersionReadResponse]]: + """List Versions By Application Id + + + :param application_id: (required) + :type application_id: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( + application_id=application_id, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationVersionReadResponse]", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def list_versions_by_application_id_v1_applications_application_id_versions_get_without_preload_content( + self, + application_id: StrictStr, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """List Versions By Application Id + + + :param application_id: (required) + :type application_id: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( + application_id=application_id, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationVersionReadResponse]", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( + self, + application_id, + page, + page_size, + version, + include, + sort, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + 'include': 'multi', + 'sort': 'multi', + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if application_id is not None: + _path_params['application_id'] = application_id + # process the query parameters + if page is not None: + + _query_params.append(('page', page)) + + if page_size is not None: + + _query_params.append(('page_size', page_size)) + + if version is not None: + + _query_params.append(('version', version)) + + if include is not None: + + _query_params.append(('include', include)) + + if sort is not None: + + _query_params.append(('sort', sort)) + + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/v1/applications/{application_id}/versions', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def list_versions_by_application_slug_v1_applications_application_slug_versions_get( + self, + application_slug: Annotated[str, Field(strict=True)], + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> List[ApplicationVersionReadResponse]: + """List Versions By Application Slug + + + :param application_slug: (required) + :type application_slug: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( + application_slug=application_slug, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationVersionReadResponse]", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def list_versions_by_application_slug_v1_applications_application_slug_versions_get_with_http_info( + self, + application_slug: Annotated[str, Field(strict=True)], + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[List[ApplicationVersionReadResponse]]: + """List Versions By Application Slug + + + :param application_slug: (required) + :type application_slug: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( + application_slug=application_slug, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationVersionReadResponse]", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def list_versions_by_application_slug_v1_applications_application_slug_versions_get_without_preload_content( + self, + application_slug: Annotated[str, Field(strict=True)], + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """List Versions By Application Slug + + + :param application_slug: (required) + :type application_slug: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( + application_slug=application_slug, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "List[ApplicationVersionReadResponse]", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( + self, + application_slug, + page, + page_size, + version, + include, + sort, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + 'include': 'multi', + 'sort': 'multi', + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if application_slug is not None: + _path_params['application_slug'] = application_slug + # process the query parameters + if page is not None: + + _query_params.append(('page', page)) + + if page_size is not None: + + _query_params.append(('page_size', page_size)) + + if version is not None: + + _query_params.append(('version', version)) + + if include is not None: + + _query_params.append(('include', include)) + + if sort is not None: + + _query_params.append(('sort', sort)) + + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/v1/applications/{application_slug}/versions', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def read_application_by_id_v1_applications_application_id_get( + self, + application_id: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApplicationReadResponse: + """Read Application By Id + + + :param application_id: (required) + :type application_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._read_application_by_id_v1_applications_application_id_get_serialize( + application_id=application_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "ApplicationReadResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def read_application_by_id_v1_applications_application_id_get_with_http_info( + self, + application_id: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[ApplicationReadResponse]: + """Read Application By Id + + + :param application_id: (required) + :type application_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._read_application_by_id_v1_applications_application_id_get_serialize( + application_id=application_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "ApplicationReadResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def read_application_by_id_v1_applications_application_id_get_without_preload_content( + self, + application_id: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Read Application By Id + + + :param application_id: (required) + :type application_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._read_application_by_id_v1_applications_application_id_get_serialize( + application_id=application_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "ApplicationReadResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _read_application_by_id_v1_applications_application_id_get_serialize( + self, + application_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if application_id is not None: + _path_params['application_id'] = application_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/v1/applications/{application_id}', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def read_application_by_slug_v1_applications_application_slug_get( + self, + application_slug: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApplicationReadResponse: + """Read Application By Slug + + + :param application_slug: (required) + :type application_slug: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( + application_slug=application_slug, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "ApplicationReadResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def read_application_by_slug_v1_applications_application_slug_get_with_http_info( + self, + application_slug: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[ApplicationReadResponse]: + """Read Application By Slug + + + :param application_slug: (required) + :type application_slug: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( + application_slug=application_slug, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "ApplicationReadResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def read_application_by_slug_v1_applications_application_slug_get_without_preload_content( + self, + application_slug: StrictStr, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Read Application By Slug + + + :param application_slug: (required) + :type application_slug: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( + application_slug=application_slug, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "ApplicationReadResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _read_application_by_slug_v1_applications_application_slug_get_serialize( + self, + application_slug, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if application_slug is not None: + _path_params['application_slug'] = application_slug + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/v1/applications/{application_slug}', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def register_version_v1_versions_post( + self, + version_creation_request: VersionCreationRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> VersionCreationResponse: + """Register Version + + + :param version_creation_request: (required) + :type version_creation_request: VersionCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._register_version_v1_versions_post_serialize( + version_creation_request=version_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '201': "VersionCreationResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def register_version_v1_versions_post_with_http_info( + self, + version_creation_request: VersionCreationRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[VersionCreationResponse]: + """Register Version + + + :param version_creation_request: (required) + :type version_creation_request: VersionCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._register_version_v1_versions_post_serialize( + version_creation_request=version_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '201': "VersionCreationResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def register_version_v1_versions_post_without_preload_content( + self, + version_creation_request: VersionCreationRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Register Version + + + :param version_creation_request: (required) + :type version_creation_request: VersionCreationRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._register_version_v1_versions_post_serialize( + version_creation_request=version_creation_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '201': "VersionCreationResponse", + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _register_version_v1_versions_post_serialize( + self, + version_creation_request, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + if version_creation_request is not None: + _body_params = version_creation_request + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + # set the HTTP header `Content-Type` + if _content_type: + _header_params['Content-Type'] = _content_type + else: + _default_content_type = ( + self.api_client.select_header_content_type( + [ + 'application/json' + ] + ) + ) + if _default_content_type is not None: + _header_params['Content-Type'] = _default_content_type + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='POST', + resource_path='/v1/versions', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def update_user_v1_users_user_id_patch( + self, + user_id: StrictStr, + user_update_request: UserUpdateRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> UserResponse: + """Update User + + + :param user_id: (required) + :type user_id: str + :param user_update_request: (required) + :type user_update_request: UserUpdateRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._update_user_v1_users_user_id_patch_serialize( + user_id=user_id, + user_update_request=user_update_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def update_user_v1_users_user_id_patch_with_http_info( + self, + user_id: StrictStr, + user_update_request: UserUpdateRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[UserResponse]: + """Update User + + + :param user_id: (required) + :type user_id: str + :param user_update_request: (required) + :type user_update_request: UserUpdateRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._update_user_v1_users_user_id_patch_serialize( + user_id=user_id, + user_update_request=user_update_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def update_user_v1_users_user_id_patch_without_preload_content( + self, + user_id: StrictStr, + user_update_request: UserUpdateRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Update User + + + :param user_id: (required) + :type user_id: str + :param user_update_request: (required) + :type user_update_request: UserUpdateRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._update_user_v1_users_user_id_patch_serialize( + user_id=user_id, + user_update_request=user_update_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "UserResponse", + '404': None, + '422': "HTTPValidationError", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _update_user_v1_users_user_id_patch_serialize( + self, + user_id, + user_update_request, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if user_id is not None: + _path_params['user_id'] = user_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + if user_update_request is not None: + _body_params = user_update_request + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + # set the HTTP header `Content-Type` + if _content_type: + _header_params['Content-Type'] = _content_type + else: + _default_content_type = ( + self.api_client.select_header_content_type( + [ + 'application/json' + ] + ) + ) + if _default_content_type is not None: + _header_params['Content-Type'] = _default_content_type + + # authentication setting + _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' + ] + + return self.api_client.param_serialize( + method='PATCH', + resource_path='/v1/users/{user_id}', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) diff --git a/codegen/out/aignx/codegen/api_client.py b/codegen/out/aignx/codegen/api_client.py new file mode 100644 index 00000000..7c690b8c --- /dev/null +++ b/codegen/out/aignx/codegen/api_client.py @@ -0,0 +1,796 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import datetime +from dateutil.parser import parse +from enum import Enum +import decimal +import json +import mimetypes +import os +import re +import tempfile + +from urllib.parse import quote +from typing import Tuple, Optional, List, Dict, Union +from pydantic import SecretStr + +from aignx.codegen.configuration import Configuration +from aignx.codegen.api_response import ApiResponse, T as ApiResponseT +import aignx.codegen.models +from aignx.codegen import rest +from aignx.codegen.exceptions import ( + ApiValueError, + ApiException, + BadRequestException, + UnauthorizedException, + ForbiddenException, + NotFoundException, + ServiceException +) + +RequestSerialized = Tuple[str, str, Dict[str, str], Optional[str], List[str]] + +class ApiClient: + """Generic API client for OpenAPI client library builds. + + OpenAPI generic API client. This client handles the client- + server communication, and is invariant across implementations. Specifics of + the methods and models for each application are generated from the OpenAPI + templates. + + :param configuration: .Configuration object for this client + :param header_name: a header to pass when making calls to the API. + :param header_value: a header value to pass when making calls to + the API. + :param cookie: a cookie to include in the header when making calls + to the API + """ + + PRIMITIVE_TYPES = (float, bool, bytes, str, int) + NATIVE_TYPES_MAPPING = { + 'int': int, + 'long': int, # TODO remove as only py3 is supported? + 'float': float, + 'str': str, + 'bool': bool, + 'date': datetime.date, + 'datetime': datetime.datetime, + 'decimal': decimal.Decimal, + 'object': object, + } + _pool = None + + def __init__( + self, + configuration=None, + header_name=None, + header_value=None, + cookie=None + ) -> None: + # use default configuration if none is provided + if configuration is None: + configuration = Configuration.get_default() + self.configuration = configuration + + self.rest_client = rest.RESTClientObject(configuration) + self.default_headers = {} + if header_name is not None: + self.default_headers[header_name] = header_value + self.cookie = cookie + # Set default User-Agent. + self.user_agent = 'OpenAPI-Generator/1.0.0/python' + self.client_side_validation = configuration.client_side_validation + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + @property + def user_agent(self): + """User agent for this API client""" + return self.default_headers['User-Agent'] + + @user_agent.setter + def user_agent(self, value): + self.default_headers['User-Agent'] = value + + def set_default_header(self, header_name, header_value): + self.default_headers[header_name] = header_value + + + _default = None + + @classmethod + def get_default(cls): + """Return new instance of ApiClient. + + This method returns newly created, based on default constructor, + object of ApiClient class or returns a copy of default + ApiClient. + + :return: The ApiClient object. + """ + if cls._default is None: + cls._default = ApiClient() + return cls._default + + @classmethod + def set_default(cls, default): + """Set default instance of ApiClient. + + It stores default ApiClient. + + :param default: object of ApiClient. + """ + cls._default = default + + def param_serialize( + self, + method, + resource_path, + path_params=None, + query_params=None, + header_params=None, + body=None, + post_params=None, + files=None, auth_settings=None, + collection_formats=None, + _host=None, + _request_auth=None + ) -> RequestSerialized: + + """Builds the HTTP request params needed by the request. + :param method: Method to call. + :param resource_path: Path to method endpoint. + :param path_params: Path parameters in the url. + :param query_params: Query parameters in the url. + :param header_params: Header parameters to be + placed in the request header. + :param body: Request body. + :param post_params dict: Request post form parameters, + for `application/x-www-form-urlencoded`, `multipart/form-data`. + :param auth_settings list: Auth Settings names for the request. + :param files dict: key -> filename, value -> filepath, + for `multipart/form-data`. + :param collection_formats: dict of collection formats for path, query, + header, and post parameters. + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the authentication + in the spec for a single request. + :return: tuple of form (path, http_method, query_params, header_params, + body, post_params, files) + """ + + config = self.configuration + + # header parameters + header_params = header_params or {} + header_params.update(self.default_headers) + if self.cookie: + header_params['Cookie'] = self.cookie + if header_params: + header_params = self.sanitize_for_serialization(header_params) + header_params = dict( + self.parameters_to_tuples(header_params,collection_formats) + ) + + # path parameters + if path_params: + path_params = self.sanitize_for_serialization(path_params) + path_params = self.parameters_to_tuples( + path_params, + collection_formats + ) + for k, v in path_params: + # specified safe chars, encode everything + resource_path = resource_path.replace( + '{%s}' % k, + quote(str(v), safe=config.safe_chars_for_path_param) + ) + + # post parameters + if post_params or files: + post_params = post_params if post_params else [] + post_params = self.sanitize_for_serialization(post_params) + post_params = self.parameters_to_tuples( + post_params, + collection_formats + ) + if files: + post_params.extend(self.files_parameters(files)) + + # auth setting + self.update_params_for_auth( + header_params, + query_params, + auth_settings, + resource_path, + method, + body, + request_auth=_request_auth + ) + + # body + if body: + body = self.sanitize_for_serialization(body) + + # request url + if _host is None or self.configuration.ignore_operation_servers: + url = self.configuration.host + resource_path + else: + # use server/host defined in path or operation instead + url = _host + resource_path + + # query parameters + if query_params: + query_params = self.sanitize_for_serialization(query_params) + url_query = self.parameters_to_url_query( + query_params, + collection_formats + ) + url += "?" + url_query + + return method, url, header_params, body, post_params + + + def call_api( + self, + method, + url, + header_params=None, + body=None, + post_params=None, + _request_timeout=None + ) -> rest.RESTResponse: + """Makes the HTTP request (synchronous) + :param method: Method to call. + :param url: Path to method endpoint. + :param header_params: Header parameters to be + placed in the request header. + :param body: Request body. + :param post_params dict: Request post form parameters, + for `application/x-www-form-urlencoded`, `multipart/form-data`. + :param _request_timeout: timeout setting for this request. + :return: RESTResponse + """ + + try: + # perform request and return response + response_data = self.rest_client.request( + method, url, + headers=header_params, + body=body, post_params=post_params, + _request_timeout=_request_timeout + ) + + except ApiException as e: + raise e + + return response_data + + def response_deserialize( + self, + response_data: rest.RESTResponse, + response_types_map: Optional[Dict[str, ApiResponseT]]=None + ) -> ApiResponse[ApiResponseT]: + """Deserializes response into an object. + :param response_data: RESTResponse object to be deserialized. + :param response_types_map: dict of response types. + :return: ApiResponse + """ + + msg = "RESTResponse.read() must be called before passing it to response_deserialize()" + assert response_data.data is not None, msg + + response_type = response_types_map.get(str(response_data.status), None) + if not response_type and isinstance(response_data.status, int) and 100 <= response_data.status <= 599: + # if not found, look for '1XX', '2XX', etc. + response_type = response_types_map.get(str(response_data.status)[0] + "XX", None) + + # deserialize response data + response_text = None + return_data = None + try: + if response_type == "bytearray": + return_data = response_data.data + elif response_type == "file": + return_data = self.__deserialize_file(response_data) + elif response_type is not None: + match = None + content_type = response_data.getheader('content-type') + if content_type is not None: + match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type) + encoding = match.group(1) if match else "utf-8" + response_text = response_data.data.decode(encoding) + return_data = self.deserialize(response_text, response_type, content_type) + finally: + if not 200 <= response_data.status <= 299: + raise ApiException.from_response( + http_resp=response_data, + body=response_text, + data=return_data, + ) + + return ApiResponse( + status_code = response_data.status, + data = return_data, + headers = response_data.getheaders(), + raw_data = response_data.data + ) + + def sanitize_for_serialization(self, obj): + """Builds a JSON POST object. + + If obj is None, return None. + If obj is SecretStr, return obj.get_secret_value() + If obj is str, int, long, float, bool, return directly. + If obj is datetime.datetime, datetime.date + convert to string in iso8601 format. + If obj is decimal.Decimal return string representation. + If obj is list, sanitize each element in the list. + If obj is dict, return the dict. + If obj is OpenAPI model, return the properties dict. + + :param obj: The data to serialize. + :return: The serialized form of data. + """ + if obj is None: + return None + elif isinstance(obj, Enum): + return obj.value + elif isinstance(obj, SecretStr): + return obj.get_secret_value() + elif isinstance(obj, self.PRIMITIVE_TYPES): + return obj + elif isinstance(obj, list): + return [ + self.sanitize_for_serialization(sub_obj) for sub_obj in obj + ] + elif isinstance(obj, tuple): + return tuple( + self.sanitize_for_serialization(sub_obj) for sub_obj in obj + ) + elif isinstance(obj, (datetime.datetime, datetime.date)): + return obj.isoformat() + elif isinstance(obj, decimal.Decimal): + return str(obj) + + elif isinstance(obj, dict): + obj_dict = obj + else: + # Convert model obj to dict except + # attributes `openapi_types`, `attribute_map` + # and attributes which value is not None. + # Convert attribute name to json key in + # model definition for request. + if hasattr(obj, 'to_dict') and callable(getattr(obj, 'to_dict')): + obj_dict = obj.to_dict() + else: + obj_dict = obj.__dict__ + + return { + key: self.sanitize_for_serialization(val) + for key, val in obj_dict.items() + } + + def deserialize(self, response_text: str, response_type: str, content_type: Optional[str]): + """Deserializes response into an object. + + :param response: RESTResponse object to be deserialized. + :param response_type: class literal for + deserialized object, or string of class name. + :param content_type: content type of response. + + :return: deserialized object. + """ + + # fetch data from response object + if content_type is None: + try: + data = json.loads(response_text) + except ValueError: + data = response_text + elif re.match(r'^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)', content_type, re.IGNORECASE): + if response_text == "": + data = "" + else: + data = json.loads(response_text) + elif re.match(r'^text\/[a-z.+-]+\s*(;|$)', content_type, re.IGNORECASE): + data = response_text + else: + raise ApiException( + status=0, + reason="Unsupported content type: {0}".format(content_type) + ) + + return self.__deserialize(data, response_type) + + def __deserialize(self, data, klass): + """Deserializes dict, list, str into an object. + + :param data: dict, list or str. + :param klass: class literal, or string of class name. + + :return: object. + """ + if data is None: + return None + + if isinstance(klass, str): + if klass.startswith('List['): + m = re.match(r'List\[(.*)]', klass) + assert m is not None, "Malformed List type definition" + sub_kls = m.group(1) + return [self.__deserialize(sub_data, sub_kls) + for sub_data in data] + + if klass.startswith('Dict['): + m = re.match(r'Dict\[([^,]*), (.*)]', klass) + assert m is not None, "Malformed Dict type definition" + sub_kls = m.group(2) + return {k: self.__deserialize(v, sub_kls) + for k, v in data.items()} + + # convert str to class + if klass in self.NATIVE_TYPES_MAPPING: + klass = self.NATIVE_TYPES_MAPPING[klass] + else: + klass = getattr(aignx.codegen.models, klass) + + if klass in self.PRIMITIVE_TYPES: + return self.__deserialize_primitive(data, klass) + elif klass == object: + return self.__deserialize_object(data) + elif klass == datetime.date: + return self.__deserialize_date(data) + elif klass == datetime.datetime: + return self.__deserialize_datetime(data) + elif klass == decimal.Decimal: + return decimal.Decimal(data) + elif issubclass(klass, Enum): + return self.__deserialize_enum(data, klass) + else: + return self.__deserialize_model(data, klass) + + def parameters_to_tuples(self, params, collection_formats): + """Get parameters as list of tuples, formatting collections. + + :param params: Parameters as dict or list of two-tuples + :param dict collection_formats: Parameter collection formats + :return: Parameters as list of tuples, collections formatted + """ + new_params: List[Tuple[str, str]] = [] + if collection_formats is None: + collection_formats = {} + for k, v in params.items() if isinstance(params, dict) else params: + if k in collection_formats: + collection_format = collection_formats[k] + if collection_format == 'multi': + new_params.extend((k, value) for value in v) + else: + if collection_format == 'ssv': + delimiter = ' ' + elif collection_format == 'tsv': + delimiter = '\t' + elif collection_format == 'pipes': + delimiter = '|' + else: # csv is the default + delimiter = ',' + new_params.append( + (k, delimiter.join(str(value) for value in v))) + else: + new_params.append((k, v)) + return new_params + + def parameters_to_url_query(self, params, collection_formats): + """Get parameters as list of tuples, formatting collections. + + :param params: Parameters as dict or list of two-tuples + :param dict collection_formats: Parameter collection formats + :return: URL query string (e.g. a=Hello%20World&b=123) + """ + new_params: List[Tuple[str, str]] = [] + if collection_formats is None: + collection_formats = {} + for k, v in params.items() if isinstance(params, dict) else params: + if isinstance(v, bool): + v = str(v).lower() + if isinstance(v, (int, float)): + v = str(v) + if isinstance(v, dict): + v = json.dumps(v) + + if k in collection_formats: + collection_format = collection_formats[k] + if collection_format == 'multi': + new_params.extend((k, str(value)) for value in v) + else: + if collection_format == 'ssv': + delimiter = ' ' + elif collection_format == 'tsv': + delimiter = '\t' + elif collection_format == 'pipes': + delimiter = '|' + else: # csv is the default + delimiter = ',' + new_params.append( + (k, delimiter.join(quote(str(value)) for value in v)) + ) + else: + new_params.append((k, quote(str(v)))) + + return "&".join(["=".join(map(str, item)) for item in new_params]) + + def files_parameters( + self, + files: Dict[str, Union[str, bytes, List[str], List[bytes], Tuple[str, bytes]]], + ): + """Builds form parameters. + + :param files: File parameters. + :return: Form parameters with files. + """ + params = [] + for k, v in files.items(): + if isinstance(v, str): + with open(v, 'rb') as f: + filename = os.path.basename(f.name) + filedata = f.read() + elif isinstance(v, bytes): + filename = k + filedata = v + elif isinstance(v, tuple): + filename, filedata = v + elif isinstance(v, list): + for file_param in v: + params.extend(self.files_parameters({k: file_param})) + continue + else: + raise ValueError("Unsupported file value") + mimetype = ( + mimetypes.guess_type(filename)[0] + or 'application/octet-stream' + ) + params.append( + tuple([k, tuple([filename, filedata, mimetype])]) + ) + return params + + def select_header_accept(self, accepts: List[str]) -> Optional[str]: + """Returns `Accept` based on an array of accepts provided. + + :param accepts: List of headers. + :return: Accept (e.g. application/json). + """ + if not accepts: + return None + + for accept in accepts: + if re.search('json', accept, re.IGNORECASE): + return accept + + return accepts[0] + + def select_header_content_type(self, content_types): + """Returns `Content-Type` based on an array of content_types provided. + + :param content_types: List of content-types. + :return: Content-Type (e.g. application/json). + """ + if not content_types: + return None + + for content_type in content_types: + if re.search('json', content_type, re.IGNORECASE): + return content_type + + return content_types[0] + + def update_params_for_auth( + self, + headers, + queries, + auth_settings, + resource_path, + method, + body, + request_auth=None + ) -> None: + """Updates header and query params based on authentication setting. + + :param headers: Header parameters dict to be updated. + :param queries: Query parameters tuple list to be updated. + :param auth_settings: Authentication setting identifiers list. + :resource_path: A string representation of the HTTP request resource path. + :method: A string representation of the HTTP request method. + :body: A object representing the body of the HTTP request. + The object type is the return value of sanitize_for_serialization(). + :param request_auth: if set, the provided settings will + override the token in the configuration. + """ + if not auth_settings: + return + + if request_auth: + self._apply_auth_params( + headers, + queries, + resource_path, + method, + body, + request_auth + ) + else: + for auth in auth_settings: + auth_setting = self.configuration.auth_settings().get(auth) + if auth_setting: + self._apply_auth_params( + headers, + queries, + resource_path, + method, + body, + auth_setting + ) + + def _apply_auth_params( + self, + headers, + queries, + resource_path, + method, + body, + auth_setting + ) -> None: + """Updates the request parameters based on a single auth_setting + + :param headers: Header parameters dict to be updated. + :param queries: Query parameters tuple list to be updated. + :resource_path: A string representation of the HTTP request resource path. + :method: A string representation of the HTTP request method. + :body: A object representing the body of the HTTP request. + The object type is the return value of sanitize_for_serialization(). + :param auth_setting: auth settings for the endpoint + """ + if auth_setting['in'] == 'cookie': + headers['Cookie'] = auth_setting['value'] + elif auth_setting['in'] == 'header': + if auth_setting['type'] != 'http-signature': + headers[auth_setting['key']] = auth_setting['value'] + elif auth_setting['in'] == 'query': + queries.append((auth_setting['key'], auth_setting['value'])) + else: + raise ApiValueError( + 'Authentication token must be in `query` or `header`' + ) + + def __deserialize_file(self, response): + """Deserializes body to file + + Saves response body into a file in a temporary folder, + using the filename from the `Content-Disposition` header if provided. + + handle file downloading + save response body into a tmp file and return the instance + + :param response: RESTResponse. + :return: file path. + """ + fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) + os.close(fd) + os.remove(path) + + content_disposition = response.getheader("Content-Disposition") + if content_disposition: + m = re.search( + r'filename=[\'"]?([^\'"\s]+)[\'"]?', + content_disposition + ) + assert m is not None, "Unexpected 'content-disposition' header value" + filename = m.group(1) + path = os.path.join(os.path.dirname(path), filename) + + with open(path, "wb") as f: + f.write(response.data) + + return path + + def __deserialize_primitive(self, data, klass): + """Deserializes string to primitive type. + + :param data: str. + :param klass: class literal. + + :return: int, long, float, str, bool. + """ + try: + return klass(data) + except UnicodeEncodeError: + return str(data) + except TypeError: + return data + + def __deserialize_object(self, value): + """Return an original value. + + :return: object. + """ + return value + + def __deserialize_date(self, string): + """Deserializes string to date. + + :param string: str. + :return: date. + """ + try: + return parse(string).date() + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, + reason="Failed to parse `{0}` as date object".format(string) + ) + + def __deserialize_datetime(self, string): + """Deserializes string to datetime. + + The string should be in iso8601 datetime format. + + :param string: str. + :return: datetime. + """ + try: + return parse(string) + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, + reason=( + "Failed to parse `{0}` as datetime object" + .format(string) + ) + ) + + def __deserialize_enum(self, data, klass): + """Deserializes primitive type to enum. + + :param data: primitive type. + :param klass: class literal. + :return: enum value. + """ + try: + return klass(data) + except ValueError: + raise rest.ApiException( + status=0, + reason=( + "Failed to parse `{0}` as `{1}`" + .format(data, klass) + ) + ) + + def __deserialize_model(self, data, klass): + """Deserializes list or dict to model. + + :param data: dict, list. + :param klass: class literal. + :return: model object. + """ + + return klass.from_dict(data) diff --git a/codegen/out/aignx/codegen/api_response.py b/codegen/out/aignx/codegen/api_response.py new file mode 100644 index 00000000..9bc7c11f --- /dev/null +++ b/codegen/out/aignx/codegen/api_response.py @@ -0,0 +1,21 @@ +"""API response object.""" + +from __future__ import annotations +from typing import Optional, Generic, Mapping, TypeVar +from pydantic import Field, StrictInt, StrictBytes, BaseModel + +T = TypeVar("T") + +class ApiResponse(BaseModel, Generic[T]): + """ + API response object + """ + + status_code: StrictInt = Field(description="HTTP status code") + headers: Optional[Mapping[str, str]] = Field(None, description="HTTP headers") + data: T = Field(description="Deserialized data given the data type") + raw_data: StrictBytes = Field(description="Raw data (HTTP response body)") + + model_config = { + "arbitrary_types_allowed": True + } diff --git a/codegen/out/aignx/codegen/configuration.py b/codegen/out/aignx/codegen/configuration.py new file mode 100644 index 00000000..5ff0465a --- /dev/null +++ b/codegen/out/aignx/codegen/configuration.py @@ -0,0 +1,573 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import copy +import http.client as httplib +import logging +from logging import FileHandler +import multiprocessing +import sys +from typing import Any, ClassVar, Dict, List, Literal, Optional, TypedDict +from typing_extensions import NotRequired, Self + +import urllib3 + + +JSON_SCHEMA_VALIDATION_KEYWORDS = { + 'multipleOf', 'maximum', 'exclusiveMaximum', + 'minimum', 'exclusiveMinimum', 'maxLength', + 'minLength', 'pattern', 'maxItems', 'minItems' +} + +ServerVariablesT = Dict[str, str] + +GenericAuthSetting = TypedDict( + "GenericAuthSetting", + { + "type": str, + "in": str, + "key": str, + "value": str, + }, +) + + +OAuth2AuthSetting = TypedDict( + "OAuth2AuthSetting", + { + "type": Literal["oauth2"], + "in": Literal["header"], + "key": Literal["Authorization"], + "value": str, + }, +) + + +APIKeyAuthSetting = TypedDict( + "APIKeyAuthSetting", + { + "type": Literal["api_key"], + "in": str, + "key": str, + "value": Optional[str], + }, +) + + +BasicAuthSetting = TypedDict( + "BasicAuthSetting", + { + "type": Literal["basic"], + "in": Literal["header"], + "key": Literal["Authorization"], + "value": Optional[str], + }, +) + + +BearerFormatAuthSetting = TypedDict( + "BearerFormatAuthSetting", + { + "type": Literal["bearer"], + "in": Literal["header"], + "format": Literal["JWT"], + "key": Literal["Authorization"], + "value": str, + }, +) + + +BearerAuthSetting = TypedDict( + "BearerAuthSetting", + { + "type": Literal["bearer"], + "in": Literal["header"], + "key": Literal["Authorization"], + "value": str, + }, +) + + +HTTPSignatureAuthSetting = TypedDict( + "HTTPSignatureAuthSetting", + { + "type": Literal["http-signature"], + "in": Literal["header"], + "key": Literal["Authorization"], + "value": None, + }, +) + + +AuthSettings = TypedDict( + "AuthSettings", + { + "OAuth2AuthorizationCodeBearer": OAuth2AuthSetting, + }, + total=False, +) + + +class HostSettingVariable(TypedDict): + description: str + default_value: str + enum_values: List[str] + + +class HostSetting(TypedDict): + url: str + description: str + variables: NotRequired[Dict[str, HostSettingVariable]] + + +class Configuration: + """This class contains various settings of the API client. + + :param host: Base url. + :param ignore_operation_servers + Boolean to ignore operation servers for the API client. + Config will use `host` as the base url regardless of the operation servers. + :param api_key: Dict to store API key(s). + Each entry in the dict specifies an API key. + The dict key is the name of the security scheme in the OAS specification. + The dict value is the API key secret. + :param api_key_prefix: Dict to store API prefix (e.g. Bearer). + The dict key is the name of the security scheme in the OAS specification. + The dict value is an API key prefix when generating the auth data. + :param username: Username for HTTP basic authentication. + :param password: Password for HTTP basic authentication. + :param access_token: Access token. + :param server_index: Index to servers configuration. + :param server_variables: Mapping with string values to replace variables in + templated server configuration. The validation of enums is performed for + variables with defined enum values before. + :param server_operation_index: Mapping from operation ID to an index to server + configuration. + :param server_operation_variables: Mapping from operation ID to a mapping with + string values to replace variables in templated server configuration. + The validation of enums is performed for variables with defined enum + values before. + :param ssl_ca_cert: str - the path to a file of concatenated CA certificates + in PEM format. + :param retries: Number of retries for API requests. + + :Example: + """ + + _default: ClassVar[Optional[Self]] = None + + def __init__( + self, + host: Optional[str]=None, + api_key: Optional[Dict[str, str]]=None, + api_key_prefix: Optional[Dict[str, str]]=None, + username: Optional[str]=None, + password: Optional[str]=None, + access_token: Optional[str]=None, + server_index: Optional[int]=None, + server_variables: Optional[ServerVariablesT]=None, + server_operation_index: Optional[Dict[int, int]]=None, + server_operation_variables: Optional[Dict[int, ServerVariablesT]]=None, + ignore_operation_servers: bool=False, + ssl_ca_cert: Optional[str]=None, + retries: Optional[int] = None, + *, + debug: Optional[bool] = None, + ) -> None: + """Constructor + """ + self._base_path = "http://localhost" if host is None else host + """Default Base url + """ + self.server_index = 0 if server_index is None and host is None else server_index + self.server_operation_index = server_operation_index or {} + """Default server index + """ + self.server_variables = server_variables or {} + self.server_operation_variables = server_operation_variables or {} + """Default server variables + """ + self.ignore_operation_servers = ignore_operation_servers + """Ignore operation servers + """ + self.temp_folder_path = None + """Temp file folder for downloading files + """ + # Authentication Settings + self.api_key = {} + if api_key: + self.api_key = api_key + """dict to store API key(s) + """ + self.api_key_prefix = {} + if api_key_prefix: + self.api_key_prefix = api_key_prefix + """dict to store API prefix (e.g. Bearer) + """ + self.refresh_api_key_hook = None + """function hook to refresh API key if expired + """ + self.username = username + """Username for HTTP basic authentication + """ + self.password = password + """Password for HTTP basic authentication + """ + self.access_token = access_token + """Access token + """ + self.logger = {} + """Logging Settings + """ + self.logger["package_logger"] = logging.getLogger("aignx.codegen") + self.logger["urllib3_logger"] = logging.getLogger("urllib3") + self.logger_format = '%(asctime)s %(levelname)s %(message)s' + """Log format + """ + self.logger_stream_handler = None + """Log stream handler + """ + self.logger_file_handler: Optional[FileHandler] = None + """Log file handler + """ + self.logger_file = None + """Debug file location + """ + if debug is not None: + self.debug = debug + else: + self.__debug = False + """Debug switch + """ + + self.verify_ssl = True + """SSL/TLS verification + Set this to false to skip verifying SSL certificate when calling API + from https server. + """ + self.ssl_ca_cert = ssl_ca_cert + """Set this to customize the certificate file to verify the peer. + """ + self.cert_file = None + """client certificate file + """ + self.key_file = None + """client key file + """ + self.assert_hostname = None + """Set this to True/False to enable/disable SSL hostname verification. + """ + self.tls_server_name = None + """SSL/TLS Server Name Indication (SNI) + Set this to the SNI value expected by the server. + """ + + self.connection_pool_maxsize = multiprocessing.cpu_count() * 5 + """urllib3 connection pool's maximum number of connections saved + per pool. urllib3 uses 1 connection as default value, but this is + not the best value when you are making a lot of possibly parallel + requests to the same host, which is often the case here. + cpu_count * 5 is used as default value to increase performance. + """ + + self.proxy: Optional[str] = None + """Proxy URL + """ + self.proxy_headers = None + """Proxy headers + """ + self.safe_chars_for_path_param = '' + """Safe chars for path_param + """ + self.retries = retries + """Adding retries to override urllib3 default value 3 + """ + # Enable client side validation + self.client_side_validation = True + + self.socket_options = None + """Options to pass down to the underlying urllib3 socket + """ + + self.datetime_format = "%Y-%m-%dT%H:%M:%S.%f%z" + """datetime format + """ + + self.date_format = "%Y-%m-%d" + """date format + """ + + def __deepcopy__(self, memo: Dict[int, Any]) -> Self: + cls = self.__class__ + result = cls.__new__(cls) + memo[id(self)] = result + for k, v in self.__dict__.items(): + if k not in ('logger', 'logger_file_handler'): + setattr(result, k, copy.deepcopy(v, memo)) + # shallow copy of loggers + result.logger = copy.copy(self.logger) + # use setters to configure loggers + result.logger_file = self.logger_file + result.debug = self.debug + return result + + def __setattr__(self, name: str, value: Any) -> None: + object.__setattr__(self, name, value) + + @classmethod + def set_default(cls, default: Optional[Self]) -> None: + """Set default instance of configuration. + + It stores default configuration, which can be + returned by get_default_copy method. + + :param default: object of Configuration + """ + cls._default = default + + @classmethod + def get_default_copy(cls) -> Self: + """Deprecated. Please use `get_default` instead. + + Deprecated. Please use `get_default` instead. + + :return: The configuration object. + """ + return cls.get_default() + + @classmethod + def get_default(cls) -> Self: + """Return the default configuration. + + This method returns newly created, based on default constructor, + object of Configuration class or returns a copy of default + configuration. + + :return: The configuration object. + """ + if cls._default is None: + cls._default = cls() + return cls._default + + @property + def logger_file(self) -> Optional[str]: + """The logger file. + + If the logger_file is None, then add stream handler and remove file + handler. Otherwise, add file handler and remove stream handler. + + :param value: The logger_file path. + :type: str + """ + return self.__logger_file + + @logger_file.setter + def logger_file(self, value: Optional[str]) -> None: + """The logger file. + + If the logger_file is None, then add stream handler and remove file + handler. Otherwise, add file handler and remove stream handler. + + :param value: The logger_file path. + :type: str + """ + self.__logger_file = value + if self.__logger_file: + # If set logging file, + # then add file handler and remove stream handler. + self.logger_file_handler = logging.FileHandler(self.__logger_file) + self.logger_file_handler.setFormatter(self.logger_formatter) + for _, logger in self.logger.items(): + logger.addHandler(self.logger_file_handler) + + @property + def debug(self) -> bool: + """Debug status + + :param value: The debug status, True or False. + :type: bool + """ + return self.__debug + + @debug.setter + def debug(self, value: bool) -> None: + """Debug status + + :param value: The debug status, True or False. + :type: bool + """ + self.__debug = value + if self.__debug: + # if debug status is True, turn on debug logging + for _, logger in self.logger.items(): + logger.setLevel(logging.DEBUG) + # turn on httplib debug + httplib.HTTPConnection.debuglevel = 1 + else: + # if debug status is False, turn off debug logging, + # setting log level to default `logging.WARNING` + for _, logger in self.logger.items(): + logger.setLevel(logging.WARNING) + # turn off httplib debug + httplib.HTTPConnection.debuglevel = 0 + + @property + def logger_format(self) -> str: + """The logger format. + + The logger_formatter will be updated when sets logger_format. + + :param value: The format string. + :type: str + """ + return self.__logger_format + + @logger_format.setter + def logger_format(self, value: str) -> None: + """The logger format. + + The logger_formatter will be updated when sets logger_format. + + :param value: The format string. + :type: str + """ + self.__logger_format = value + self.logger_formatter = logging.Formatter(self.__logger_format) + + def get_api_key_with_prefix(self, identifier: str, alias: Optional[str]=None) -> Optional[str]: + """Gets API key (with prefix if set). + + :param identifier: The identifier of apiKey. + :param alias: The alternative identifier of apiKey. + :return: The token for api key authentication. + """ + if self.refresh_api_key_hook is not None: + self.refresh_api_key_hook(self) + key = self.api_key.get(identifier, self.api_key.get(alias) if alias is not None else None) + if key: + prefix = self.api_key_prefix.get(identifier) + if prefix: + return "%s %s" % (prefix, key) + else: + return key + + return None + + def get_basic_auth_token(self) -> Optional[str]: + """Gets HTTP basic authentication header (string). + + :return: The token for basic HTTP authentication. + """ + username = "" + if self.username is not None: + username = self.username + password = "" + if self.password is not None: + password = self.password + return urllib3.util.make_headers( + basic_auth=username + ':' + password + ).get('authorization') + + def auth_settings(self)-> AuthSettings: + """Gets Auth Settings dict for api client. + + :return: The Auth Settings information dict. + """ + auth: AuthSettings = {} + if self.access_token is not None: + auth['OAuth2AuthorizationCodeBearer'] = { + 'type': 'oauth2', + 'in': 'header', + 'key': 'Authorization', + 'value': 'Bearer ' + self.access_token + } + return auth + + def to_debug_report(self) -> str: + """Gets the essential information for debugging. + + :return: The report for debugging. + """ + return "Python SDK Debug Report:\n"\ + "OS: {env}\n"\ + "Python Version: {pyversion}\n"\ + "Version of the API: 0.1.0\n"\ + "SDK Package Version: 1.0.0".\ + format(env=sys.platform, pyversion=sys.version) + + def get_host_settings(self) -> List[HostSetting]: + """Gets an array of host settings + + :return: An array of host settings + """ + return [ + { + 'url': "", + 'description': "No description provided", + } + ] + + def get_host_from_settings( + self, + index: Optional[int], + variables: Optional[ServerVariablesT]=None, + servers: Optional[List[HostSetting]]=None, + ) -> str: + """Gets host URL based on the index and variables + :param index: array index of the host settings + :param variables: hash of variable and the corresponding value + :param servers: an array of host settings or None + :return: URL based on host settings + """ + if index is None: + return self._base_path + + variables = {} if variables is None else variables + servers = self.get_host_settings() if servers is None else servers + + try: + server = servers[index] + except IndexError: + raise ValueError( + "Invalid index {0} when selecting the host settings. " + "Must be less than {1}".format(index, len(servers))) + + url = server['url'] + + # go through variables and replace placeholders + for variable_name, variable in server.get('variables', {}).items(): + used_value = variables.get( + variable_name, variable['default_value']) + + if 'enum_values' in variable \ + and used_value not in variable['enum_values']: + raise ValueError( + "The variable `{0}` in the host URL has invalid value " + "{1}. Must be {2}.".format( + variable_name, variables[variable_name], + variable['enum_values'])) + + url = url.replace("{" + variable_name + "}", used_value) + + return url + + @property + def host(self) -> str: + """Return generated host.""" + return self.get_host_from_settings(self.server_index, variables=self.server_variables) + + @host.setter + def host(self, value: str) -> None: + """Fix base path.""" + self._base_path = value + self.server_index = None diff --git a/codegen/out/aignx/codegen/exceptions.py b/codegen/out/aignx/codegen/exceptions.py new file mode 100644 index 00000000..98349c59 --- /dev/null +++ b/codegen/out/aignx/codegen/exceptions.py @@ -0,0 +1,198 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + +from typing import Any, Optional +from typing_extensions import Self + +class OpenApiException(Exception): + """The base exception class for all OpenAPIExceptions""" + + +class ApiTypeError(OpenApiException, TypeError): + def __init__(self, msg, path_to_item=None, valid_classes=None, + key_type=None) -> None: + """ Raises an exception for TypeErrors + + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (list): a list of keys an indices to get to the + current_item + None if unset + valid_classes (tuple): the primitive classes that current item + should be an instance of + None if unset + key_type (bool): False if our value is a value in a dict + True if it is a key in a dict + False if our item is an item in a list + None if unset + """ + self.path_to_item = path_to_item + self.valid_classes = valid_classes + self.key_type = key_type + full_msg = msg + if path_to_item: + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) + super(ApiTypeError, self).__init__(full_msg) + + +class ApiValueError(OpenApiException, ValueError): + def __init__(self, msg, path_to_item=None) -> None: + """ + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (list) the path to the exception in the + received_data dict. None if unset + """ + + self.path_to_item = path_to_item + full_msg = msg + if path_to_item: + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) + super(ApiValueError, self).__init__(full_msg) + + +class ApiAttributeError(OpenApiException, AttributeError): + def __init__(self, msg, path_to_item=None) -> None: + """ + Raised when an attribute reference or assignment fails. + + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (None/list) the path to the exception in the + received_data dict + """ + self.path_to_item = path_to_item + full_msg = msg + if path_to_item: + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) + super(ApiAttributeError, self).__init__(full_msg) + + +class ApiKeyError(OpenApiException, KeyError): + def __init__(self, msg, path_to_item=None) -> None: + """ + Args: + msg (str): the exception message + + Keyword Args: + path_to_item (None/list) the path to the exception in the + received_data dict + """ + self.path_to_item = path_to_item + full_msg = msg + if path_to_item: + full_msg = "{0} at {1}".format(msg, render_path(path_to_item)) + super(ApiKeyError, self).__init__(full_msg) + + +class ApiException(OpenApiException): + + def __init__( + self, + status=None, + reason=None, + http_resp=None, + *, + body: Optional[str] = None, + data: Optional[Any] = None, + ) -> None: + self.status = status + self.reason = reason + self.body = body + self.data = data + self.headers = None + + if http_resp: + if self.status is None: + self.status = http_resp.status + if self.reason is None: + self.reason = http_resp.reason + if self.body is None: + try: + self.body = http_resp.data.decode('utf-8') + except Exception: + pass + self.headers = http_resp.getheaders() + + @classmethod + def from_response( + cls, + *, + http_resp, + body: Optional[str], + data: Optional[Any], + ) -> Self: + if http_resp.status == 400: + raise BadRequestException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 401: + raise UnauthorizedException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 403: + raise ForbiddenException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 404: + raise NotFoundException(http_resp=http_resp, body=body, data=data) + + if 500 <= http_resp.status <= 599: + raise ServiceException(http_resp=http_resp, body=body, data=data) + raise ApiException(http_resp=http_resp, body=body, data=data) + + def __str__(self): + """Custom error messages for exception""" + error_message = "({0})\n"\ + "Reason: {1}\n".format(self.status, self.reason) + if self.headers: + error_message += "HTTP response headers: {0}\n".format( + self.headers) + + if self.data or self.body: + error_message += "HTTP response body: {0}\n".format(self.data or self.body) + + return error_message + + +class BadRequestException(ApiException): + pass + + +class NotFoundException(ApiException): + pass + + +class UnauthorizedException(ApiException): + pass + + +class ForbiddenException(ApiException): + pass + + +class ServiceException(ApiException): + pass + + +def render_path(path_to_item): + """Returns a string representation of a path""" + result = "" + for pth in path_to_item: + if isinstance(pth, int): + result += "[{0}]".format(pth) + else: + result += "['{0}']".format(pth) + return result diff --git a/codegen/out/aignx/codegen/models/__init__.py b/codegen/out/aignx/codegen/models/__init__.py new file mode 100644 index 00000000..33ff63eb --- /dev/null +++ b/codegen/out/aignx/codegen/models/__init__.py @@ -0,0 +1,57 @@ +from .user_creation_request import * +from .item_result_read_response import * +from .input_artifact_schema_creation_request import * +from .organization_update_request import * +from .validation_error_loc_inner import * +from .application_version_read_response import * +from .item_status import * +from .run_creation_response import * +from .input_artifact_read_response import * +from .version_creation_request import * +from .user_payload import * +from .validation_error import * +from .application_read_response import * +from .application_creation_response import * +from .output_artifact_event_trigger_response import * +from .output_artifact_event_trigger_request import * +from .application_creation_request import * +from .quota_name import * +from .output_artifact_scope import * +from .version_creation_response import * +from .item_event_creation_response import * +from .item_read_response import * +from .input_artifact_creation_request import * +from .item_event_creation_request import * +from .user_update_request import * +from .item_creation_request import * +from .organization_response import * +from .quotas_read_response import * +from .application_version import * +from .http_validation_error import * +from .transfer_urls import * +from .item_event import * +from .slug_version_request import * +from .input_artifact import * +from .output_artifact_result_read_response import * +from .version_read_response import * +from .quotas_update_request import * +from .output_artifact_schema_creation_request import * +from .run_read_response import * +from .application_run_status import * +from .run_creation_request import * +from .quota_read_response import * +from .payload_output_artifact import * +from .payload_input_artifact import * +from .organization_quota import * +from .organization_creation_request import * +from .user_response import * +from .user_quota import * +from .artifact_event import * +from .output_artifact_visibility import * +from .quota_update_response import * +from .payload_item import * +from .output_artifact_read_response import * +from .quota_update_request import * +from .quotas_update_response import * +from .artifact_status import * +from .output_artifact import * diff --git a/codegen/out/aignx/codegen/models/application_creation_request.py b/codegen/out/aignx/codegen/models/application_creation_request.py new file mode 100644 index 00000000..87b89a43 --- /dev/null +++ b/codegen/out/aignx/codegen/models/application_creation_request.py @@ -0,0 +1,88 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class ApplicationCreationRequest(BaseModel): + """ + ApplicationCreationRequest + """ # noqa: E501 + name: StrictStr + description: StrictStr + regulatory_classes: List[StrictStr] + __properties: ClassVar[List[str]] = ["name", "description", "regulatory_classes"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ApplicationCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ApplicationCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "description": obj.get("description"), + "regulatory_classes": obj.get("regulatory_classes") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/application_creation_response.py b/codegen/out/aignx/codegen/models/application_creation_response.py new file mode 100644 index 00000000..be493a06 --- /dev/null +++ b/codegen/out/aignx/codegen/models/application_creation_response.py @@ -0,0 +1,84 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class ApplicationCreationResponse(BaseModel): + """ + ApplicationCreationResponse + """ # noqa: E501 + application_id: StrictStr + __properties: ClassVar[List[str]] = ["application_id"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ApplicationCreationResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ApplicationCreationResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_id": obj.get("application_id") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/application_read_response.py b/codegen/out/aignx/codegen/models/application_read_response.py new file mode 100644 index 00000000..ad37912a --- /dev/null +++ b/codegen/out/aignx/codegen/models/application_read_response.py @@ -0,0 +1,92 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class ApplicationReadResponse(BaseModel): + """ + ApplicationReadResponse + """ # noqa: E501 + application_id: StrictStr + name: StrictStr + slug: StrictStr + regulatory_classes: List[StrictStr] + description: StrictStr + __properties: ClassVar[List[str]] = ["application_id", "name", "slug", "regulatory_classes", "description"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ApplicationReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ApplicationReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_id": obj.get("application_id"), + "name": obj.get("name"), + "slug": obj.get("slug"), + "regulatory_classes": obj.get("regulatory_classes"), + "description": obj.get("description") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/application_run_status.py b/codegen/out/aignx/codegen/models/application_run_status.py new file mode 100644 index 00000000..afd1b320 --- /dev/null +++ b/codegen/out/aignx/codegen/models/application_run_status.py @@ -0,0 +1,40 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class ApplicationRunStatus(str, Enum): + """ + ApplicationRunStatus + """ + + """ + allowed enum values + """ + CANCELED_SYSTEM = 'canceled_system' + CANCELED_USER = 'canceled_user' + COMPLETED = 'completed' + COMPLETED_WITH_ERROR = 'completed_with_error' + RECEIVED = 'received' + REJECTED = 'rejected' + RUNNING = 'running' + SCHEDULED = 'scheduled' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ApplicationRunStatus from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/out/aignx/codegen/models/application_version.py b/codegen/out/aignx/codegen/models/application_version.py new file mode 100644 index 00000000..5c968ce9 --- /dev/null +++ b/codegen/out/aignx/codegen/models/application_version.py @@ -0,0 +1,133 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +from inspect import getfullargspec +import json +import pprint +import re # noqa: F401 +from pydantic import BaseModel, ConfigDict, Field, StrictStr, ValidationError, field_validator +from typing import Optional +from aignx.codegen.models.slug_version_request import SlugVersionRequest +from typing import Union, Any, List, Set, TYPE_CHECKING, Optional, Dict +from typing_extensions import Literal, Self +from pydantic import Field + +APPLICATIONVERSION_ANY_OF_SCHEMAS = ["SlugVersionRequest", "str"] + +class ApplicationVersion(BaseModel): + """ + ApplicationVersion + """ + + # data type: str + anyof_schema_1_validator: Optional[StrictStr] = None + # data type: SlugVersionRequest + anyof_schema_2_validator: Optional[SlugVersionRequest] = None + if TYPE_CHECKING: + actual_instance: Optional[Union[SlugVersionRequest, str]] = None + else: + actual_instance: Any = None + any_of_schemas: Set[str] = { "SlugVersionRequest", "str" } + + model_config = { + "validate_assignment": True, + "protected_namespaces": (), + } + + def __init__(self, *args, **kwargs) -> None: + if args: + if len(args) > 1: + raise ValueError("If a position argument is used, only 1 is allowed to set `actual_instance`") + if kwargs: + raise ValueError("If a position argument is used, keyword arguments cannot be used.") + super().__init__(actual_instance=args[0]) + else: + super().__init__(**kwargs) + + @field_validator('actual_instance') + def actual_instance_must_validate_anyof(cls, v): + instance = ApplicationVersion.model_construct() + error_messages = [] + # validate data type: str + try: + instance.anyof_schema_1_validator = v + return v + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # validate data type: SlugVersionRequest + if not isinstance(v, SlugVersionRequest): + error_messages.append(f"Error! Input type `{type(v)}` is not `SlugVersionRequest`") + else: + return v + + if error_messages: + # no match + raise ValueError("No match found when setting the actual_instance in ApplicationVersion with anyOf schemas: SlugVersionRequest, str. Details: " + ", ".join(error_messages)) + else: + return v + + @classmethod + def from_dict(cls, obj: Dict[str, Any]) -> Self: + return cls.from_json(json.dumps(obj)) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Returns the object represented by the json string""" + instance = cls.model_construct() + error_messages = [] + # deserialize data into str + try: + # validation + instance.anyof_schema_1_validator = json.loads(json_str) + # assign value to actual_instance + instance.actual_instance = instance.anyof_schema_1_validator + return instance + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # anyof_schema_2_validator: Optional[SlugVersionRequest] = None + try: + instance.actual_instance = SlugVersionRequest.from_json(json_str) + return instance + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + + if error_messages: + # no match + raise ValueError("No match found when deserializing the JSON string into ApplicationVersion with anyOf schemas: SlugVersionRequest, str. Details: " + ", ".join(error_messages)) + else: + return instance + + def to_json(self) -> str: + """Returns the JSON representation of the actual instance""" + if self.actual_instance is None: + return "null" + + if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): + return self.actual_instance.to_json() + else: + return json.dumps(self.actual_instance) + + def to_dict(self) -> Optional[Union[Dict[str, Any], SlugVersionRequest, str]]: + """Returns the dict representation of the actual instance""" + if self.actual_instance is None: + return None + + if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): + return self.actual_instance.to_dict() + else: + return self.actual_instance + + def to_str(self) -> str: + """Returns the string representation of the actual instance""" + return pprint.pformat(self.model_dump()) diff --git a/codegen/out/aignx/codegen/models/application_version_read_response.py b/codegen/out/aignx/codegen/models/application_version_read_response.py new file mode 100644 index 00000000..ba162378 --- /dev/null +++ b/codegen/out/aignx/codegen/models/application_version_read_response.py @@ -0,0 +1,127 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from typing import Any, ClassVar, Dict, List, Optional +from typing_extensions import Annotated +from aignx.codegen.models.input_artifact_read_response import InputArtifactReadResponse +from aignx.codegen.models.output_artifact_read_response import OutputArtifactReadResponse +from typing import Optional, Set +from typing_extensions import Self + +class ApplicationVersionReadResponse(BaseModel): + """ + ApplicationVersionReadResponse + """ # noqa: E501 + application_version_id: StrictStr + application_version_slug: Annotated[str, Field(strict=True)] + version: StrictStr + application_id: StrictStr + flow_id: Optional[StrictStr] = None + changelog: StrictStr + input_artifacts: List[InputArtifactReadResponse] + output_artifacts: List[OutputArtifactReadResponse] + __properties: ClassVar[List[str]] = ["application_version_id", "application_version_slug", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] + + @field_validator('application_version_slug') + def application_version_slug_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$", value): + raise ValueError(r"must validate the regular expression /^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ApplicationVersionReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) + _items = [] + if self.input_artifacts: + for _item_input_artifacts in self.input_artifacts: + if _item_input_artifacts: + _items.append(_item_input_artifacts.to_dict()) + _dict['input_artifacts'] = _items + # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) + _items = [] + if self.output_artifacts: + for _item_output_artifacts in self.output_artifacts: + if _item_output_artifacts: + _items.append(_item_output_artifacts.to_dict()) + _dict['output_artifacts'] = _items + # set to None if flow_id (nullable) is None + # and model_fields_set contains the field + if self.flow_id is None and "flow_id" in self.model_fields_set: + _dict['flow_id'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ApplicationVersionReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_version_id": obj.get("application_version_id"), + "application_version_slug": obj.get("application_version_slug"), + "version": obj.get("version"), + "application_id": obj.get("application_id"), + "flow_id": obj.get("flow_id"), + "changelog": obj.get("changelog"), + "input_artifacts": [InputArtifactReadResponse.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None, + "output_artifacts": [OutputArtifactReadResponse.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/artifact_event.py b/codegen/out/aignx/codegen/models/artifact_event.py new file mode 100644 index 00000000..1ef35c3a --- /dev/null +++ b/codegen/out/aignx/codegen/models/artifact_event.py @@ -0,0 +1,35 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class ArtifactEvent(str, Enum): + """ + This is a subset of the OutputArtifactEvent used by the state machine. Only the variants defined below are allowed to be submitted from the Algorithms/Applications. + """ + + """ + allowed enum values + """ + SUCCEEDED = 'succeeded' + FAILED_WITH_USER_ERROR = 'failed_with_user_error' + FAILED_WITH_SYSTEM_ERROR = 'failed_with_system_error' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ArtifactEvent from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/out/aignx/codegen/models/artifact_status.py b/codegen/out/aignx/codegen/models/artifact_status.py new file mode 100644 index 00000000..2cdfbecf --- /dev/null +++ b/codegen/out/aignx/codegen/models/artifact_status.py @@ -0,0 +1,40 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class ArtifactStatus(str, Enum): + """ + ArtifactStatus + """ + + """ + allowed enum values + """ + PENDING = 'pending' + CANCELED_USER = 'canceled_user' + CANCELED_SYSTEM = 'canceled_system' + ERROR_USER = 'error_user' + ERROR_SYSTEM_FATAL = 'error_system_fatal' + ERROR_SYSTEM_RECOVERABLE = 'error_system_recoverable' + SKIPPED = 'skipped' + SUCCEEDED = 'succeeded' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ArtifactStatus from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/out/aignx/codegen/models/http_validation_error.py b/codegen/out/aignx/codegen/models/http_validation_error.py new file mode 100644 index 00000000..7516585d --- /dev/null +++ b/codegen/out/aignx/codegen/models/http_validation_error.py @@ -0,0 +1,92 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict +from typing import Any, ClassVar, Dict, List, Optional +from aignx.codegen.models.validation_error import ValidationError +from typing import Optional, Set +from typing_extensions import Self + +class HTTPValidationError(BaseModel): + """ + HTTPValidationError + """ # noqa: E501 + detail: Optional[List[ValidationError]] = None + __properties: ClassVar[List[str]] = ["detail"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of HTTPValidationError from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in detail (list) + _items = [] + if self.detail: + for _item_detail in self.detail: + if _item_detail: + _items.append(_item_detail.to_dict()) + _dict['detail'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of HTTPValidationError from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "detail": [ValidationError.from_dict(_item) for _item in obj["detail"]] if obj.get("detail") is not None else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/input_artifact.py b/codegen/out/aignx/codegen/models/input_artifact.py new file mode 100644 index 00000000..b3be6b65 --- /dev/null +++ b/codegen/out/aignx/codegen/models/input_artifact.py @@ -0,0 +1,96 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self + +class InputArtifact(BaseModel): + """ + InputArtifact + """ # noqa: E501 + name: StrictStr + mime_type: Annotated[str, Field(strict=True)] + metadata_schema: Dict[str, Any] + __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema"] + + @field_validator('mime_type') + def mime_type_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of InputArtifact from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of InputArtifact from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "metadata_schema": obj.get("metadata_schema") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/input_artifact_creation_request.py b/codegen/out/aignx/codegen/models/input_artifact_creation_request.py new file mode 100644 index 00000000..be5d5577 --- /dev/null +++ b/codegen/out/aignx/codegen/models/input_artifact_creation_request.py @@ -0,0 +1,89 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self + +class InputArtifactCreationRequest(BaseModel): + """ + InputArtifactCreationRequest + """ # noqa: E501 + name: StrictStr + download_url: Annotated[str, Field(min_length=1, strict=True, max_length=2083)] + metadata: Dict[str, Any] + __properties: ClassVar[List[str]] = ["name", "download_url", "metadata"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of InputArtifactCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of InputArtifactCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "download_url": obj.get("download_url"), + "metadata": obj.get("metadata") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/input_artifact_read_response.py b/codegen/out/aignx/codegen/models/input_artifact_read_response.py new file mode 100644 index 00000000..f52f8bab --- /dev/null +++ b/codegen/out/aignx/codegen/models/input_artifact_read_response.py @@ -0,0 +1,96 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self + +class InputArtifactReadResponse(BaseModel): + """ + InputArtifactReadResponse + """ # noqa: E501 + name: StrictStr + mime_type: Annotated[str, Field(strict=True)] + metadata_schema: Dict[str, Any] + __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema"] + + @field_validator('mime_type') + def mime_type_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of InputArtifactReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of InputArtifactReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "metadata_schema": obj.get("metadata_schema") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py b/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py new file mode 100644 index 00000000..9bf88b28 --- /dev/null +++ b/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py @@ -0,0 +1,88 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class InputArtifactSchemaCreationRequest(BaseModel): + """ + InputArtifactSchemaCreationRequest + """ # noqa: E501 + name: StrictStr + mime_type: StrictStr + metadata_schema: Dict[str, Any] + __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of InputArtifactSchemaCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of InputArtifactSchemaCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "metadata_schema": obj.get("metadata_schema") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/item_creation_request.py b/codegen/out/aignx/codegen/models/item_creation_request.py new file mode 100644 index 00000000..3fd787c8 --- /dev/null +++ b/codegen/out/aignx/codegen/models/item_creation_request.py @@ -0,0 +1,94 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.input_artifact_creation_request import InputArtifactCreationRequest +from typing import Optional, Set +from typing_extensions import Self + +class ItemCreationRequest(BaseModel): + """ + ItemCreationRequest + """ # noqa: E501 + reference: StrictStr + input_artifacts: List[InputArtifactCreationRequest] + __properties: ClassVar[List[str]] = ["reference", "input_artifacts"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ItemCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) + _items = [] + if self.input_artifacts: + for _item_input_artifacts in self.input_artifacts: + if _item_input_artifacts: + _items.append(_item_input_artifacts.to_dict()) + _dict['input_artifacts'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ItemCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "reference": obj.get("reference"), + "input_artifacts": [InputArtifactCreationRequest.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/item_event.py b/codegen/out/aignx/codegen/models/item_event.py new file mode 100644 index 00000000..e0ba63f6 --- /dev/null +++ b/codegen/out/aignx/codegen/models/item_event.py @@ -0,0 +1,34 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class ItemEvent(str, Enum): + """ + ItemEvent + """ + + """ + allowed enum values + """ + FAILED_WITH_SYSTEM_ERROR = 'failed_with_system_error' + FAILED_RECOVERABLE = 'failed_recoverable' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ItemEvent from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/out/aignx/codegen/models/item_event_creation_request.py b/codegen/out/aignx/codegen/models/item_event_creation_request.py new file mode 100644 index 00000000..d9b523c7 --- /dev/null +++ b/codegen/out/aignx/codegen/models/item_event_creation_request.py @@ -0,0 +1,87 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.item_event import ItemEvent +from typing import Optional, Set +from typing_extensions import Self + +class ItemEventCreationRequest(BaseModel): + """ + ItemEventCreationRequest + """ # noqa: E501 + event: ItemEvent + error: StrictStr + __properties: ClassVar[List[str]] = ["event", "error"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ItemEventCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ItemEventCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "event": obj.get("event"), + "error": obj.get("error") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/item_event_creation_response.py b/codegen/out/aignx/codegen/models/item_event_creation_response.py new file mode 100644 index 00000000..a22a32ad --- /dev/null +++ b/codegen/out/aignx/codegen/models/item_event_creation_response.py @@ -0,0 +1,87 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.item_status import ItemStatus +from typing import Optional, Set +from typing_extensions import Self + +class ItemEventCreationResponse(BaseModel): + """ + ItemEventCreationResponse + """ # noqa: E501 + item_id: StrictStr + status: ItemStatus + __properties: ClassVar[List[str]] = ["item_id", "status"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ItemEventCreationResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ItemEventCreationResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "item_id": obj.get("item_id"), + "status": obj.get("status") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/item_read_response.py b/codegen/out/aignx/codegen/models/item_read_response.py new file mode 100644 index 00000000..7ef0cd1e --- /dev/null +++ b/codegen/out/aignx/codegen/models/item_read_response.py @@ -0,0 +1,103 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from aignx.codegen.models.item_status import ItemStatus +from typing import Optional, Set +from typing_extensions import Self + +class ItemReadResponse(BaseModel): + """ + ItemReadResponse + """ # noqa: E501 + item_id: StrictStr + application_run_id: Optional[StrictStr] = None + reference: StrictStr + status: ItemStatus + error: Optional[StrictStr] + __properties: ClassVar[List[str]] = ["item_id", "application_run_id", "reference", "status", "error"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ItemReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if application_run_id (nullable) is None + # and model_fields_set contains the field + if self.application_run_id is None and "application_run_id" in self.model_fields_set: + _dict['application_run_id'] = None + + # set to None if error (nullable) is None + # and model_fields_set contains the field + if self.error is None and "error" in self.model_fields_set: + _dict['error'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ItemReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "item_id": obj.get("item_id"), + "application_run_id": obj.get("application_run_id"), + "reference": obj.get("reference"), + "status": obj.get("status"), + "error": obj.get("error") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/item_result_read_response.py b/codegen/out/aignx/codegen/models/item_result_read_response.py new file mode 100644 index 00000000..50a67cc8 --- /dev/null +++ b/codegen/out/aignx/codegen/models/item_result_read_response.py @@ -0,0 +1,108 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from aignx.codegen.models.item_status import ItemStatus +from aignx.codegen.models.output_artifact_result_read_response import OutputArtifactResultReadResponse +from typing import Optional, Set +from typing_extensions import Self + +class ItemResultReadResponse(BaseModel): + """ + ItemResultReadResponse + """ # noqa: E501 + item_id: StrictStr + application_run_id: StrictStr + reference: StrictStr + status: ItemStatus + error: Optional[StrictStr] + output_artifacts: List[OutputArtifactResultReadResponse] + __properties: ClassVar[List[str]] = ["item_id", "application_run_id", "reference", "status", "error", "output_artifacts"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ItemResultReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) + _items = [] + if self.output_artifacts: + for _item_output_artifacts in self.output_artifacts: + if _item_output_artifacts: + _items.append(_item_output_artifacts.to_dict()) + _dict['output_artifacts'] = _items + # set to None if error (nullable) is None + # and model_fields_set contains the field + if self.error is None and "error" in self.model_fields_set: + _dict['error'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ItemResultReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "item_id": obj.get("item_id"), + "application_run_id": obj.get("application_run_id"), + "reference": obj.get("reference"), + "status": obj.get("status"), + "error": obj.get("error"), + "output_artifacts": [OutputArtifactResultReadResponse.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/item_status.py b/codegen/out/aignx/codegen/models/item_status.py new file mode 100644 index 00000000..6ffcf237 --- /dev/null +++ b/codegen/out/aignx/codegen/models/item_status.py @@ -0,0 +1,38 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class ItemStatus(str, Enum): + """ + ItemStatus + """ + + """ + allowed enum values + """ + PENDING = 'pending' + CANCELED_USER = 'canceled_user' + CANCELED_SYSTEM = 'canceled_system' + ERROR_USER = 'error_user' + ERROR_SYSTEM = 'error_system' + SUCCEEDED = 'succeeded' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ItemStatus from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/out/aignx/codegen/models/organization_creation_request.py b/codegen/out/aignx/codegen/models/organization_creation_request.py new file mode 100644 index 00000000..c4514010 --- /dev/null +++ b/codegen/out/aignx/codegen/models/organization_creation_request.py @@ -0,0 +1,90 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class OrganizationCreationRequest(BaseModel): + """ + OrganizationCreationRequest + """ # noqa: E501 + organization_id: StrictStr + owner_email: StrictStr + slide_quota: StrictInt + batch_size: StrictInt + __properties: ClassVar[List[str]] = ["organization_id", "owner_email", "slide_quota", "batch_size"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OrganizationCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OrganizationCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "organization_id": obj.get("organization_id"), + "owner_email": obj.get("owner_email"), + "slide_quota": obj.get("slide_quota"), + "batch_size": obj.get("batch_size") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/organization_quota.py b/codegen/out/aignx/codegen/models/organization_quota.py new file mode 100644 index 00000000..74b66431 --- /dev/null +++ b/codegen/out/aignx/codegen/models/organization_quota.py @@ -0,0 +1,91 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self + +class OrganizationQuota(BaseModel): + """ + OrganizationQuota + """ # noqa: E501 + total: Optional[StrictInt] + used: StrictInt + __properties: ClassVar[List[str]] = ["total", "used"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OrganizationQuota from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if total (nullable) is None + # and model_fields_set contains the field + if self.total is None and "total" in self.model_fields_set: + _dict['total'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OrganizationQuota from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "total": obj.get("total"), + "used": obj.get("used") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/organization_response.py b/codegen/out/aignx/codegen/models/organization_response.py new file mode 100644 index 00000000..f90120d4 --- /dev/null +++ b/codegen/out/aignx/codegen/models/organization_response.py @@ -0,0 +1,94 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.organization_quota import OrganizationQuota +from typing import Optional, Set +from typing_extensions import Self + +class OrganizationResponse(BaseModel): + """ + OrganizationResponse + """ # noqa: E501 + organization_id: StrictStr + owner_id: StrictStr + slide_quota: OrganizationQuota + batch_size: StrictInt + __properties: ClassVar[List[str]] = ["organization_id", "owner_id", "slide_quota", "batch_size"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OrganizationResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of slide_quota + if self.slide_quota: + _dict['slide_quota'] = self.slide_quota.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OrganizationResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "organization_id": obj.get("organization_id"), + "owner_id": obj.get("owner_id"), + "slide_quota": OrganizationQuota.from_dict(obj["slide_quota"]) if obj.get("slide_quota") is not None else None, + "batch_size": obj.get("batch_size") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/organization_update_request.py b/codegen/out/aignx/codegen/models/organization_update_request.py new file mode 100644 index 00000000..38f40627 --- /dev/null +++ b/codegen/out/aignx/codegen/models/organization_update_request.py @@ -0,0 +1,96 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self + +class OrganizationUpdateRequest(BaseModel): + """ + OrganizationUpdateRequest + """ # noqa: E501 + slide_quota: Optional[StrictInt] = None + batch_size: Optional[StrictInt] = None + __properties: ClassVar[List[str]] = ["slide_quota", "batch_size"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OrganizationUpdateRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if slide_quota (nullable) is None + # and model_fields_set contains the field + if self.slide_quota is None and "slide_quota" in self.model_fields_set: + _dict['slide_quota'] = None + + # set to None if batch_size (nullable) is None + # and model_fields_set contains the field + if self.batch_size is None and "batch_size" in self.model_fields_set: + _dict['batch_size'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OrganizationUpdateRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "slide_quota": obj.get("slide_quota"), + "batch_size": obj.get("batch_size") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/output_artifact.py b/codegen/out/aignx/codegen/models/output_artifact.py new file mode 100644 index 00000000..3cf1bcf6 --- /dev/null +++ b/codegen/out/aignx/codegen/models/output_artifact.py @@ -0,0 +1,102 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from aignx.codegen.models.output_artifact_scope import OutputArtifactScope +from aignx.codegen.models.output_artifact_visibility import OutputArtifactVisibility +from typing import Optional, Set +from typing_extensions import Self + +class OutputArtifact(BaseModel): + """ + OutputArtifact + """ # noqa: E501 + name: StrictStr + mime_type: Annotated[str, Field(strict=True)] + metadata_schema: Dict[str, Any] + scope: OutputArtifactScope + visibility: OutputArtifactVisibility + __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema", "scope", "visibility"] + + @field_validator('mime_type') + def mime_type_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OutputArtifact from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OutputArtifact from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "metadata_schema": obj.get("metadata_schema"), + "scope": obj.get("scope"), + "visibility": obj.get("visibility") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py b/codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py new file mode 100644 index 00000000..2927bca7 --- /dev/null +++ b/codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py @@ -0,0 +1,94 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from aignx.codegen.models.artifact_event import ArtifactEvent +from typing import Optional, Set +from typing_extensions import Self + +class OutputArtifactEventTriggerRequest(BaseModel): + """ + OutputArtifactEventTriggerRequest + """ # noqa: E501 + event: ArtifactEvent + metadata: Dict[str, Any] + error: Optional[StrictStr] = None + __properties: ClassVar[List[str]] = ["event", "metadata", "error"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OutputArtifactEventTriggerRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if error (nullable) is None + # and model_fields_set contains the field + if self.error is None and "error" in self.model_fields_set: + _dict['error'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OutputArtifactEventTriggerRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "event": obj.get("event"), + "metadata": obj.get("metadata"), + "error": obj.get("error") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py b/codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py new file mode 100644 index 00000000..7cb12cbe --- /dev/null +++ b/codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py @@ -0,0 +1,87 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.artifact_status import ArtifactStatus +from typing import Optional, Set +from typing_extensions import Self + +class OutputArtifactEventTriggerResponse(BaseModel): + """ + OutputArtifactEventTriggerResponse + """ # noqa: E501 + output_artifact_id: StrictStr + status: ArtifactStatus + __properties: ClassVar[List[str]] = ["output_artifact_id", "status"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OutputArtifactEventTriggerResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OutputArtifactEventTriggerResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "output_artifact_id": obj.get("output_artifact_id"), + "status": obj.get("status") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/output_artifact_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_read_response.py new file mode 100644 index 00000000..1e721f15 --- /dev/null +++ b/codegen/out/aignx/codegen/models/output_artifact_read_response.py @@ -0,0 +1,99 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from aignx.codegen.models.output_artifact_scope import OutputArtifactScope +from typing import Optional, Set +from typing_extensions import Self + +class OutputArtifactReadResponse(BaseModel): + """ + OutputArtifactReadResponse + """ # noqa: E501 + name: StrictStr + mime_type: Annotated[str, Field(strict=True)] + metadata_schema: Dict[str, Any] + scope: OutputArtifactScope + __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema", "scope"] + + @field_validator('mime_type') + def mime_type_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OutputArtifactReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OutputArtifactReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "metadata_schema": obj.get("metadata_schema"), + "scope": obj.get("scope") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py new file mode 100644 index 00000000..765a3ce8 --- /dev/null +++ b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py @@ -0,0 +1,105 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from typing import Any, ClassVar, Dict, List, Optional +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self + +class OutputArtifactResultReadResponse(BaseModel): + """ + OutputArtifactResultReadResponse + """ # noqa: E501 + output_artifact_id: StrictStr + name: StrictStr + mime_type: Annotated[str, Field(strict=True)] + metadata: Dict[str, Any] + download_url: Optional[Annotated[str, Field(min_length=1, strict=True, max_length=2083)]] + __properties: ClassVar[List[str]] = ["output_artifact_id", "name", "mime_type", "metadata", "download_url"] + + @field_validator('mime_type') + def mime_type_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OutputArtifactResultReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if download_url (nullable) is None + # and model_fields_set contains the field + if self.download_url is None and "download_url" in self.model_fields_set: + _dict['download_url'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OutputArtifactResultReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "output_artifact_id": obj.get("output_artifact_id"), + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "metadata": obj.get("metadata"), + "download_url": obj.get("download_url") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py b/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py new file mode 100644 index 00000000..9ba0f7e7 --- /dev/null +++ b/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py @@ -0,0 +1,94 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.output_artifact_scope import OutputArtifactScope +from aignx.codegen.models.output_artifact_visibility import OutputArtifactVisibility +from typing import Optional, Set +from typing_extensions import Self + +class OutputArtifactSchemaCreationRequest(BaseModel): + """ + OutputArtifactSchemaCreationRequest + """ # noqa: E501 + name: StrictStr + mime_type: StrictStr + scope: OutputArtifactScope + visibility: OutputArtifactVisibility + metadata_schema: Dict[str, Any] + __properties: ClassVar[List[str]] = ["name", "mime_type", "scope", "visibility", "metadata_schema"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OutputArtifactSchemaCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OutputArtifactSchemaCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "mime_type": obj.get("mime_type"), + "scope": obj.get("scope"), + "visibility": obj.get("visibility"), + "metadata_schema": obj.get("metadata_schema") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/output_artifact_scope.py b/codegen/out/aignx/codegen/models/output_artifact_scope.py new file mode 100644 index 00000000..cade78c0 --- /dev/null +++ b/codegen/out/aignx/codegen/models/output_artifact_scope.py @@ -0,0 +1,34 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class OutputArtifactScope(str, Enum): + """ + OutputArtifactScope + """ + + """ + allowed enum values + """ + ITEM = 'item' + GLOBAL = 'global' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of OutputArtifactScope from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/out/aignx/codegen/models/output_artifact_visibility.py b/codegen/out/aignx/codegen/models/output_artifact_visibility.py new file mode 100644 index 00000000..357ed2a5 --- /dev/null +++ b/codegen/out/aignx/codegen/models/output_artifact_visibility.py @@ -0,0 +1,34 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class OutputArtifactVisibility(str, Enum): + """ + OutputArtifactVisibility + """ + + """ + allowed enum values + """ + INTERNAL = 'internal' + EXTERNAL = 'external' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of OutputArtifactVisibility from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/out/aignx/codegen/models/payload_input_artifact.py b/codegen/out/aignx/codegen/models/payload_input_artifact.py new file mode 100644 index 00000000..1eec8b69 --- /dev/null +++ b/codegen/out/aignx/codegen/models/payload_input_artifact.py @@ -0,0 +1,89 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self + +class PayloadInputArtifact(BaseModel): + """ + PayloadInputArtifact + """ # noqa: E501 + input_artifact_id: StrictStr + metadata: Dict[str, Any] + download_url: Annotated[str, Field(min_length=1, strict=True)] + __properties: ClassVar[List[str]] = ["input_artifact_id", "metadata", "download_url"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of PayloadInputArtifact from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of PayloadInputArtifact from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "input_artifact_id": obj.get("input_artifact_id"), + "metadata": obj.get("metadata"), + "download_url": obj.get("download_url") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/payload_item.py b/codegen/out/aignx/codegen/models/payload_item.py new file mode 100644 index 00000000..472ce936 --- /dev/null +++ b/codegen/out/aignx/codegen/models/payload_item.py @@ -0,0 +1,114 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.payload_input_artifact import PayloadInputArtifact +from aignx.codegen.models.payload_output_artifact import PayloadOutputArtifact +from typing import Optional, Set +from typing_extensions import Self + +class PayloadItem(BaseModel): + """ + PayloadItem + """ # noqa: E501 + item_id: StrictStr + input_artifacts: Dict[str, PayloadInputArtifact] + output_artifacts: Dict[str, PayloadOutputArtifact] + __properties: ClassVar[List[str]] = ["item_id", "input_artifacts", "output_artifacts"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of PayloadItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each value in input_artifacts (dict) + _field_dict = {} + if self.input_artifacts: + for _key_input_artifacts in self.input_artifacts: + if self.input_artifacts[_key_input_artifacts]: + _field_dict[_key_input_artifacts] = self.input_artifacts[_key_input_artifacts].to_dict() + _dict['input_artifacts'] = _field_dict + # override the default output from pydantic by calling `to_dict()` of each value in output_artifacts (dict) + _field_dict = {} + if self.output_artifacts: + for _key_output_artifacts in self.output_artifacts: + if self.output_artifacts[_key_output_artifacts]: + _field_dict[_key_output_artifacts] = self.output_artifacts[_key_output_artifacts].to_dict() + _dict['output_artifacts'] = _field_dict + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of PayloadItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "item_id": obj.get("item_id"), + "input_artifacts": dict( + (_k, PayloadInputArtifact.from_dict(_v)) + for _k, _v in obj["input_artifacts"].items() + ) + if obj.get("input_artifacts") is not None + else None, + "output_artifacts": dict( + (_k, PayloadOutputArtifact.from_dict(_v)) + for _k, _v in obj["output_artifacts"].items() + ) + if obj.get("output_artifacts") is not None + else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/payload_output_artifact.py b/codegen/out/aignx/codegen/models/payload_output_artifact.py new file mode 100644 index 00000000..bc149705 --- /dev/null +++ b/codegen/out/aignx/codegen/models/payload_output_artifact.py @@ -0,0 +1,95 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.transfer_urls import TransferUrls +from typing import Optional, Set +from typing_extensions import Self + +class PayloadOutputArtifact(BaseModel): + """ + PayloadOutputArtifact + """ # noqa: E501 + output_artifact_id: StrictStr + data: TransferUrls + metadata: TransferUrls + __properties: ClassVar[List[str]] = ["output_artifact_id", "data", "metadata"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of PayloadOutputArtifact from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of data + if self.data: + _dict['data'] = self.data.to_dict() + # override the default output from pydantic by calling `to_dict()` of metadata + if self.metadata: + _dict['metadata'] = self.metadata.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of PayloadOutputArtifact from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "output_artifact_id": obj.get("output_artifact_id"), + "data": TransferUrls.from_dict(obj["data"]) if obj.get("data") is not None else None, + "metadata": TransferUrls.from_dict(obj["metadata"]) if obj.get("metadata") is not None else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/quota_name.py b/codegen/out/aignx/codegen/models/quota_name.py new file mode 100644 index 00000000..d912727c --- /dev/null +++ b/codegen/out/aignx/codegen/models/quota_name.py @@ -0,0 +1,41 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class QuotaName(str, Enum): + """ + Global, API-level, and slide-level quotas for Samia API. + """ + + """ + allowed enum values + """ + MAX_USERS = 'max_users' + MAX_ORGANIZATIONS = 'max_organizations' + MAX_USERS_PER_ORGANIZATION = 'max_users_per_organization' + MAX_APPLICATIONS = 'max_applications' + MAX_APPLICATION_VERSIONS = 'max_application_versions' + MAX_SLIDES_PER_RUN = 'max_slides_per_run' + MAX_PARALLEL_RUNS = 'max_parallel_runs' + MAX_PARALLEL_RUNS_PER_ORGANIZATION = 'max_parallel_runs_per_organization' + MAX_PARALLEL_RUNS_PER_USER = 'max_parallel_runs_per_user' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of QuotaName from a JSON string""" + return cls(json.loads(json_str)) diff --git a/codegen/out/aignx/codegen/models/quota_read_response.py b/codegen/out/aignx/codegen/models/quota_read_response.py new file mode 100644 index 00000000..f49313d4 --- /dev/null +++ b/codegen/out/aignx/codegen/models/quota_read_response.py @@ -0,0 +1,87 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictInt +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.quota_name import QuotaName +from typing import Optional, Set +from typing_extensions import Self + +class QuotaReadResponse(BaseModel): + """ + GET response payload for quota read. + """ # noqa: E501 + name: QuotaName + quota: StrictInt + __properties: ClassVar[List[str]] = ["name", "quota"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of QuotaReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of QuotaReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "quota": obj.get("quota") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/quota_update_request.py b/codegen/out/aignx/codegen/models/quota_update_request.py new file mode 100644 index 00000000..578667c9 --- /dev/null +++ b/codegen/out/aignx/codegen/models/quota_update_request.py @@ -0,0 +1,87 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictInt +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.quota_name import QuotaName +from typing import Optional, Set +from typing_extensions import Self + +class QuotaUpdateRequest(BaseModel): + """ + PATCH request payload for quota update. + """ # noqa: E501 + name: QuotaName + quota: StrictInt + __properties: ClassVar[List[str]] = ["name", "quota"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of QuotaUpdateRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of QuotaUpdateRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "quota": obj.get("quota") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/quota_update_response.py b/codegen/out/aignx/codegen/models/quota_update_response.py new file mode 100644 index 00000000..257acb29 --- /dev/null +++ b/codegen/out/aignx/codegen/models/quota_update_response.py @@ -0,0 +1,87 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictInt +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.quota_name import QuotaName +from typing import Optional, Set +from typing_extensions import Self + +class QuotaUpdateResponse(BaseModel): + """ + PATCH response payload for quota update. + """ # noqa: E501 + name: QuotaName + quota: StrictInt + __properties: ClassVar[List[str]] = ["name", "quota"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of QuotaUpdateResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of QuotaUpdateResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "name": obj.get("name"), + "quota": obj.get("quota") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/quotas_read_response.py b/codegen/out/aignx/codegen/models/quotas_read_response.py new file mode 100644 index 00000000..317340d2 --- /dev/null +++ b/codegen/out/aignx/codegen/models/quotas_read_response.py @@ -0,0 +1,92 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.quota_read_response import QuotaReadResponse +from typing import Optional, Set +from typing_extensions import Self + +class QuotasReadResponse(BaseModel): + """ + GET response payload for multiple quota reads. + """ # noqa: E501 + quotas: List[QuotaReadResponse] + __properties: ClassVar[List[str]] = ["quotas"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of QuotasReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in quotas (list) + _items = [] + if self.quotas: + for _item_quotas in self.quotas: + if _item_quotas: + _items.append(_item_quotas.to_dict()) + _dict['quotas'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of QuotasReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "quotas": [QuotaReadResponse.from_dict(_item) for _item in obj["quotas"]] if obj.get("quotas") is not None else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/quotas_update_request.py b/codegen/out/aignx/codegen/models/quotas_update_request.py new file mode 100644 index 00000000..62fc9981 --- /dev/null +++ b/codegen/out/aignx/codegen/models/quotas_update_request.py @@ -0,0 +1,92 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.quota_update_request import QuotaUpdateRequest +from typing import Optional, Set +from typing_extensions import Self + +class QuotasUpdateRequest(BaseModel): + """ + PATCH request payload for quota updates. + """ # noqa: E501 + quotas: List[QuotaUpdateRequest] + __properties: ClassVar[List[str]] = ["quotas"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of QuotasUpdateRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in quotas (list) + _items = [] + if self.quotas: + for _item_quotas in self.quotas: + if _item_quotas: + _items.append(_item_quotas.to_dict()) + _dict['quotas'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of QuotasUpdateRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "quotas": [QuotaUpdateRequest.from_dict(_item) for _item in obj["quotas"]] if obj.get("quotas") is not None else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/quotas_update_response.py b/codegen/out/aignx/codegen/models/quotas_update_response.py new file mode 100644 index 00000000..6ba5048a --- /dev/null +++ b/codegen/out/aignx/codegen/models/quotas_update_response.py @@ -0,0 +1,92 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.quota_update_response import QuotaUpdateResponse +from typing import Optional, Set +from typing_extensions import Self + +class QuotasUpdateResponse(BaseModel): + """ + PATCH response payload for quota updates. + """ # noqa: E501 + updated_quotas: List[QuotaUpdateResponse] + __properties: ClassVar[List[str]] = ["updated_quotas"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of QuotasUpdateResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in updated_quotas (list) + _items = [] + if self.updated_quotas: + for _item_updated_quotas in self.updated_quotas: + if _item_updated_quotas: + _items.append(_item_updated_quotas.to_dict()) + _dict['updated_quotas'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of QuotasUpdateResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "updated_quotas": [QuotaUpdateResponse.from_dict(_item) for _item in obj["updated_quotas"]] if obj.get("updated_quotas") is not None else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/run_creation_request.py b/codegen/out/aignx/codegen/models/run_creation_request.py new file mode 100644 index 00000000..5e27d316 --- /dev/null +++ b/codegen/out/aignx/codegen/models/run_creation_request.py @@ -0,0 +1,98 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.application_version import ApplicationVersion +from aignx.codegen.models.item_creation_request import ItemCreationRequest +from typing import Optional, Set +from typing_extensions import Self + +class RunCreationRequest(BaseModel): + """ + RunCreationRequest + """ # noqa: E501 + application_version: ApplicationVersion + items: List[ItemCreationRequest] + __properties: ClassVar[List[str]] = ["application_version", "items"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RunCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of application_version + if self.application_version: + _dict['application_version'] = self.application_version.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in items (list) + _items = [] + if self.items: + for _item_items in self.items: + if _item_items: + _items.append(_item_items.to_dict()) + _dict['items'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RunCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_version": ApplicationVersion.from_dict(obj["application_version"]) if obj.get("application_version") is not None else None, + "items": [ItemCreationRequest.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/run_creation_response.py b/codegen/out/aignx/codegen/models/run_creation_response.py new file mode 100644 index 00000000..c3b02e67 --- /dev/null +++ b/codegen/out/aignx/codegen/models/run_creation_response.py @@ -0,0 +1,84 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class RunCreationResponse(BaseModel): + """ + RunCreationResponse + """ # noqa: E501 + application_run_id: StrictStr + __properties: ClassVar[List[str]] = ["application_run_id"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RunCreationResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RunCreationResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_run_id": obj.get("application_run_id") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/run_read_response.py b/codegen/out/aignx/codegen/models/run_read_response.py new file mode 100644 index 00000000..ab747a09 --- /dev/null +++ b/codegen/out/aignx/codegen/models/run_read_response.py @@ -0,0 +1,107 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from datetime import datetime +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from aignx.codegen.models.application_run_status import ApplicationRunStatus +from aignx.codegen.models.user_payload import UserPayload +from typing import Optional, Set +from typing_extensions import Self + +class RunReadResponse(BaseModel): + """ + RunReadResponse + """ # noqa: E501 + application_run_id: StrictStr + application_version_id: StrictStr + organization_id: StrictStr + user_payload: Optional[UserPayload] = None + status: ApplicationRunStatus + triggered_at: datetime + triggered_by: StrictStr + __properties: ClassVar[List[str]] = ["application_run_id", "application_version_id", "organization_id", "user_payload", "status", "triggered_at", "triggered_by"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RunReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of user_payload + if self.user_payload: + _dict['user_payload'] = self.user_payload.to_dict() + # set to None if user_payload (nullable) is None + # and model_fields_set contains the field + if self.user_payload is None and "user_payload" in self.model_fields_set: + _dict['user_payload'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RunReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_run_id": obj.get("application_run_id"), + "application_version_id": obj.get("application_version_id"), + "organization_id": obj.get("organization_id"), + "user_payload": UserPayload.from_dict(obj["user_payload"]) if obj.get("user_payload") is not None else None, + "status": obj.get("status"), + "triggered_at": obj.get("triggered_at"), + "triggered_by": obj.get("triggered_by") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/slug_version_request.py b/codegen/out/aignx/codegen/models/slug_version_request.py new file mode 100644 index 00000000..f7d17143 --- /dev/null +++ b/codegen/out/aignx/codegen/models/slug_version_request.py @@ -0,0 +1,94 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self + +class SlugVersionRequest(BaseModel): + """ + SlugVersionRequest + """ # noqa: E501 + application_slug: Annotated[str, Field(strict=True)] + version: StrictStr + __properties: ClassVar[List[str]] = ["application_slug", "version"] + + @field_validator('application_slug') + def application_slug_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-z](-?[a-z])*$", value): + raise ValueError(r"must validate the regular expression /^[a-z](-?[a-z])*$/") + return value + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of SlugVersionRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of SlugVersionRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_slug": obj.get("application_slug"), + "version": obj.get("version") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/transfer_urls.py b/codegen/out/aignx/codegen/models/transfer_urls.py new file mode 100644 index 00000000..3a329aa0 --- /dev/null +++ b/codegen/out/aignx/codegen/models/transfer_urls.py @@ -0,0 +1,87 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self + +class TransferUrls(BaseModel): + """ + TransferUrls + """ # noqa: E501 + upload_url: Annotated[str, Field(min_length=1, strict=True)] + download_url: Annotated[str, Field(min_length=1, strict=True)] + __properties: ClassVar[List[str]] = ["upload_url", "download_url"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TransferUrls from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TransferUrls from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "upload_url": obj.get("upload_url"), + "download_url": obj.get("download_url") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/user_creation_request.py b/codegen/out/aignx/codegen/models/user_creation_request.py new file mode 100644 index 00000000..12777e73 --- /dev/null +++ b/codegen/out/aignx/codegen/models/user_creation_request.py @@ -0,0 +1,93 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self + +class UserCreationRequest(BaseModel): + """ + UserCreationRequest + """ # noqa: E501 + user_id: StrictStr + organization_id: StrictStr + email: Optional[StrictStr] + __properties: ClassVar[List[str]] = ["user_id", "organization_id", "email"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of UserCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if email (nullable) is None + # and model_fields_set contains the field + if self.email is None and "email" in self.model_fields_set: + _dict['email'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of UserCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "user_id": obj.get("user_id"), + "organization_id": obj.get("organization_id"), + "email": obj.get("email") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/user_payload.py b/codegen/out/aignx/codegen/models/user_payload.py new file mode 100644 index 00000000..7800d69a --- /dev/null +++ b/codegen/out/aignx/codegen/models/user_payload.py @@ -0,0 +1,116 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from aignx.codegen.models.payload_item import PayloadItem +from aignx.codegen.models.payload_output_artifact import PayloadOutputArtifact +from typing import Optional, Set +from typing_extensions import Self + +class UserPayload(BaseModel): + """ + UserPayload + """ # noqa: E501 + application_id: StrictStr + application_run_id: StrictStr + global_output_artifacts: Optional[Dict[str, PayloadOutputArtifact]] + items: List[PayloadItem] + __properties: ClassVar[List[str]] = ["application_id", "application_run_id", "global_output_artifacts", "items"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of UserPayload from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each value in global_output_artifacts (dict) + _field_dict = {} + if self.global_output_artifacts: + for _key_global_output_artifacts in self.global_output_artifacts: + if self.global_output_artifacts[_key_global_output_artifacts]: + _field_dict[_key_global_output_artifacts] = self.global_output_artifacts[_key_global_output_artifacts].to_dict() + _dict['global_output_artifacts'] = _field_dict + # override the default output from pydantic by calling `to_dict()` of each item in items (list) + _items = [] + if self.items: + for _item_items in self.items: + if _item_items: + _items.append(_item_items.to_dict()) + _dict['items'] = _items + # set to None if global_output_artifacts (nullable) is None + # and model_fields_set contains the field + if self.global_output_artifacts is None and "global_output_artifacts" in self.model_fields_set: + _dict['global_output_artifacts'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of UserPayload from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_id": obj.get("application_id"), + "application_run_id": obj.get("application_run_id"), + "global_output_artifacts": dict( + (_k, PayloadOutputArtifact.from_dict(_v)) + for _k, _v in obj["global_output_artifacts"].items() + ) + if obj.get("global_output_artifacts") is not None + else None, + "items": [PayloadItem.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/user_quota.py b/codegen/out/aignx/codegen/models/user_quota.py new file mode 100644 index 00000000..a2265946 --- /dev/null +++ b/codegen/out/aignx/codegen/models/user_quota.py @@ -0,0 +1,91 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self + +class UserQuota(BaseModel): + """ + UserQuota + """ # noqa: E501 + total: Optional[StrictInt] + used: StrictInt + __properties: ClassVar[List[str]] = ["total", "used"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of UserQuota from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if total (nullable) is None + # and model_fields_set contains the field + if self.total is None and "total" in self.model_fields_set: + _dict['total'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of UserQuota from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "total": obj.get("total"), + "used": obj.get("used") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/user_response.py b/codegen/out/aignx/codegen/models/user_response.py new file mode 100644 index 00000000..ecc0d0ff --- /dev/null +++ b/codegen/out/aignx/codegen/models/user_response.py @@ -0,0 +1,102 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from aignx.codegen.models.user_quota import UserQuota +from typing import Optional, Set +from typing_extensions import Self + +class UserResponse(BaseModel): + """ + UserResponse + """ # noqa: E501 + user_id: Optional[StrictStr] + organization_id: Optional[StrictStr] + slide_quota: UserQuota + __properties: ClassVar[List[str]] = ["user_id", "organization_id", "slide_quota"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of UserResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of slide_quota + if self.slide_quota: + _dict['slide_quota'] = self.slide_quota.to_dict() + # set to None if user_id (nullable) is None + # and model_fields_set contains the field + if self.user_id is None and "user_id" in self.model_fields_set: + _dict['user_id'] = None + + # set to None if organization_id (nullable) is None + # and model_fields_set contains the field + if self.organization_id is None and "organization_id" in self.model_fields_set: + _dict['organization_id'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of UserResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "user_id": obj.get("user_id"), + "organization_id": obj.get("organization_id"), + "slide_quota": UserQuota.from_dict(obj["slide_quota"]) if obj.get("slide_quota") is not None else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/user_update_request.py b/codegen/out/aignx/codegen/models/user_update_request.py new file mode 100644 index 00000000..a60b9eda --- /dev/null +++ b/codegen/out/aignx/codegen/models/user_update_request.py @@ -0,0 +1,96 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self + +class UserUpdateRequest(BaseModel): + """ + UserUpdateRequest + """ # noqa: E501 + user_id: Optional[StrictStr] = None + slide_quota: Optional[StrictInt] = None + __properties: ClassVar[List[str]] = ["user_id", "slide_quota"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of UserUpdateRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if user_id (nullable) is None + # and model_fields_set contains the field + if self.user_id is None and "user_id" in self.model_fields_set: + _dict['user_id'] = None + + # set to None if slide_quota (nullable) is None + # and model_fields_set contains the field + if self.slide_quota is None and "slide_quota" in self.model_fields_set: + _dict['slide_quota'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of UserUpdateRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "user_id": obj.get("user_id"), + "slide_quota": obj.get("slide_quota") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/validation_error.py b/codegen/out/aignx/codegen/models/validation_error.py new file mode 100644 index 00000000..f9c19f35 --- /dev/null +++ b/codegen/out/aignx/codegen/models/validation_error.py @@ -0,0 +1,96 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.validation_error_loc_inner import ValidationErrorLocInner +from typing import Optional, Set +from typing_extensions import Self + +class ValidationError(BaseModel): + """ + ValidationError + """ # noqa: E501 + loc: List[ValidationErrorLocInner] + msg: StrictStr + type: StrictStr + __properties: ClassVar[List[str]] = ["loc", "msg", "type"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ValidationError from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in loc (list) + _items = [] + if self.loc: + for _item_loc in self.loc: + if _item_loc: + _items.append(_item_loc.to_dict()) + _dict['loc'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ValidationError from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "loc": [ValidationErrorLocInner.from_dict(_item) for _item in obj["loc"]] if obj.get("loc") is not None else None, + "msg": obj.get("msg"), + "type": obj.get("type") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/validation_error_loc_inner.py b/codegen/out/aignx/codegen/models/validation_error_loc_inner.py new file mode 100644 index 00000000..6e532d48 --- /dev/null +++ b/codegen/out/aignx/codegen/models/validation_error_loc_inner.py @@ -0,0 +1,135 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +from inspect import getfullargspec +import json +import pprint +import re # noqa: F401 +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr, ValidationError, field_validator +from typing import Optional +from typing import Union, Any, List, Set, TYPE_CHECKING, Optional, Dict +from typing_extensions import Literal, Self +from pydantic import Field + +VALIDATIONERRORLOCINNER_ANY_OF_SCHEMAS = ["int", "str"] + +class ValidationErrorLocInner(BaseModel): + """ + ValidationErrorLocInner + """ + + # data type: str + anyof_schema_1_validator: Optional[StrictStr] = None + # data type: int + anyof_schema_2_validator: Optional[StrictInt] = None + if TYPE_CHECKING: + actual_instance: Optional[Union[int, str]] = None + else: + actual_instance: Any = None + any_of_schemas: Set[str] = { "int", "str" } + + model_config = { + "validate_assignment": True, + "protected_namespaces": (), + } + + def __init__(self, *args, **kwargs) -> None: + if args: + if len(args) > 1: + raise ValueError("If a position argument is used, only 1 is allowed to set `actual_instance`") + if kwargs: + raise ValueError("If a position argument is used, keyword arguments cannot be used.") + super().__init__(actual_instance=args[0]) + else: + super().__init__(**kwargs) + + @field_validator('actual_instance') + def actual_instance_must_validate_anyof(cls, v): + instance = ValidationErrorLocInner.model_construct() + error_messages = [] + # validate data type: str + try: + instance.anyof_schema_1_validator = v + return v + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # validate data type: int + try: + instance.anyof_schema_2_validator = v + return v + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + if error_messages: + # no match + raise ValueError("No match found when setting the actual_instance in ValidationErrorLocInner with anyOf schemas: int, str. Details: " + ", ".join(error_messages)) + else: + return v + + @classmethod + def from_dict(cls, obj: Dict[str, Any]) -> Self: + return cls.from_json(json.dumps(obj)) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Returns the object represented by the json string""" + instance = cls.model_construct() + error_messages = [] + # deserialize data into str + try: + # validation + instance.anyof_schema_1_validator = json.loads(json_str) + # assign value to actual_instance + instance.actual_instance = instance.anyof_schema_1_validator + return instance + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into int + try: + # validation + instance.anyof_schema_2_validator = json.loads(json_str) + # assign value to actual_instance + instance.actual_instance = instance.anyof_schema_2_validator + return instance + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + + if error_messages: + # no match + raise ValueError("No match found when deserializing the JSON string into ValidationErrorLocInner with anyOf schemas: int, str. Details: " + ", ".join(error_messages)) + else: + return instance + + def to_json(self) -> str: + """Returns the JSON representation of the actual instance""" + if self.actual_instance is None: + return "null" + + if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): + return self.actual_instance.to_json() + else: + return json.dumps(self.actual_instance) + + def to_dict(self) -> Optional[Union[Dict[str, Any], int, str]]: + """Returns the dict representation of the actual instance""" + if self.actual_instance is None: + return None + + if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): + return self.actual_instance.to_dict() + else: + return self.actual_instance + + def to_str(self) -> str: + """Returns the string representation of the actual instance""" + return pprint.pformat(self.model_dump()) diff --git a/codegen/out/aignx/codegen/models/version_creation_request.py b/codegen/out/aignx/codegen/models/version_creation_request.py new file mode 100644 index 00000000..a0fc6749 --- /dev/null +++ b/codegen/out/aignx/codegen/models/version_creation_request.py @@ -0,0 +1,110 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from aignx.codegen.models.input_artifact_schema_creation_request import InputArtifactSchemaCreationRequest +from aignx.codegen.models.output_artifact_schema_creation_request import OutputArtifactSchemaCreationRequest +from typing import Optional, Set +from typing_extensions import Self + +class VersionCreationRequest(BaseModel): + """ + VersionCreationRequest + """ # noqa: E501 + version: StrictStr + application_id: StrictStr + flow_id: StrictStr + changelog: StrictStr + input_artifacts: List[InputArtifactSchemaCreationRequest] + output_artifacts: List[OutputArtifactSchemaCreationRequest] + __properties: ClassVar[List[str]] = ["version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of VersionCreationRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) + _items = [] + if self.input_artifacts: + for _item_input_artifacts in self.input_artifacts: + if _item_input_artifacts: + _items.append(_item_input_artifacts.to_dict()) + _dict['input_artifacts'] = _items + # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) + _items = [] + if self.output_artifacts: + for _item_output_artifacts in self.output_artifacts: + if _item_output_artifacts: + _items.append(_item_output_artifacts.to_dict()) + _dict['output_artifacts'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of VersionCreationRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "version": obj.get("version"), + "application_id": obj.get("application_id"), + "flow_id": obj.get("flow_id"), + "changelog": obj.get("changelog"), + "input_artifacts": [InputArtifactSchemaCreationRequest.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None, + "output_artifacts": [OutputArtifactSchemaCreationRequest.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/version_creation_response.py b/codegen/out/aignx/codegen/models/version_creation_response.py new file mode 100644 index 00000000..0150b084 --- /dev/null +++ b/codegen/out/aignx/codegen/models/version_creation_response.py @@ -0,0 +1,84 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class VersionCreationResponse(BaseModel): + """ + VersionCreationResponse + """ # noqa: E501 + application_version_id: StrictStr + __properties: ClassVar[List[str]] = ["application_version_id"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of VersionCreationResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of VersionCreationResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_version_id": obj.get("application_version_id") + }) + return _obj diff --git a/codegen/out/aignx/codegen/models/version_read_response.py b/codegen/out/aignx/codegen/models/version_read_response.py new file mode 100644 index 00000000..c979a837 --- /dev/null +++ b/codegen/out/aignx/codegen/models/version_read_response.py @@ -0,0 +1,120 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from datetime import datetime +from pydantic import BaseModel, ConfigDict, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from aignx.codegen.models.input_artifact import InputArtifact +from aignx.codegen.models.output_artifact import OutputArtifact +from typing import Optional, Set +from typing_extensions import Self + +class VersionReadResponse(BaseModel): + """ + VersionReadResponse + """ # noqa: E501 + application_version_id: StrictStr + version: StrictStr + application_id: StrictStr + flow_id: Optional[StrictStr] = None + changelog: StrictStr + input_artifacts: List[InputArtifact] + output_artifacts: List[OutputArtifact] + created_at: datetime + __properties: ClassVar[List[str]] = ["application_version_id", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts", "created_at"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of VersionReadResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) + _items = [] + if self.input_artifacts: + for _item_input_artifacts in self.input_artifacts: + if _item_input_artifacts: + _items.append(_item_input_artifacts.to_dict()) + _dict['input_artifacts'] = _items + # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) + _items = [] + if self.output_artifacts: + for _item_output_artifacts in self.output_artifacts: + if _item_output_artifacts: + _items.append(_item_output_artifacts.to_dict()) + _dict['output_artifacts'] = _items + # set to None if flow_id (nullable) is None + # and model_fields_set contains the field + if self.flow_id is None and "flow_id" in self.model_fields_set: + _dict['flow_id'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of VersionReadResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "application_version_id": obj.get("application_version_id"), + "version": obj.get("version"), + "application_id": obj.get("application_id"), + "flow_id": obj.get("flow_id"), + "changelog": obj.get("changelog"), + "input_artifacts": [InputArtifact.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None, + "output_artifacts": [OutputArtifact.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None, + "created_at": obj.get("created_at") + }) + return _obj diff --git a/codegen/out/aignx/codegen/rest.py b/codegen/out/aignx/codegen/rest.py new file mode 100644 index 00000000..d7232881 --- /dev/null +++ b/codegen/out/aignx/codegen/rest.py @@ -0,0 +1,256 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import io +import json +import re +import ssl + +import urllib3 + +from aignx.codegen.exceptions import ApiException, ApiValueError + +SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"} +RESTResponseType = urllib3.HTTPResponse + + +def is_socks_proxy_url(url): + if url is None: + return False + split_section = url.split("://") + if len(split_section) < 2: + return False + else: + return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES + + +class RESTResponse(io.IOBase): + + def __init__(self, resp) -> None: + self.response = resp + self.status = resp.status + self.reason = resp.reason + self.data = None + + def read(self): + if self.data is None: + self.data = self.response.data + return self.data + + def getheaders(self): + """Returns a dictionary of the response headers.""" + return self.response.headers + + def getheader(self, name, default=None): + """Returns a given response header.""" + return self.response.headers.get(name, default) + + +class RESTClientObject: + + def __init__(self, configuration) -> None: + # urllib3.PoolManager will pass all kw parameters to connectionpool + # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501 + # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501 + # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501 + + # cert_reqs + if configuration.verify_ssl: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + + pool_args = { + "cert_reqs": cert_reqs, + "ca_certs": configuration.ssl_ca_cert, + "cert_file": configuration.cert_file, + "key_file": configuration.key_file, + } + if configuration.assert_hostname is not None: + pool_args['assert_hostname'] = ( + configuration.assert_hostname + ) + + if configuration.retries is not None: + pool_args['retries'] = configuration.retries + + if configuration.tls_server_name: + pool_args['server_hostname'] = configuration.tls_server_name + + + if configuration.socket_options is not None: + pool_args['socket_options'] = configuration.socket_options + + if configuration.connection_pool_maxsize is not None: + pool_args['maxsize'] = configuration.connection_pool_maxsize + + # https pool manager + self.pool_manager: urllib3.PoolManager + + if configuration.proxy: + if is_socks_proxy_url(configuration.proxy): + from urllib3.contrib.socks import SOCKSProxyManager + pool_args["proxy_url"] = configuration.proxy + pool_args["headers"] = configuration.proxy_headers + self.pool_manager = SOCKSProxyManager(**pool_args) + else: + pool_args["proxy_url"] = configuration.proxy + pool_args["proxy_headers"] = configuration.proxy_headers + self.pool_manager = urllib3.ProxyManager(**pool_args) + else: + self.pool_manager = urllib3.PoolManager(**pool_args) + + def request( + self, + method, + url, + headers=None, + body=None, + post_params=None, + _request_timeout=None + ): + """Perform requests. + + :param method: http request method + :param url: http request url + :param headers: http request headers + :param body: request json body, for `application/json` + :param post_params: request post parameters, + `application/x-www-form-urlencoded` + and `multipart/form-data` + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + """ + method = method.upper() + assert method in [ + 'GET', + 'HEAD', + 'DELETE', + 'POST', + 'PUT', + 'PATCH', + 'OPTIONS' + ] + + if post_params and body: + raise ApiValueError( + "body parameter cannot be used with post_params parameter." + ) + + post_params = post_params or {} + headers = headers or {} + + timeout = None + if _request_timeout: + if isinstance(_request_timeout, (int, float)): + timeout = urllib3.Timeout(total=_request_timeout) + elif ( + isinstance(_request_timeout, tuple) + and len(_request_timeout) == 2 + ): + timeout = urllib3.Timeout( + connect=_request_timeout[0], + read=_request_timeout[1] + ) + + try: + # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` + if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: + + # no content type provided or payload is json + content_type = headers.get('Content-Type') + if ( + not content_type + or re.search('json', content_type, re.IGNORECASE) + ): + request_body = None + if body is not None: + request_body = json.dumps(body) + r = self.pool_manager.request( + method, + url, + body=request_body, + timeout=timeout, + headers=headers, + preload_content=False + ) + elif content_type == 'application/x-www-form-urlencoded': + r = self.pool_manager.request( + method, + url, + fields=post_params, + encode_multipart=False, + timeout=timeout, + headers=headers, + preload_content=False + ) + elif content_type == 'multipart/form-data': + # must del headers['Content-Type'], or the correct + # Content-Type which generated by urllib3 will be + # overwritten. + del headers['Content-Type'] + # Ensures that dict objects are serialized + post_params = [(a, json.dumps(b)) if isinstance(b, dict) else (a,b) for a, b in post_params] + r = self.pool_manager.request( + method, + url, + fields=post_params, + encode_multipart=True, + timeout=timeout, + headers=headers, + preload_content=False + ) + # Pass a `string` parameter directly in the body to support + # other content types than JSON when `body` argument is + # provided in serialized form. + elif isinstance(body, str) or isinstance(body, bytes): + r = self.pool_manager.request( + method, + url, + body=body, + timeout=timeout, + headers=headers, + preload_content=False + ) + elif headers['Content-Type'].startswith('text/') and isinstance(body, bool): + request_body = "true" if body else "false" + r = self.pool_manager.request( + method, + url, + body=request_body, + preload_content=False, + timeout=timeout, + headers=headers) + else: + # Cannot generate the request from given parameters + msg = """Cannot prepare a request message for provided + arguments. Please check that your arguments match + declared content type.""" + raise ApiException(status=0, reason=msg) + # For `GET`, `HEAD` + else: + r = self.pool_manager.request( + method, + url, + fields={}, + timeout=timeout, + headers=headers, + preload_content=False + ) + except urllib3.exceptions.SSLError as e: + msg = "\n".join([type(e).__name__, str(e)]) + raise ApiException(status=0, reason=msg) + + return RESTResponse(r) diff --git a/codegen/out/docs/ExternalsApi.md b/codegen/out/docs/ExternalsApi.md new file mode 100644 index 00000000..7e15a440 --- /dev/null +++ b/codegen/out/docs/ExternalsApi.md @@ -0,0 +1,1269 @@ +# aignx.codegen.ExternalsApi + +All URIs are relative to *http://localhost* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**cancel_run_v1_runs_application_run_id_cancel_post**](ExternalsApi.md#cancel_run_v1_runs_application_run_id_cancel_post) | **POST** /v1/runs/{application_run_id}/cancel | Cancel Run +[**create_application_run_v1_runs_post**](ExternalsApi.md#create_application_run_v1_runs_post) | **POST** /v1/runs | Create Application Run +[**create_user_v1_users_post**](ExternalsApi.md#create_user_v1_users_post) | **POST** /v1/users/ | Create User +[**delete_run_results_v1_runs_application_run_id_results_delete**](ExternalsApi.md#delete_run_results_v1_runs_application_run_id_results_delete) | **DELETE** /v1/runs/{application_run_id}/results | Delete Run Results +[**get_run_v1_runs_application_run_id_get**](ExternalsApi.md#get_run_v1_runs_application_run_id_get) | **GET** /v1/runs/{application_run_id} | Get Run +[**get_user_v1_users_user_id_get**](ExternalsApi.md#get_user_v1_users_user_id_get) | **GET** /v1/users/{user_id} | Get User +[**get_version_v1_versions_application_version_id_get**](ExternalsApi.md#get_version_v1_versions_application_version_id_get) | **GET** /v1/versions/{application_version_id} | Get Version +[**list_application_runs_v1_runs_get**](ExternalsApi.md#list_application_runs_v1_runs_get) | **GET** /v1/runs | List Application Runs +[**list_applications_v1_applications_get**](ExternalsApi.md#list_applications_v1_applications_get) | **GET** /v1/applications | List Applications +[**list_run_results_v1_runs_application_run_id_results_get**](ExternalsApi.md#list_run_results_v1_runs_application_run_id_results_get) | **GET** /v1/runs/{application_run_id}/results | List Run Results +[**list_versions_by_application_id_v1_applications_application_id_versions_get**](ExternalsApi.md#list_versions_by_application_id_v1_applications_application_id_versions_get) | **GET** /v1/applications/{application_id}/versions | List Versions By Application Id +[**list_versions_by_application_slug_v1_applications_application_slug_versions_get**](ExternalsApi.md#list_versions_by_application_slug_v1_applications_application_slug_versions_get) | **GET** /v1/applications/{application_slug}/versions | List Versions By Application Slug +[**read_application_by_id_v1_applications_application_id_get**](ExternalsApi.md#read_application_by_id_v1_applications_application_id_get) | **GET** /v1/applications/{application_id} | Read Application By Id +[**read_application_by_slug_v1_applications_application_slug_get**](ExternalsApi.md#read_application_by_slug_v1_applications_application_slug_get) | **GET** /v1/applications/{application_slug} | Read Application By Slug +[**register_version_v1_versions_post**](ExternalsApi.md#register_version_v1_versions_post) | **POST** /v1/versions | Register Version +[**update_user_v1_users_user_id_patch**](ExternalsApi.md#update_user_v1_users_user_id_patch) | **PATCH** /v1/users/{user_id} | Update User + + +# **cancel_run_v1_runs_application_run_id_cancel_post** +> object cancel_run_v1_runs_application_run_id_cancel_post(application_run_id) + +Cancel Run + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_run_id = 'application_run_id_example' # str | + + try: + # Cancel Run + api_response = api_instance.cancel_run_v1_runs_application_run_id_cancel_post(application_run_id) + print("The response of ExternalsApi->cancel_run_v1_runs_application_run_id_cancel_post:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->cancel_run_v1_runs_application_run_id_cancel_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_run_id** | **str**| | + +### Return type + +**object** + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**202** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **create_application_run_v1_runs_post** +> RunCreationResponse create_application_run_v1_runs_post(run_creation_request) + +Create Application Run + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.run_creation_request import RunCreationRequest +from aignx.codegen.models.run_creation_response import RunCreationResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + run_creation_request = aignx.codegen.RunCreationRequest() # RunCreationRequest | + + try: + # Create Application Run + api_response = api_instance.create_application_run_v1_runs_post(run_creation_request) + print("The response of ExternalsApi->create_application_run_v1_runs_post:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->create_application_run_v1_runs_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **run_creation_request** | [**RunCreationRequest**](RunCreationRequest.md)| | + +### Return type + +[**RunCreationResponse**](RunCreationResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**201** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **create_user_v1_users_post** +> UserResponse create_user_v1_users_post(user_creation_request) + +Create User + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.user_creation_request import UserCreationRequest +from aignx.codegen.models.user_response import UserResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + user_creation_request = aignx.codegen.UserCreationRequest() # UserCreationRequest | + + try: + # Create User + api_response = api_instance.create_user_v1_users_post(user_creation_request) + print("The response of ExternalsApi->create_user_v1_users_post:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->create_user_v1_users_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user_creation_request** | [**UserCreationRequest**](UserCreationRequest.md)| | + +### Return type + +[**UserResponse**](UserResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | User not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **delete_run_results_v1_runs_application_run_id_results_delete** +> delete_run_results_v1_runs_application_run_id_results_delete(application_run_id) + +Delete Run Results + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_run_id = 'application_run_id_example' # str | + + try: + # Delete Run Results + api_instance.delete_run_results_v1_runs_application_run_id_results_delete(application_run_id) + except Exception as e: + print("Exception when calling ExternalsApi->delete_run_results_v1_runs_application_run_id_results_delete: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_run_id** | **str**| | + +### Return type + +void (empty response body) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**204** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **get_run_v1_runs_application_run_id_get** +> RunReadResponse get_run_v1_runs_application_run_id_get(application_run_id, include=include) + +Get Run + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.run_read_response import RunReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_run_id = 'application_run_id_example' # str | + include = None # List[object] | (optional) + + try: + # Get Run + api_response = api_instance.get_run_v1_runs_application_run_id_get(application_run_id, include=include) + print("The response of ExternalsApi->get_run_v1_runs_application_run_id_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->get_run_v1_runs_application_run_id_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_run_id** | **str**| | + **include** | [**List[object]**](object.md)| | [optional] + +### Return type + +[**RunReadResponse**](RunReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **get_user_v1_users_user_id_get** +> UserResponse get_user_v1_users_user_id_get(user_id) + +Get User + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.user_response import UserResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + user_id = 'user_id_example' # str | + + try: + # Get User + api_response = api_instance.get_user_v1_users_user_id_get(user_id) + print("The response of ExternalsApi->get_user_v1_users_user_id_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->get_user_v1_users_user_id_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user_id** | **str**| | + +### Return type + +[**UserResponse**](UserResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | User not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **get_version_v1_versions_application_version_id_get** +> VersionReadResponse get_version_v1_versions_application_version_id_get(application_version_id, include=include) + +Get Version + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.version_read_response import VersionReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_version_id = 'application_version_id_example' # str | + include = None # List[object] | (optional) + + try: + # Get Version + api_response = api_instance.get_version_v1_versions_application_version_id_get(application_version_id, include=include) + print("The response of ExternalsApi->get_version_v1_versions_application_version_id_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->get_version_v1_versions_application_version_id_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_version_id** | **str**| | + **include** | [**List[object]**](object.md)| | [optional] + +### Return type + +[**VersionReadResponse**](VersionReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_application_runs_v1_runs_get** +> List[RunReadResponse] list_application_runs_v1_runs_get(application_id=application_id, application_version_id=application_version_id, include=include, page=page, page_size=page_size, sort=sort) + +List Application Runs + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.run_read_response import RunReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_id = 'application_id_example' # str | (optional) + application_version_id = 'application_version_id_example' # str | (optional) + include = None # List[object] | (optional) + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Application Runs + api_response = api_instance.list_application_runs_v1_runs_get(application_id=application_id, application_version_id=application_version_id, include=include, page=page, page_size=page_size, sort=sort) + print("The response of ExternalsApi->list_application_runs_v1_runs_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->list_application_runs_v1_runs_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_id** | **str**| | [optional] + **application_version_id** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[RunReadResponse]**](RunReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_applications_v1_applications_get** +> List[ApplicationReadResponse] list_applications_v1_applications_get(page=page, page_size=page_size, sort=sort) + +List Applications + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.application_read_response import ApplicationReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Applications + api_response = api_instance.list_applications_v1_applications_get(page=page, page_size=page_size, sort=sort) + print("The response of ExternalsApi->list_applications_v1_applications_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->list_applications_v1_applications_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[ApplicationReadResponse]**](ApplicationReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_run_results_v1_runs_application_run_id_results_get** +> List[ItemResultReadResponse] list_run_results_v1_runs_application_run_id_results_get(application_run_id, item_id__in=item_id__in, page=page, page_size=page_size, reference__in=reference__in, status__in=status__in, sort=sort) + +List Run Results + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.item_result_read_response import ItemResultReadResponse +from aignx.codegen.models.item_status import ItemStatus +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_run_id = 'application_run_id_example' # str | + item_id__in = ['item_id__in_example'] # List[Optional[str]] | (optional) + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + reference__in = ['reference__in_example'] # List[str] | (optional) + status__in = [aignx.codegen.ItemStatus()] # List[ItemStatus] | (optional) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Run Results + api_response = api_instance.list_run_results_v1_runs_application_run_id_results_get(application_run_id, item_id__in=item_id__in, page=page, page_size=page_size, reference__in=reference__in, status__in=status__in, sort=sort) + print("The response of ExternalsApi->list_run_results_v1_runs_application_run_id_results_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->list_run_results_v1_runs_application_run_id_results_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_run_id** | **str**| | + **item_id__in** | [**List[Optional[str]]**](str.md)| | [optional] + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **reference__in** | [**List[str]**](str.md)| | [optional] + **status__in** | [**List[ItemStatus]**](ItemStatus.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[ItemResultReadResponse]**](ItemResultReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_versions_by_application_id_v1_applications_application_id_versions_get** +> List[ApplicationVersionReadResponse] list_versions_by_application_id_v1_applications_application_id_versions_get(application_id, page=page, page_size=page_size, version=version, include=include, sort=sort) + +List Versions By Application Id + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_id = 'application_id_example' # str | + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + version = 'version_example' # str | (optional) + include = None # List[object] | (optional) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Versions By Application Id + api_response = api_instance.list_versions_by_application_id_v1_applications_application_id_versions_get(application_id, page=page, page_size=page_size, version=version, include=include, sort=sort) + print("The response of ExternalsApi->list_versions_by_application_id_v1_applications_application_id_versions_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->list_versions_by_application_id_v1_applications_application_id_versions_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_id** | **str**| | + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **version** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[ApplicationVersionReadResponse]**](ApplicationVersionReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_versions_by_application_slug_v1_applications_application_slug_versions_get** +> List[ApplicationVersionReadResponse] list_versions_by_application_slug_v1_applications_application_slug_versions_get(application_slug, page=page, page_size=page_size, version=version, include=include, sort=sort) + +List Versions By Application Slug + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_slug = 'application_slug_example' # str | + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + version = 'version_example' # str | (optional) + include = None # List[object] | (optional) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Versions By Application Slug + api_response = api_instance.list_versions_by_application_slug_v1_applications_application_slug_versions_get(application_slug, page=page, page_size=page_size, version=version, include=include, sort=sort) + print("The response of ExternalsApi->list_versions_by_application_slug_v1_applications_application_slug_versions_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->list_versions_by_application_slug_v1_applications_application_slug_versions_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_slug** | **str**| | + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **version** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[ApplicationVersionReadResponse]**](ApplicationVersionReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **read_application_by_id_v1_applications_application_id_get** +> ApplicationReadResponse read_application_by_id_v1_applications_application_id_get(application_id) + +Read Application By Id + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.application_read_response import ApplicationReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_id = 'application_id_example' # str | + + try: + # Read Application By Id + api_response = api_instance.read_application_by_id_v1_applications_application_id_get(application_id) + print("The response of ExternalsApi->read_application_by_id_v1_applications_application_id_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->read_application_by_id_v1_applications_application_id_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_id** | **str**| | + +### Return type + +[**ApplicationReadResponse**](ApplicationReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **read_application_by_slug_v1_applications_application_slug_get** +> ApplicationReadResponse read_application_by_slug_v1_applications_application_slug_get(application_slug) + +Read Application By Slug + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.application_read_response import ApplicationReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + application_slug = 'application_slug_example' # str | + + try: + # Read Application By Slug + api_response = api_instance.read_application_by_slug_v1_applications_application_slug_get(application_slug) + print("The response of ExternalsApi->read_application_by_slug_v1_applications_application_slug_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->read_application_by_slug_v1_applications_application_slug_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_slug** | **str**| | + +### Return type + +[**ApplicationReadResponse**](ApplicationReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **register_version_v1_versions_post** +> VersionCreationResponse register_version_v1_versions_post(version_creation_request) + +Register Version + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.version_creation_request import VersionCreationRequest +from aignx.codegen.models.version_creation_response import VersionCreationResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + version_creation_request = aignx.codegen.VersionCreationRequest() # VersionCreationRequest | + + try: + # Register Version + api_response = api_instance.register_version_v1_versions_post(version_creation_request) + print("The response of ExternalsApi->register_version_v1_versions_post:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->register_version_v1_versions_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **version_creation_request** | [**VersionCreationRequest**](VersionCreationRequest.md)| | + +### Return type + +[**VersionCreationResponse**](VersionCreationResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**201** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **update_user_v1_users_user_id_patch** +> UserResponse update_user_v1_users_user_id_patch(user_id, user_update_request) + +Update User + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.user_response import UserResponse +from aignx.codegen.models.user_update_request import UserUpdateRequest +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to http://localhost +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "http://localhost" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.ExternalsApi(api_client) + user_id = 'user_id_example' # str | + user_update_request = aignx.codegen.UserUpdateRequest() # UserUpdateRequest | + + try: + # Update User + api_response = api_instance.update_user_v1_users_user_id_patch(user_id, user_update_request) + print("The response of ExternalsApi->update_user_v1_users_user_id_patch:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling ExternalsApi->update_user_v1_users_user_id_patch: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **user_id** | **str**| | + **user_update_request** | [**UserUpdateRequest**](UserUpdateRequest.md)| | + +### Return type + +[**UserResponse**](UserResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | User not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/codegen/out/test/test_externals_api.py b/codegen/out/test/test_externals_api.py new file mode 100644 index 00000000..28aef4b0 --- /dev/null +++ b/codegen/out/test/test_externals_api.py @@ -0,0 +1,142 @@ + +""" + Aignostics Platform API + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + + The version of the OpenAPI document: 0.1.0 + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest + +from aignx.codegen.api.externals_api import ExternalsApi + + +class TestExternalsApi(unittest.TestCase): + """ExternalsApi unit test stubs""" + + def setUp(self) -> None: + self.api = ExternalsApi() + + def tearDown(self) -> None: + pass + + def test_cancel_run_v1_runs_application_run_id_cancel_post(self) -> None: + """Test case for cancel_run_v1_runs_application_run_id_cancel_post + + Cancel Run + """ + pass + + def test_create_application_run_v1_runs_post(self) -> None: + """Test case for create_application_run_v1_runs_post + + Create Application Run + """ + pass + + def test_create_user_v1_users_post(self) -> None: + """Test case for create_user_v1_users_post + + Create User + """ + pass + + def test_delete_run_results_v1_runs_application_run_id_results_delete(self) -> None: + """Test case for delete_run_results_v1_runs_application_run_id_results_delete + + Delete Run Results + """ + pass + + def test_get_run_v1_runs_application_run_id_get(self) -> None: + """Test case for get_run_v1_runs_application_run_id_get + + Get Run + """ + pass + + def test_get_user_v1_users_user_id_get(self) -> None: + """Test case for get_user_v1_users_user_id_get + + Get User + """ + pass + + def test_get_version_v1_versions_application_version_id_get(self) -> None: + """Test case for get_version_v1_versions_application_version_id_get + + Get Version + """ + pass + + def test_list_application_runs_v1_runs_get(self) -> None: + """Test case for list_application_runs_v1_runs_get + + List Application Runs + """ + pass + + def test_list_applications_v1_applications_get(self) -> None: + """Test case for list_applications_v1_applications_get + + List Applications + """ + pass + + def test_list_run_results_v1_runs_application_run_id_results_get(self) -> None: + """Test case for list_run_results_v1_runs_application_run_id_results_get + + List Run Results + """ + pass + + def test_list_versions_by_application_id_v1_applications_application_id_versions_get(self) -> None: + """Test case for list_versions_by_application_id_v1_applications_application_id_versions_get + + List Versions By Application Id + """ + pass + + def test_list_versions_by_application_slug_v1_applications_application_slug_versions_get(self) -> None: + """Test case for list_versions_by_application_slug_v1_applications_application_slug_versions_get + + List Versions By Application Slug + """ + pass + + def test_read_application_by_id_v1_applications_application_id_get(self) -> None: + """Test case for read_application_by_id_v1_applications_application_id_get + + Read Application By Id + """ + pass + + def test_read_application_by_slug_v1_applications_application_slug_get(self) -> None: + """Test case for read_application_by_slug_v1_applications_application_slug_get + + Read Application By Slug + """ + pass + + def test_register_version_v1_versions_post(self) -> None: + """Test case for register_version_v1_versions_post + + Register Version + """ + pass + + def test_update_user_v1_users_user_id_patch(self) -> None: + """Test case for update_user_v1_users_user_id_patch + + Update User + """ + pass + + +if __name__ == '__main__': + unittest.main() From d77575b970559d3512c8bbfa7f55376347b1020b Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sat, 5 Apr 2025 20:56:50 +0200 Subject: [PATCH 026/110] other: intermediate --- codegen/out/.openapi-generator/FILES | 1 + codegen/out/test/test_externals_api.py | 3 +- pyproject.toml | 8 +- src/aignostics/__init__.py | 4 +- src/aignostics/cli.py | 148 ++++++-- src/aignostics/client/resources/__init__.py | 0 src/aignostics/{service.py => platform.py} | 51 ++- tests/aignostics/cli/core_test.py | 8 +- uv.lock | 352 +++++--------------- 9 files changed, 248 insertions(+), 327 deletions(-) create mode 100644 src/aignostics/client/resources/__init__.py rename src/aignostics/{service.py => platform.py} (69%) diff --git a/codegen/out/.openapi-generator/FILES b/codegen/out/.openapi-generator/FILES index 7b6034dc..b65f8044 100644 --- a/codegen/out/.openapi-generator/FILES +++ b/codegen/out/.openapi-generator/FILES @@ -62,3 +62,4 @@ aignx/codegen/models/version_creation_response.py aignx/codegen/models/version_read_response.py aignx/codegen/rest.py docs/ExternalsApi.md +test/test_externals_api.py diff --git a/codegen/out/test/test_externals_api.py b/codegen/out/test/test_externals_api.py index c23a877a..c49032db 100644 --- a/codegen/out/test/test_externals_api.py +++ b/codegen/out/test/test_externals_api.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ Aignostics Platform API @@ -13,7 +14,7 @@ import unittest -from aignostics.codegen.api.externals_api import ExternalsApi +from aignx.codegen.api.externals_api import ExternalsApi class TestExternalsApi(unittest.TestCase): diff --git a/pyproject.toml b/pyproject.toml index 1d963e7d..b4c4e6a7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,7 +63,6 @@ requires-python = ">=3.11, <4.0" dependencies = [ # From Template - "fastapi[standard,all]>=0.115.12", "pydantic>=2.11.1", "pydantic-settings>=2.8.1", "typer>=0.15.1", @@ -75,7 +74,6 @@ dependencies = [ "jsf>=0.11.2", "jsonschema>=4.23.0", "pyjwt>=2.10.1", - "python-dotenv>=1.1.0", # Can be removed later "requests>=2.32.3", "requests-oauthlib>=2.0.0", "tqdm>=4.67.1", @@ -96,15 +94,13 @@ Issues = "https://github.com/aignostics/python-sdk/issues" requires = ["hatchling==1.27.0"] build-backend = "hatchling.build" + [tool.hatch.build] include = ["src/*", "codegen/out/*"] [tool.hatch.build.targets.wheel] packages = ["src/aignostics", "codegen/out/aignx"] -[tool.hatch.build.targets.wheel.force-include] -"codegen" = "codegen/out" - [project.optional-dependencies] examples = [ "streamlit>=1.44.1", @@ -112,6 +108,8 @@ examples = [ "jupyter>=1.1.1", "jinja2>=3.1.6", ] +formats = ["openslide-python>=1.4.1", "openslide-bin>=4.0.0.6"] +aws = ["boto3>=1.37.27"] [dependency-groups] dev = [ diff --git a/src/aignostics/__init__.py b/src/aignostics/__init__.py index 29018aea..75efdef7 100644 --- a/src/aignostics/__init__.py +++ b/src/aignostics/__init__.py @@ -7,7 +7,7 @@ ) from .exceptions import OpenAPISchemaError from .models import Health, HealthStatus -from .service import Service +from .platform import Platform from .types import APIVersion, InfoOutputFormat, OpenAPIOutputFormat __all__ = [ @@ -17,7 +17,7 @@ "InfoOutputFormat", "OpenAPIOutputFormat", "OpenAPISchemaError", - "Service", + "Platform", "__project_name__", "__project_path__", "__version__", diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index 04efc826..8dcfd1d9 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -8,44 +8,48 @@ import aignostics.client -from . import APIVersion, InfoOutputFormat, OpenAPIOutputFormat, Service, __version__ +from . import APIVersion, InfoOutputFormat, OpenAPIOutputFormat, Platform, __version__ from .utils import prepare_cli -cli = typer.Typer(name="Command Line Interface of Aignostics Python SDK") -applications_app = typer.Typer() -cli.add_typer(applications_app, name="applications", help="Manage AI applications") -runs_app = typer.Typer() -cli.add_typer(runs_app, name="runs", help="Manage AI runs") -diagnostics_app = typer.Typer() -cli.add_typer(diagnostics_app, name="system", help="System diagnostics") - -_service = Service() _console = Console() +_platform = Platform() +cli = typer.Typer(help="Command Line Interface of the aignostics platform") +platform_app = typer.Typer() +cli.add_typer(platform_app, name="platform", help="Platform diagnostics and utilities") -@applications_app.command("list") -def applications_list() -> None: - """List AI applications.""" - papi_client = aignostics.client.Client() - applications = papi_client.applications.list() - _console.print(applications) +bucket_app = typer.Typer() +platform_app.add_typer(bucket_app, name="bucket", help="Transfer bucket provide by platform") +application_app = typer.Typer() +cli.add_typer(application_app, name="application", help="aignostics applications") -@runs_app.command("list") -def runs_list() -> None: - """List runs.""" - papi_client = aignostics.client.Client() - runs = papi_client.runs.list() - _console.print(runs) +datasset_app = typer.Typer() +application_app.add_typer(datasset_app, name="dataset", help="Datasets for use as input for applications") + +metadata_app = typer.Typer() +application_app.add_typer(metadata_app, name="metadata", help="Metadata required as input for applications") + +run_app = typer.Typer() +application_app.add_typer(run_app, name="run", help="Runs of applications") + +result_app = typer.Typer() +run_app.add_typer(result_app, name="result", help="Results of applications runs") + + +@platform_app.command("install") +def install() -> None: + """Complete and validate installation of the CLI.""" + _console.print(_platform.install()) -@diagnostics_app.command("health") +@platform_app.command("health") def health() -> None: - """Indicate if service is healthy.""" - _console.print(_service.healthy()) + """Indicate if aignostics platform is healthy.""" + _console.print(_platform.healthy()) -@diagnostics_app.command("info") +@platform_app.command("info") def info( output_format: Annotated[ InfoOutputFormat, typer.Option(help="Output format", case_sensitive=False) @@ -54,7 +58,7 @@ def info( filter_secrets: Annotated[bool, typer.Option(help="Filter out secret values from environment variables")] = True, ) -> None: """Print info about service configuration.""" - info = _service.info(env=env, filter_secrets=filter_secrets) + info = _platform.info(env=env, filter_secrets=filter_secrets) match output_format: case InfoOutputFormat.JSON: _console.print_json(data=info) @@ -62,17 +66,17 @@ def info( _console.print(yaml.dump(info, default_flow_style=False), end="") -@diagnostics_app.command("openapi") +@platform_app.command("openapi") def openapi( api_version: Annotated[APIVersion, typer.Option(help="API Version", case_sensitive=False)] = APIVersion.V1, output_format: Annotated[ OpenAPIOutputFormat, typer.Option(help="Output format", case_sensitive=False) ] = OpenAPIOutputFormat.YAML, ) -> None: - """Dump the OpenAPI specification to stdout (YAML by default).""" + """Dump the OpenAPI specification of to stdout.""" match api_version: case APIVersion.V1: - schema = Service.openapi_schema() + schema = Platform.openapi_schema() match output_format: case OpenAPIOutputFormat.JSON: _console.print_json(data=schema) @@ -80,6 +84,90 @@ def openapi( _console.print(yaml.dump(schema, default_flow_style=False), end="") +@bucket_app.command("ls") +def bucket_ls() -> None: + """List contents of tranfer bucket.""" + _console.print("bucket ls") + + +@bucket_app.command("purge") +def bucket_purge() -> None: + """Purge content of transfer bucket.""" + _console.print("bucket purged.") + + +@application_app.command("list") +def application_list() -> None: + """List available applications.""" + papi_client = aignostics.client.Client() + applications = papi_client.applications.list() + _console.print(applications) + + +@application_app.command("describe") +def application_describe() -> None: + """Describe application.""" + papi_client = aignostics.client.Client() + applications = papi_client.applications.list() + _console.print(applications) + + +@datasset_app.command("download") +def dataset_download() -> None: + """Download dataset.""" + _console.print("dataset download") + + +@metadata_app.command("generate") +def metadata_generate() -> None: + """Generate metadata.""" + _console.print("generate metadata") + + +@run_app.command("submit") +def run_submit() -> None: + """Create run.""" + _console.print("submit run") + + +@run_app.command("list") +def run_list() -> None: + """List runs.""" + papi_client = aignostics.client.Client() + runs = papi_client.runs.list() + _console.print(runs) + + +@run_app.command("describe") +def run_describe() -> None: + """Describe run.""" + _console.print("The run") + + +@run_app.command("cancel") +def run_cancel() -> None: + """Cancel run.""" + _console.print("canceled run") + + +@result_app.command("describe") +def result_describe() -> None: + """Describe the result of an application run.""" + _console.print("describe result") + + +@result_app.command("download") +def result_download() -> None: + """Download the result of an application run.""" + _console.print("download result") + + +@result_app.command("delete") +def result_delete() -> None: + """Delete the result of an application run.""" + _console.print("delete resuilt") + + prepare_cli(cli, f"🔬 Aignostics Python SDK v{__version__} - built with love in Berlin 🐻") if __name__ == "__main__": diff --git a/src/aignostics/client/resources/__init__.py b/src/aignostics/client/resources/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/aignostics/service.py b/src/aignostics/platform.py similarity index 69% rename from src/aignostics/service.py rename to src/aignostics/platform.py index d57eafd7..b5117683 100644 --- a/src/aignostics/service.py +++ b/src/aignostics/platform.py @@ -1,4 +1,4 @@ -"""Service of Aignostics Python SDK.""" +"""Service providing platform diagnostics and utilities.""" import json import os @@ -15,8 +15,8 @@ load_dotenv() -class Service: - """Service of Aignostics Python SDK.""" +class Platform: + """Service providing platform diagnostics and utilities.""" _settings: Settings @@ -27,21 +27,32 @@ def __init__(self) -> None: def healthy(self) -> bool: """ - Check if the service is healthy. + Check if the platform is healthy. Returns: - bool: True if the service is healthy, False otherwise. + bool: True if the platform is healthy, False otherwise. """ return self.is_healthy def info(self, env: bool = True, filter_secrets: bool = True) -> dict: """ - For diagnostics compile info about local and remote environment. + For diagnostics compile info about user and platform environment. Returns: - dict: Info about local and remote environment + dict: Info about user and environment, including organisation, + execution environment, local and remote platform. """ info_dict = { + "user": { + "name": "TODO", + "email": "TODO", + "id": "TODO", + "organisation": { + "name": "TODO", + "id": "TODO", + "tier": "TODO", + }, + }, "local": { "sdk": { "version": __version__, @@ -70,15 +81,17 @@ def info(self, env: bool = True, filter_secrets: bool = True) -> dict: "settings": self._settings.model_dump_json(), }, "remote": { - "dev": { - "url": "https://api.dev.aignostics.com", - }, - "staging": { - "url": "https://api.staging.aignostics.com", - }, - "production": { - "url": "https://api.aignostics.com", - }, + "platform": { + "dev": { + "url": "https://api.dev.aignostics.com", + }, + "staging": { + "url": "https://api.staging.aignostics.com", + }, + "production": { + "url": "https://api.aignostics.com", + }, + } }, } @@ -100,10 +113,14 @@ def info(self, env: bool = True, filter_secrets: bool = True) -> dict: return info_dict + def install(self) -> None: + """Complete and validate installation of the CLI.""" + # TODO (Helmut, Andreas) + @staticmethod def openapi_schema() -> dict: """ - Get OpenAPI schema. + Get OpenAPI schema of the webservice API provided by the platform. Returns: dict: OpenAPI schema. diff --git a/tests/aignostics/cli/core_test.py b/tests/aignostics/cli/core_test.py index 7ffc34fa..6fda8778 100644 --- a/tests/aignostics/cli/core_test.py +++ b/tests/aignostics/cli/core_test.py @@ -28,21 +28,21 @@ def test_cli_built_with_love(runner) -> None: @pytest.mark.scheduled def test_cli_health(runner: CliRunner) -> None: """Check health is true.""" - result = runner.invoke(cli, ["system", "health"]) + result = runner.invoke(cli, ["platform", "health"]) assert result.exit_code == 0 assert "True" in result.output def test_cli_info(runner: CliRunner) -> None: """Check health is true.""" - result = runner.invoke(cli, ["system", "info"]) + result = runner.invoke(cli, ["platform", "info"]) assert result.exit_code == 0 assert "CPython" in result.output def test_cli_openapi_yaml(runner: CliRunner) -> None: """Check openapi command outputs YAML schema.""" - result = runner.invoke(cli, ["system", "openapi"]) + result = runner.invoke(cli, ["platform", "openapi"]) assert result.exit_code == 0 # Check for common OpenAPI YAML elements assert "openapi:" in result.output @@ -52,7 +52,7 @@ def test_cli_openapi_yaml(runner: CliRunner) -> None: def test_cli_openapi_json(runner: CliRunner) -> None: """Check openapi command outputs JSON schema.""" - result = runner.invoke(cli, ["system", "openapi", "--output-format", "json"]) + result = runner.invoke(cli, ["platform", "openapi", "--output-format", "json"]) assert result.exit_code == 0 # Check for common OpenAPI JSON elements assert '"openapi":' in result.output diff --git a/uv.lock b/uv.lock index c17d19b4..2aac5908 100644 --- a/uv.lock +++ b/uv.lock @@ -16,7 +16,6 @@ version = "0.0.10" source = { editable = "." } dependencies = [ { name = "appdirs" }, - { name = "fastapi", extra = ["all", "standard"] }, { name = "google-cloud-storage" }, { name = "google-crc32c" }, { name = "httpx" }, @@ -25,7 +24,6 @@ dependencies = [ { name = "pydantic" }, { name = "pydantic-settings" }, { name = "pyjwt" }, - { name = "python-dotenv" }, { name = "requests" }, { name = "requests-oauthlib" }, { name = "tqdm" }, @@ -34,12 +32,19 @@ dependencies = [ ] [package.optional-dependencies] +aws = [ + { name = "boto3" }, +] examples = [ { name = "jinja2" }, { name = "jupyter" }, { name = "marimo" }, { name = "streamlit" }, ] +formats = [ + { name = "openslide-bin" }, + { name = "openslide-python" }, +] [package.dev-dependencies] dev = [ @@ -85,7 +90,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "appdirs", specifier = ">=1.4.4" }, - { name = "fastapi", extras = ["standard", "all"], specifier = ">=0.115.12" }, + { name = "boto3", marker = "extra == 'aws'", specifier = ">=1.37.27" }, { name = "google-cloud-storage", specifier = ">=3.1.0" }, { name = "google-crc32c", specifier = ">=1.7.1" }, { name = "httpx", specifier = ">=0.28.1" }, @@ -94,10 +99,11 @@ requires-dist = [ { name = "jsonschema", specifier = ">=4.23.0" }, { name = "jupyter", marker = "extra == 'examples'", specifier = ">=1.1.1" }, { name = "marimo", marker = "extra == 'examples'", specifier = ">=0.12.2" }, + { name = "openslide-bin", marker = "extra == 'formats'", specifier = ">=4.0.0.6" }, + { name = "openslide-python", marker = "extra == 'formats'", specifier = ">=1.4.1" }, { name = "pydantic", specifier = ">=2.11.1" }, { name = "pydantic-settings", specifier = ">=2.8.1" }, { name = "pyjwt", specifier = ">=2.10.1" }, - { name = "python-dotenv", specifier = ">=1.1.0" }, { name = "requests", specifier = ">=2.32.3" }, { name = "requests-oauthlib", specifier = ">=2.0.0" }, { name = "streamlit", marker = "extra == 'examples'", specifier = ">=1.44.1" }, @@ -105,7 +111,7 @@ requires-dist = [ { name = "typer", specifier = ">=0.15.1" }, { name = "urllib3", specifier = ">=2.2.3" }, ] -provides-extras = ["examples"] +provides-extras = ["examples", "formats", "aws"] [package.metadata.requires-dev] dev = [ @@ -406,6 +412,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/02/6389ef0529af6da0b913374dedb9bbde8eabfe45767ceec38cc37801b0bd/boolean.py-4.0-py3-none-any.whl", hash = "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd", size = 25909 }, ] +[[package]] +name = "boto3" +version = "1.37.27" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, + { name = "jmespath" }, + { name = "s3transfer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/3f/03033eaacd043e5c905c74f9067ebcf3a4a24fb852fa3f4745f87327f0e7/boto3-1.37.27.tar.gz", hash = "sha256:ccdeee590902e6f4fb30cec6d3a88668545817fccfd3e5cb9cbc166c4a0000d4", size = 111357 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/23/19fbca3ca1614c69b7bc1aa15839ef355b8ccf434e1ad8b190f7ebfdc261/boto3-1.37.27-py3-none-any.whl", hash = "sha256:439c2cd18c79386b1b9d5fdc4a4e7e418e57ac50431bdf9421c60f09807f40fb", size = 139560 }, +] + +[[package]] +name = "botocore" +version = "1.37.27" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jmespath" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/3f/597ca9de62d00556a2c387261293441d9e84fa196a7031ec656deffe8aee/botocore-1.37.27.tar.gz", hash = "sha256:143fd7cdb0d73f43aa1f14799124de7b857da7d7ab996af5c89a49e3032a9e66", size = 13800193 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/48/f2670866a36d2dd68f7c93897fb9ec6c693bca1bb73cb867a173c2ad92c3/botocore-1.37.27-py3-none-any.whl", hash = "sha256:a86d1ffbe344bfb183d9acc24de3428118fc166cb89d0f1ce1d412857edfacd7", size = 13467344 }, +] + [[package]] name = "bracex" version = "2.5.post1" @@ -889,15 +923,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, ] -[[package]] -name = "dnspython" -version = "2.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 }, -] - [[package]] name = "docutils" version = "0.21.2" @@ -920,19 +945,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/11/208f72084084d3f6a2ed5ebfdfc846692c3f7ad6dce65e400194924f7eed/domdf_python_tools-3.10.0-py3-none-any.whl", hash = "sha256:5e71c1be71bbcc1f881d690c8984b60e64298ec256903b3147f068bc33090c36", size = 126860 }, ] -[[package]] -name = "email-validator" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dnspython" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521 }, -] - [[package]] name = "enum-tools" version = "0.12.0" @@ -976,63 +988,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/a1/8936bc8e79af80ca38288dd93ed44ed1f9d63beb25447a4c59e746e01f8d/faker-37.1.0-py3-none-any.whl", hash = "sha256:dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c", size = 1918783 }, ] -[[package]] -name = "fastapi" -version = "0.115.12" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "starlette" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164 }, -] - -[package.optional-dependencies] -all = [ - { name = "email-validator" }, - { name = "fastapi-cli", extra = ["standard"] }, - { name = "httpx" }, - { name = "itsdangerous" }, - { name = "jinja2" }, - { name = "orjson" }, - { name = "pydantic-extra-types" }, - { name = "pydantic-settings" }, - { name = "python-multipart" }, - { name = "pyyaml" }, - { name = "ujson" }, - { name = "uvicorn", extra = ["standard"] }, -] -standard = [ - { name = "email-validator" }, - { name = "fastapi-cli", extra = ["standard"] }, - { name = "httpx" }, - { name = "jinja2" }, - { name = "python-multipart" }, - { name = "uvicorn", extra = ["standard"] }, -] - -[[package]] -name = "fastapi-cli" -version = "0.0.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "rich-toolkit" }, - { name = "typer" }, - { name = "uvicorn", extra = ["standard"] }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705 }, -] - -[package.optional-dependencies] -standard = [ - { name = "uvicorn", extra = ["standard"] }, -] - [[package]] name = "fastjsonschema" version = "2.21.1" @@ -1295,35 +1250,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, ] -[[package]] -name = "httptools" -version = "0.6.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029 }, - { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492 }, - { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891 }, - { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788 }, - { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214 }, - { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120 }, - { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565 }, - { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683 }, - { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337 }, - { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796 }, - { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837 }, - { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289 }, - { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779 }, - { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634 }, - { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214 }, - { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431 }, - { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121 }, - { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805 }, - { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858 }, - { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042 }, - { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682 }, -] - [[package]] name = "httpx" version = "0.28.1" @@ -1494,6 +1420,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, ] +[[package]] +name = "jmespath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256 }, +] + [[package]] name = "jsf" version = "0.11.2" @@ -2374,50 +2309,30 @@ wheels = [ ] [[package]] -name = "orjson" -version = "3.10.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/5dea21763eeff8c1590076918a446ea3d6140743e0e36f58f369928ed0f4/orjson-3.10.15.tar.gz", hash = "sha256:05ca7fe452a2e9d8d9d706a2984c95b9c2ebc5db417ce0b7a49b91d50642a23e", size = 5282482 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/a2/21b25ce4a2c71dbb90948ee81bd7a42b4fbfc63162e57faf83157d5540ae/orjson-3.10.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c4cc83960ab79a4031f3119cc4b1a1c627a3dc09df125b27c4201dff2af7eaa6", size = 249533 }, - { url = "https://files.pythonhosted.org/packages/b2/85/2076fc12d8225698a51278009726750c9c65c846eda741e77e1761cfef33/orjson-3.10.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddbeef2481d895ab8be5185f2432c334d6dec1f5d1933a9c83014d188e102cef", size = 125230 }, - { url = "https://files.pythonhosted.org/packages/06/df/a85a7955f11274191eccf559e8481b2be74a7c6d43075d0a9506aa80284d/orjson-3.10.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e590a0477b23ecd5b0ac865b1b907b01b3c5535f5e8a8f6ab0e503efb896334", size = 150148 }, - { url = "https://files.pythonhosted.org/packages/37/b3/94c55625a29b8767c0eed194cb000b3787e3c23b4cdd13be17bae6ccbb4b/orjson-3.10.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6be38bd103d2fd9bdfa31c2720b23b5d47c6796bcb1d1b598e3924441b4298d", size = 139749 }, - { url = "https://files.pythonhosted.org/packages/53/ba/c608b1e719971e8ddac2379f290404c2e914cf8e976369bae3cad88768b1/orjson-3.10.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff4f6edb1578960ed628a3b998fa54d78d9bb3e2eb2cfc5c2a09732431c678d0", size = 154558 }, - { url = "https://files.pythonhosted.org/packages/b2/c4/c1fb835bb23ad788a39aa9ebb8821d51b1c03588d9a9e4ca7de5b354fdd5/orjson-3.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0482b21d0462eddd67e7fce10b89e0b6ac56570424662b685a0d6fccf581e13", size = 130349 }, - { url = "https://files.pythonhosted.org/packages/78/14/bb2b48b26ab3c570b284eb2157d98c1ef331a8397f6c8bd983b270467f5c/orjson-3.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bb5cc3527036ae3d98b65e37b7986a918955f85332c1ee07f9d3f82f3a6899b5", size = 138513 }, - { url = "https://files.pythonhosted.org/packages/4a/97/d5b353a5fe532e92c46467aa37e637f81af8468aa894cd77d2ec8a12f99e/orjson-3.10.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d569c1c462912acdd119ccbf719cf7102ea2c67dd03b99edcb1a3048651ac96b", size = 130942 }, - { url = "https://files.pythonhosted.org/packages/b5/5d/a067bec55293cca48fea8b9928cfa84c623be0cce8141d47690e64a6ca12/orjson-3.10.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1e6d33efab6b71d67f22bf2962895d3dc6f82a6273a965fab762e64fa90dc399", size = 414717 }, - { url = "https://files.pythonhosted.org/packages/6f/9a/1485b8b05c6b4c4db172c438cf5db5dcfd10e72a9bc23c151a1137e763e0/orjson-3.10.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c33be3795e299f565681d69852ac8c1bc5c84863c0b0030b2b3468843be90388", size = 141033 }, - { url = "https://files.pythonhosted.org/packages/f8/d2/fc67523656e43a0c7eaeae9007c8b02e86076b15d591e9be11554d3d3138/orjson-3.10.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eea80037b9fae5339b214f59308ef0589fc06dc870578b7cce6d71eb2096764c", size = 129720 }, - { url = "https://files.pythonhosted.org/packages/79/42/f58c7bd4e5b54da2ce2ef0331a39ccbbaa7699b7f70206fbf06737c9ed7d/orjson-3.10.15-cp311-cp311-win32.whl", hash = "sha256:d5ac11b659fd798228a7adba3e37c010e0152b78b1982897020a8e019a94882e", size = 142473 }, - { url = "https://files.pythonhosted.org/packages/00/f8/bb60a4644287a544ec81df1699d5b965776bc9848d9029d9f9b3402ac8bb/orjson-3.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:cf45e0214c593660339ef63e875f32ddd5aa3b4adc15e662cdb80dc49e194f8e", size = 133570 }, - { url = "https://files.pythonhosted.org/packages/66/85/22fe737188905a71afcc4bf7cc4c79cd7f5bbe9ed1fe0aac4ce4c33edc30/orjson-3.10.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d11c0714fc85bfcf36ada1179400862da3288fc785c30e8297844c867d7505a", size = 249504 }, - { url = "https://files.pythonhosted.org/packages/48/b7/2622b29f3afebe938a0a9037e184660379797d5fd5234e5998345d7a5b43/orjson-3.10.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba5a1e85d554e3897fa9fe6fbcff2ed32d55008973ec9a2b992bd9a65d2352d", size = 125080 }, - { url = "https://files.pythonhosted.org/packages/ce/8f/0b72a48f4403d0b88b2a41450c535b3e8989e8a2d7800659a967efc7c115/orjson-3.10.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7723ad949a0ea502df656948ddd8b392780a5beaa4c3b5f97e525191b102fff0", size = 150121 }, - { url = "https://files.pythonhosted.org/packages/06/ec/acb1a20cd49edb2000be5a0404cd43e3c8aad219f376ac8c60b870518c03/orjson-3.10.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fd9bc64421e9fe9bd88039e7ce8e58d4fead67ca88e3a4014b143cec7684fd4", size = 139796 }, - { url = "https://files.pythonhosted.org/packages/33/e1/f7840a2ea852114b23a52a1c0b2bea0a1ea22236efbcdb876402d799c423/orjson-3.10.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dadba0e7b6594216c214ef7894c4bd5f08d7c0135f4dd0145600be4fbcc16767", size = 154636 }, - { url = "https://files.pythonhosted.org/packages/fa/da/31543337febd043b8fa80a3b67de627669b88c7b128d9ad4cc2ece005b7a/orjson-3.10.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48f59114fe318f33bbaee8ebeda696d8ccc94c9e90bc27dbe72153094e26f41", size = 130621 }, - { url = "https://files.pythonhosted.org/packages/ed/78/66115dc9afbc22496530d2139f2f4455698be444c7c2475cb48f657cefc9/orjson-3.10.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:035fb83585e0f15e076759b6fedaf0abb460d1765b6a36f48018a52858443514", size = 138516 }, - { url = "https://files.pythonhosted.org/packages/22/84/cd4f5fb5427ffcf823140957a47503076184cb1ce15bcc1165125c26c46c/orjson-3.10.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d13b7fe322d75bf84464b075eafd8e7dd9eae05649aa2a5354cfa32f43c59f17", size = 130762 }, - { url = "https://files.pythonhosted.org/packages/93/1f/67596b711ba9f56dd75d73b60089c5c92057f1130bb3a25a0f53fb9a583b/orjson-3.10.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7066b74f9f259849629e0d04db6609db4cf5b973248f455ba5d3bd58a4daaa5b", size = 414700 }, - { url = "https://files.pythonhosted.org/packages/7c/0c/6a3b3271b46443d90efb713c3e4fe83fa8cd71cda0d11a0f69a03f437c6e/orjson-3.10.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88dc3f65a026bd3175eb157fea994fca6ac7c4c8579fc5a86fc2114ad05705b7", size = 141077 }, - { url = "https://files.pythonhosted.org/packages/3b/9b/33c58e0bfc788995eccd0d525ecd6b84b40d7ed182dd0751cd4c1322ac62/orjson-3.10.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b342567e5465bd99faa559507fe45e33fc76b9fb868a63f1642c6bc0735ad02a", size = 129898 }, - { url = "https://files.pythonhosted.org/packages/01/c1/d577ecd2e9fa393366a1ea0a9267f6510d86e6c4bb1cdfb9877104cac44c/orjson-3.10.15-cp312-cp312-win32.whl", hash = "sha256:0a4f27ea5617828e6b58922fdbec67b0aa4bb844e2d363b9244c47fa2180e665", size = 142566 }, - { url = "https://files.pythonhosted.org/packages/ed/eb/a85317ee1732d1034b92d56f89f1de4d7bf7904f5c8fb9dcdd5b1c83917f/orjson-3.10.15-cp312-cp312-win_amd64.whl", hash = "sha256:ef5b87e7aa9545ddadd2309efe6824bd3dd64ac101c15dae0f2f597911d46eaa", size = 133732 }, - { url = "https://files.pythonhosted.org/packages/06/10/fe7d60b8da538e8d3d3721f08c1b7bff0491e8fa4dd3bf11a17e34f4730e/orjson-3.10.15-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bae0e6ec2b7ba6895198cd981b7cca95d1487d0147c8ed751e5632ad16f031a6", size = 249399 }, - { url = "https://files.pythonhosted.org/packages/6b/83/52c356fd3a61abd829ae7e4366a6fe8e8863c825a60d7ac5156067516edf/orjson-3.10.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93ce145b2db1252dd86af37d4165b6faa83072b46e3995ecc95d4b2301b725a", size = 125044 }, - { url = "https://files.pythonhosted.org/packages/55/b2/d06d5901408e7ded1a74c7c20d70e3a127057a6d21355f50c90c0f337913/orjson-3.10.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c203f6f969210128af3acae0ef9ea6aab9782939f45f6fe02d05958fe761ef9", size = 150066 }, - { url = "https://files.pythonhosted.org/packages/75/8c/60c3106e08dc593a861755781c7c675a566445cc39558677d505878d879f/orjson-3.10.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8918719572d662e18b8af66aef699d8c21072e54b6c82a3f8f6404c1f5ccd5e0", size = 139737 }, - { url = "https://files.pythonhosted.org/packages/6a/8c/ae00d7d0ab8a4490b1efeb01ad4ab2f1982e69cc82490bf8093407718ff5/orjson-3.10.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f71eae9651465dff70aa80db92586ad5b92df46a9373ee55252109bb6b703307", size = 154804 }, - { url = "https://files.pythonhosted.org/packages/22/86/65dc69bd88b6dd254535310e97bc518aa50a39ef9c5a2a5d518e7a223710/orjson-3.10.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e117eb299a35f2634e25ed120c37c641398826c2f5a3d3cc39f5993b96171b9e", size = 130583 }, - { url = "https://files.pythonhosted.org/packages/bb/00/6fe01ededb05d52be42fabb13d93a36e51f1fd9be173bd95707d11a8a860/orjson-3.10.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13242f12d295e83c2955756a574ddd6741c81e5b99f2bef8ed8d53e47a01e4b7", size = 138465 }, - { url = "https://files.pythonhosted.org/packages/db/2f/4cc151c4b471b0cdc8cb29d3eadbce5007eb0475d26fa26ed123dca93b33/orjson-3.10.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7946922ada8f3e0b7b958cc3eb22cfcf6c0df83d1fe5521b4a100103e3fa84c8", size = 130742 }, - { url = "https://files.pythonhosted.org/packages/9f/13/8a6109e4b477c518498ca37963d9c0eb1508b259725553fb53d53b20e2ea/orjson-3.10.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b7155eb1623347f0f22c38c9abdd738b287e39b9982e1da227503387b81b34ca", size = 414669 }, - { url = "https://files.pythonhosted.org/packages/22/7b/1d229d6d24644ed4d0a803de1b0e2df832032d5beda7346831c78191b5b2/orjson-3.10.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:208beedfa807c922da4e81061dafa9c8489c6328934ca2a562efa707e049e561", size = 141043 }, - { url = "https://files.pythonhosted.org/packages/cc/d3/6dc91156cf12ed86bed383bcb942d84d23304a1e57b7ab030bf60ea130d6/orjson-3.10.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eca81f83b1b8c07449e1d6ff7074e82e3fd6777e588f1a6632127f286a968825", size = 129826 }, - { url = "https://files.pythonhosted.org/packages/b3/38/c47c25b86f6996f1343be721b6ea4367bc1c8bc0fc3f6bbcd995d18cb19d/orjson-3.10.15-cp313-cp313-win32.whl", hash = "sha256:c03cd6eea1bd3b949d0d007c8d57049aa2b39bd49f58b4b2af571a5d3833d890", size = 142542 }, - { url = "https://files.pythonhosted.org/packages/27/f1/1d7ec15b20f8ce9300bc850de1e059132b88990e46cd0ccac29cbf11e4f9/orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf", size = 133444 }, +name = "openslide-bin" +version = "4.0.0.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/79/9f57b339d1726b30254e33afdb698526b0f057a2e184042a0c00e710947d/openslide-bin-4.0.0.6.tar.gz", hash = "sha256:baca4a590cb15c8685f1ee1905d496bb0a23468b969f7066a2126c24c9e9ef39", size = 17817045 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/cb/90e884978a3999c1deb90e487678eb7143551f3262c58ee5bd20bd8b010e/openslide_bin-4.0.0.6-py3-none-macosx_11_0_universal2.whl", hash = "sha256:f9c4ed0da275202dce531b163d92e1b860d215e779e7620fdd0dd92b7c40764b", size = 5325878 }, + { url = "https://files.pythonhosted.org/packages/dc/6d/dc29cda9f75001f589b6830aaeeb5a06026b88ab5088f731af74aeef4665/openslide_bin-4.0.0.6-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:43af7aabab7aa6d7c21573736de8b59ccf2f4078f0ae26da70d86005d2ee662b", size = 4206967 }, + { url = "https://files.pythonhosted.org/packages/b8/04/6f8d4ed4167bd63dfe43085a9f0ecfc18a3e51fc9e99ef631005e90abcf1/openslide_bin-4.0.0.6-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:0bc2e6d624781b0ba24d2ef3d8623fd52de7645520911539e1279d599212ecb0", size = 4300039 }, + { url = "https://files.pythonhosted.org/packages/9b/13/67272c5a1f83720188f3b0c3b9e6c045c60b841b68c5404524624bc4db83/openslide_bin-4.0.0.6-py3-none-win_amd64.whl", hash = "sha256:d9bb0659bce0384f6f961aa64c0cfdb882c8dacd6f4fbfaf84895e06fe571f40", size = 4169544 }, +] + +[[package]] +name = "openslide-python" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pillow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d2/6b/e754e969a24cb035e630461bad47ba8280b563c08712a5eb35a7b83bbfbe/openslide_python-1.4.1.tar.gz", hash = "sha256:95da570994abd8a02db18b8dac68da0b3d3f7eba733bdeeb2a8b52e40e1de1c8", size = 383933 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/a2/742faf757e23e85f1610288ea2d9b934e3cb62d6ffb410442fd069a23ae0/openslide_python-1.4.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:3715fbed151ce448998a83d4a1c3defb1992c5e7e73d66fa05294bfecec0740c", size = 30440 }, + { url = "https://files.pythonhosted.org/packages/ef/37/f5ae29dcd1597f14b916fb63c1367edd32083616260c33efabd46238b3e2/openslide_python-1.4.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63a4c01dfc15ceebaf4cd1d14c97e3f4e6658ef1f83b003d7e4e85a1a1aad39", size = 33860 }, + { url = "https://files.pythonhosted.org/packages/4d/d7/d4e4bd454458f826c726d67b0c866f9c46f9906fa7c2a79552f8137c9e36/openslide_python-1.4.1-cp311-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f3015d4f591471d5c39fd7f853e8d3308eb29eff0e4be3938a8c9d97d0b72256", size = 33259 }, + { url = "https://files.pythonhosted.org/packages/1e/34/123c6f070e658c75d38ec24ab2846796d781a888c39f78ba54b01c931471/openslide_python-1.4.1-cp311-abi3-win_amd64.whl", hash = "sha256:57ec66edf3e8f22dd8712071227f2e256fa04a542c99d72bb211d00285ccf0a2", size = 32595 }, ] [[package]] @@ -2951,19 +2866,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2f/f8/66f328e411f1c9574b13c2c28ab01f308b53688bbbe6ca8fb981e6cabc42/pydantic_core-2.33.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b6d77c75a57f041c5ee915ff0b0bb58eabb78728b69ed967bc5b780e8f701b8", size = 2082099 }, ] -[[package]] -name = "pydantic-extra-types" -version = "2.10.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/53/fa/6b268a47839f8af46ffeb5bb6aee7bded44fbad54e6bf826c11f17aef91a/pydantic_extra_types-2.10.3.tar.gz", hash = "sha256:dcc0a7b90ac9ef1b58876c9b8fdede17fbdde15420de9d571a9fccde2ae175bb", size = 95128 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/0a/f6f8e5f79d188e2f3fa9ecfccfa72538b685985dd5c7c2886c67af70e685/pydantic_extra_types-2.10.3-py3-none-any.whl", hash = "sha256:e8b372752b49019cd8249cc192c62a820d8019f5382a8789d0f887338a59c0f3", size = 37175 }, -] - [[package]] name = "pydantic-settings" version = "2.8.1" @@ -3206,15 +3108,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/08/20/0f2523b9e50a8052bc6a8b732dfc8568abbdc42010aef03a2d750bdab3b2/python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7", size = 15163 }, ] -[[package]] -name = "python-multipart" -version = "0.0.20" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, -] - [[package]] name = "pytz" version = "2025.1" @@ -3455,20 +3348,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/69/963f0bf44a654f6465bdb66fb5a91051b0d7af9f742b5bd7202607165036/rich_click-1.8.8-py3-none-any.whl", hash = "sha256:205aabd5a98e64ab2c105dee9e368be27480ba004c7dfa2accd0ed44f9f1550e", size = 35747 }, ] -[[package]] -name = "rich-toolkit" -version = "0.13.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "rich" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5b/8a/71cfbf6bf6257ea785d1f030c22468f763eea1b3e5417620f2ba9abd6dca/rich_toolkit-0.13.2.tar.gz", hash = "sha256:fea92557530de7c28f121cbed572ad93d9e0ddc60c3ca643f1b831f2f56b95d3", size = 72288 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/1b/1c2f43af46456050b27810a7a013af8a7e12bc545a0cdc00eb0df55eb769/rich_toolkit-0.13.2-py3-none-any.whl", hash = "sha256:f3f6c583e5283298a2f7dbd3c65aca18b7f818ad96174113ab5bec0b0e35ed61", size = 13566 }, -] - [[package]] name = "roman-numerals-py" version = "3.1.0" @@ -3631,6 +3510,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d6/d4/dd813703af8a1e2ac33bf3feb27e8a5ad514c9f219df80c64d69807e7f71/ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4", size = 10441990 }, ] +[[package]] +name = "s3transfer" +version = "0.11.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/ec/aa1a215e5c126fe5decbee2e107468f51d9ce190b9763cb649f76bb45938/s3transfer-0.11.4.tar.gz", hash = "sha256:559f161658e1cf0a911f45940552c696735f5c74e64362e515f333ebed87d679", size = 148419 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/62/8d3fc3ec6640161a5649b2cddbbf2b9fa39c92541225b33f117c37c5a2eb/s3transfer-0.11.4-py3-none-any.whl", hash = "sha256:ac265fa68318763a03bf2dc4f39d5cbd6a9e178d81cc9483ad27da33637e320d", size = 84412 }, +] + [[package]] name = "send2trash" version = "1.8.3" @@ -4289,44 +4180,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0f/dd/84f10e23edd882c6f968c21c2434fe67bd4a528967067515feca9e611e5e/tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639", size = 346762 }, ] -[[package]] -name = "ujson" -version = "5.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/00/3110fd566786bfa542adb7932d62035e0c0ef662a8ff6544b6643b3d6fd7/ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1", size = 7154885 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/ec/3c551ecfe048bcb3948725251fb0214b5844a12aa60bee08d78315bb1c39/ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00", size = 55353 }, - { url = "https://files.pythonhosted.org/packages/8d/9f/4731ef0671a0653e9f5ba18db7c4596d8ecbf80c7922dd5fe4150f1aea76/ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126", size = 51813 }, - { url = "https://files.pythonhosted.org/packages/1f/2b/44d6b9c1688330bf011f9abfdb08911a9dc74f76926dde74e718d87600da/ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8", size = 51988 }, - { url = "https://files.pythonhosted.org/packages/29/45/f5f5667427c1ec3383478092a414063ddd0dfbebbcc533538fe37068a0a3/ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b", size = 53561 }, - { url = "https://files.pythonhosted.org/packages/26/21/a0c265cda4dd225ec1be595f844661732c13560ad06378760036fc622587/ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9", size = 58497 }, - { url = "https://files.pythonhosted.org/packages/28/36/8fde862094fd2342ccc427a6a8584fed294055fdee341661c78660f7aef3/ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f", size = 997877 }, - { url = "https://files.pythonhosted.org/packages/90/37/9208e40d53baa6da9b6a1c719e0670c3f474c8fc7cc2f1e939ec21c1bc93/ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4", size = 1140632 }, - { url = "https://files.pythonhosted.org/packages/89/d5/2626c87c59802863d44d19e35ad16b7e658e4ac190b0dead17ff25460b4c/ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1", size = 1043513 }, - { url = "https://files.pythonhosted.org/packages/2f/ee/03662ce9b3f16855770f0d70f10f0978ba6210805aa310c4eebe66d36476/ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f", size = 38616 }, - { url = "https://files.pythonhosted.org/packages/3e/20/952dbed5895835ea0b82e81a7be4ebb83f93b079d4d1ead93fcddb3075af/ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720", size = 42071 }, - { url = "https://files.pythonhosted.org/packages/e8/a6/fd3f8bbd80842267e2d06c3583279555e8354c5986c952385199d57a5b6c/ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5", size = 55642 }, - { url = "https://files.pythonhosted.org/packages/a8/47/dd03fd2b5ae727e16d5d18919b383959c6d269c7b948a380fdd879518640/ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e", size = 51807 }, - { url = "https://files.pythonhosted.org/packages/25/23/079a4cc6fd7e2655a473ed9e776ddbb7144e27f04e8fc484a0fb45fe6f71/ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043", size = 51972 }, - { url = "https://files.pythonhosted.org/packages/04/81/668707e5f2177791869b624be4c06fb2473bf97ee33296b18d1cf3092af7/ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1", size = 53686 }, - { url = "https://files.pythonhosted.org/packages/bd/50/056d518a386d80aaf4505ccf3cee1c40d312a46901ed494d5711dd939bc3/ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3", size = 58591 }, - { url = "https://files.pythonhosted.org/packages/fc/d6/aeaf3e2d6fb1f4cfb6bf25f454d60490ed8146ddc0600fae44bfe7eb5a72/ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21", size = 997853 }, - { url = "https://files.pythonhosted.org/packages/f8/d5/1f2a5d2699f447f7d990334ca96e90065ea7f99b142ce96e85f26d7e78e2/ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2", size = 1140689 }, - { url = "https://files.pythonhosted.org/packages/f2/2c/6990f4ccb41ed93744aaaa3786394bca0875503f97690622f3cafc0adfde/ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e", size = 1043576 }, - { url = "https://files.pythonhosted.org/packages/14/f5/a2368463dbb09fbdbf6a696062d0c0f62e4ae6fa65f38f829611da2e8fdd/ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e", size = 38764 }, - { url = "https://files.pythonhosted.org/packages/59/2d/691f741ffd72b6c84438a93749ac57bf1a3f217ac4b0ea4fd0e96119e118/ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc", size = 42211 }, - { url = "https://files.pythonhosted.org/packages/0d/69/b3e3f924bb0e8820bb46671979770c5be6a7d51c77a66324cdb09f1acddb/ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287", size = 55646 }, - { url = "https://files.pythonhosted.org/packages/32/8a/9b748eb543c6cabc54ebeaa1f28035b1bd09c0800235b08e85990734c41e/ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e", size = 51806 }, - { url = "https://files.pythonhosted.org/packages/39/50/4b53ea234413b710a18b305f465b328e306ba9592e13a791a6a6b378869b/ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557", size = 51975 }, - { url = "https://files.pythonhosted.org/packages/b4/9d/8061934f960cdb6dd55f0b3ceeff207fcc48c64f58b43403777ad5623d9e/ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988", size = 53693 }, - { url = "https://files.pythonhosted.org/packages/f5/be/7bfa84b28519ddbb67efc8410765ca7da55e6b93aba84d97764cd5794dbc/ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816", size = 58594 }, - { url = "https://files.pythonhosted.org/packages/48/eb/85d465abafb2c69d9699cfa5520e6e96561db787d36c677370e066c7e2e7/ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20", size = 997853 }, - { url = "https://files.pythonhosted.org/packages/9f/76/2a63409fc05d34dd7d929357b7a45e3a2c96f22b4225cd74becd2ba6c4cb/ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0", size = 1140694 }, - { url = "https://files.pythonhosted.org/packages/45/ed/582c4daba0f3e1688d923b5cb914ada1f9defa702df38a1916c899f7c4d1/ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f", size = 1043580 }, - { url = "https://files.pythonhosted.org/packages/d7/0c/9837fece153051e19c7bade9f88f9b409e026b9525927824cdf16293b43b/ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165", size = 38766 }, - { url = "https://files.pythonhosted.org/packages/d7/72/6cb6728e2738c05bbe9bd522d6fc79f86b9a28402f38663e85a28fddd4a0/ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539", size = 42212 }, -] - [[package]] name = "uri-template" version = "1.3.0" @@ -4383,43 +4236,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, ] -[package.optional-dependencies] -standard = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "httptools" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, - { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, - { name = "watchfiles" }, - { name = "websockets" }, -] - -[[package]] -name = "uvloop" -version = "0.21.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410 }, - { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476 }, - { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855 }, - { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185 }, - { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256 }, - { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323 }, - { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284 }, - { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349 }, - { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089 }, - { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770 }, - { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321 }, - { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022 }, - { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123 }, - { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325 }, - { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806 }, - { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068 }, - { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428 }, - { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018 }, -] - [[package]] name = "virtualenv" version = "20.29.3" From 49caf2cf9e6ed01bcd151394337ce926add44d57 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 09:21:39 +0200 Subject: [PATCH 027/110] chore(deps): update from template, so we have auto-generated CLI reference and API reference; furthermore better structure logging in ci github action --- .copier-answers.yml | 2 +- .../workflows/docker-image-build-publish.yml | 8 +- .github/workflows/install_dev_tools.bash | 20 + .../workflows/install_dev_tools_project.bash | 16 + .../package-build-publish-release.yml | 31 +- .github/workflows/test-and-report.yml | 50 +- .github/workflows/test-scheduled.yml | 11 +- .pre-commit-config.yaml | 10 +- .vscode/settings.json | 5 +- API_REFERENCE_v1.md | 2179 +++++++++++++++++ ATTRIBUTIONS.md | 16 - CLI_REFERENCE.md | 454 ++++ Makefile | 20 +- docs/source/_static/openapi_v1.yaml | 2155 ++++++++++++++++ docs/source/api_explorer_v1.rst | 9 + docs/source/api_reference_v1.rst | 1 + docs/source/api_v1.rst | 9 - docs/source/cli_reference.rst | 1 + docs/source/conf.py | 4 +- docs/source/index.rst | 22 +- .../{reference.rst => lib_reference.rst} | 4 +- install.sh | 1 + noxfile.py | 169 +- pyproject.toml | 3 +- src/aignostics/client/_authentication.py | 2 +- src/aignostics/client/resources/__init__.py | 0 src/aignostics/platform.py | 2 +- 27 files changed, 5048 insertions(+), 156 deletions(-) create mode 100755 .github/workflows/install_dev_tools.bash create mode 100755 .github/workflows/install_dev_tools_project.bash create mode 100644 API_REFERENCE_v1.md create mode 100644 CLI_REFERENCE.md create mode 100644 docs/source/_static/openapi_v1.yaml create mode 100644 docs/source/api_explorer_v1.rst create mode 100644 docs/source/api_reference_v1.rst delete mode 100644 docs/source/api_v1.rst create mode 100644 docs/source/cli_reference.rst rename docs/source/{reference.rst => lib_reference.rst} (53%) delete mode 100644 src/aignostics/client/resources/__init__.py diff --git a/.copier-answers.yml b/.copier-answers.yml index da7c4593..f2ddd791 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.8.16 +_commit: v0.8.31 _src_path: gh:helmut-hoffer-von-ankershoffen/oe-python-template attestations_enabled: false author_email: helmut@aignostics.com diff --git a/.github/workflows/docker-image-build-publish.yml b/.github/workflows/docker-image-build-publish.yml index 2414c103..2e63d16a 100644 --- a/.github/workflows/docker-image-build-publish.yml +++ b/.github/workflows/docker-image-build-publish.yml @@ -24,11 +24,8 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install dev tools - run: | - wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add - - echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list - sudo apt-get update - sudo apt-get install -y curl jq xsltproc gnupg2 trivy + shell: bash + run: .github/workflows/install_dev_tools.bash - name: Set up QEMU uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 @@ -37,7 +34,6 @@ jobs: uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0 - - name: Log in to Docker Hub uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 with: diff --git a/.github/workflows/install_dev_tools.bash b/.github/workflows/install_dev_tools.bash new file mode 100755 index 00000000..74312834 --- /dev/null +++ b/.github/workflows/install_dev_tools.bash @@ -0,0 +1,20 @@ +#!/bin/bash + +set -e # Exit immediately if a command exits with a non-zero status +set -o pipefail # Return value of a pipeline is the value of the last command to exit with a non-zero status + +# Log function for better debugging +log() { + echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')] $*" +} + +log "Starting installation of development tools..." + +wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add - +echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list +sudo apt-get update +sudo apt-get install -y curl jq xsltproc gnupg2 imagemagick trivy + +.github/workflows/install_dev_tools_project.bash + +log "Completed installation of development tools." diff --git a/.github/workflows/install_dev_tools_project.bash b/.github/workflows/install_dev_tools_project.bash new file mode 100755 index 00000000..57d27c35 --- /dev/null +++ b/.github/workflows/install_dev_tools_project.bash @@ -0,0 +1,16 @@ +#!/bin/bash + +set -e # Exit immediately if a command exits with a non-zero status +set -o pipefail # Return value of a pipeline is the value of the last command to exit with a non-zero status + +# Log function for better debugging +log() { + echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')] $*" +} + +log "Starting installation of development tools specific to Aignostics Python SDK..." + +# Add your project specific installation commands here +# sudo apt-get install -y curl jq xsltproc gnupg2 imagemagick trivy + +log "Completed installation of development tools specific to Aignostics Python SDK." diff --git a/.github/workflows/package-build-publish-release.yml b/.github/workflows/package-build-publish-release.yml index d26edca4..eab2bf74 100644 --- a/.github/workflows/package-build-publish-release.yml +++ b/.github/workflows/package-build-publish-release.yml @@ -19,12 +19,19 @@ jobs: with: fetch-depth: 0 + - name: Install uv + uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1 + with: + version: "0.6.3" + cache-dependency-glob: uv.lock + enable-cache: true + - name: Install dev tools - run: | - wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add - - echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list - sudo apt-get update - sudo apt-get install -y curl jq xsltproc gnupg2 trivy + shell: bash + run: .github/workflows/install_dev_tools.bash + + - name: Docs + run: make docs - name: Generate release notes uses: orhun/git-cliff-action@4a4a951bc43fafe41cd2348d181853f52356bee7 # v4.4.2 @@ -39,15 +46,8 @@ jobs: - name: Print the release notes run: cat "${{ steps.git-cliff.outputs.changelog }}" - - name: Install uv - uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1 - with: - version: "0.6.3" - cache-dependency-glob: uv.lock - enable-cache: true - - name: Build distribution into dist/ - run: uv build + run: make dist - name: Publish distribution to Python Package Index at pypi.org @@ -55,13 +55,14 @@ jobs: - name: Have audit checks publish to reports/ for auditing - run: uv run nox -s audit + run: make audit - name: Create GitHub release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - gh release create ${{ github.ref_name }} ./dist/* ./reports/* --notes-file ${{ steps.git-cliff.outputs.changelog }} + gh release create ${{ github.ref_name }} ./dist/* ./reports/* \ + --notes-file ${{ steps.git-cliff.outputs.changelog }} - name: Allow other workflows to trigger on release env: diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 973843b0..7ebcac10 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -24,27 +24,19 @@ jobs: with: fetch-depth: 0 - - name: Install dev tools - run: | - wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add - - echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list - sudo apt-get update - sudo apt-get install -y curl jq xsltproc gnupg2 trivy - - - name: Install project specific dependencies - run: | - # sudo apt-get install -y YOUR_PROJECT_DEPENDENCIES - - - name: Install uv (python package manager) + - name: Install uv uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1 with: version: "0.6.3" enable-cache: true cache-dependency-glob: uv.lock + - name: Install dev tools + shell: bash + run: .github/workflows/install_dev_tools.bash + - name: Install Python, venv and dependencies - run: | - uv sync --all-extras --frozen --link-mode=copy + run: uv sync --all-extras --frozen --link-mode=copy - name: Release version check if: startsWith(github.ref, 'refs/tags/v') @@ -81,12 +73,16 @@ jobs: fi - name: Smoke tests - run: | - uv run --no-dev aignostics system health + run: uv run --no-dev aignostics hello-world - - name: Run unit tests, measure coverage, lint, and check vulnerabilities - run: | - uv run --all-extras nox + - name: Lint + run: make lint + + - name: Audit + run: make audit + + - name: Test + run: make test - name: Upload test results uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 @@ -94,12 +90,16 @@ jobs: with: name: test-results path: | - junit.xml - coverage.xml - coverage_html/ - vulnerabilities.json - licenses.json - licenses-inverted.json + reports/mypy_junit.xml + reports/sbom.json + reports/sbom.spdx + reports/licenses.csv + reports/licenses.json + reports/licenses_grouped.json + reports/vulnerabilities.json + reports/junit.xml + reports/coverage.xml + reports/coverage_html retention-days: 30 - name: Upload coverage reports to Codecov diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index 499697a3..3b7f5f84 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -2,8 +2,7 @@ name: "CI Scheduled" on: schedule: - - cron: '0 7 * * *' - workflow_dispatch: + - cron: '0 6 * * *' jobs: test-scheduled: @@ -25,8 +24,7 @@ jobs: cache-dependency-glob: uv.lock - name: Install Python, venv and dependencies - run: | - uv sync --all-extras --frozen --link-mode=copy + run: uv sync --all-extras --frozen --link-mode=copy - name: Set up cloud credentials & environment file env: @@ -39,7 +37,4 @@ jobs: echo "ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV - name: Run tests marked as scheduled - env: - AIGNX_REFRESH_TOKEN: ${{ secrets.AIGNX_REFRESH_TOKEN }} - run: | - uv run --all-extras nox -s test -p 3.12 -- -m scheduled + run: make test_scheduled diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 63acf30f..7d77a171 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ # .pre-commit-config.yaml default_install_hook_types: - - pre-push + - pre-commit fail_fast: true repos: - repo: meta @@ -53,7 +53,7 @@ repos: - id: name-tests-test - id: requirements-txt-fixer - id: trailing-whitespace - exclude: "docs/source/_static|ATTRIBUTIONS.md" + exclude: "docs/source/_static|ATTRIBUTIONS.md||API_REFEREENCE" - repo: https://github.com/Yelp/detect-secrets rev: v1.5.0 hooks: @@ -66,9 +66,9 @@ repos: - id: uv-lock - repo: local hooks: - - id: nox - name: nox - entry: uv run nox + - id: make + name: make + entry: make language: system pass_filenames: false always_run: true diff --git a/.vscode/settings.json b/.vscode/settings.json index 6442688d..7915f364 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,7 +3,7 @@ "editor.defaultFormatter": "vscode.json-language-features" }, "files.exclude": { - "**/__pycache__ ": true + "**/__pycache__ ": true, }, "editor.formatOnSave": true, "terminal.integrated.scrollback": 100000, @@ -32,7 +32,8 @@ "**/.nox/**", "**/.venv/**", "**/site-packages/**", - "**/dist-packages/**" + "**/dist-packages/**", + "**/dist_vercel/.vercel/**", ], "python.analysis.ignore": [ "**/typing.py" diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md new file mode 100644 index 00000000..d2b45906 --- /dev/null +++ b/API_REFERENCE_v1.md @@ -0,0 +1,2179 @@ +# API v1 Reference +--- +title: machine. +language_tabs: +toc_footers: [] +includes: [] +search: true +highlight_theme: darkula +--- + + + + + + + + +segmentation, + cell detection and cell classfication' + title: Description + type: string + name: + examples: + - HETA + title: Name + type: string + regulatory_classes: + examples: + - - RuO + items: + type: string + title: Regulatory Classes + type: array + required: + - name + - description + - regulatory_classes + title: ApplicationCreationRequest + type: object + ApplicationCreationResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + required: + - application_id + title: ApplicationCreationResponse + type: object + ApplicationReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + description: + examples: + - Aignostics H&E TME application + title: Description + type: string + name: + examples: + - HETA + title: Name + type: string + regulatory_classes: + examples: + - - RuO + items: + type: string + title: Regulatory Classes + type: array + slug: + examples: + - heta + title: Slug + type: string + required: + - application_id + - name + - slug + - regulatory_classes + - description + title: ApplicationReadResponse + type: object + ApplicationRunStatus: + enum: + - canceled_system + - canceled_user + - completed + - completed_with_error + - received + - rejected + - running + - scheduled + title: ApplicationRunStatus + type: string + ApplicationVersionReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + application_version_slug: + examples: + - tissue-segmentation-qc:v0.0.1 + pattern: ^(?:|-)*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ + title: Application Version Slug + type: string + changelog: + title: Changelog + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Flow Id + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactReadResponse' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactReadResponse' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - application_version_id + - application_version_slug + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + title: ApplicationVersionReadResponse + type: object + ArtifactEvent: + description: 'This is a subset of the OutputArtifactEvent used by the +state + machine. + +> components: + +> schemas: + +> ApplicationCreationRequest: + +> properties: + +> description: + +> examples: + +> - 'H&E Tumor Micro Environment Analysis: Performing tissue QC, + + Only the variants defined below are allowed to be submitted from the +Algorithms/Applications.' + enum: + - succeeded + - failed_with_user_error + - failed_with_system_error + title: ArtifactEvent + type: string + ArtifactStatus: + enum: + - pending + - canceled_user + - canceled_system + - error_user + - error_system_fatal + - error_system_recoverable + - skipped + - succeeded + title: ArtifactStatus + type: string + HTTPValidationError: + properties: + detail: + items: + $ref: '#/components/schemas/ValidationError' + title: Detail + type: array + title: HTTPValidationError + type: object + InputArtifact: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifact + type: object + InputArtifactCreationRequest: + properties: + download_url: + examples: + - https://example.com/case-no-1-slide.tiff + format: uri + maxLength: 2083 + minLength: 1 + title: Download Url + type: string + metadata: + examples: + - checksum_crc32c: 752f9554 + height: 2000 + height_mpp: 0.5 + width: 10000 + width_mpp: 0.5 + title: Metadata + type: object + name: + examples: + - slide + title: Name + type: string + required: + - name + - download_url + - metadata + title: InputArtifactCreationRequest + type: object + InputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactReadResponse + type: object + InputArtifactSchemaCreationRequest: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactSchemaCreationRequest + type: object + ItemCreationRequest: + properties: + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactCreationRequest' + title: Input Artifacts + type: array + reference: + examples: + - case-no-1 + title: Reference + type: string + required: + - reference + - input_artifacts + title: ItemCreationRequest + type: object + ItemEvent: + enum: + - failed_with_system_error + - failed_recoverable + title: ItemEvent + type: string + ItemEventCreationRequest: + properties: + error: + title: Error + type: string + event: + $ref: '#/components/schemas/ItemEvent' + required: + - event + - error + title: ItemEventCreationRequest + type: object + ItemEventCreationResponse: + properties: + item_id: + format: uuid + title: Item Id + type: string + status: + $ref: '#/components/schemas/ItemStatus' + required: + - item_id + - status + title: ItemEventCreationResponse + type: object + ItemReadResponse: + properties: + application_run_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Run Id + error: + anyOf: + - type: string + - type: 'null' + title: Error + item_id: + format: uuid + title: Item Id + type: string + reference: + title: Reference + type: string + status: + $ref: '#/components/schemas/ItemStatus' + required: + - item_id + - reference + - status + - error + title: ItemReadResponse + type: object + ItemResultReadResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + error: + anyOf: + - type: string + - type: 'null' + title: Error + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactResultReadResponse' + title: Output Artifacts + type: array + reference: + title: Reference + type: string + status: + $ref: '#/components/schemas/ItemStatus' + required: + - item_id + - application_run_id + - reference + - status + - error + - output_artifacts + title: ItemResultReadResponse + type: object + ItemStatus: + enum: + - pending + - canceled_user + - canceled_system + - error_user + - error_system + - succeeded + title: ItemStatus + type: string + OrganizationCreationRequest: + properties: + batch_size: + title: Batch Size + type: integer + organization_id: + title: Organization Id + type: string + owner_email: + title: Owner Email + type: string + slide_quota: + title: Slide Quota + type: integer + required: + - organization_id + - owner_email + - slide_quota + - batch_size + title: OrganizationCreationRequest + type: object + OrganizationQuota: + properties: + total: + anyOf: + - type: integer + - type: 'null' + title: Total + used: + title: Used + type: integer + required: + - total + - used + title: OrganizationQuota + type: object + OrganizationResponse: + properties: + batch_size: + title: Batch Size + type: integer + organization_id: + title: Organization Id + type: string + owner_id: + format: uuid + title: Owner Id + type: string + slide_quota: + $ref: '#/components/schemas/OrganizationQuota' + required: + - organization_id + - owner_id + - slide_quota + - batch_size + title: OrganizationResponse + type: object + OrganizationUpdateRequest: + properties: + batch_size: + anyOf: + - type: integer + - type: 'null' + title: Batch Size + slide_quota: + anyOf: + - type: integer + - type: 'null' + title: Slide Quota + title: OrganizationUpdateRequest + type: object + OutputArtifact: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + visibility: + $ref: '#/components/schemas/OutputArtifactVisibility' + required: + - name + - mime_type + - metadata_schema + - scope + - visibility + title: OutputArtifact + type: object + OutputArtifactEventTriggerRequest: + properties: + error: + anyOf: + - type: string + - type: 'null' + title: Error + event: + $ref: '#/components/schemas/ArtifactEvent' + metadata: + title: Metadata + type: object + required: + - event + - metadata + title: OutputArtifactEventTriggerRequest + type: object + OutputArtifactEventTriggerResponse: + properties: + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + status: + $ref: '#/components/schemas/ArtifactStatus' + required: + - output_artifact_id + - status + title: OutputArtifactEventTriggerResponse + type: object + OutputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + required: + - name + - mime_type + - metadata_schema + - scope + title: OutputArtifactReadResponse + type: object + OutputArtifactResultReadResponse: + properties: + download_url: + anyOf: + - format: uri + maxLength: 2083 + minLength: 1 + type: string + - type: 'null' + title: Download Url + metadata: + title: Metadata + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - name + - mime_type + - metadata + - download_url + title: OutputArtifactResultReadResponse + type: object + OutputArtifactSchemaCreationRequest: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + visibility: + $ref: '#/components/schemas/OutputArtifactVisibility' + required: + - name + - mime_type + - scope + - visibility + - metadata_schema + title: OutputArtifactSchemaCreationRequest + type: object + OutputArtifactScope: + enum: + - item + - global + title: OutputArtifactScope + type: string + OutputArtifactVisibility: + enum: + - internal + - external + title: OutputArtifactVisibility + type: string + PayloadInputArtifact: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + input_artifact_id: + format: uuid + title: Input Artifact Id + type: string + metadata: + title: Metadata + type: object + required: + - input_artifact_id + - metadata + - download_url + title: PayloadInputArtifact + type: object + PayloadItem: + properties: + input_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadInputArtifact' + title: Input Artifacts + type: object + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + title: Output Artifacts + type: object + required: + - item_id + - input_artifacts + - output_artifacts + title: PayloadItem + type: object + PayloadOutputArtifact: + properties: + data: + $ref: '#/components/schemas/TransferUrls' + metadata: + $ref: '#/components/schemas/TransferUrls' + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - data + - metadata + title: PayloadOutputArtifact + type: object + QuotaName: + description: Global, API-level, and slide-level quotas for Samia API. + enum: + - max_users + - max_organizations + - max_users_per_organization + - max_applications + - max_application_versions + - max_slides_per_run + - max_parallel_runs + - max_parallel_runs_per_organization + - max_parallel_runs_per_user + title: QuotaName + type: string + QuotaReadResponse: + description: GET response payload for quota read. + properties: + name: + $ref: '#/components/schemas/QuotaName' + quota: + title: Quota + type: integer + required: + - name + - quota + title: QuotaReadResponse + type: object + QuotaUpdateRequest: + description: PATCH request payload for quota update. + properties: + name: + $ref: '#/components/schemas/QuotaName' + quota: + exclusiveMinimum: 0.0 + title: Quota + type: integer + required: + - name + - quota + title: QuotaUpdateRequest + type: object + QuotaUpdateResponse: + description: PATCH response payload for quota update. + properties: + name: + $ref: '#/components/schemas/QuotaName' + quota: + title: Quota + type: integer + required: + - name + - quota + title: QuotaUpdateResponse + type: object + QuotasReadResponse: + description: GET response payload for multiple quota reads. + properties: + quotas: + items: + $ref: '#/components/schemas/QuotaReadResponse' + title: Quotas + type: array + required: + - quotas + title: QuotasReadResponse + type: object + QuotasUpdateRequest: + description: PATCH request payload for quota updates. + properties: + quotas: + items: + $ref: '#/components/schemas/QuotaUpdateRequest' + title: Quotas + type: array + required: + - quotas + title: QuotasUpdateRequest + type: object + QuotasUpdateResponse: + description: PATCH response payload for quota updates. + properties: + updated_quotas: + items: + $ref: '#/components/schemas/QuotaUpdateResponse' + title: Updated Quotas + type: array + required: + - updated_quotas + title: QuotasUpdateResponse + type: object + RunCreationRequest: + properties: + application_version: + anyOf: + - format: uuid + type: string + - $ref: '#/components/schemas/SlugVersionRequest' + examples: + - efbf9822-a1e5-4045-a283-dbf26e8064a9 + title: Application Version + items: + items: + $ref: '#/components/schemas/ItemCreationRequest' + title: Items + type: array + required: + - application_version + - items + title: RunCreationRequest + type: object + RunCreationResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + required: + - application_run_id + title: RunCreationResponse + type: object + RunReadResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + organization_id: + title: Organization Id + type: string + status: + $ref: '#/components/schemas/ApplicationRunStatus' + triggered_at: + format: date-time + title: Triggered At + type: string + triggered_by: + title: Triggered By + type: string + user_payload: + anyOf: + - $ref: '#/components/schemas/UserPayload' + - type: 'null' + required: + - application_run_id + - application_version_id + - organization_id + - status + - triggered_at + - triggered_by + title: RunReadResponse + type: object + SlugVersionRequest: + properties: + application_slug: + pattern: ^(-?)*$ + title: Application Slug + type: string + version: + title: Version + type: string + required: + - application_slug + - version + title: SlugVersionRequest + type: object + TransferUrls: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + upload_url: + format: uri + minLength: 1 + title: Upload Url + type: string + required: + - upload_url + - download_url + title: TransferUrls + type: object + UserCreationRequest: + properties: + email: + anyOf: + - type: string + - type: 'null' + title: Email + organization_id: + format: uuid + title: Organization Id + type: string + user_id: + title: User Id + type: string + required: + - user_id + - organization_id + - email + title: UserCreationRequest + type: object + UserPayload: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_run_id: + format: uuid + title: Application Run Id + type: string + global_output_artifacts: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + type: object + - type: 'null' + title: Global Output Artifacts + items: + items: + $ref: '#/components/schemas/PayloadItem' + title: Items + type: array + required: + - application_id + - application_run_id + - global_output_artifacts + - items + title: UserPayload + type: object + UserQuota: + properties: + total: + anyOf: + - type: integer + - type: 'null' + title: Total + used: + title: Used + type: integer + required: + - total + - used + title: UserQuota + type: object + UserResponse: + properties: + organization_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Organization Id + slide_quota: + $ref: '#/components/schemas/UserQuota' + user_id: + anyOf: + - type: string + - type: 'null' + title: User Id + required: + - user_id + - organization_id + - slide_quota + title: UserResponse + type: object + UserUpdateRequest: + properties: + slide_quota: + anyOf: + - type: integer + - type: 'null' + title: Slide Quota + user_id: + anyOf: + - type: string + - type: 'null' + title: User Id + title: UserUpdateRequest + type: object + ValidationError: + properties: + loc: + items: + anyOf: + - type: string + - type: integer + title: Location + type: array + msg: + title: Message + type: string + type: + title: Error Type + type: string + required: + - loc + - msg + - type + title: ValidationError + type: object + VersionCreationRequest: + properties: + application_id: + format: uuid + title: Application Id + type: string + changelog: + title: Changelog + type: string + flow_id: + format: uuid + title: Flow Id + type: string + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactSchemaCreationRequest' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactSchemaCreationRequest' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - version + - application_id + - flow_id + - changelog + - input_artifacts + - output_artifacts + title: VersionCreationRequest + type: object + VersionCreationResponse: + properties: + application_version_id: + format: uuid + title: Application Version Id + type: string + required: + - application_version_id + title: VersionCreationResponse + type: object + VersionReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + changelog: + title: Changelog + type: string + created_at: + format: date-time + title: Created At + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Flow Id + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifact' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifact' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - application_version_id + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + - created_at + title: VersionReadResponse + type: object + securitySchemes: + OAuth2AuthorizationCodeBearer: + flows: + authorizationCode: + authorizationUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize + scopes: {} + tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token + type: oauth2 +info: + description: Pagination is done via `page` and `page_size`. Sorting via `sort` +query + parameter. sort is a comma-separated list of field names. The sorting +direction + can be indicated via `+` (ascending) or `-` (descending) (e.g. +`/applications?sort=+name)`. + summary: Interact with Aignostics' Application Platform + title: Aignostics Platform API + version: 0.1.0 +openapi: 3.1.0 +paths: + /docs: + get: + operationId: get_documentation_docs_get + parameters: + - in: cookie + name: access_token + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Access Token + responses: + '200': + content: + application/json: + schema: {} + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Get Documentation + /health: + get: + description: Check that the API application is alive and responsive. + operationId: health_health_get + responses: + '200': + content: + application/json: + schema: {} + description: Successful Response + summary: Health + tags: + - Infrastructure + /liveness: + get: + description: Check that the API application is alive and responsive. + operationId: liveness_liveness_get + responses: + '200': + content: + application/json: + schema: {} + description: Successful Response + summary: Liveness + tags: + - Infrastructure + /readiness: + get: + description: Check that the API application is ready to serve. + operationId: readiness_readiness_get + responses: + '200': + content: + application/json: + schema: {} + description: Successful Response + summary: Readiness + tags: + - Infrastructure + /v1/applications: + get: + operationId: list_applications_v1_applications_get + parameters: + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationReadResponse' + title: Response List Applications V1 Applications Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Applications + tags: + - Externals + post: + operationId: register_application_v1_applications_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationCreationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Register Application + tags: + - Admins + /v1/applications/{application_id}: + get: + operationId: read_application_by_id_v1_applications__application_id__get + parameters: + - in: path + name: application_id + required: true + schema: + format: uuid + title: Application Id + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Read Application By Id + tags: + - Externals + /v1/applications/{application_id}/versions: + get: + operationId: +list_versions_by_application_id_v1_applications__application_id__versions_get + parameters: + - in: path + name: application_id + required: true + schema: + format: uuid + title: Application Id + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Id V1 Applications +Application + Id Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Versions By Application Id + tags: + - Externals + /v1/applications/{application_slug}: + get: + operationId: +read_application_by_slug_v1_applications__application_slug__get + parameters: + - in: path + name: application_slug + required: true + schema: + title: Application Slug + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Read Application By Slug + tags: + - Externals + /v1/applications/{application_slug}/versions: + get: + operationId: +list_versions_by_application_slug_v1_applications__application_slug__versions_ge +t + parameters: + - in: path + name: application_slug + required: true + schema: + pattern: ^(-?)*$ + title: Application Slug + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Slug V1 +Applications Application + Slug Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Versions By Application Slug + tags: + - Externals + /v1/artifacts/{output_artifact_id}/event: + post: + operationId: +trigger_artifact_event_v1_artifacts__output_artifact_id__event_post + parameters: + - in: path + name: output_artifact_id + required: true + schema: + format: uuid + title: Output Artifact Id + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OutputArtifactEventTriggerRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/OutputArtifactEventTriggerResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Trigger Artifact Event + tags: + - Algorithms/Apps + /v1/items/{item_id}: + get: + operationId: get_item_v1_items__item_id__get + parameters: + - in: path + name: item_id + required: true + schema: + format: uuid + title: Item Id + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ItemReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Item + tags: + - Scheduler + /v1/items/{item_id}/event: + post: + operationId: register_item_event_v1_items__item_id__event_post + parameters: + - in: path + name: item_id + required: true + schema: + format: uuid + title: Item Id + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ItemEventCreationRequest' + required: true + responses: + '202': + content: + application/json: + schema: + $ref: '#/components/schemas/ItemEventCreationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Register Item Event + tags: + - Scheduler + /v1/organizations: + post: + operationId: create_organization_v1_organizations_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Create Organization + tags: + - Organizations + /v1/organizations/{organization_id}: + get: + operationId: get_organization_v1_organizations__organization_id__get + parameters: + - in: path + name: organization_id + required: true + schema: + format: uuid + title: Organization Id + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Organization + tags: + - Organizations + patch: + operationId: update_organization_v1_organizations__organization_id__patch + parameters: + - in: path + name: organization_id + required: true + schema: + title: Organization Id + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationUpdateRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Update Organization + tags: + - Organizations + /v1/quotas: + get: + operationId: list_quotas_v1_quotas_get + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/QuotasReadResponse' + description: Successful Response + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Quotas + tags: + - Admins + - Admins + patch: + operationId: update_quotas_v1_quotas_patch + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/QuotasUpdateRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/QuotasUpdateResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Update Quotas + tags: + - Admins + - Admins + /v1/runs: + get: + operationId: list_application_runs_v1_runs_get + parameters: + - in: query + name: application_id + required: false + schema: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Id + - in: query + name: application_version_id + required: false + schema: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Version Id + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/RunReadResponse' + title: Response List Application Runs V1 Runs Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Application Runs + tags: + - Externals + post: + operationId: create_application_run_v1_runs_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Create Application Run + tags: + - Externals + /v1/runs/{application_run_id}: + get: + operationId: get_run_v1_runs__application_run_id__get + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RunReadResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Run + tags: + - Externals + - Scheduler + /v1/runs/{application_run_id}/cancel: + post: + operationId: cancel_run_v1_runs__application_run_id__cancel_post + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + responses: + '202': + content: + application/json: + schema: {} + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Cancel Run + tags: + - Externals + /v1/runs/{application_run_id}/results: + delete: + operationId: +delete_run_results_v1_runs__application_run_id__results_delete + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + responses: + '204': + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Delete Run Results + tags: + - Externals + get: + operationId: list_run_results_v1_runs__application_run_id__results_get + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + - in: query + name: item_id__in + required: false + schema: + anyOf: + - items: + format: uuid + type: string + type: array + - type: 'null' + title: Item Id In + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: reference__in + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Reference In + - in: query + name: status__in + required: false + schema: + anyOf: + - items: + $ref: '#/components/schemas/ItemStatus' + type: array + - type: 'null' + title: Status In + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ItemResultReadResponse' + title: Response List Run Results V1 Runs Application Run Id +Results + Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Run Results + tags: + - Externals + /v1/users/: + post: + operationId: create_user_v1_users__post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserCreationRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponse' + description: Successful Response + '404': + description: User not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Create User + tags: + - Externals + /v1/users/{user_id}: + get: + operationId: get_user_v1_users__user_id__get + parameters: + - in: path + name: user_id + required: true + schema: + format: uuid + title: User Id + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponse' + description: Successful Response + '404': + description: User not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get User + tags: + - Externals + patch: + operationId: update_user_v1_users__user_id__patch + parameters: + - in: path + name: user_id + required: true + schema: + format: uuid + title: User Id + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserUpdateRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponse' + description: Successful Response + '404': + description: User not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Update User + tags: + - Externals + /v1/versions: + post: + operationId: register_version_v1_versions_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VersionCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/VersionCreationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Register Version + tags: + - Externals + - Scheduler + - Admins + /v1/versions/{application_version_id}: + get: + operationId: get_version_v1_versions__application_version_id__get + parameters: + - in: path + name: application_version_id + required: true + schema: + format: uuid + title: Application Version Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VersionReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Version + tags: + - Externals + - Scheduler +tags: +- description: Called by externals to interact with our API + name: Externals +- description: Called by the Algorithms and applications to update statuses + name: Algorithms/Apps +- description: Called by the Scheduler + name: Scheduler +- description: Called by Admins to manage and register entities + name: Admins +- description: Called by other Infra + name: Infrastructure diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index fdab342d..400a7932 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -3211,22 +3211,6 @@ Code coverage measurement for Python ``` -## cryptography (44.0.2) - Apache Software License; BSD License - -cryptography is a package which provides cryptographic recipes and primitives to Python developers. - -* URL: https://github.com/pyca/cryptography -* Author(s): The cryptography developers - -### License Text - -``` -This software is made available under the terms of *either* of the licenses -found in LICENSE.APACHE or LICENSE.BSD. Contributions to cryptography are made -under the terms of *both* these licenses. - -``` - ## cssutils (2.11.1) - GNU Library or Lesser General Public License (LGPL) A CSS Cascading Style Sheets library for Python diff --git a/CLI_REFERENCE.md b/CLI_REFERENCE.md new file mode 100644 index 00000000..461a233a --- /dev/null +++ b/CLI_REFERENCE.md @@ -0,0 +1,454 @@ +# CLI Reference + +Command Line Interface of the aignostics platform + +**Usage**: + +```console +$ aignostics [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +* `--install-completion`: Install completion for the current shell. +* `--show-completion`: Show completion for the current shell, to copy it or customize the installation. +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +**Commands**: + +* `platform`: Platform diagnostics and utilities +* `application`: aignostics applications + +## `aignostics platform` + +Platform diagnostics and utilities + +**Usage**: + +```console +$ aignostics platform [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +**Commands**: + +* `install`: Complete and validate installation of the... +* `health`: Indicate if aignostics platform is healthy. +* `info`: Print info about service configuration. +* `openapi`: Dump the OpenAPI specification of to stdout. +* `bucket`: Transfer bucket provide by platform + +### `aignostics platform install` + +Complete and validate installation of the CLI. + +**Usage**: + +```console +$ aignostics platform install [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +### `aignostics platform health` + +Indicate if aignostics platform is healthy. + +**Usage**: + +```console +$ aignostics platform health [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +### `aignostics platform info` + +Print info about service configuration. + +**Usage**: + +```console +$ aignostics platform info [OPTIONS] +``` + +**Options**: + +* `--output-format [yaml|json]`: Output format [default: yaml] +* `--env / --no-env`: Include environment variables in output [default: no-env] +* `--filter-secrets / --no-filter-secrets`: Filter out secret values from environment variables [default: filter-secrets] +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +### `aignostics platform openapi` + +Dump the OpenAPI specification of to stdout. + +**Usage**: + +```console +$ aignostics platform openapi [OPTIONS] +``` + +**Options**: + +* `--api-version [v1]`: API Version [default: v1] +* `--output-format [yaml|json]`: Output format [default: yaml] +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +### `aignostics platform bucket` + +Transfer bucket provide by platform + +**Usage**: + +```console +$ aignostics platform bucket [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +**Commands**: + +* `ls`: List contents of tranfer bucket. +* `purge`: Purge content of transfer bucket. + +#### `aignostics platform bucket ls` + +List contents of tranfer bucket. + +**Usage**: + +```console +$ aignostics platform bucket ls [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +#### `aignostics platform bucket purge` + +Purge content of transfer bucket. + +**Usage**: + +```console +$ aignostics platform bucket purge [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +## `aignostics application` + +aignostics applications + +**Usage**: + +```console +$ aignostics application [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +**Commands**: + +* `list`: List available applications. +* `describe`: Describe application. +* `dataset`: Datasets for use as input for applications +* `metadata`: Metadata required as input for applications +* `run`: Runs of applications + +### `aignostics application list` + +List available applications. + +**Usage**: + +```console +$ aignostics application list [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +### `aignostics application describe` + +Describe application. + +**Usage**: + +```console +$ aignostics application describe [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +### `aignostics application dataset` + +Datasets for use as input for applications + +**Usage**: + +```console +$ aignostics application dataset [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +**Commands**: + +* `download`: Download dataset. + +#### `aignostics application dataset download` + +Download dataset. + +**Usage**: + +```console +$ aignostics application dataset download [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +### `aignostics application metadata` + +Metadata required as input for applications + +**Usage**: + +```console +$ aignostics application metadata [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +**Commands**: + +* `generate`: Generate metadata. + +#### `aignostics application metadata generate` + +Generate metadata. + +**Usage**: + +```console +$ aignostics application metadata generate [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +### `aignostics application run` + +Runs of applications + +**Usage**: + +```console +$ aignostics application run [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +**Commands**: + +* `submit`: Create run. +* `list`: List runs. +* `describe`: Describe run. +* `cancel`: Cancel run. +* `result`: Results of applications runs + +#### `aignostics application run submit` + +Create run. + +**Usage**: + +```console +$ aignostics application run submit [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +#### `aignostics application run list` + +List runs. + +**Usage**: + +```console +$ aignostics application run list [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +#### `aignostics application run describe` + +Describe run. + +**Usage**: + +```console +$ aignostics application run describe [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +#### `aignostics application run cancel` + +Cancel run. + +**Usage**: + +```console +$ aignostics application run cancel [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +#### `aignostics application run result` + +Results of applications runs + +**Usage**: + +```console +$ aignostics application run result [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +**Commands**: + +* `describe`: Describe the result of an application run. +* `download`: Download the result of an application run. +* `delete`: Delete the result of an application run. + +##### `aignostics application run result describe` + +Describe the result of an application run. + +**Usage**: + +```console +$ aignostics application run result describe [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +##### `aignostics application run result download` + +Download the result of an application run. + +**Usage**: + +```console +$ aignostics application run result download [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 + +##### `aignostics application run result delete` + +Delete the result of an application run. + +**Usage**: + +```console +$ aignostics application run result delete [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 diff --git a/Makefile b/Makefile index 3410b60b..02a757da 100644 --- a/Makefile +++ b/Makefile @@ -1,27 +1,27 @@ # Makefile for running common development tasks # Define all PHONY targets -.PHONY: all act audit bump clean codegen dist docs docker_build lint setup setup test test_scheduledupdate_from_template +.PHONY: all act audit bump clean dist docs docker_build lint setup setup test test_scheduled update_from_template # Main target i.e. default sessions defined in noxfile.py all: - uv run nox + uv run --all-extras nox # Nox targets ## Call nox sessions passing parameters nox-cmd = @if [ "$@" = "test" ]; then \ if [ -n "$(filter 3.%,$(MAKECMDGOALS))" ]; then \ - uv run nox -s test -p $(filter 3.%,$(MAKECMDGOALS)); \ + uv run --all-extras nox -s test -p $(filter 3.%,$(MAKECMDGOALS)); \ elif [ -n "$(filter-out $@,$(MAKECMDGOALS))" ]; then \ - uv run nox -s $@ -- $(filter-out $@,$(MAKECMDGOALS)); \ + uv run --all-extras nox -s $@ -- $(filter-out $@,$(MAKECMDGOALS)); \ else \ - uv run nox -s $@; \ + uv run --all-extras nox -s $@; \ fi; \ elif [ -n "$(filter-out $@,$(MAKECMDGOALS))" ]; then \ - uv run nox -s $@ -- $(filter-out $@,$(MAKECMDGOALS)); \ + uv run --all-extras nox -s $@ -- $(filter-out $@,$(MAKECMDGOALS)); \ else \ - uv run nox -s $@; \ + uv run --all-extras nox -s $@; \ fi ## Individual Nox sessions @@ -30,9 +30,9 @@ act audit bump dist docs lint setup test update_from_template: # Standalone targets -## Scheduled tests +## Run tests marked as scheduled test_scheduled: - uv run nox -s test -p 3.11 -- -m scheduled + uv run --all-extras nox -s test -p 3.11 -- -m scheduled ## Clean build artifacts and caches clean: @@ -88,7 +88,7 @@ help: @echo " lint - Run linting and formatting checks" @echo " setup - Setup development environment" @echo " test [3.11|3.12|3.13] - Run tests (for specific Python version)" - @echo " test_scheduled - Run scheduled tests (with Python version 3.11)" + @echo " test_scheduled - Run tests marked as scheduled with Python 3.11 @echo " update_from_template - Update from template using copier" @echo "" @echo "Built with love in Berlin 🐻" diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml new file mode 100644 index 00000000..fbb3d0c5 --- /dev/null +++ b/docs/source/_static/openapi_v1.yaml @@ -0,0 +1,2155 @@ +components: + schemas: + ApplicationCreationRequest: + properties: + description: + examples: + - 'H&E Tumor Micro Environment Analysis: Performing tissue QC, +segmentation, + cell detection and cell classfication' + title: Description + type: string + name: + examples: + - HETA + title: Name + type: string + regulatory_classes: + examples: + - - RuO + items: + type: string + title: Regulatory Classes + type: array + required: + - name + - description + - regulatory_classes + title: ApplicationCreationRequest + type: object + ApplicationCreationResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + required: + - application_id + title: ApplicationCreationResponse + type: object + ApplicationReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + description: + examples: + - Aignostics H&E TME application + title: Description + type: string + name: + examples: + - HETA + title: Name + type: string + regulatory_classes: + examples: + - - RuO + items: + type: string + title: Regulatory Classes + type: array + slug: + examples: + - heta + title: Slug + type: string + required: + - application_id + - name + - slug + - regulatory_classes + - description + title: ApplicationReadResponse + type: object + ApplicationRunStatus: + enum: + - canceled_system + - canceled_user + - completed + - completed_with_error + - received + - rejected + - running + - scheduled + title: ApplicationRunStatus + type: string + ApplicationVersionReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + application_version_slug: + examples: + - tissue-segmentation-qc:v0.0.1 + pattern: ^(?:|-)*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ + title: Application Version Slug + type: string + changelog: + title: Changelog + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Flow Id + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactReadResponse' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactReadResponse' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - application_version_id + - application_version_slug + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + title: ApplicationVersionReadResponse + type: object + ArtifactEvent: + description: 'This is a subset of the OutputArtifactEvent used by the +state + machine. + + Only the variants defined below are allowed to be submitted from the +Algorithms/Applications.' + enum: + - succeeded + - failed_with_user_error + - failed_with_system_error + title: ArtifactEvent + type: string + ArtifactStatus: + enum: + - pending + - canceled_user + - canceled_system + - error_user + - error_system_fatal + - error_system_recoverable + - skipped + - succeeded + title: ArtifactStatus + type: string + HTTPValidationError: + properties: + detail: + items: + $ref: '#/components/schemas/ValidationError' + title: Detail + type: array + title: HTTPValidationError + type: object + InputArtifact: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifact + type: object + InputArtifactCreationRequest: + properties: + download_url: + examples: + - https://example.com/case-no-1-slide.tiff + format: uri + maxLength: 2083 + minLength: 1 + title: Download Url + type: string + metadata: + examples: + - checksum_crc32c: 752f9554 + height: 2000 + height_mpp: 0.5 + width: 10000 + width_mpp: 0.5 + title: Metadata + type: object + name: + examples: + - slide + title: Name + type: string + required: + - name + - download_url + - metadata + title: InputArtifactCreationRequest + type: object + InputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactReadResponse + type: object + InputArtifactSchemaCreationRequest: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactSchemaCreationRequest + type: object + ItemCreationRequest: + properties: + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactCreationRequest' + title: Input Artifacts + type: array + reference: + examples: + - case-no-1 + title: Reference + type: string + required: + - reference + - input_artifacts + title: ItemCreationRequest + type: object + ItemEvent: + enum: + - failed_with_system_error + - failed_recoverable + title: ItemEvent + type: string + ItemEventCreationRequest: + properties: + error: + title: Error + type: string + event: + $ref: '#/components/schemas/ItemEvent' + required: + - event + - error + title: ItemEventCreationRequest + type: object + ItemEventCreationResponse: + properties: + item_id: + format: uuid + title: Item Id + type: string + status: + $ref: '#/components/schemas/ItemStatus' + required: + - item_id + - status + title: ItemEventCreationResponse + type: object + ItemReadResponse: + properties: + application_run_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Run Id + error: + anyOf: + - type: string + - type: 'null' + title: Error + item_id: + format: uuid + title: Item Id + type: string + reference: + title: Reference + type: string + status: + $ref: '#/components/schemas/ItemStatus' + required: + - item_id + - reference + - status + - error + title: ItemReadResponse + type: object + ItemResultReadResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + error: + anyOf: + - type: string + - type: 'null' + title: Error + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactResultReadResponse' + title: Output Artifacts + type: array + reference: + title: Reference + type: string + status: + $ref: '#/components/schemas/ItemStatus' + required: + - item_id + - application_run_id + - reference + - status + - error + - output_artifacts + title: ItemResultReadResponse + type: object + ItemStatus: + enum: + - pending + - canceled_user + - canceled_system + - error_user + - error_system + - succeeded + title: ItemStatus + type: string + OrganizationCreationRequest: + properties: + batch_size: + title: Batch Size + type: integer + organization_id: + title: Organization Id + type: string + owner_email: + title: Owner Email + type: string + slide_quota: + title: Slide Quota + type: integer + required: + - organization_id + - owner_email + - slide_quota + - batch_size + title: OrganizationCreationRequest + type: object + OrganizationQuota: + properties: + total: + anyOf: + - type: integer + - type: 'null' + title: Total + used: + title: Used + type: integer + required: + - total + - used + title: OrganizationQuota + type: object + OrganizationResponse: + properties: + batch_size: + title: Batch Size + type: integer + organization_id: + title: Organization Id + type: string + owner_id: + format: uuid + title: Owner Id + type: string + slide_quota: + $ref: '#/components/schemas/OrganizationQuota' + required: + - organization_id + - owner_id + - slide_quota + - batch_size + title: OrganizationResponse + type: object + OrganizationUpdateRequest: + properties: + batch_size: + anyOf: + - type: integer + - type: 'null' + title: Batch Size + slide_quota: + anyOf: + - type: integer + - type: 'null' + title: Slide Quota + title: OrganizationUpdateRequest + type: object + OutputArtifact: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + visibility: + $ref: '#/components/schemas/OutputArtifactVisibility' + required: + - name + - mime_type + - metadata_schema + - scope + - visibility + title: OutputArtifact + type: object + OutputArtifactEventTriggerRequest: + properties: + error: + anyOf: + - type: string + - type: 'null' + title: Error + event: + $ref: '#/components/schemas/ArtifactEvent' + metadata: + title: Metadata + type: object + required: + - event + - metadata + title: OutputArtifactEventTriggerRequest + type: object + OutputArtifactEventTriggerResponse: + properties: + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + status: + $ref: '#/components/schemas/ArtifactStatus' + required: + - output_artifact_id + - status + title: OutputArtifactEventTriggerResponse + type: object + OutputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + required: + - name + - mime_type + - metadata_schema + - scope + title: OutputArtifactReadResponse + type: object + OutputArtifactResultReadResponse: + properties: + download_url: + anyOf: + - format: uri + maxLength: 2083 + minLength: 1 + type: string + - type: 'null' + title: Download Url + metadata: + title: Metadata + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - name + - mime_type + - metadata + - download_url + title: OutputArtifactResultReadResponse + type: object + OutputArtifactSchemaCreationRequest: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + visibility: + $ref: '#/components/schemas/OutputArtifactVisibility' + required: + - name + - mime_type + - scope + - visibility + - metadata_schema + title: OutputArtifactSchemaCreationRequest + type: object + OutputArtifactScope: + enum: + - item + - global + title: OutputArtifactScope + type: string + OutputArtifactVisibility: + enum: + - internal + - external + title: OutputArtifactVisibility + type: string + PayloadInputArtifact: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + input_artifact_id: + format: uuid + title: Input Artifact Id + type: string + metadata: + title: Metadata + type: object + required: + - input_artifact_id + - metadata + - download_url + title: PayloadInputArtifact + type: object + PayloadItem: + properties: + input_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadInputArtifact' + title: Input Artifacts + type: object + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + title: Output Artifacts + type: object + required: + - item_id + - input_artifacts + - output_artifacts + title: PayloadItem + type: object + PayloadOutputArtifact: + properties: + data: + $ref: '#/components/schemas/TransferUrls' + metadata: + $ref: '#/components/schemas/TransferUrls' + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - data + - metadata + title: PayloadOutputArtifact + type: object + QuotaName: + description: Global, API-level, and slide-level quotas for Samia API. + enum: + - max_users + - max_organizations + - max_users_per_organization + - max_applications + - max_application_versions + - max_slides_per_run + - max_parallel_runs + - max_parallel_runs_per_organization + - max_parallel_runs_per_user + title: QuotaName + type: string + QuotaReadResponse: + description: GET response payload for quota read. + properties: + name: + $ref: '#/components/schemas/QuotaName' + quota: + title: Quota + type: integer + required: + - name + - quota + title: QuotaReadResponse + type: object + QuotaUpdateRequest: + description: PATCH request payload for quota update. + properties: + name: + $ref: '#/components/schemas/QuotaName' + quota: + exclusiveMinimum: 0.0 + title: Quota + type: integer + required: + - name + - quota + title: QuotaUpdateRequest + type: object + QuotaUpdateResponse: + description: PATCH response payload for quota update. + properties: + name: + $ref: '#/components/schemas/QuotaName' + quota: + title: Quota + type: integer + required: + - name + - quota + title: QuotaUpdateResponse + type: object + QuotasReadResponse: + description: GET response payload for multiple quota reads. + properties: + quotas: + items: + $ref: '#/components/schemas/QuotaReadResponse' + title: Quotas + type: array + required: + - quotas + title: QuotasReadResponse + type: object + QuotasUpdateRequest: + description: PATCH request payload for quota updates. + properties: + quotas: + items: + $ref: '#/components/schemas/QuotaUpdateRequest' + title: Quotas + type: array + required: + - quotas + title: QuotasUpdateRequest + type: object + QuotasUpdateResponse: + description: PATCH response payload for quota updates. + properties: + updated_quotas: + items: + $ref: '#/components/schemas/QuotaUpdateResponse' + title: Updated Quotas + type: array + required: + - updated_quotas + title: QuotasUpdateResponse + type: object + RunCreationRequest: + properties: + application_version: + anyOf: + - format: uuid + type: string + - $ref: '#/components/schemas/SlugVersionRequest' + examples: + - efbf9822-a1e5-4045-a283-dbf26e8064a9 + title: Application Version + items: + items: + $ref: '#/components/schemas/ItemCreationRequest' + title: Items + type: array + required: + - application_version + - items + title: RunCreationRequest + type: object + RunCreationResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + required: + - application_run_id + title: RunCreationResponse + type: object + RunReadResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + organization_id: + title: Organization Id + type: string + status: + $ref: '#/components/schemas/ApplicationRunStatus' + triggered_at: + format: date-time + title: Triggered At + type: string + triggered_by: + title: Triggered By + type: string + user_payload: + anyOf: + - $ref: '#/components/schemas/UserPayload' + - type: 'null' + required: + - application_run_id + - application_version_id + - organization_id + - status + - triggered_at + - triggered_by + title: RunReadResponse + type: object + SlugVersionRequest: + properties: + application_slug: + pattern: ^(-?)*$ + title: Application Slug + type: string + version: + title: Version + type: string + required: + - application_slug + - version + title: SlugVersionRequest + type: object + TransferUrls: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + upload_url: + format: uri + minLength: 1 + title: Upload Url + type: string + required: + - upload_url + - download_url + title: TransferUrls + type: object + UserCreationRequest: + properties: + email: + anyOf: + - type: string + - type: 'null' + title: Email + organization_id: + format: uuid + title: Organization Id + type: string + user_id: + title: User Id + type: string + required: + - user_id + - organization_id + - email + title: UserCreationRequest + type: object + UserPayload: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_run_id: + format: uuid + title: Application Run Id + type: string + global_output_artifacts: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + type: object + - type: 'null' + title: Global Output Artifacts + items: + items: + $ref: '#/components/schemas/PayloadItem' + title: Items + type: array + required: + - application_id + - application_run_id + - global_output_artifacts + - items + title: UserPayload + type: object + UserQuota: + properties: + total: + anyOf: + - type: integer + - type: 'null' + title: Total + used: + title: Used + type: integer + required: + - total + - used + title: UserQuota + type: object + UserResponse: + properties: + organization_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Organization Id + slide_quota: + $ref: '#/components/schemas/UserQuota' + user_id: + anyOf: + - type: string + - type: 'null' + title: User Id + required: + - user_id + - organization_id + - slide_quota + title: UserResponse + type: object + UserUpdateRequest: + properties: + slide_quota: + anyOf: + - type: integer + - type: 'null' + title: Slide Quota + user_id: + anyOf: + - type: string + - type: 'null' + title: User Id + title: UserUpdateRequest + type: object + ValidationError: + properties: + loc: + items: + anyOf: + - type: string + - type: integer + title: Location + type: array + msg: + title: Message + type: string + type: + title: Error Type + type: string + required: + - loc + - msg + - type + title: ValidationError + type: object + VersionCreationRequest: + properties: + application_id: + format: uuid + title: Application Id + type: string + changelog: + title: Changelog + type: string + flow_id: + format: uuid + title: Flow Id + type: string + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactSchemaCreationRequest' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactSchemaCreationRequest' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - version + - application_id + - flow_id + - changelog + - input_artifacts + - output_artifacts + title: VersionCreationRequest + type: object + VersionCreationResponse: + properties: + application_version_id: + format: uuid + title: Application Version Id + type: string + required: + - application_version_id + title: VersionCreationResponse + type: object + VersionReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + changelog: + title: Changelog + type: string + created_at: + format: date-time + title: Created At + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Flow Id + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifact' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifact' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - application_version_id + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + - created_at + title: VersionReadResponse + type: object + securitySchemes: + OAuth2AuthorizationCodeBearer: + flows: + authorizationCode: + authorizationUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize + scopes: {} + tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token + type: oauth2 +info: + description: Pagination is done via `page` and `page_size`. Sorting via `sort` +query + parameter. sort is a comma-separated list of field names. The sorting +direction + can be indicated via `+` (ascending) or `-` (descending) (e.g. +`/applications?sort=+name)`. + summary: Interact with Aignostics' Application Platform + title: Aignostics Platform API + version: 0.1.0 +openapi: 3.1.0 +paths: + /docs: + get: + operationId: get_documentation_docs_get + parameters: + - in: cookie + name: access_token + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Access Token + responses: + '200': + content: + application/json: + schema: {} + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Get Documentation + /health: + get: + description: Check that the API application is alive and responsive. + operationId: health_health_get + responses: + '200': + content: + application/json: + schema: {} + description: Successful Response + summary: Health + tags: + - Infrastructure + /liveness: + get: + description: Check that the API application is alive and responsive. + operationId: liveness_liveness_get + responses: + '200': + content: + application/json: + schema: {} + description: Successful Response + summary: Liveness + tags: + - Infrastructure + /readiness: + get: + description: Check that the API application is ready to serve. + operationId: readiness_readiness_get + responses: + '200': + content: + application/json: + schema: {} + description: Successful Response + summary: Readiness + tags: + - Infrastructure + /v1/applications: + get: + operationId: list_applications_v1_applications_get + parameters: + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationReadResponse' + title: Response List Applications V1 Applications Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Applications + tags: + - Externals + post: + operationId: register_application_v1_applications_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationCreationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Register Application + tags: + - Admins + /v1/applications/{application_id}: + get: + operationId: read_application_by_id_v1_applications__application_id__get + parameters: + - in: path + name: application_id + required: true + schema: + format: uuid + title: Application Id + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Read Application By Id + tags: + - Externals + /v1/applications/{application_id}/versions: + get: + operationId: +list_versions_by_application_id_v1_applications__application_id__versions_get + parameters: + - in: path + name: application_id + required: true + schema: + format: uuid + title: Application Id + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Id V1 Applications +Application + Id Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Versions By Application Id + tags: + - Externals + /v1/applications/{application_slug}: + get: + operationId: +read_application_by_slug_v1_applications__application_slug__get + parameters: + - in: path + name: application_slug + required: true + schema: + title: Application Slug + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Read Application By Slug + tags: + - Externals + /v1/applications/{application_slug}/versions: + get: + operationId: +list_versions_by_application_slug_v1_applications__application_slug__versions_ge +t + parameters: + - in: path + name: application_slug + required: true + schema: + pattern: ^(-?)*$ + title: Application Slug + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Slug V1 +Applications Application + Slug Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Versions By Application Slug + tags: + - Externals + /v1/artifacts/{output_artifact_id}/event: + post: + operationId: +trigger_artifact_event_v1_artifacts__output_artifact_id__event_post + parameters: + - in: path + name: output_artifact_id + required: true + schema: + format: uuid + title: Output Artifact Id + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OutputArtifactEventTriggerRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/OutputArtifactEventTriggerResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Trigger Artifact Event + tags: + - Algorithms/Apps + /v1/items/{item_id}: + get: + operationId: get_item_v1_items__item_id__get + parameters: + - in: path + name: item_id + required: true + schema: + format: uuid + title: Item Id + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ItemReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Item + tags: + - Scheduler + /v1/items/{item_id}/event: + post: + operationId: register_item_event_v1_items__item_id__event_post + parameters: + - in: path + name: item_id + required: true + schema: + format: uuid + title: Item Id + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ItemEventCreationRequest' + required: true + responses: + '202': + content: + application/json: + schema: + $ref: '#/components/schemas/ItemEventCreationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Register Item Event + tags: + - Scheduler + /v1/organizations: + post: + operationId: create_organization_v1_organizations_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Create Organization + tags: + - Organizations + /v1/organizations/{organization_id}: + get: + operationId: get_organization_v1_organizations__organization_id__get + parameters: + - in: path + name: organization_id + required: true + schema: + format: uuid + title: Organization Id + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Organization + tags: + - Organizations + patch: + operationId: update_organization_v1_organizations__organization_id__patch + parameters: + - in: path + name: organization_id + required: true + schema: + title: Organization Id + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationUpdateRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/OrganizationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Update Organization + tags: + - Organizations + /v1/quotas: + get: + operationId: list_quotas_v1_quotas_get + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/QuotasReadResponse' + description: Successful Response + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Quotas + tags: + - Admins + - Admins + patch: + operationId: update_quotas_v1_quotas_patch + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/QuotasUpdateRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/QuotasUpdateResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Update Quotas + tags: + - Admins + - Admins + /v1/runs: + get: + operationId: list_application_runs_v1_runs_get + parameters: + - in: query + name: application_id + required: false + schema: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Id + - in: query + name: application_version_id + required: false + schema: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Version Id + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/RunReadResponse' + title: Response List Application Runs V1 Runs Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Application Runs + tags: + - Externals + post: + operationId: create_application_run_v1_runs_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Create Application Run + tags: + - Externals + /v1/runs/{application_run_id}: + get: + operationId: get_run_v1_runs__application_run_id__get + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RunReadResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Run + tags: + - Externals + - Scheduler + /v1/runs/{application_run_id}/cancel: + post: + operationId: cancel_run_v1_runs__application_run_id__cancel_post + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + responses: + '202': + content: + application/json: + schema: {} + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Cancel Run + tags: + - Externals + /v1/runs/{application_run_id}/results: + delete: + operationId: +delete_run_results_v1_runs__application_run_id__results_delete + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + responses: + '204': + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Delete Run Results + tags: + - Externals + get: + operationId: list_run_results_v1_runs__application_run_id__results_get + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + - in: query + name: item_id__in + required: false + schema: + anyOf: + - items: + format: uuid + type: string + type: array + - type: 'null' + title: Item Id In + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: reference__in + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Reference In + - in: query + name: status__in + required: false + schema: + anyOf: + - items: + $ref: '#/components/schemas/ItemStatus' + type: array + - type: 'null' + title: Status In + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ItemResultReadResponse' + title: Response List Run Results V1 Runs Application Run Id +Results + Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Run Results + tags: + - Externals + /v1/users/: + post: + operationId: create_user_v1_users__post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserCreationRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponse' + description: Successful Response + '404': + description: User not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Create User + tags: + - Externals + /v1/users/{user_id}: + get: + operationId: get_user_v1_users__user_id__get + parameters: + - in: path + name: user_id + required: true + schema: + format: uuid + title: User Id + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponse' + description: Successful Response + '404': + description: User not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get User + tags: + - Externals + patch: + operationId: update_user_v1_users__user_id__patch + parameters: + - in: path + name: user_id + required: true + schema: + format: uuid + title: User Id + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserUpdateRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserResponse' + description: Successful Response + '404': + description: User not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Update User + tags: + - Externals + /v1/versions: + post: + operationId: register_version_v1_versions_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VersionCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/VersionCreationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Register Version + tags: + - Externals + - Scheduler + - Admins + /v1/versions/{application_version_id}: + get: + operationId: get_version_v1_versions__application_version_id__get + parameters: + - in: path + name: application_version_id + required: true + schema: + format: uuid + title: Application Version Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VersionReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Version + tags: + - Externals + - Scheduler +tags: +- description: Called by externals to interact with our API + name: Externals +- description: Called by the Algorithms and applications to update statuses + name: Algorithms/Apps +- description: Called by the Scheduler + name: Scheduler +- description: Called by Admins to manage and register entities + name: Admins +- description: Called by other Infra + name: Infrastructure diff --git a/docs/source/api_explorer_v1.rst b/docs/source/api_explorer_v1.rst new file mode 100644 index 00000000..2fee0a10 --- /dev/null +++ b/docs/source/api_explorer_v1.rst @@ -0,0 +1,9 @@ +API v1 Explorer +=============== + +.. only:: html + + .. swagger-plugin:: _static/openapi_v1.yaml + :full-page: + +Visit the `Interactive API Documentation `_ diff --git a/docs/source/api_reference_v1.rst b/docs/source/api_reference_v1.rst new file mode 100644 index 00000000..35c5429f --- /dev/null +++ b/docs/source/api_reference_v1.rst @@ -0,0 +1 @@ +.. mdinclude:: ../../API_REFERENCE_v1.md diff --git a/docs/source/api_v1.rst b/docs/source/api_v1.rst deleted file mode 100644 index 8ab115ad..00000000 --- a/docs/source/api_v1.rst +++ /dev/null @@ -1,9 +0,0 @@ -API V1 -====== - -.. only:: html - - .. swagger-plugin:: _static/openapi_v1.yaml - :full-page: - -Visit the `Interactive API Documentation `_ diff --git a/docs/source/cli_reference.rst b/docs/source/cli_reference.rst new file mode 100644 index 00000000..3c8403cd --- /dev/null +++ b/docs/source/cli_reference.rst @@ -0,0 +1 @@ +.. mdinclude:: ../../CLI_REFERENCE.md diff --git a/docs/source/conf.py b/docs/source/conf.py index bd6cbd43..16d885f2 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -43,6 +43,9 @@ ogp_enable_meta_description = True ogp_description_length = 300 +show_warning_types = True +suppress_warnings = ["ref.ref", "docutils"] + autodoc_pydantic_model_show_json = False napoleon_google_docstring = True @@ -68,7 +71,6 @@ r"http://localhost", ] - templates_path = ["_templates"] exclude_patterns = [] diff --git a/docs/source/index.rst b/docs/source/index.rst index 609c3e24..a05428d7 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -11,25 +11,25 @@ :maxdepth: 2 main - api_v1 - reference - security - release-notes + api_explorer_v1 + cli_reference + lib_reference + api_reference_v1 contributing code-style + release-notes + security license attributions .. sidebar-links:: :caption: Links :github: - :pypi: aignostics - - Docker - SonarQube - Codecov - ghcr.io - License + :pypi: {{ pypi_distribution_name }} + Docker + ghcr.io <{{ github_repository_url_https }}/pkgs/container/{{ github_repository_name }}> + SonarQube + Codecov .. only:: html diff --git a/docs/source/reference.rst b/docs/source/lib_reference.rst similarity index 53% rename from docs/source/reference.rst rename to docs/source/lib_reference.rst index bd0b86a8..93185896 100644 --- a/docs/source/reference.rst +++ b/docs/source/lib_reference.rst @@ -1,5 +1,5 @@ -Reference -========= +Library Reference +================= .. automodule:: aignostics :members: diff --git a/install.sh b/install.sh index 3021c923..16b05a52 100755 --- a/install.sh +++ b/install.sh @@ -18,6 +18,7 @@ BREW_TOOLS=( "pinact;pinact;https://github.com/suzuki-shunsuke/pinact" "trivy;trivy;https://trivy.dev/latest/" "pnpm;pnpm;https://pnpm.io/" + "magick;imagemagick;https://imagemagick.org/" "openapi-generator;openapi-generator;https://github.com/OpenAPITools/openapi-generator" ) diff --git a/noxfile.py b/noxfile.py index 1fd49509..49912e50 100644 --- a/noxfile.py +++ b/noxfile.py @@ -18,6 +18,9 @@ SBOM_CYCLONEDX_PATH = "reports/sbom.json" SBOM_SPDX_PATH = "reports/sbom.spdx" +CLI_MODULE = "cli" +API_VERSIONS = ["v1"] + def _setup_venv(session: nox.Session, all_extras: bool = True) -> None: """Install dependencies for the given session using uv.""" @@ -42,10 +45,22 @@ def _is_act_environment() -> bool: return os.environ.get("GITHUB_WORKFLOW_RUNTIME") == "ACT" -@nox.session(python=["3.12"]) +def _format_json_with_jq(session: nox.Session, path: str) -> None: + """Format JSON file using jq for better readability. + + Args: + session: The nox session instance + path: Path to the JSON file to format + """ + with Path(f"{path}.tmp").open("w", encoding="utf-8") as outfile: + session.run("jq", ".", path, stdout=outfile, external=True) + session.run("mv", f"{path}.tmp", path, stdout=outfile, external=True) + + +@nox.session(python=["3.13"]) def lint(session: nox.Session) -> None: """Run code formatting checks, linting, and static type checking.""" - _setup_venv(session) + _setup_venv(session, True) session.run("ruff", "check", ".") session.run( "ruff", @@ -63,7 +78,7 @@ def audit(session: nox.Session) -> None: # pip-audit to check for vulnerabilities session.run("pip-audit", "-f", "json", "-o", "reports/vulnerabilities.json") - session.run("jq", ".", "reports/vulnerabilities.json", external=True) + _format_json_with_jq(session, "reports/vulnerabilities.json") # pip-licenses to check for compliance pip_licenses_base_args = [ @@ -106,7 +121,7 @@ def audit(session: nox.Session) -> None: ) # Group by license type - session.run("jq", ".", LICENSES_JSON_PATH, external=True) + _format_json_with_jq(session, LICENSES_JSON_PATH) licenses_data = json.loads(Path(LICENSES_JSON_PATH).read_text(encoding="utf-8")) licenses_grouped: dict[str, list[dict[str, str]]] = {} licenses_grouped = {} @@ -120,11 +135,11 @@ def audit(session: nox.Session) -> None: json.dumps(licenses_grouped, indent=2), encoding="utf-8", ) - session.run("jq", ".", "reports/licenses_grouped.json", external=True) + _format_json_with_jq(session, "reports/licenses_grouped.json") # SBOMs session.run("cyclonedx-py", "environment", "-o", SBOM_CYCLONEDX_PATH) - session.run("jq", ".", SBOM_CYCLONEDX_PATH, external=True) + _format_json_with_jq(session, SBOM_CYCLONEDX_PATH) # Generates an SPDX SBOM including vulnerability scanning session.run( @@ -207,8 +222,8 @@ def _generate_attributions(session: nox.Session, licenses_json_path: Path) -> No session.log("Generated ATTRIBUTIONS.md file") -def _compile_readme(session: nox.Session) -> None: - """Compile README partial files into a single README.md. +def _generate_readme(session: nox.Session) -> None: + """Generate README.md from partials. Args: session: The nox session instance @@ -222,8 +237,8 @@ def _compile_readme(session: nox.Session) -> None: session.log("Generated README.md file from partials") -def _dump_openapi_schemas(session: nox.Session) -> None: - """Dump OpenAPI schemas for different API versions in YAML and JSON formats. +def _generate_openapi_schemas(session: nox.Session) -> None: + """Generate OpenAPI schemas for different API versions in YAML and JSON formats. Args: session: The nox session instance @@ -231,32 +246,103 @@ def _dump_openapi_schemas(session: nox.Session) -> None: # Create directory if it doesn't exist Path("docs/source/_static").mkdir(parents=True, exist_ok=True) - try: - # Generate API v1 schemas - try: - with Path("docs/source/_static/openapi_v1.yaml").open("w", encoding="utf-8") as f: - session.run("aignostics", "system", "openapi", "--api-version=v1", stdout=f, external=True) - with Path("docs/source/_static/openapi_v1.json").open("w", encoding="utf-8") as f: - session.run( + formats = { + "yaml": {"ext": "yaml", "args": []}, + "json": {"ext": "json", "args": ["--output-format=json"]}, + } + + for version in API_VERSIONS: + for format_name, format_info in formats.items(): + output_path = Path(f"docs/source/_static/openapi_{version}.{format_info['ext']}") + with output_path.open("w", encoding="utf-8") as f: + cmd_args = [ "aignostics", - "system", + "platform", "openapi", - "--api-version=v1", - "--output-format=json", - stdout=f, - external=True, - ) - session.log("Generated API v1 OpenAPI schemas") - except CommandFailed: - session.log("Failed to generate API v1 OpenAPI schemas - command may not be supported") + f"--api-version={version}", + *format_info["args"], + ] + session.run(*cmd_args, stdout=f, external=True) + session.log(f"Generated API {version} OpenAPI schema in {format_name} format") + - session.log("OpenAPI schema generation completed") - except Exception as e: # noqa: BLE001 - session.log(f"Warning: Could not generate OpenAPI schemas: {e}") +def _generate_cli_reference(session: nox.Session) -> None: + """Generate CLI_REFERENCE.md. + + Args: + session: The nox session instance + """ + if CLI_MODULE: + session.run( + "typer", + f"aignostics.{CLI_MODULE}", + "utils", + "docs", + "--name", + "aignostics", + "--title", + "CLI Reference", + "--output", + "CLI_REFERENCE.md", + external=True, + ) + + +def _generate_api_reference(session: nox.Session) -> None: + """Generate API_REFERENCE_v1.md and API_REFERENCE_v2.md. + Args: + session: The nox session instance -def _build_pdf_docs(session: nox.Session) -> None: - """Build PDF documentation using latexmk. + Raises: + FileNotFoundError: If the OpenAPI schema file for a version is not found + """ + for version in API_VERSIONS: + openapi_path = Path(f"docs/source/_static/openapi_{version}.yaml") + + if not openapi_path.exists(): + error_message = f"OpenAPI schema for {version} not found at {openapi_path}" + raise FileNotFoundError(error_message) + + output_file = f"API_REFERENCE_{version}.md" + session.run( + "npx", + "widdershins", + f"docs/source/_static/openapi_{version}.yaml", + "--omitHeader", + "--search", + "false", + "--language_tabs", + "python:Python", + "javascript:Javascript", + "-o", + f"API_REFERENCE_{version}.md", + external=True, + ) + session.log(f"Generated API_REFERENCE_{version}.md using widdershins") + + content = Path(output_file).read_text(encoding="utf-8") + content = re.sub(r"", "", content) + content = re.sub(r"

([\s\S]+?)

", r"# \1", content) + content = re.sub(r"

([\s\S]+?)

", r"## \1", content) + content = re.sub(r"

([\s\S]+?)

", r"### \1", content) + content = re.sub(r"

([\s\S]+?)

", r"#### \1", content) + content = re.sub(r"([\s\S]+?)", r"[\2](\1)", content) + content = re.sub(r"([\s\S]+?)", r"\2 (\1)", content) + content = re.sub(r"<[^>]*>", "", content) + content = re.sub(r"^\s*\n", "", content) + Path(output_file).write_text(content, encoding="utf-8") + session.log(f"Cleaned HTML from {output_file}") + + content = Path(output_file).read_text(encoding="utf-8") + content = re.sub(r"^(#+)", r"\1#", content, flags=re.MULTILINE) + content = content.rstrip() + "\n" + Path(output_file).write_text(f"# API {version} Reference\n{content}", encoding="utf-8") + session.log(f"Shifted headers in {output_file}") + + +def _generate_pdf_docs(session: nox.Session) -> None: + """Generate PDF documentation using latexmk. Args: session: The nox session instance @@ -312,26 +398,28 @@ def docs(session: nox.Session) -> None: ValueError: If the installed latexmk version is outdated AttributeError: If parsing the latexmk version information fails """ - _setup_venv(session) + _setup_venv(session, True) + _generate_readme(session) + _generate_cli_reference(session) + _generate_openapi_schemas(session) + _generate_api_reference(session) _generate_attributions(session, Path(LICENSES_JSON_PATH)) - _compile_readme(session) - _dump_openapi_schemas(session) - # Build docs + # Build HTML docs session.run("make", "-C", "docs", "clean", external=True) session.run("make", "-C", "docs", "html", external=True) session.run("make", "-C", "docs", "singlehtml", external=True) session.run("make", "-C", "docs", "latex", external=True) if "pdf" in session.posargs: - _build_pdf_docs(session) + _generate_pdf_docs(session) @nox.session(python=["3.13"], default=False) def docs_pdf(session: nox.Session) -> None: """Setup dev environment post project creation.""" # noqa: DOC501 - _setup_venv(session) + _setup_venv(session, True) try: out = session.run("latexmk", "--version", external=True, silent=True) @@ -362,14 +450,11 @@ def docs_pdf(session: nox.Session) -> None: @nox.session(python=["3.11", "3.12", "3.13"]) def test(session: nox.Session) -> None: """Run tests with pytest.""" - _setup_venv(session) + _setup_venv(session, True) pytest_args = ["pytest", "--disable-warnings", "--junitxml=reports/junit.xml", "-n", "auto", "--dist", "loadgroup"] - if _is_act_environment(): pytest_args.extend(["-k", NOT_SKIP_WITH_ACT]) - - pytest_args.extend(session.posargs) - + session.run(*pytest_args) session.run(*pytest_args) diff --git a/pyproject.toml b/pyproject.toml index 4cf4244d..3d054e67 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -263,6 +263,7 @@ env = ["COVERAGE_FILE=.coverage", "COVERAGE_PROCESS_START=pyproject.toml"] markers = [ # From Template "no_extras: tests that do require no extras installed", + "scheduled: tests to run on a schedule", "sequential: exclude from parallel test execution", # Custom # Nothing yet @@ -277,7 +278,7 @@ markers = [ sigterm = true relative_files = true source = ["src"] -omit = ["src/starbridge/instrumentation/*"] +omit = [] branch = true parallel = true concurrency = ["thread", "multiprocessing"] diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 63bba87b..95dc7c3e 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -18,7 +18,7 @@ CLIENT_ID_DEVICE = os.getenv("CLIENT_ID_DEVICE") CLIENT_ID_INTERACTIVE = os.getenv("CLIENT_ID_INTERACTIVE") -SCOPE = [scope.strip() for scope in os.getenv("SCOPE").split(",")] +SCOPE = [scope.strip() for scope in os.getenv("SCOPE", "TODO(Andreas),TODO(Andreas)").split(",")] REDIRECT_URI = os.getenv("REDIRECT_URI") AUDIENCE = os.getenv("AUDIENCE") diff --git a/src/aignostics/client/resources/__init__.py b/src/aignostics/client/resources/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/aignostics/platform.py b/src/aignostics/platform.py index b5117683..23ebec77 100644 --- a/src/aignostics/platform.py +++ b/src/aignostics/platform.py @@ -115,7 +115,7 @@ def info(self, env: bool = True, filter_secrets: bool = True) -> dict: def install(self) -> None: """Complete and validate installation of the CLI.""" - # TODO (Helmut, Andreas) + # TODO (Helmut, Andreas): Build @staticmethod def openapi_schema() -> dict: From c8652063ae8268013d749829d0454d30f1b67733 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 09:25:11 +0200 Subject: [PATCH 028/110] chore(ci): smoke test --- .github/workflows/test-and-report.yml | 2 +- API_REFERENCE_v1.md | 7202 +++++++++++++++++-------- docs/source/_static/openapi_v1.yaml | 43 +- 3 files changed, 5039 insertions(+), 2208 deletions(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 7ebcac10..b492fde1 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -73,7 +73,7 @@ jobs: fi - name: Smoke tests - run: uv run --no-dev aignostics hello-world + run: uv run --no-dev aignostics platform health - name: Lint run: make lint diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md index d2b45906..5de12e38 100644 --- a/API_REFERENCE_v1.md +++ b/API_REFERENCE_v1.md @@ -1,2179 +1,5025 @@ # API v1 Reference ---- -title: machine. -language_tabs: -toc_footers: [] -includes: [] -search: true -highlight_theme: darkula ---- - - - - - - - - -segmentation, - cell detection and cell classfication' - title: Description - type: string - name: - examples: - - HETA - title: Name - type: string - regulatory_classes: - examples: - - - RuO - items: - type: string - title: Regulatory Classes - type: array - required: - - name - - description - - regulatory_classes - title: ApplicationCreationRequest - type: object - ApplicationCreationResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - required: - - application_id - title: ApplicationCreationResponse - type: object - ApplicationReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - description: - examples: - - Aignostics H&E TME application - title: Description - type: string - name: - examples: - - HETA - title: Name - type: string - regulatory_classes: - examples: - - - RuO - items: - type: string - title: Regulatory Classes - type: array - slug: - examples: - - heta - title: Slug - type: string - required: - - application_id - - name - - slug - - regulatory_classes - - description - title: ApplicationReadResponse - type: object - ApplicationRunStatus: - enum: - - canceled_system - - canceled_user - - completed - - completed_with_error - - received - - rejected - - running - - scheduled - title: ApplicationRunStatus - type: string - ApplicationVersionReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - application_version_slug: - examples: - - tissue-segmentation-qc:v0.0.1 - pattern: ^(?:|-)*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ - title: Application Version Slug - type: string - changelog: - title: Changelog - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Flow Id - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactReadResponse' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactReadResponse' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - application_version_id - - application_version_slug - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - title: ApplicationVersionReadResponse - type: object - ArtifactEvent: - description: 'This is a subset of the OutputArtifactEvent used by the -state - machine. - -> components: - -> schemas: - -> ApplicationCreationRequest: - -> properties: - -> description: - -> examples: - -> - 'H&E Tumor Micro Environment Analysis: Performing tissue QC, - - Only the variants defined below are allowed to be submitted from the -Algorithms/Applications.' - enum: - - succeeded - - failed_with_user_error - - failed_with_system_error - title: ArtifactEvent - type: string - ArtifactStatus: - enum: - - pending - - canceled_user - - canceled_system - - error_user - - error_system_fatal - - error_system_recoverable - - skipped - - succeeded - title: ArtifactStatus - type: string - HTTPValidationError: - properties: - detail: - items: - $ref: '#/components/schemas/ValidationError' - title: Detail - type: array - title: HTTPValidationError - type: object - InputArtifact: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifact - type: object - InputArtifactCreationRequest: - properties: - download_url: - examples: - - https://example.com/case-no-1-slide.tiff - format: uri - maxLength: 2083 - minLength: 1 - title: Download Url - type: string - metadata: - examples: - - checksum_crc32c: 752f9554 - height: 2000 - height_mpp: 0.5 - width: 10000 - width_mpp: 0.5 - title: Metadata - type: object - name: - examples: - - slide - title: Name - type: string - required: - - name - - download_url - - metadata - title: InputArtifactCreationRequest - type: object - InputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactReadResponse - type: object - InputArtifactSchemaCreationRequest: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactSchemaCreationRequest - type: object - ItemCreationRequest: - properties: - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactCreationRequest' - title: Input Artifacts - type: array - reference: - examples: - - case-no-1 - title: Reference - type: string - required: - - reference - - input_artifacts - title: ItemCreationRequest - type: object - ItemEvent: - enum: - - failed_with_system_error - - failed_recoverable - title: ItemEvent - type: string - ItemEventCreationRequest: - properties: - error: - title: Error - type: string - event: - $ref: '#/components/schemas/ItemEvent' - required: - - event - - error - title: ItemEventCreationRequest - type: object - ItemEventCreationResponse: - properties: - item_id: - format: uuid - title: Item Id - type: string - status: - $ref: '#/components/schemas/ItemStatus' - required: - - item_id - - status - title: ItemEventCreationResponse - type: object - ItemReadResponse: - properties: - application_run_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Run Id - error: - anyOf: - - type: string - - type: 'null' - title: Error - item_id: - format: uuid - title: Item Id - type: string - reference: - title: Reference - type: string - status: - $ref: '#/components/schemas/ItemStatus' - required: - - item_id - - reference - - status - - error - title: ItemReadResponse - type: object - ItemResultReadResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - error: - anyOf: - - type: string - - type: 'null' - title: Error - item_id: - format: uuid - title: Item Id - type: string - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactResultReadResponse' - title: Output Artifacts - type: array - reference: - title: Reference - type: string - status: - $ref: '#/components/schemas/ItemStatus' - required: - - item_id - - application_run_id - - reference - - status - - error - - output_artifacts - title: ItemResultReadResponse - type: object - ItemStatus: - enum: - - pending - - canceled_user - - canceled_system - - error_user - - error_system - - succeeded - title: ItemStatus - type: string - OrganizationCreationRequest: - properties: - batch_size: - title: Batch Size - type: integer - organization_id: - title: Organization Id - type: string - owner_email: - title: Owner Email - type: string - slide_quota: - title: Slide Quota - type: integer - required: - - organization_id - - owner_email - - slide_quota - - batch_size - title: OrganizationCreationRequest - type: object - OrganizationQuota: - properties: - total: - anyOf: - - type: integer - - type: 'null' - title: Total - used: - title: Used - type: integer - required: - - total - - used - title: OrganizationQuota - type: object - OrganizationResponse: - properties: - batch_size: - title: Batch Size - type: integer - organization_id: - title: Organization Id - type: string - owner_id: - format: uuid - title: Owner Id - type: string - slide_quota: - $ref: '#/components/schemas/OrganizationQuota' - required: - - organization_id - - owner_id - - slide_quota - - batch_size - title: OrganizationResponse - type: object - OrganizationUpdateRequest: - properties: - batch_size: - anyOf: - - type: integer - - type: 'null' - title: Batch Size - slide_quota: - anyOf: - - type: integer - - type: 'null' - title: Slide Quota - title: OrganizationUpdateRequest - type: object - OutputArtifact: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - visibility: - $ref: '#/components/schemas/OutputArtifactVisibility' - required: - - name - - mime_type - - metadata_schema - - scope - - visibility - title: OutputArtifact - type: object - OutputArtifactEventTriggerRequest: - properties: - error: - anyOf: - - type: string - - type: 'null' - title: Error - event: - $ref: '#/components/schemas/ArtifactEvent' - metadata: - title: Metadata - type: object - required: - - event - - metadata - title: OutputArtifactEventTriggerRequest - type: object - OutputArtifactEventTriggerResponse: - properties: - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - status: - $ref: '#/components/schemas/ArtifactStatus' - required: - - output_artifact_id - - status - title: OutputArtifactEventTriggerResponse - type: object - OutputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - required: - - name - - mime_type - - metadata_schema - - scope - title: OutputArtifactReadResponse - type: object - OutputArtifactResultReadResponse: - properties: - download_url: - anyOf: - - format: uri - maxLength: 2083 - minLength: 1 - type: string - - type: 'null' - title: Download Url - metadata: - title: Metadata - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - name - - mime_type - - metadata - - download_url - title: OutputArtifactResultReadResponse - type: object - OutputArtifactSchemaCreationRequest: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - visibility: - $ref: '#/components/schemas/OutputArtifactVisibility' - required: - - name - - mime_type - - scope - - visibility - - metadata_schema - title: OutputArtifactSchemaCreationRequest - type: object - OutputArtifactScope: - enum: - - item - - global - title: OutputArtifactScope - type: string - OutputArtifactVisibility: - enum: - - internal - - external - title: OutputArtifactVisibility - type: string - PayloadInputArtifact: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - input_artifact_id: - format: uuid - title: Input Artifact Id - type: string - metadata: - title: Metadata - type: object - required: - - input_artifact_id - - metadata - - download_url - title: PayloadInputArtifact - type: object - PayloadItem: - properties: - input_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadInputArtifact' - title: Input Artifacts - type: object - item_id: - format: uuid - title: Item Id - type: string - output_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - title: Output Artifacts - type: object - required: - - item_id - - input_artifacts - - output_artifacts - title: PayloadItem - type: object - PayloadOutputArtifact: - properties: - data: - $ref: '#/components/schemas/TransferUrls' - metadata: - $ref: '#/components/schemas/TransferUrls' - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - data - - metadata - title: PayloadOutputArtifact - type: object - QuotaName: - description: Global, API-level, and slide-level quotas for Samia API. - enum: - - max_users - - max_organizations - - max_users_per_organization - - max_applications - - max_application_versions - - max_slides_per_run - - max_parallel_runs - - max_parallel_runs_per_organization - - max_parallel_runs_per_user - title: QuotaName - type: string - QuotaReadResponse: - description: GET response payload for quota read. - properties: - name: - $ref: '#/components/schemas/QuotaName' - quota: - title: Quota - type: integer - required: - - name - - quota - title: QuotaReadResponse - type: object - QuotaUpdateRequest: - description: PATCH request payload for quota update. - properties: - name: - $ref: '#/components/schemas/QuotaName' - quota: - exclusiveMinimum: 0.0 - title: Quota - type: integer - required: - - name - - quota - title: QuotaUpdateRequest - type: object - QuotaUpdateResponse: - description: PATCH response payload for quota update. - properties: - name: - $ref: '#/components/schemas/QuotaName' - quota: - title: Quota - type: integer - required: - - name - - quota - title: QuotaUpdateResponse - type: object - QuotasReadResponse: - description: GET response payload for multiple quota reads. - properties: - quotas: - items: - $ref: '#/components/schemas/QuotaReadResponse' - title: Quotas - type: array - required: - - quotas - title: QuotasReadResponse - type: object - QuotasUpdateRequest: - description: PATCH request payload for quota updates. - properties: - quotas: - items: - $ref: '#/components/schemas/QuotaUpdateRequest' - title: Quotas - type: array - required: - - quotas - title: QuotasUpdateRequest - type: object - QuotasUpdateResponse: - description: PATCH response payload for quota updates. - properties: - updated_quotas: - items: - $ref: '#/components/schemas/QuotaUpdateResponse' - title: Updated Quotas - type: array - required: - - updated_quotas - title: QuotasUpdateResponse - type: object - RunCreationRequest: - properties: - application_version: - anyOf: - - format: uuid - type: string - - $ref: '#/components/schemas/SlugVersionRequest' - examples: - - efbf9822-a1e5-4045-a283-dbf26e8064a9 - title: Application Version - items: - items: - $ref: '#/components/schemas/ItemCreationRequest' - title: Items - type: array - required: - - application_version - - items - title: RunCreationRequest - type: object - RunCreationResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - required: - - application_run_id - title: RunCreationResponse - type: object - RunReadResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - organization_id: - title: Organization Id - type: string - status: - $ref: '#/components/schemas/ApplicationRunStatus' - triggered_at: - format: date-time - title: Triggered At - type: string - triggered_by: - title: Triggered By - type: string - user_payload: - anyOf: - - $ref: '#/components/schemas/UserPayload' - - type: 'null' - required: - - application_run_id - - application_version_id - - organization_id - - status - - triggered_at - - triggered_by - title: RunReadResponse - type: object - SlugVersionRequest: - properties: - application_slug: - pattern: ^(-?)*$ - title: Application Slug - type: string - version: - title: Version - type: string - required: - - application_slug - - version - title: SlugVersionRequest - type: object - TransferUrls: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - upload_url: - format: uri - minLength: 1 - title: Upload Url - type: string - required: - - upload_url - - download_url - title: TransferUrls - type: object - UserCreationRequest: - properties: - email: - anyOf: - - type: string - - type: 'null' - title: Email - organization_id: - format: uuid - title: Organization Id - type: string - user_id: - title: User Id - type: string - required: - - user_id - - organization_id - - email - title: UserCreationRequest - type: object - UserPayload: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_run_id: - format: uuid - title: Application Run Id - type: string - global_output_artifacts: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - type: object - - type: 'null' - title: Global Output Artifacts - items: - items: - $ref: '#/components/schemas/PayloadItem' - title: Items - type: array - required: - - application_id - - application_run_id - - global_output_artifacts - - items - title: UserPayload - type: object - UserQuota: - properties: - total: - anyOf: - - type: integer - - type: 'null' - title: Total - used: - title: Used - type: integer - required: - - total - - used - title: UserQuota - type: object - UserResponse: - properties: - organization_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Organization Id - slide_quota: - $ref: '#/components/schemas/UserQuota' - user_id: - anyOf: - - type: string - - type: 'null' - title: User Id - required: - - user_id - - organization_id - - slide_quota - title: UserResponse - type: object - UserUpdateRequest: - properties: - slide_quota: - anyOf: - - type: integer - - type: 'null' - title: Slide Quota - user_id: - anyOf: - - type: string - - type: 'null' - title: User Id - title: UserUpdateRequest - type: object - ValidationError: - properties: - loc: - items: - anyOf: - - type: string - - type: integer - title: Location - type: array - msg: - title: Message - type: string - type: - title: Error Type - type: string - required: - - loc - - msg - - type - title: ValidationError - type: object - VersionCreationRequest: - properties: - application_id: - format: uuid - title: Application Id - type: string - changelog: - title: Changelog - type: string - flow_id: - format: uuid - title: Flow Id - type: string - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactSchemaCreationRequest' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactSchemaCreationRequest' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - version - - application_id - - flow_id - - changelog - - input_artifacts - - output_artifacts - title: VersionCreationRequest - type: object - VersionCreationResponse: - properties: - application_version_id: - format: uuid - title: Application Version Id - type: string - required: - - application_version_id - title: VersionCreationResponse - type: object - VersionReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - changelog: - title: Changelog - type: string - created_at: - format: date-time - title: Created At - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Flow Id - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifact' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifact' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - application_version_id - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - - created_at - title: VersionReadResponse - type: object - securitySchemes: - OAuth2AuthorizationCodeBearer: - flows: - authorizationCode: - authorizationUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize - scopes: {} - tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token - type: oauth2 -info: - description: Pagination is done via `page` and `page_size`. Sorting via `sort` -query - parameter. sort is a comma-separated list of field names. The sorting -direction - can be indicated via `+` (ascending) or `-` (descending) (e.g. -`/applications?sort=+name)`. - summary: Interact with Aignostics' Application Platform - title: Aignostics Platform API - version: 0.1.0 -openapi: 3.1.0 -paths: - /docs: - get: - operationId: get_documentation_docs_get - parameters: - - in: cookie - name: access_token - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Access Token - responses: - '200': - content: - application/json: - schema: {} - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Get Documentation - /health: - get: - description: Check that the API application is alive and responsive. - operationId: health_health_get - responses: - '200': - content: - application/json: - schema: {} - description: Successful Response - summary: Health - tags: - - Infrastructure - /liveness: - get: - description: Check that the API application is alive and responsive. - operationId: liveness_liveness_get - responses: - '200': - content: - application/json: - schema: {} - description: Successful Response - summary: Liveness - tags: - - Infrastructure - /readiness: - get: - description: Check that the API application is ready to serve. - operationId: readiness_readiness_get - responses: - '200': - content: - application/json: - schema: {} - description: Successful Response - summary: Readiness - tags: - - Infrastructure - /v1/applications: - get: - operationId: list_applications_v1_applications_get - parameters: - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationReadResponse' - title: Response List Applications V1 Applications Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Applications - tags: - - Externals - post: - operationId: register_application_v1_applications_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationCreationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Register Application - tags: - - Admins - /v1/applications/{application_id}: - get: - operationId: read_application_by_id_v1_applications__application_id__get - parameters: - - in: path - name: application_id - required: true - schema: - format: uuid - title: Application Id - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Read Application By Id - tags: - - Externals - /v1/applications/{application_id}/versions: - get: - operationId: -list_versions_by_application_id_v1_applications__application_id__versions_get - parameters: - - in: path - name: application_id - required: true - schema: - format: uuid - title: Application Id - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications -Application - Id Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Versions By Application Id - tags: - - Externals - /v1/applications/{application_slug}: - get: - operationId: -read_application_by_slug_v1_applications__application_slug__get - parameters: - - in: path - name: application_slug - required: true - schema: - title: Application Slug - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Read Application By Slug - tags: - - Externals - /v1/applications/{application_slug}/versions: - get: - operationId: -list_versions_by_application_slug_v1_applications__application_slug__versions_ge -t - parameters: - - in: path - name: application_slug - required: true - schema: - pattern: ^(-?)*$ - title: Application Slug - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 -Applications Application - Slug Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Versions By Application Slug - tags: - - Externals - /v1/artifacts/{output_artifact_id}/event: - post: - operationId: -trigger_artifact_event_v1_artifacts__output_artifact_id__event_post - parameters: - - in: path - name: output_artifact_id - required: true - schema: - format: uuid - title: Output Artifact Id - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/OutputArtifactEventTriggerRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/OutputArtifactEventTriggerResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Trigger Artifact Event - tags: - - Algorithms/Apps - /v1/items/{item_id}: - get: - operationId: get_item_v1_items__item_id__get - parameters: - - in: path - name: item_id - required: true - schema: - format: uuid - title: Item Id - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ItemReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get Item - tags: - - Scheduler - /v1/items/{item_id}/event: - post: - operationId: register_item_event_v1_items__item_id__event_post - parameters: - - in: path - name: item_id - required: true - schema: - format: uuid - title: Item Id - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ItemEventCreationRequest' - required: true - responses: - '202': - content: - application/json: - schema: - $ref: '#/components/schemas/ItemEventCreationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Register Item Event - tags: - - Scheduler - /v1/organizations: - post: - operationId: create_organization_v1_organizations_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Create Organization - tags: - - Organizations - /v1/organizations/{organization_id}: - get: - operationId: get_organization_v1_organizations__organization_id__get - parameters: - - in: path - name: organization_id - required: true - schema: - format: uuid - title: Organization Id - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get Organization - tags: - - Organizations - patch: - operationId: update_organization_v1_organizations__organization_id__patch - parameters: - - in: path - name: organization_id - required: true - schema: - title: Organization Id - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationUpdateRequest' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Update Organization - tags: - - Organizations - /v1/quotas: - get: - operationId: list_quotas_v1_quotas_get - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/QuotasReadResponse' - description: Successful Response - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Quotas - tags: - - Admins - - Admins - patch: - operationId: update_quotas_v1_quotas_patch - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/QuotasUpdateRequest' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/QuotasUpdateResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Update Quotas - tags: - - Admins - - Admins - /v1/runs: - get: - operationId: list_application_runs_v1_runs_get - parameters: - - in: query - name: application_id - required: false - schema: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Id - - in: query - name: application_version_id - required: false - schema: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Version Id - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/RunReadResponse' - title: Response List Application Runs V1 Runs Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Application Runs - tags: - - Externals - post: - operationId: create_application_run_v1_runs_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Create Application Run - tags: - - Externals - /v1/runs/{application_run_id}: - get: - operationId: get_run_v1_runs__application_run_id__get - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/RunReadResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get Run - tags: - - Externals - - Scheduler - /v1/runs/{application_run_id}/cancel: - post: - operationId: cancel_run_v1_runs__application_run_id__cancel_post - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - responses: - '202': - content: - application/json: - schema: {} - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Cancel Run - tags: - - Externals - /v1/runs/{application_run_id}/results: - delete: - operationId: -delete_run_results_v1_runs__application_run_id__results_delete - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - responses: - '204': - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Delete Run Results - tags: - - Externals - get: - operationId: list_run_results_v1_runs__application_run_id__results_get - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - - in: query - name: item_id__in - required: false - schema: - anyOf: - - items: - format: uuid - type: string - type: array - - type: 'null' - title: Item Id In - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: reference__in - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Reference In - - in: query - name: status__in - required: false - schema: - anyOf: - - items: - $ref: '#/components/schemas/ItemStatus' - type: array - - type: 'null' - title: Status In - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id -Results - Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Run Results - tags: - - Externals - /v1/users/: - post: - operationId: create_user_v1_users__post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserCreationRequest' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/UserResponse' - description: Successful Response - '404': - description: User not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Create User - tags: - - Externals - /v1/users/{user_id}: - get: - operationId: get_user_v1_users__user_id__get - parameters: - - in: path - name: user_id - required: true - schema: - format: uuid - title: User Id - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/UserResponse' - description: Successful Response - '404': - description: User not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get User - tags: - - Externals - patch: - operationId: update_user_v1_users__user_id__patch - parameters: - - in: path - name: user_id - required: true - schema: - format: uuid - title: User Id - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserUpdateRequest' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/UserResponse' - description: Successful Response - '404': - description: User not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Update User - tags: - - Externals - /v1/versions: - post: - operationId: register_version_v1_versions_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Register Version - tags: - - Externals - - Scheduler - - Admins - /v1/versions/{application_version_id}: - get: - operationId: get_version_v1_versions__application_version_id__get - parameters: - - in: path - name: application_version_id - required: true - schema: - format: uuid - title: Application Version Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/VersionReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get Version - tags: - - Externals - - Scheduler -tags: -- description: Called by externals to interact with our API - name: Externals -- description: Called by the Algorithms and applications to update statuses - name: Algorithms/Apps -- description: Called by the Scheduler - name: Scheduler -- description: Called by Admins to manage and register entities - name: Admins -- description: Called by other Infra - name: Infrastructure +## Aignostics Platform API v0.1.0 + +> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + +## Authentication + +- oAuth2 authentication. + + - Flow: authorizationCode + - Authorization URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize) + - Token URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token) + +|Scope|Scope Description| +|---|---| + +## Default + +### get_documentation_docs_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/docs', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/docs', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /docs` + +*Get Documentation* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|access_token|cookie|any|false|none| + +> Example responses + +> 200 Response + +```json +null +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + + +This operation does not require authentication + + +## Externals + +Called by externals to interact with our API + +### list_applications_v1_applications_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/applications', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/applications', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications` + +*List Applications* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Applications V1 Applications Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Applications V1 Applications Get|[[ApplicationReadResponse](#schemaapplicationreadresponse)]|false|none|none| +|» ApplicationReadResponse|[ApplicationReadResponse](#schemaapplicationreadresponse)|false|none|none| +|»» application_id|string(uuid)|true|none|none| +|»» description|string|true|none|none| +|»» name|string|true|none|none| +|»» regulatory_classes|[string]|true|none|none| +|»» slug|string|true|none|none| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### read_application_by_id_v1_applications__application_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/applications/{application_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/applications/{application_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_id}` + +*Read Application By Id* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|path|string(uuid)|true|none| + +> Example responses + +> 200 Response + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[ApplicationReadResponse](#schemaapplicationreadresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### list_versions_by_application_id_v1_applications__application_id__versions_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/applications/{application_id}/versions', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/applications/{application_id}/versions', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_id}/versions` + +*List Versions By Application Id* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|path|string(uuid)|true|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|version|query|any|false|none| +|include|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Versions By Application Id V1 Applications Application Id Versions Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| +|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| +|»» application_id|string(uuid)|true|none|none| +|»» application_version_id|string(uuid)|true|none|none| +|»» application_version_slug|string|true|none|none| +|»» changelog|string|true|none|none| +|»» flow_id|any|false|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string(uuid)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|»» version|string|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|scope|item| +|scope|global| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### read_application_by_slug_v1_applications__application_slug__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/applications/{application_slug}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/applications/{application_slug}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_slug}` + +*Read Application By Slug* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_slug|path|string|true|none| + +> Example responses + +> 200 Response + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[ApplicationReadResponse](#schemaapplicationreadresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### list_versions_by_application_slug_v1_applications__application_slug__versions_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/applications/{application_slug}/versions', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/applications/{application_slug}/versions', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_slug}/versions` + +*List Versions By Application Slug* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_slug|path|string|true|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|version|query|any|false|none| +|include|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Versions By Application Slug V1 Applications Application Slug Versions Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Versions By Application Slug V1 Applications Application Slug Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| +|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| +|»» application_id|string(uuid)|true|none|none| +|»» application_version_id|string(uuid)|true|none|none| +|»» application_version_slug|string|true|none|none| +|»» changelog|string|true|none|none| +|»» flow_id|any|false|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string(uuid)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|»» version|string|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|scope|item| +|scope|global| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### list_application_runs_v1_runs_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/runs', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/runs', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs` + +*List Application Runs* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|query|any|false|none| +|application_version_id|query|any|false|none| +|include|query|any|false|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Application Runs V1 Runs Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Application Runs V1 Runs Get|[[RunReadResponse](#schemarunreadresponse)]|false|none|none| +|» RunReadResponse|[RunReadResponse](#schemarunreadresponse)|false|none|none| +|»» application_run_id|string(uuid)|true|none|none| +|»» application_version_id|string(uuid)|true|none|none| +|»» organization_id|string|true|none|none| +|»» status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| +|»» triggered_at|string(date-time)|true|none|none| +|»» triggered_by|string|true|none|none| +|»» user_payload|any|false|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| +|»»»» application_id|string(uuid)|true|none|none| +|»»»» application_run_id|string(uuid)|true|none|none| +|»»»» global_output_artifacts|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|object|false|none|none| +|»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| +|»»»»»»» data|[TransferUrls](#schematransferurls)|true|none|none| +|»»»»»»»» download_url|string(uri)|true|none|none| +|»»»»»»»» upload_url|string(uri)|true|none|none| +|»»»»»»» metadata|[TransferUrls](#schematransferurls)|true|none|none| +|»»»»»»» output_artifact_id|string(uuid)|true|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»» items|[[PayloadItem](#schemapayloaditem)]|true|none|none| +|»»»»» PayloadItem|[PayloadItem](#schemapayloaditem)|false|none|none| +|»»»»»» input_artifacts|object|true|none|none| +|»»»»»»» PayloadInputArtifact|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| +|»»»»»»»» download_url|string(uri)|true|none|none| +|»»»»»»»» input_artifact_id|string(uuid)|true|none|none| +|»»»»»»»» metadata|object|true|none|none| +|»»»»»» item_id|string(uuid)|true|none|none| +|»»»»»» output_artifacts|object|true|none|none| +|»»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|status|canceled_system| +|status|canceled_user| +|status|completed| +|status|completed_with_error| +|status|received| +|status|rejected| +|status|running| +|status|scheduled| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### create_application_run_v1_runs_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.post('/v1/runs', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/runs', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/runs` + +*Create Application Run* + +> Body parameter + +```json +{ + "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[RunCreationRequest](#schemaruncreationrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[RunCreationResponse](#schemaruncreationresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### get_run_v1_runs__application_run_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/runs/{application_run_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/runs/{application_run_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs/{application_run_id}` + +*Get Run* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| +|include|query|any|false|none| + +> Example responses + +> 200 Response + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[RunReadResponse](#schemarunreadresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### cancel_run_v1_runs__application_run_id__cancel_post + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.post('/v1/runs/{application_run_id}/cancel', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/runs/{application_run_id}/cancel', +{ + method: 'POST', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/runs/{application_run_id}/cancel` + +*Cancel Run* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| + +> Example responses + +> 202 Response + +```json +null +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### delete_run_results_v1_runs__application_run_id__results_delete + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.delete('/v1/runs/{application_run_id}/results', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/runs/{application_run_id}/results', +{ + method: 'DELETE', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`DELETE /v1/runs/{application_run_id}/results` + +*Delete Run Results* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| + +> Example responses + +> 422 Response + +```json +{ + "detail": [ + { + "loc": [ + "string" + ], + "msg": "string", + "type": "string" + } + ] +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|Successful Response|None| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### list_run_results_v1_runs__application_run_id__results_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/runs/{application_run_id}/results', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/runs/{application_run_id}/results', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs/{application_run_id}/results` + +*List Run Results* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| +|item_id__in|query|any|false|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|reference__in|query|any|false|none| +|status__in|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": [ + { + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + ], + "reference": "string", + "status": "pending" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Run Results V1 Runs Application Run Id Results Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Run Results V1 Runs Application Run Id Results Get|[[ItemResultReadResponse](#schemaitemresultreadresponse)]|false|none|none| +|» ItemResultReadResponse|[ItemResultReadResponse](#schemaitemresultreadresponse)|false|none|none| +|»» application_run_id|string(uuid)|true|none|none| +|»» error|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» item_id|string(uuid)|true|none|none| +|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| +|»»» OutputArtifactResultReadResponse|[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)|false|none|none| +|»»»» download_url|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|string(uri)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»» metadata|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» output_artifact_id|string(uuid)|true|none|none| +|»» reference|string|true|none|none| +|»» status|[ItemStatus](#schemaitemstatus)|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|status|pending| +|status|canceled_user| +|status|canceled_system| +|status|error_user| +|status|error_system| +|status|succeeded| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### create_user_v1_users__post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.post('/v1/users/', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "email": "string", + "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", + "user_id": "string" +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/users/', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/users/` + +*Create User* + +> Body parameter + +```json +{ + "email": "string", + "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", + "user_id": "string" +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[UserCreationRequest](#schemausercreationrequest)|true|none| + +> Example responses + +> 200 Response + +```json +{ + "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", + "slide_quota": { + "total": 0, + "used": 0 + }, + "user_id": "string" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[UserResponse](#schemauserresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|User not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### get_user_v1_users__user_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/users/{user_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/users/{user_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/users/{user_id}` + +*Get User* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|user_id|path|string(uuid)|true|none| + +> Example responses + +> 200 Response + +```json +{ + "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", + "slide_quota": { + "total": 0, + "used": 0 + }, + "user_id": "string" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[UserResponse](#schemauserresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|User not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### update_user_v1_users__user_id__patch + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.patch('/v1/users/{user_id}', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "slide_quota": 0, + "user_id": "string" +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/users/{user_id}', +{ + method: 'PATCH', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`PATCH /v1/users/{user_id}` + +*Update User* + +> Body parameter + +```json +{ + "slide_quota": 0, + "user_id": "string" +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|user_id|path|string(uuid)|true|none| +|body|body|[UserUpdateRequest](#schemauserupdaterequest)|true|none| + +> Example responses + +> 200 Response + +```json +{ + "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", + "slide_quota": { + "total": 0, + "used": 0 + }, + "user_id": "string" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[UserResponse](#schemauserresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|User not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### register_version_v1_versions_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.post('/v1/versions', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/versions', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/versions` + +*Register Version* + +> Body parameter + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[VersionCreationRequest](#schemaversioncreationrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[VersionCreationResponse](#schemaversioncreationresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### get_version_v1_versions__application_version_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/versions/{application_version_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/versions/{application_version_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/versions/{application_version_id}` + +*Get Version* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_version_id|path|string(uuid)|true|none| +|include|query|any|false|none| + +> Example responses + +> 200 Response + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "changelog": "string", + "created_at": "2019-08-24T14:15:22Z", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[VersionReadResponse](#schemaversionreadresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +## Algorithms/Apps + +Called by the Algorithms and applications to update statuses + +### trigger_artifact_event_v1_artifacts__output_artifact_id__event_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json' +} + +r = requests.post('/v1/artifacts/{output_artifact_id}/event', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "error": "string", + "event": "succeeded", + "metadata": {} +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json' +}; + +fetch('/v1/artifacts/{output_artifact_id}/event', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/artifacts/{output_artifact_id}/event` + +*Trigger Artifact Event* + +> Body parameter + +```json +{ + "error": "string", + "event": "succeeded", + "metadata": {} +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|output_artifact_id|path|string(uuid)|true|none| +|body|body|[OutputArtifactEventTriggerRequest](#schemaoutputartifacteventtriggerrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b", + "status": "pending" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[OutputArtifactEventTriggerResponse](#schemaoutputartifacteventtriggerresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +## Scheduler + +Called by the Scheduler + +### get_item_v1_items__item_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/items/{item_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/items/{item_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/items/{item_id}` + +*Get Item* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|item_id|path|string(uuid)|true|none| + +> Example responses + +> 200 Response + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "reference": "string", + "status": "pending" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[ItemReadResponse](#schemaitemreadresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### register_item_event_v1_items__item_id__event_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.post('/v1/items/{item_id}/event', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "error": "string", + "event": "failed_with_system_error" +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/items/{item_id}/event', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/items/{item_id}/event` + +*Register Item Event* + +> Body parameter + +```json +{ + "error": "string", + "event": "failed_with_system_error" +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|item_id|path|string(uuid)|true|none| +|body|body|[ItemEventCreationRequest](#schemaitemeventcreationrequest)|true|none| + +> Example responses + +> 202 Response + +```json +{ + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "status": "pending" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|[ItemEventCreationResponse](#schemaitemeventcreationresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +## Admins + +Called by Admins to manage and register entities + +### register_application_v1_applications_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.post('/v1/applications', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "description": "H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, cell detection and cell classfication", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ] +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/applications', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/applications` + +*Register Application* + +> Body parameter + +```json +{ + "description": "H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, cell detection and cell classfication", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ] +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[ApplicationCreationRequest](#schemaapplicationcreationrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[ApplicationCreationResponse](#schemaapplicationcreationresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### list_quotas_v1_quotas_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/quotas', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/quotas', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/quotas` + +*List Quotas* + +> Example responses + +> 200 Response + +```json +{ + "quotas": [ + { + "name": "max_users", + "quota": 0 + } + ] +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[QuotasReadResponse](#schemaquotasreadresponse)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### update_quotas_v1_quotas_patch + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.patch('/v1/quotas', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "quotas": [ + { + "name": "max_users", + "quota": 0 + } + ] +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/quotas', +{ + method: 'PATCH', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`PATCH /v1/quotas` + +*Update Quotas* + +> Body parameter + +```json +{ + "quotas": [ + { + "name": "max_users", + "quota": 0 + } + ] +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[QuotasUpdateRequest](#schemaquotasupdaterequest)|true|none| + +> Example responses + +> 200 Response + +```json +{ + "updated_quotas": [ + { + "name": "max_users", + "quota": 0 + } + ] +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[QuotasUpdateResponse](#schemaquotasupdateresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +## Infrastructure + +Called by other Infra + +### health_health_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/health', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/health', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /health` + +*Health* + +Check that the API application is alive and responsive. + +> Example responses + +> 200 Response + +```json +null +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| + +#### Response Schema + + +This operation does not require authentication + + +### liveness_liveness_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/liveness', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/liveness', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /liveness` + +*Liveness* + +Check that the API application is alive and responsive. + +> Example responses + +> 200 Response + +```json +null +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| + +#### Response Schema + + +This operation does not require authentication + + +### readiness_readiness_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/readiness', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/readiness', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /readiness` + +*Readiness* + +Check that the API application is ready to serve. + +> Example responses + +> 200 Response + +```json +null +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| + +#### Response Schema + + +This operation does not require authentication + + +## Organizations + +### create_organization_v1_organizations_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.post('/v1/organizations', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "batch_size": 0, + "organization_id": "string", + "owner_email": "string", + "slide_quota": 0 +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/organizations', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/organizations` + +*Create Organization* + +> Body parameter + +```json +{ + "batch_size": 0, + "organization_id": "string", + "owner_email": "string", + "slide_quota": 0 +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[OrganizationCreationRequest](#schemaorganizationcreationrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "batch_size": 0, + "organization_id": "string", + "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05", + "slide_quota": { + "total": 0, + "used": 0 + } +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[OrganizationResponse](#schemaorganizationresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### get_organization_v1_organizations__organization_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/v1/organizations/{organization_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/organizations/{organization_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/organizations/{organization_id}` + +*Get Organization* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|organization_id|path|string(uuid)|true|none| + +> Example responses + +> 200 Response + +```json +{ + "batch_size": 0, + "organization_id": "string", + "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05", + "slide_quota": { + "total": 0, + "used": 0 + } +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[OrganizationResponse](#schemaorganizationresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### update_organization_v1_organizations__organization_id__patch + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.patch('/v1/organizations/{organization_id}', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "batch_size": 0, + "slide_quota": 0 +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/v1/organizations/{organization_id}', +{ + method: 'PATCH', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`PATCH /v1/organizations/{organization_id}` + +*Update Organization* + +> Body parameter + +```json +{ + "batch_size": 0, + "slide_quota": 0 +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|organization_id|path|string|true|none| +|body|body|[OrganizationUpdateRequest](#schemaorganizationupdaterequest)|true|none| + +> Example responses + +> 200 Response + +```json +{ + "batch_size": 0, + "organization_id": "string", + "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05", + "slide_quota": { + "total": 0, + "used": 0 + } +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[OrganizationResponse](#schemaorganizationresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +## Schemas + +### ApplicationCreationRequest + + + + + + +```json +{ + "description": "H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, cell detection and cell classfication", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ] +} + +``` + +ApplicationCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|description|string|true|none|none| +|name|string|true|none|none| +|regulatory_classes|[string]|true|none|none| + +### ApplicationCreationResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c" +} + +``` + +ApplicationCreationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| + +### ApplicationReadResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" +} + +``` + +ApplicationReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|description|string|true|none|none| +|name|string|true|none|none| +|regulatory_classes|[string]|true|none|none| +|slug|string|true|none|none| + +### ApplicationRunStatus + + + + + + +```json +"canceled_system" + +``` + +ApplicationRunStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ApplicationRunStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ApplicationRunStatus|canceled_system| +|ApplicationRunStatus|canceled_user| +|ApplicationRunStatus|completed| +|ApplicationRunStatus|completed_with_error| +|ApplicationRunStatus|received| +|ApplicationRunStatus|rejected| +|ApplicationRunStatus|running| +|ApplicationRunStatus|scheduled| + +### ApplicationVersionReadResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" +} + +``` + +ApplicationVersionReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|application_version_id|string(uuid)|true|none|none| +|application_version_slug|string|true|none|none| +|changelog|string|true|none|none| +|flow_id|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|version|string|true|none|none| + +### ArtifactEvent + + + + + + +```json +"succeeded" + +``` + +ArtifactEvent + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ArtifactEvent|string|false|none|This is a subset of the OutputArtifactEvent used by the state machine.Only the variants defined below are allowed to be submitted from the Algorithms/Applications.| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ArtifactEvent|succeeded| +|ArtifactEvent|failed_with_user_error| +|ArtifactEvent|failed_with_system_error| + +### ArtifactStatus + + + + + + +```json +"pending" + +``` + +ArtifactStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ArtifactStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ArtifactStatus|pending| +|ArtifactStatus|canceled_user| +|ArtifactStatus|canceled_system| +|ArtifactStatus|error_user| +|ArtifactStatus|error_system_fatal| +|ArtifactStatus|error_system_recoverable| +|ArtifactStatus|skipped| +|ArtifactStatus|succeeded| + +### HTTPValidationError + + + + + + +```json +{ + "detail": [ + { + "loc": [ + "string" + ], + "msg": "string", + "type": "string" + } + ] +} + +``` + +HTTPValidationError + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|detail|[[ValidationError](#schemavalidationerror)]|false|none|none| + +### InputArtifact + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" +} + +``` + +InputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### InputArtifactCreationRequest + + + + + + +```json +{ + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" +} + +``` + +InputArtifactCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|metadata|object|true|none|none| +|name|string|true|none|none| + +### InputArtifactReadResponse + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" +} + +``` + +InputArtifactReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### InputArtifactSchemaCreationRequest + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" +} + +``` + +InputArtifactSchemaCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### ItemCreationRequest + + + + + + +```json +{ + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" +} + +``` + +ItemCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|none| +|reference|string|true|none|none| + +### ItemEvent + + + + + + +```json +"failed_with_system_error" + +``` + +ItemEvent + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ItemEvent|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ItemEvent|failed_with_system_error| +|ItemEvent|failed_recoverable| + +### ItemEventCreationRequest + + + + + + +```json +{ + "error": "string", + "event": "failed_with_system_error" +} + +``` + +ItemEventCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|error|string|true|none|none| +|event|[ItemEvent](#schemaitemevent)|true|none|none| + +### ItemEventCreationResponse + + + + + + +```json +{ + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "status": "pending" +} + +``` + +ItemEventCreationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|item_id|string(uuid)|true|none|none| +|status|[ItemStatus](#schemaitemstatus)|true|none|none| + +### ItemReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "reference": "string", + "status": "pending" +} + +``` + +ItemReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|error|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|item_id|string(uuid)|true|none|none| +|reference|string|true|none|none| +|status|[ItemStatus](#schemaitemstatus)|true|none|none| + +### ItemResultReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": [ + { + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + ], + "reference": "string", + "status": "pending" +} + +``` + +ItemResultReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|none| +|error|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|item_id|string(uuid)|true|none|none| +|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| +|reference|string|true|none|none| +|status|[ItemStatus](#schemaitemstatus)|true|none|none| + +### ItemStatus + + + + + + +```json +"pending" + +``` + +ItemStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ItemStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ItemStatus|pending| +|ItemStatus|canceled_user| +|ItemStatus|canceled_system| +|ItemStatus|error_user| +|ItemStatus|error_system| +|ItemStatus|succeeded| + +### OrganizationCreationRequest + + + + + + +```json +{ + "batch_size": 0, + "organization_id": "string", + "owner_email": "string", + "slide_quota": 0 +} + +``` + +OrganizationCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|batch_size|integer|true|none|none| +|organization_id|string|true|none|none| +|owner_email|string|true|none|none| +|slide_quota|integer|true|none|none| + +### OrganizationQuota + + + + + + +```json +{ + "total": 0, + "used": 0 +} + +``` + +OrganizationQuota + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|total|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|integer|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|used|integer|true|none|none| + +### OrganizationResponse + + + + + + +```json +{ + "batch_size": 0, + "organization_id": "string", + "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05", + "slide_quota": { + "total": 0, + "used": 0 + } +} + +``` + +OrganizationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|batch_size|integer|true|none|none| +|organization_id|string|true|none|none| +|owner_id|string(uuid)|true|none|none| +|slide_quota|[OrganizationQuota](#schemaorganizationquota)|true|none|none| + +### OrganizationUpdateRequest + + + + + + +```json +{ + "batch_size": 0, + "slide_quota": 0 +} + +``` + +OrganizationUpdateRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|batch_size|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|integer|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|slide_quota|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|integer|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +### OutputArtifact + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" +} + +``` + +OutputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| + +### OutputArtifactEventTriggerRequest + + + + + + +```json +{ + "error": "string", + "event": "succeeded", + "metadata": {} +} + +``` + +OutputArtifactEventTriggerRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|error|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|event|[ArtifactEvent](#schemaartifactevent)|true|none|This is a subset of the OutputArtifactEvent used by the state machine.Only the variants defined below are allowed to be submitted from the Algorithms/Applications.| +|metadata|object|true|none|none| + +### OutputArtifactEventTriggerResponse + + + + + + +```json +{ + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b", + "status": "pending" +} + +``` + +OutputArtifactEventTriggerResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|output_artifact_id|string(uuid)|true|none|none| +|status|[ArtifactStatus](#schemaartifactstatus)|true|none|none| + +### OutputArtifactReadResponse + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" +} + +``` + +OutputArtifactReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| + +### OutputArtifactResultReadResponse + + + + + + +```json +{ + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" +} + +``` + +OutputArtifactResultReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uri)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|output_artifact_id|string(uuid)|true|none|none| + +### OutputArtifactSchemaCreationRequest + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" +} + +``` + +OutputArtifactSchemaCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| + +### OutputArtifactScope + + + + + + +```json +"item" + +``` + +OutputArtifactScope + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|OutputArtifactScope|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|OutputArtifactScope|item| +|OutputArtifactScope|global| + +### OutputArtifactVisibility + + + + + + +```json +"internal" + +``` + +OutputArtifactVisibility + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|OutputArtifactVisibility|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|OutputArtifactVisibility|internal| +|OutputArtifactVisibility|external| + +### PayloadInputArtifact + + + + + + +```json +{ + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} +} + +``` + +PayloadInputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|input_artifact_id|string(uuid)|true|none|none| +|metadata|object|true|none|none| + +### PayloadItem + + + + + + +```json +{ + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } +} + +``` + +PayloadItem + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|object|true|none|none| +|» **additionalProperties**|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| +|item_id|string(uuid)|true|none|none| +|output_artifacts|object|true|none|none| +|» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +### PayloadOutputArtifact + + + + + + +```json +{ + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" +} + +``` + +PayloadOutputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|data|[TransferUrls](#schematransferurls)|true|none|none| +|metadata|[TransferUrls](#schematransferurls)|true|none|none| +|output_artifact_id|string(uuid)|true|none|none| + +### QuotaName + + + + + + +```json +"max_users" + +``` + +QuotaName + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|QuotaName|string|false|none|Global, API-level, and slide-level quotas for Samia API.| + +##### Enumerated Values + +|Property|Value| +|---|---| +|QuotaName|max_users| +|QuotaName|max_organizations| +|QuotaName|max_users_per_organization| +|QuotaName|max_applications| +|QuotaName|max_application_versions| +|QuotaName|max_slides_per_run| +|QuotaName|max_parallel_runs| +|QuotaName|max_parallel_runs_per_organization| +|QuotaName|max_parallel_runs_per_user| + +### QuotaReadResponse + + + + + + +```json +{ + "name": "max_users", + "quota": 0 +} + +``` + +QuotaReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|name|[QuotaName](#schemaquotaname)|true|none|Global, API-level, and slide-level quotas for Samia API.| +|quota|integer|true|none|none| + +### QuotaUpdateRequest + + + + + + +```json +{ + "name": "max_users", + "quota": 0 +} + +``` + +QuotaUpdateRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|name|[QuotaName](#schemaquotaname)|true|none|Global, API-level, and slide-level quotas for Samia API.| +|quota|integer|true|none|none| + +### QuotaUpdateResponse + + + + + + +```json +{ + "name": "max_users", + "quota": 0 +} + +``` + +QuotaUpdateResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|name|[QuotaName](#schemaquotaname)|true|none|Global, API-level, and slide-level quotas for Samia API.| +|quota|integer|true|none|none| + +### QuotasReadResponse + + + + + + +```json +{ + "quotas": [ + { + "name": "max_users", + "quota": 0 + } + ] +} + +``` + +QuotasReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|quotas|[[QuotaReadResponse](#schemaquotareadresponse)]|true|none|[GET response payload for quota read.]| + +### QuotasUpdateRequest + + + + + + +```json +{ + "quotas": [ + { + "name": "max_users", + "quota": 0 + } + ] +} + +``` + +QuotasUpdateRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|quotas|[[QuotaUpdateRequest](#schemaquotaupdaterequest)]|true|none|[PATCH request payload for quota update.]| + +### QuotasUpdateResponse + + + + + + +```json +{ + "updated_quotas": [ + { + "name": "max_users", + "quota": 0 + } + ] +} + +``` + +QuotasUpdateResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|updated_quotas|[[QuotaUpdateResponse](#schemaquotaupdateresponse)]|true|none|[PATCH response payload for quota update.]| + +### RunCreationRequest + + + + + + +```json +{ + "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +} + +``` + +RunCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_version|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|[SlugVersionRequest](#schemaslugversionrequest)|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|none| + +### RunCreationResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" +} + +``` + +RunCreationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|none| + +### RunReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } +} + +``` + +RunReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|none| +|application_version_id|string(uuid)|true|none|none| +|organization_id|string|true|none|none| +|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| +|triggered_at|string(date-time)|true|none|none| +|triggered_by|string|true|none|none| +|user_payload|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +### SlugVersionRequest + + + + + + +```json +{ + "application_slug": "string", + "version": "string" +} + +``` + +SlugVersionRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_slug|string|true|none|none| +|version|string|true|none|none| + +### TransferUrls + + + + + + +```json +{ + "download_url": "http://example.com", + "upload_url": "http://example.com" +} + +``` + +TransferUrls + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|upload_url|string(uri)|true|none|none| + +### UserCreationRequest + + + + + + +```json +{ + "email": "string", + "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", + "user_id": "string" +} + +``` + +UserCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|email|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|organization_id|string(uuid)|true|none|none| +|user_id|string|true|none|none| + +### UserPayload + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] +} + +``` + +UserPayload + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|application_run_id|string(uuid)|true|none|none| +|global_output_artifacts|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|object|false|none|none| +|»» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|items|[[PayloadItem](#schemapayloaditem)]|true|none|none| + +### UserQuota + + + + + + +```json +{ + "total": 0, + "used": 0 +} + +``` + +UserQuota + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|total|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|integer|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|used|integer|true|none|none| + +### UserResponse + + + + + + +```json +{ + "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", + "slide_quota": { + "total": 0, + "used": 0 + }, + "user_id": "string" +} + +``` + +UserResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|organization_id|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|slide_quota|[UserQuota](#schemauserquota)|true|none|none| +|user_id|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +### UserUpdateRequest + + + + + + +```json +{ + "slide_quota": 0, + "user_id": "string" +} + +``` + +UserUpdateRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|slide_quota|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|integer|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|user_id|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +### ValidationError + + + + + + +```json +{ + "loc": [ + "string" + ], + "msg": "string", + "type": "string" +} + +``` + +ValidationError + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|loc|[anyOf]|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|integer|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|msg|string|true|none|none| +|type|string|true|none|none| + +### VersionCreationRequest + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} + +``` + +VersionCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|changelog|string|true|none|none| +|flow_id|string(uuid)|true|none|none| +|input_artifacts|[[InputArtifactSchemaCreationRequest](#schemainputartifactschemacreationrequest)]|true|none|none| +|output_artifacts|[[OutputArtifactSchemaCreationRequest](#schemaoutputartifactschemacreationrequest)]|true|none|none| +|version|string|true|none|none| + +### VersionCreationResponse + + + + + + +```json +{ + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" +} + +``` + +VersionCreationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_version_id|string(uuid)|true|none|none| + +### VersionReadResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "changelog": "string", + "created_at": "2019-08-24T14:15:22Z", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} + +``` + +VersionReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|application_version_id|string(uuid)|true|none|none| +|changelog|string|true|none|none| +|created_at|string(date-time)|true|none|none| +|flow_id|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifact](#schemainputartifact)]|true|none|none| +|output_artifacts|[[OutputArtifact](#schemaoutputartifact)]|true|none|none| +|version|string|true|none|none| diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index fbb3d0c5..f1a167fb 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -4,8 +4,7 @@ components: properties: description: examples: - - 'H&E Tumor Micro Environment Analysis: Performing tissue QC, -segmentation, + - 'H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, cell detection and cell classfication' title: Description type: string @@ -134,12 +133,10 @@ segmentation, title: ApplicationVersionReadResponse type: object ArtifactEvent: - description: 'This is a subset of the OutputArtifactEvent used by the -state + description: 'This is a subset of the OutputArtifactEvent used by the state machine. - Only the variants defined below are allowed to be submitted from the -Algorithms/Applications.' + Only the variants defined below are allowed to be submitted from the Algorithms/Applications.' enum: - succeeded - failed_with_user_error @@ -1062,12 +1059,9 @@ Algorithms/Applications.' tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token type: oauth2 info: - description: Pagination is done via `page` and `page_size`. Sorting via `sort` -query - parameter. sort is a comma-separated list of field names. The sorting -direction - can be indicated via `+` (ascending) or `-` (descending) (e.g. -`/applications?sort=+name)`. + description: Pagination is done via `page` and `page_size`. Sorting via `sort` query + parameter. sort is a comma-separated list of field names. The sorting direction + can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. summary: Interact with Aignostics' Application Platform title: Aignostics Platform API version: 0.1.0 @@ -1246,8 +1240,7 @@ paths: - Externals /v1/applications/{application_id}/versions: get: - operationId: -list_versions_by_application_id_v1_applications__application_id__versions_get + operationId: list_versions_by_application_id_v1_applications__application_id__versions_get parameters: - in: path name: application_id @@ -1310,8 +1303,7 @@ list_versions_by_application_id_v1_applications__application_id__versions_get schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications -Application + title: Response List Versions By Application Id V1 Applications Application Id Versions Get type: array description: Successful Response @@ -1328,8 +1320,7 @@ Application - Externals /v1/applications/{application_slug}: get: - operationId: -read_application_by_slug_v1_applications__application_slug__get + operationId: read_application_by_slug_v1_applications__application_slug__get parameters: - in: path name: application_slug @@ -1357,9 +1348,7 @@ read_application_by_slug_v1_applications__application_slug__get - Externals /v1/applications/{application_slug}/versions: get: - operationId: -list_versions_by_application_slug_v1_applications__application_slug__versions_ge -t + operationId: list_versions_by_application_slug_v1_applications__application_slug__versions_get parameters: - in: path name: application_slug @@ -1422,8 +1411,7 @@ t schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 -Applications Application + title: Response List Versions By Application Slug V1 Applications Application Slug Versions Get type: array description: Successful Response @@ -1440,8 +1428,7 @@ Applications Application - Externals /v1/artifacts/{output_artifact_id}/event: post: - operationId: -trigger_artifact_event_v1_artifacts__output_artifact_id__event_post + operationId: trigger_artifact_event_v1_artifacts__output_artifact_id__event_post parameters: - in: path name: output_artifact_id @@ -1856,8 +1843,7 @@ trigger_artifact_event_v1_artifacts__output_artifact_id__event_post - Externals /v1/runs/{application_run_id}/results: delete: - operationId: -delete_run_results_v1_runs__application_run_id__results_delete + operationId: delete_run_results_v1_runs__application_run_id__results_delete parameters: - in: path name: application_run_id @@ -1957,8 +1943,7 @@ delete_run_results_v1_runs__application_run_id__results_delete schema: items: $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id -Results + title: Response List Run Results V1 Runs Application Run Id Results Get type: array description: Successful Response From e2ac93692204ee8659eb1f48823ef72d62161b80 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 10:25:12 +0200 Subject: [PATCH 029/110] fix(types): fix typing errors. remaining: _authentication --- pyproject.toml | 1 + src/aignostics/__init__.py | 4 +++- src/aignostics/cli.py | 2 +- src/aignostics/client/__init__.py | 6 +++++- src/aignostics/client/resources/applications.py | 11 ++++++++--- src/aignostics/client/resources/runs.py | 6 +++++- src/aignostics/client/utils.py | 15 ++++++++------- src/aignostics/platform.py | 14 ++++++++------ src/aignostics/types.py | 4 ++++ uv.lock | 14 ++++++++++++++ 10 files changed, 57 insertions(+), 20 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3d054e67..c72aa0dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -150,6 +150,7 @@ dev = [ "swagger-plugin-for-sphinx>=5.1.0", "tomli>=2.1.0", "types-pyyaml>=6.0.12.20250402", + "types-requests>=2.32.0.20250328", "watchdog>=6.0.0", ] diff --git a/src/aignostics/__init__.py b/src/aignostics/__init__.py index 75efdef7..c110136a 100644 --- a/src/aignostics/__init__.py +++ b/src/aignostics/__init__.py @@ -8,13 +8,15 @@ from .exceptions import OpenAPISchemaError from .models import Health, HealthStatus from .platform import Platform -from .types import APIVersion, InfoOutputFormat, OpenAPIOutputFormat +from .types import APIVersion, InfoOutputFormat, JsonType, JsonValue, OpenAPIOutputFormat __all__ = [ "APIVersion", "Health", "HealthStatus", "InfoOutputFormat", + "JsonType", + "JsonValue", "OpenAPIOutputFormat", "OpenAPISchemaError", "Platform", diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index 8dcfd1d9..a295aef3 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -40,7 +40,7 @@ @platform_app.command("install") def install() -> None: """Complete and validate installation of the CLI.""" - _console.print(_platform.install()) + _platform.install() @platform_app.command("health") diff --git a/src/aignostics/client/__init__.py b/src/aignostics/client/__init__.py index 0ec24f08..321ebb4c 100644 --- a/src/aignostics/client/__init__.py +++ b/src/aignostics/client/__init__.py @@ -6,4 +6,8 @@ for all interactions with the Aignostics platform. """ -from aignostics.client._client import Client # noqa: F401 +from aignostics.client._client import Client + +__all__ = [ + "Client", +] diff --git a/src/aignostics/client/resources/applications.py b/src/aignostics/client/resources/applications.py index a9af48ba..040ff580 100644 --- a/src/aignostics/client/resources/applications.py +++ b/src/aignostics/client/resources/applications.py @@ -4,6 +4,8 @@ It includes functionality for listing applications and managing application versions. """ +import typing as t + from aignx.codegen.api.externals_api import ExternalsApi from aignx.codegen.models import ApplicationReadResponse, ApplicationVersionReadResponse, VersionReadResponse @@ -40,8 +42,11 @@ def list(self, for_application: ApplicationReadResponse | str) -> list[Applicati else: application_id = for_application - return self._api.list_versions_by_application_id_v1_applications_application_id_versions_get( - application_id=application_id + return t.cast( + "list[ApplicationVersionReadResponse]", + self._api.list_versions_by_application_id_v1_applications_application_id_versions_get( + application_id=application_id + ), ) def details(self, for_application_version_id: str) -> VersionReadResponse: @@ -85,4 +90,4 @@ def list(self) -> list[ApplicationReadResponse]: Raises: Exception: If the API request fails. """ - return self._api.list_applications_v1_applications_get() + return t.cast("list[ApplicationReadResponse]", self._api.list_applications_v1_applications_get()) diff --git a/src/aignostics/client/resources/runs.py b/src/aignostics/client/resources/runs.py index 1d41add0..db1e1d09 100644 --- a/src/aignostics/client/resources/runs.py +++ b/src/aignostics/client/resources/runs.py @@ -5,6 +5,7 @@ """ import json +import typing as t from pathlib import Path from time import sleep @@ -99,7 +100,10 @@ def results(self) -> list[ItemResultReadResponse]: Exception: If the API request fails. """ # TODO(andreas): paging, sorting - return self._api.list_run_results_v1_runs_application_run_id_results_get(self.application_run_id) + return t.cast( + "list[ItemResultReadResponse]", + self._api.list_run_results_v1_runs_application_run_id_results_get(self.application_run_id), + ) def download_to_folder(self, download_base: Path | str) -> None: """Downloads all result artifacts to a folder. diff --git a/src/aignostics/client/utils.py b/src/aignostics/client/utils.py index 73ee36b1..386dc058 100644 --- a/src/aignostics/client/utils.py +++ b/src/aignostics/client/utils.py @@ -13,6 +13,7 @@ import datetime import re import tempfile +import typing as t from collections.abc import Generator from pathlib import Path from typing import IO, Any @@ -63,7 +64,7 @@ def download_file(signed_url: str, file_path: str, verify_checksum: str) -> None ValueError: If the downloaded file's checksum doesn't match the expected value. requests.HTTPError: If the download request fails. """ - checksum = google_crc32c.Checksum() + checksum = google_crc32c.Checksum() # type: ignore[no-untyped-call] with requests.get(signed_url, stream=True, timeout=60) as stream: stream.raise_for_status() with open(file_path, mode="wb") as file: @@ -72,10 +73,10 @@ def download_file(signed_url: str, file_path: str, verify_checksum: str) -> None for chunk in stream.iter_content(chunk_size=EIGHT_MB): if chunk: file.write(chunk) - checksum.update(chunk) + checksum.update(chunk) # type: ignore[no-untyped-call] progress_bar.update(len(chunk)) progress_bar.close() - downloaded_file = base64.b64encode(checksum.digest()).decode("ascii") + downloaded_file = base64.b64encode(checksum.digest()).decode("ascii") # type: ignore[no-untyped-call] if downloaded_file != verify_checksum: msg = f"Checksum mismatch: {downloaded_file} != {verify_checksum}" raise ValueError(msg) @@ -108,7 +109,7 @@ def _generate_signed_url(fully_qualified_gs_path: str) -> str: msg = f"Blob does not exist: {fully_qualified_gs_path}" raise ValueError(msg) - return blob.generate_signed_url(expiration=datetime.timedelta(hours=1), method="GET", version="v4") + return t.cast("str", blob.generate_signed_url(expiration=datetime.timedelta(hours=1), method="GET", version="v4")) def calculate_file_crc32c(file: Path) -> str: @@ -120,11 +121,11 @@ def calculate_file_crc32c(file: Path) -> str: Returns: str: The CRC32C checksum in base64 encoding. """ - checksum = google_crc32c.Checksum() + checksum = google_crc32c.Checksum() # type: ignore[no-untyped-call] with open(file, mode="rb") as f: - for _ in checksum.consume(f, EIGHT_MB): + for _ in checksum.consume(f, EIGHT_MB): # type: ignore[no-untyped-call] pass - return base64.b64encode(checksum.digest()).decode("ascii") + return base64.b64encode(checksum.digest()).decode("ascii") # type: ignore[no-untyped-call] @contextlib.contextmanager diff --git a/src/aignostics/platform.py b/src/aignostics/platform.py index 23ebec77..9fea67c0 100644 --- a/src/aignostics/platform.py +++ b/src/aignostics/platform.py @@ -5,12 +5,14 @@ import platform import sys from pathlib import Path +from typing import Any from dotenv import load_dotenv from . import OpenAPISchemaError from .constants import __project_name__, __project_path__, __version__ from .settings import Settings +from .types import JsonType load_dotenv() @@ -34,7 +36,7 @@ def healthy(self) -> bool: """ return self.is_healthy - def info(self, env: bool = True, filter_secrets: bool = True) -> dict: + def info(self, env: bool = True, filter_secrets: bool = True) -> dict[str, Any]: """ For diagnostics compile info about user and platform environment. @@ -97,7 +99,7 @@ def info(self, env: bool = True, filter_secrets: bool = True) -> dict: if env: if filter_secrets: - info_dict["local"]["execution"]["env"] = { + info_dict["local"]["execution"]["env"] = { # type: ignore[index] k: v for k, v in os.environ.items() if not ( @@ -109,7 +111,7 @@ def info(self, env: bool = True, filter_secrets: bool = True) -> dict: ) } else: - info_dict["local"]["execution"]["env"] = dict(os.environ) + info_dict["local"]["execution"]["env"] = dict(os.environ) # type: ignore[index] return info_dict @@ -118,12 +120,12 @@ def install(self) -> None: # TODO (Helmut, Andreas): Build @staticmethod - def openapi_schema() -> dict: + def openapi_schema() -> JsonType: """ Get OpenAPI schema of the webservice API provided by the platform. Returns: - dict: OpenAPI schema. + dict[str, object]: OpenAPI schema. Raises: OpenAPISchemaError: If the OpenAPI schema file cannot be found or is not valid JSON. @@ -131,6 +133,6 @@ def openapi_schema() -> dict: schema_path = Path(__file__).parent.parent.parent / "codegen" / "in" / "api.json" try: with schema_path.open(encoding="utf-8") as f: - return json.load(f) + return json.load(f) # type: ignore[no-any-return] except (FileNotFoundError, json.JSONDecodeError) as e: raise OpenAPISchemaError(e) from e diff --git a/src/aignostics/types.py b/src/aignostics/types.py index 120afa04..60baf7d8 100644 --- a/src/aignostics/types.py +++ b/src/aignostics/types.py @@ -1,7 +1,11 @@ """Types of Aignostics Python SDK.""" +import typing as t from enum import StrEnum +JsonType: t.TypeAlias = list["JsonValue"] | t.Mapping[str, "JsonValue"] +JsonValue: t.TypeAlias = str | int | float | JsonType | None + class APIVersion(StrEnum): """ diff --git a/uv.lock b/uv.lock index cd1311d9..04a9062b 100644 --- a/uv.lock +++ b/uv.lock @@ -85,6 +85,7 @@ dev = [ { name = "swagger-plugin-for-sphinx" }, { name = "tomli" }, { name = "types-pyyaml" }, + { name = "types-requests" }, { name = "watchdog" }, ] @@ -153,6 +154,7 @@ dev = [ { name = "swagger-plugin-for-sphinx", specifier = ">=5.1.0" }, { name = "tomli", specifier = ">=2.1.0" }, { name = "types-pyyaml", specifier = ">=6.0.12.20250402" }, + { name = "types-requests", specifier = ">=2.32.0.20250328" }, { name = "watchdog", specifier = ">=6.0.0" }, ] @@ -4207,6 +4209,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ed/56/1fe61db05685fbb512c07ea9323f06ea727125951f1eb4dff110b3311da3/types_pyyaml-6.0.12.20250402-py3-none-any.whl", hash = "sha256:652348fa9e7a203d4b0d21066dfb00760d3cbd5a15ebb7cf8d33c88a49546681", size = 20329 }, ] +[[package]] +name = "types-requests" +version = "2.32.0.20250328" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/7d/eb174f74e3f5634eaacb38031bbe467dfe2e545bc255e5c90096ec46bc46/types_requests-2.32.0.20250328.tar.gz", hash = "sha256:c9e67228ea103bd811c96984fac36ed2ae8da87a36a633964a21f199d60baf32", size = 22995 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl", hash = "sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2", size = 20663 }, +] + [[package]] name = "typing-extensions" version = "4.13.1" From 34d8359509ec0c0146c75611f2f4fa467668b930 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 11:44:28 +0200 Subject: [PATCH 030/110] fix(authentication): type safety; introduce pydantic settings to actually validate the env, while using lazy loading of settings, so we don't kill CLI if the settings are not used for the given action --- .env.example | 9 ++ src/aignostics/client/__init__.py | 2 + src/aignostics/client/_authentication.py | 149 ++++++++++++++++------- src/aignostics/client/messages.py | 3 + 4 files changed, 118 insertions(+), 45 deletions(-) create mode 100644 src/aignostics/client/messages.py diff --git a/.env.example b/.env.example index e69de29b..1549c242 100644 --- a/.env.example +++ b/.env.example @@ -0,0 +1,9 @@ + CLIENT_ID_DEVICE=YOUR_CLIENT_ID_DEVICE + CLIENT_ID_INTERACTIVE=YOUR_CLIENT_ID_INTERACTIVE + SCOPE=YOUR_SCOPE_ELEMENT,YOUR_SCOPE_ELEMENT + REDIRECT_URI=YOUR_REDIRECT_URI + AUDIENCE=YOUR_AUDIENCE + AUTHORIZATION_BASE_URL=YOUR_AUTHORIZATION_BASE_URL + TOKEN_URL=YOUR_TOKEN_URL + DEVICE_URL=YOUR_DEVICE_URL + JWS_JSON_URL=YOUR_JWS_JSON_URL diff --git a/src/aignostics/client/__init__.py b/src/aignostics/client/__init__.py index 321ebb4c..b3c6a630 100644 --- a/src/aignostics/client/__init__.py +++ b/src/aignostics/client/__init__.py @@ -7,7 +7,9 @@ """ from aignostics.client._client import Client +from aignostics.client.messages import AUTHENTICATION_FAILED __all__ = [ + "AUTHENTICATION_FAILED", "Client", ] diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 95dc7c3e..912df3c4 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -1,5 +1,5 @@ -import os import time +import typing as t import webbrowser from datetime import UTC, datetime, timedelta from http.server import BaseHTTPRequestHandler, HTTPServer @@ -10,33 +10,67 @@ import appdirs import jwt import requests -from dotenv import load_dotenv +from pydantic import computed_field +from pydantic_settings import BaseSettings, SettingsConfigDict from requests_oauthlib import OAuth2Session -ENV_FILE = os.getenv("ENV_FILE", Path.home() / ".aignostics/env") -load_dotenv(dotenv_path=ENV_FILE) +from .messages import AUTHENTICATION_FAILED -CLIENT_ID_DEVICE = os.getenv("CLIENT_ID_DEVICE") -CLIENT_ID_INTERACTIVE = os.getenv("CLIENT_ID_INTERACTIVE") -SCOPE = [scope.strip() for scope in os.getenv("SCOPE", "TODO(Andreas),TODO(Andreas)").split(",")] -REDIRECT_URI = os.getenv("REDIRECT_URI") - -AUDIENCE = os.getenv("AUDIENCE") -AUTHORIZATION_BASE_URL = os.getenv("AUTHORIZATION_BASE_URL") -TOKEN_URL = os.getenv("TOKEN_URL") -DEVICE_URL = os.getenv("DEVICE_URL") - -JWS_JSON_URL = os.getenv("JWS_JSON_URL") - -# constants for token caching +# Constants CLIENT_APP_NAME = "python-sdk" + CACHE_DIR = appdirs.user_cache_dir(CLIENT_APP_NAME, "aignostics") TOKEN_FILE = Path(CACHE_DIR) / ".token" +ENV_FILE = Path.home() / ".aignostics/env" AUTHORIZATION_BACKOFF_SECONDS = 3 REQUEST_TIMEOUT_SECONDS = 30 +# Settings +class AuthenticationSettings(BaseSettings): + model_config = SettingsConfigDict(env_prefix="", env_file=ENV_FILE, env_file_encoding="utf-8") + + client_id_device: str + client_id_interactive: str + scope: str + redirect_uri: str + audience: str + authorization_base_url: str + token_url: str + device_url: str + jws_json_url: str + aignx_refresh_token: str | None = None + + @computed_field # type: ignore[prop-decorator] + @property + def scope_elements(self) -> list[str]: + return [element.strip() for element in self.scope.split(",")] + + +__cached_authentication_settings: AuthenticationSettings | None = None + + +def authentication_settings() -> AuthenticationSettings: + """Lazy load authentication settings from the environment or a file. + + * Given we use Pydantic Settings, validation is done automatically. + * We only load and validate if we actually need the settings, + thereby not killing the client on other actions. + * If the settings have already been loaded, return the cached instance. + + Returns: + AuthenticationSettings: The loaded authentication settings. + """ + global __cached_authentication_settings # noqa: PLW0603 + if __cached_authentication_settings is None: + __cached_authentication_settings = AuthenticationSettings() # pyright: ignore[reportCallIssue] + return __cached_authentication_settings + + +print(authentication_settings().model_dump()) + + def get_token(use_cache: bool = True) -> str: """Retrieves an authentication token, either from cache or via login. @@ -90,7 +124,7 @@ def verify_and_decode_token(token: str) -> dict[str, str]: Raises: RuntimeError: If token verification or decoding fails. """ - jwk_client = jwt.PyJWKClient(JWS_JSON_URL) + jwk_client = jwt.PyJWKClient(authentication_settings().jws_json_url) try: # Get the public key from the JWK client key = jwk_client.get_signing_key_from_jwt(token).key @@ -99,12 +133,16 @@ def verify_and_decode_token(token: str) -> dict[str, str]: header_data = jwt.get_unverified_header(binary_token) algorithm = header_data["alg"] # Verify and decode the token using the public key - return jwt.decode(binary_token, key=key, algorithms=[algorithm], audience=AUDIENCE) + return t.cast( + # TODO(Andreas): hhva: Are we missing error handilng in case jwt.decode fails given invalid token? + "dict[str, str]", + jwt.decode(binary_token, key=key, algorithms=[algorithm], audience=authentication_settings().audience), + ) except jwt.exceptions.PyJWKClientError as e: - msg = "Authentication failed" + msg = AUTHENTICATION_FAILED raise RuntimeError(msg) from e except jwt.exceptions.DecodeError as e: - msg = "Authentication failed" + msg = AUTHENTICATION_FAILED raise RuntimeError(msg) from e @@ -121,12 +159,14 @@ def _authenticate() -> str: RuntimeError: If authentication fails. AssertionError: If the returned token doesn't have the expected format. """ - if refresh_token := os.getenv("AIGNX_REFRESH_TOKEN"): + if refresh_token := authentication_settings().aignx_refresh_token: token = _token_from_refresh_token(refresh_token) elif _can_open_browser(): token = _perform_authorization_code_with_pkce_flow() else: token = _perform_device_flow() + if not token: + raise RuntimeError(AUTHENTICATION_FAILED) return token @@ -152,7 +192,8 @@ class _OAuthHttpServer(HTTPServer): Extends HTTPServer to store the authorization code received during OAuth flow. """ - def __init__(self, *args, **kwargs) -> None: + # TODO(Andreas): hhva: HTTPServer.init expects particular args, guess you want to have them there + def __init__(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def] """Initializes the server with storage for the authorization code. Args: @@ -181,19 +222,20 @@ def do_GET(self) -> None: # noqa: N802 parsed = parse.urlparse(self.path) qs = parse.parse_qs(parsed.query) - response = """ + response = b""" {status} """ # see if auth was successful + # TODO(Andreas): The base server does not have .error or .error_description. Was this tested? if "error" in qs: - self.server.error = qs["error"][0] - self.server.error_description = qs["error_description"][0] + self.server.error = qs["error"][0] # type: ignore[attr-defined] + self.server.error_description = qs["error_description"][0] # type: ignore[attr-defined] status = b"Authentication error" else: - self.server.error = None - self.server.authorization_code = qs["code"][0] + self.server.error = None # type: ignore[attr-defined] + self.server.authorization_code = qs["code"][0] # type: ignore[attr-defined] status = b"Authentication successful" # display status in browser and close tab after 2 seconds @@ -202,7 +244,8 @@ def do_GET(self) -> None: # noqa: N802 """ self.wfile.write(response + status) - def log_message(self, _format: str, *args) -> None: + # TODO(Andreas): Implement and fix typing + def log_message(self, _format: str, *args) -> None: # type: ignore[no-untyped-def] """Suppresses log messages from the HTTP server. Args: @@ -223,12 +266,19 @@ def _perform_authorization_code_with_pkce_flow() -> str: Raises: RuntimeError: If authentication fails. """ - parsed_redirect = urlparse(REDIRECT_URI) + parsed_redirect = urlparse(authentication_settings().redirect_uri) with _OAuthHttpServer((parsed_redirect.hostname, parsed_redirect.port), _OAuthHttpHandler) as httpd: # initialize flow (generate code_challenge and code_verifier) - session = OAuth2Session(CLIENT_ID_INTERACTIVE, scope=SCOPE, redirect_uri=REDIRECT_URI, pkce="S256") + session = OAuth2Session( + authentication_settings().client_id_interactive, + scope=authentication_settings().scope_elements, + redirect_uri=authentication_settings().redirect_uri, + pkce="S256", + ) authorization_url, _ = session.authorization_url( - AUTHORIZATION_BASE_URL, access_type="offline", audience=AUDIENCE + authentication_settings().authorization_base_url, + access_type="offline", + audience=authentication_settings().audience, ) # Call Auth0 with challenge and redirect to localhost with code after successful authN @@ -240,8 +290,11 @@ def _perform_authorization_code_with_pkce_flow() -> str: auth_code = httpd.authorization_code # exchange authorization_code against access token at Auth0 (prove identity with code_verifier) - token_response = session.fetch_token(TOKEN_URL, code=auth_code, include_client_id=True) - return token_response["access_token"] + token_response = session.fetch_token( + authentication_settings().token_url, code=auth_code, include_client_id=True + ) + # TODO(Andreas): hhva: Validate response + return t.cast("str", token_response["access_token"]) def _perform_device_flow() -> str | None: @@ -256,23 +309,29 @@ def _perform_device_flow() -> str | None: Raises: RuntimeError: If authentication fails or is denied. """ - resp = requests.post( - DEVICE_URL, - data={"client_id": CLIENT_ID_DEVICE, "scope": SCOPE, "audience": AUDIENCE}, + # TODO(Andreas): hhva: Validate response. How about using Pydantic here? + resp: dict[str, str] = requests.post( + authentication_settings().device_url, + data={ + "client_id": authentication_settings().client_id_device, + "scope": authentication_settings().scope_elements, + "audience": authentication_settings().audience, + }, timeout=REQUEST_TIMEOUT_SECONDS, - ) - device_code = resp.json()["device_code"] - print(f"Please visit: {resp.json()['verification_uri_complete']}") + ).json() + device_code = resp["device_code"] + print(f"Please visit: {resp['verification_uri_complete']}") # Polling for access token with received device code while True: + # TODO(Andreas): hhva: Validate response. How about using Pydantic here? resp = requests.post( - TOKEN_URL, + authentication_settings().token_url, headers={"Accept": "application/json"}, data={ "grant_type": "urn:ietf:params:oauth:grant-type:device_code", "device_code": device_code, - "client_id": CLIENT_ID_DEVICE, + "client_id": authentication_settings().client_id_device, }, timeout=REQUEST_TIMEOUT_SECONDS, ).json() @@ -299,11 +358,11 @@ def _token_from_refresh_token(refresh_token: str) -> str | None: """ while True: resp = requests.post( - TOKEN_URL, + authentication_settings().token_url, headers={"Accept": "application/json"}, data={ "grant_type": "refresh_token", - "client_id": CLIENT_ID_INTERACTIVE, + "client_id": authentication_settings().client_id_interactive, "refresh_token": refresh_token, }, timeout=REQUEST_TIMEOUT_SECONDS, @@ -313,7 +372,7 @@ def _token_from_refresh_token(refresh_token: str) -> str | None: time.sleep(AUTHORIZATION_BACKOFF_SECONDS) continue raise RuntimeError(resp["error"]) - return resp["access_token"] + return t.cast("str", resp["access_token"]) if __name__ == "__main__": diff --git a/src/aignostics/client/messages.py b/src/aignostics/client/messages.py new file mode 100644 index 00000000..54953b51 --- /dev/null +++ b/src/aignostics/client/messages.py @@ -0,0 +1,3 @@ +"""Messages for the Aignostics client.""" + +AUTHENTICATION_FAILED = "Authentication failed. Please check your credentials." From 7c2b6508fb665a2838b503170c317f756c380d5a Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 11:48:47 +0200 Subject: [PATCH 031/110] chore: works, now cont --- src/aignostics/client/_authentication.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 912df3c4..2dd5de70 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -68,9 +68,6 @@ def authentication_settings() -> AuthenticationSettings: return __cached_authentication_settings -print(authentication_settings().model_dump()) - - def get_token(use_cache: bool = True) -> str: """Retrieves an authentication token, either from cache or via login. From ae54717b86266ec31adf1fdfbf6e2ba0a6f56cc4 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 11:53:19 +0200 Subject: [PATCH 032/110] chore(audit): no bioformats for now --- pyproject.toml | 2 +- uv.lock | 35 +---------------------------------- 2 files changed, 2 insertions(+), 35 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c72aa0dc..88a61ca6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -109,7 +109,7 @@ examples = [ "jupyter>=1.1.1", "jinja2>=3.1.6", ] -formats = ["openslide-python>=1.4.1", "openslide-bin>=4.0.0.6"] +# formats = ["openslide-python>=1.4.1", "openslide-bin>=4.0.0.6"] aws = ["boto3>=1.37.27"] [dependency-groups] diff --git a/uv.lock b/uv.lock index 04a9062b..b610d74d 100644 --- a/uv.lock +++ b/uv.lock @@ -42,10 +42,6 @@ examples = [ { name = "marimo" }, { name = "streamlit" }, ] -formats = [ - { name = "openslide-bin" }, - { name = "openslide-python" }, -] [package.dev-dependencies] dev = [ @@ -101,8 +97,6 @@ requires-dist = [ { name = "jsonschema", specifier = ">=4.23.0" }, { name = "jupyter", marker = "extra == 'examples'", specifier = ">=1.1.1" }, { name = "marimo", marker = "extra == 'examples'", specifier = ">=0.12.2" }, - { name = "openslide-bin", marker = "extra == 'formats'", specifier = ">=4.0.0.6" }, - { name = "openslide-python", marker = "extra == 'formats'", specifier = ">=1.4.1" }, { name = "pydantic", specifier = ">=2.11.1" }, { name = "pydantic-settings", specifier = ">=2.8.1" }, { name = "pyjwt", extras = ["crypto"], specifier = ">=2.10.1" }, @@ -114,7 +108,7 @@ requires-dist = [ { name = "typer", specifier = ">=0.15.1" }, { name = "urllib3", specifier = ">=2.2.3" }, ] -provides-extras = ["examples", "formats", "aws"] +provides-extras = ["examples", "aws"] [package.metadata.requires-dev] dev = [ @@ -2351,33 +2345,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688 }, ] -[[package]] -name = "openslide-bin" -version = "4.0.0.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/03/79/9f57b339d1726b30254e33afdb698526b0f057a2e184042a0c00e710947d/openslide-bin-4.0.0.6.tar.gz", hash = "sha256:baca4a590cb15c8685f1ee1905d496bb0a23468b969f7066a2126c24c9e9ef39", size = 17817045 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/cb/90e884978a3999c1deb90e487678eb7143551f3262c58ee5bd20bd8b010e/openslide_bin-4.0.0.6-py3-none-macosx_11_0_universal2.whl", hash = "sha256:f9c4ed0da275202dce531b163d92e1b860d215e779e7620fdd0dd92b7c40764b", size = 5325878 }, - { url = "https://files.pythonhosted.org/packages/dc/6d/dc29cda9f75001f589b6830aaeeb5a06026b88ab5088f731af74aeef4665/openslide_bin-4.0.0.6-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:43af7aabab7aa6d7c21573736de8b59ccf2f4078f0ae26da70d86005d2ee662b", size = 4206967 }, - { url = "https://files.pythonhosted.org/packages/b8/04/6f8d4ed4167bd63dfe43085a9f0ecfc18a3e51fc9e99ef631005e90abcf1/openslide_bin-4.0.0.6-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:0bc2e6d624781b0ba24d2ef3d8623fd52de7645520911539e1279d599212ecb0", size = 4300039 }, - { url = "https://files.pythonhosted.org/packages/9b/13/67272c5a1f83720188f3b0c3b9e6c045c60b841b68c5404524624bc4db83/openslide_bin-4.0.0.6-py3-none-win_amd64.whl", hash = "sha256:d9bb0659bce0384f6f961aa64c0cfdb882c8dacd6f4fbfaf84895e06fe571f40", size = 4169544 }, -] - -[[package]] -name = "openslide-python" -version = "1.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pillow" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d2/6b/e754e969a24cb035e630461bad47ba8280b563c08712a5eb35a7b83bbfbe/openslide_python-1.4.1.tar.gz", hash = "sha256:95da570994abd8a02db18b8dac68da0b3d3f7eba733bdeeb2a8b52e40e1de1c8", size = 383933 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/01/a2/742faf757e23e85f1610288ea2d9b934e3cb62d6ffb410442fd069a23ae0/openslide_python-1.4.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:3715fbed151ce448998a83d4a1c3defb1992c5e7e73d66fa05294bfecec0740c", size = 30440 }, - { url = "https://files.pythonhosted.org/packages/ef/37/f5ae29dcd1597f14b916fb63c1367edd32083616260c33efabd46238b3e2/openslide_python-1.4.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63a4c01dfc15ceebaf4cd1d14c97e3f4e6658ef1f83b003d7e4e85a1a1aad39", size = 33860 }, - { url = "https://files.pythonhosted.org/packages/4d/d7/d4e4bd454458f826c726d67b0c866f9c46f9906fa7c2a79552f8137c9e36/openslide_python-1.4.1-cp311-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f3015d4f591471d5c39fd7f853e8d3308eb29eff0e4be3938a8c9d97d0b72256", size = 33259 }, - { url = "https://files.pythonhosted.org/packages/1e/34/123c6f070e658c75d38ec24ab2846796d781a888c39f78ba54b01c931471/openslide_python-1.4.1-cp311-abi3-win_amd64.whl", hash = "sha256:57ec66edf3e8f22dd8712071227f2e256fa04a542c99d72bb211d00285ccf0a2", size = 32595 }, -] - [[package]] name = "overrides" version = "7.7.0" From 21f29abe835bfe632e267f94a24b01611db9ecfe Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 12:06:14 +0200 Subject: [PATCH 033/110] chore(secrets): properly use secrets --- src/aignostics/client/_authentication.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 2dd5de70..56f1e1df 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -10,7 +10,7 @@ import appdirs import jwt import requests -from pydantic import computed_field +from pydantic import SecretStr, computed_field from pydantic_settings import BaseSettings, SettingsConfigDict from requests_oauthlib import OAuth2Session @@ -31,8 +31,8 @@ class AuthenticationSettings(BaseSettings): model_config = SettingsConfigDict(env_prefix="", env_file=ENV_FILE, env_file_encoding="utf-8") - client_id_device: str - client_id_interactive: str + client_id_device: SecretStr + client_id_interactive: SecretStr scope: str redirect_uri: str audience: str @@ -40,7 +40,7 @@ class AuthenticationSettings(BaseSettings): token_url: str device_url: str jws_json_url: str - aignx_refresh_token: str | None = None + aignx_refresh_token: SecretStr | None = None @computed_field # type: ignore[prop-decorator] @property @@ -157,7 +157,7 @@ def _authenticate() -> str: AssertionError: If the returned token doesn't have the expected format. """ if refresh_token := authentication_settings().aignx_refresh_token: - token = _token_from_refresh_token(refresh_token) + token = _token_from_refresh_token(refresh_token.get_secret_value()) elif _can_open_browser(): token = _perform_authorization_code_with_pkce_flow() else: @@ -267,7 +267,7 @@ def _perform_authorization_code_with_pkce_flow() -> str: with _OAuthHttpServer((parsed_redirect.hostname, parsed_redirect.port), _OAuthHttpHandler) as httpd: # initialize flow (generate code_challenge and code_verifier) session = OAuth2Session( - authentication_settings().client_id_interactive, + authentication_settings().client_id_interactive.get_secret_value(), scope=authentication_settings().scope_elements, redirect_uri=authentication_settings().redirect_uri, pkce="S256", @@ -310,7 +310,7 @@ def _perform_device_flow() -> str | None: resp: dict[str, str] = requests.post( authentication_settings().device_url, data={ - "client_id": authentication_settings().client_id_device, + "client_id": authentication_settings().client_id_device.get_secret_value(), "scope": authentication_settings().scope_elements, "audience": authentication_settings().audience, }, @@ -328,7 +328,7 @@ def _perform_device_flow() -> str | None: data={ "grant_type": "urn:ietf:params:oauth:grant-type:device_code", "device_code": device_code, - "client_id": authentication_settings().client_id_device, + "client_id": authentication_settings().client_id_device.get_secret_value(), }, timeout=REQUEST_TIMEOUT_SECONDS, ).json() @@ -359,7 +359,7 @@ def _token_from_refresh_token(refresh_token: str) -> str | None: headers={"Accept": "application/json"}, data={ "grant_type": "refresh_token", - "client_id": authentication_settings().client_id_interactive, + "client_id": authentication_settings().client_id_interactive.get_secret_value, "refresh_token": refresh_token, }, timeout=REQUEST_TIMEOUT_SECONDS, From dafe45a932985262eec94a9563c4fa19b642612d Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 12:46:49 +0200 Subject: [PATCH 034/110] chore(auth): show settings, masked --- .github/workflows/test-and-report.yml | 4 +++- src/aignostics/cli.py | 7 +++++++ src/aignostics/client/__init__.py | 2 ++ src/aignostics/client/_authentication.py | 2 +- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index b492fde1..da1d9503 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -73,7 +73,9 @@ jobs: fi - name: Smoke tests - run: uv run --no-dev aignostics platform health + run: | + uv run --no-dev aignostics platform health + uv run --no-dev aignostics platform authentication-settings - name: Lint run: make lint diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index a295aef3..9515f7cc 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -9,6 +9,7 @@ import aignostics.client from . import APIVersion, InfoOutputFormat, OpenAPIOutputFormat, Platform, __version__ +from .client import authentication_settings as auth_settings from .utils import prepare_cli _console = Console() @@ -66,6 +67,12 @@ def info( _console.print(yaml.dump(info, default_flow_style=False), end="") +@platform_app.command("authentication-settings") +def authentication_settings() -> None: + """Print info about service configuration.""" + print(auth_settings().model_dump()) + + @platform_app.command("openapi") def openapi( api_version: Annotated[APIVersion, typer.Option(help="API Version", case_sensitive=False)] = APIVersion.V1, diff --git a/src/aignostics/client/__init__.py b/src/aignostics/client/__init__.py index b3c6a630..7587cf66 100644 --- a/src/aignostics/client/__init__.py +++ b/src/aignostics/client/__init__.py @@ -6,10 +6,12 @@ for all interactions with the Aignostics platform. """ +from aignostics.client._authentication import authentication_settings from aignostics.client._client import Client from aignostics.client.messages import AUTHENTICATION_FAILED __all__ = [ "AUTHENTICATION_FAILED", "Client", + "authentication_settings", ] diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 56f1e1df..8969e964 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -29,7 +29,7 @@ # Settings class AuthenticationSettings(BaseSettings): - model_config = SettingsConfigDict(env_prefix="", env_file=ENV_FILE, env_file_encoding="utf-8") + model_config = SettingsConfigDict(env_prefix="", env_file=ENV_FILE, env_file_encoding="utf-8", extra="ignore") client_id_device: SecretStr client_id_interactive: SecretStr From f1b1b56e4718a7dd18a807618ad8311cd873c510 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 12:51:07 +0200 Subject: [PATCH 035/110] fix(auth settings): on empty scope --- src/aignostics/client/_authentication.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 8969e964..1ae7a043 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -45,6 +45,8 @@ class AuthenticationSettings(BaseSettings): @computed_field # type: ignore[prop-decorator] @property def scope_elements(self) -> list[str]: + if not self.scope: + return [] return [element.strip() for element in self.scope.split(",")] From 8ba092130e93f57e2263bd9ad5c838c80bbb736d Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 13:08:24 +0200 Subject: [PATCH 036/110] chore(dev_env): trying to reverse engineer --- .github/workflows/test-and-report.yml | 2 +- src/aignostics/client/_authentication.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index da1d9503..728daac0 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -61,7 +61,7 @@ jobs: run: | echo "$CREDENTIALS" | base64 -d > credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV - echo "$DEV_ENV_FILE" | base64 -d > dev.env + echo "$DEV_ENV_FILE" > dev.env echo "ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV - name: Validate installation diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 1ae7a043..a3d1b5de 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -70,6 +70,9 @@ def authentication_settings() -> AuthenticationSettings: return __cached_authentication_settings +print(authentication_settings().scope_elements()) + + def get_token(use_cache: bool = True) -> str: """Retrieves an authentication token, either from cache or via login. From 28210a2bad1590a708df7cf71843d0d62417ea58 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 13:13:02 +0200 Subject: [PATCH 037/110] chore: debug --- .github/workflows/test-and-report.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 728daac0..fab7dc3d 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -61,8 +61,9 @@ jobs: run: | echo "$CREDENTIALS" | base64 -d > credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV - echo "$DEV_ENV_FILE" > dev.env + echo "$DEV_ENV_FILE" | base64 -d > dev.env echo "ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV + env - name: Validate installation run: | From 04f801179714a8de6dc62ff9936b324169f21be8 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 13:15:19 +0200 Subject: [PATCH 038/110] chore: debug --- .github/workflows/test-and-report.yml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index fab7dc3d..c2f284d5 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -24,6 +24,17 @@ jobs: with: fetch-depth: 0 + - name: Set up cloud credentials & environment file + env: + CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} + DEV_ENV_FILE: ${{ secrets.DEV_ENV_FILE }} + run: | + echo "$CREDENTIALS" | base64 -d > credentials.json + echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV + echo "$DEV_ENV_FILE" > dev.env + echo "ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV + env + - name: Install uv uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1 with: @@ -54,16 +65,7 @@ jobs: TOML_VERSION=$(uv run python -c "import tomli; print(tomli.load(open('pyproject.toml', 'rb'))['project']['version'])") echo "Development build - Current version in pyproject.toml: $TOML_VERSION" - - name: Set up cloud credentials & environment file - env: - CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} - DEV_ENV_FILE: ${{ secrets.DEV_ENV_FILE }} - run: | - echo "$CREDENTIALS" | base64 -d > credentials.json - echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV - echo "$DEV_ENV_FILE" | base64 -d > dev.env - echo "ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV - env + - name: Validate installation run: | From e90d9f71c925f71613e234beb671bb43607034d6 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 13:19:07 +0200 Subject: [PATCH 039/110] chore: debug --- src/aignostics/client/_authentication.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index a3d1b5de..b17f7734 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -29,7 +29,9 @@ # Settings class AuthenticationSettings(BaseSettings): - model_config = SettingsConfigDict(env_prefix="", env_file=ENV_FILE, env_file_encoding="utf-8", extra="ignore") + model_config = SettingsConfigDict( + env_prefix="AIGNOSTICS_", env_file=ENV_FILE, env_file_encoding="utf-8", extra="ignore" + ) client_id_device: SecretStr client_id_interactive: SecretStr @@ -40,7 +42,7 @@ class AuthenticationSettings(BaseSettings): token_url: str device_url: str jws_json_url: str - aignx_refresh_token: SecretStr | None = None + refresh_token: SecretStr | None = None @computed_field # type: ignore[prop-decorator] @property @@ -161,7 +163,7 @@ def _authenticate() -> str: RuntimeError: If authentication fails. AssertionError: If the returned token doesn't have the expected format. """ - if refresh_token := authentication_settings().aignx_refresh_token: + if refresh_token := authentication_settings().refresh_token: token = _token_from_refresh_token(refresh_token.get_secret_value()) elif _can_open_browser(): token = _perform_authorization_code_with_pkce_flow() From 8b566f95be2264e631957a80aaf37351ce282a9f Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 13:26:29 +0200 Subject: [PATCH 040/110] chore: debug --- .github/workflows/test-and-report.yml | 5 +---- src/aignostics/client/_authentication.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index c2f284d5..896ff9cb 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -7,9 +7,6 @@ on: pull_request: branches: [main] -env: - AIGNX_REFRESH_TOKEN: ${{ secrets.AIGNX_REFRESH_TOKEN }} - jobs: test: runs-on: ubuntu-latest @@ -31,7 +28,7 @@ jobs: run: | echo "$CREDENTIALS" | base64 -d > credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV - echo "$DEV_ENV_FILE" > dev.env + echo "$DEV_ENV_FILE" | base64 -d> dev.env echo "ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV env diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index b17f7734..64942053 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -72,7 +72,7 @@ def authentication_settings() -> AuthenticationSettings: return __cached_authentication_settings -print(authentication_settings().scope_elements()) +print(authentication_settings().scope_elements) def get_token(use_cache: bool = True) -> str: From 5d9182e9cfe53a21a1e5aad583d53fe8109eb341 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 13:27:59 +0200 Subject: [PATCH 041/110] chore: debug --- .github/workflows/test-and-report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 896ff9cb..5b10e6f7 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -28,7 +28,7 @@ jobs: run: | echo "$CREDENTIALS" | base64 -d > credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV - echo "$DEV_ENV_FILE" | base64 -d> dev.env + echo "$DEV_ENV_FILE" | base64 -d > dev.env echo "ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV env From 0e86b79dc7211ebdb8a316dc9810c65e5eaaaea6 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 13:33:32 +0200 Subject: [PATCH 042/110] chore: debug --- .github/workflows/test-and-report.yml | 2 +- src/aignostics/client/_authentication.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 5b10e6f7..a51ef5d4 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -29,7 +29,7 @@ jobs: echo "$CREDENTIALS" | base64 -d > credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV echo "$DEV_ENV_FILE" | base64 -d > dev.env - echo "ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV + echo "AIGNOSTICS_ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV env - name: Install uv diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 64942053..42f641d3 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -1,3 +1,4 @@ +import os import time import typing as t import webbrowser @@ -21,7 +22,7 @@ CACHE_DIR = appdirs.user_cache_dir(CLIENT_APP_NAME, "aignostics") TOKEN_FILE = Path(CACHE_DIR) / ".token" -ENV_FILE = Path.home() / ".aignostics/env" +ENV_FILE = os.getenv("AIGNOSTICS_ENV_FILE", Path.home() / ".aignostics/env") AUTHORIZATION_BACKOFF_SECONDS = 3 REQUEST_TIMEOUT_SECONDS = 30 From 09bbdf8fe67cbb6ad9cf52dd9553816a8e75c9cb Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 13:40:43 +0200 Subject: [PATCH 043/110] chore: debug --- .github/workflows/test-and-report.yml | 27 +++++++++++------------- .github/workflows/test-scheduled.yml | 2 +- src/aignostics/client/_authentication.py | 3 --- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index a51ef5d4..0d1065a9 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -21,17 +21,6 @@ jobs: with: fetch-depth: 0 - - name: Set up cloud credentials & environment file - env: - CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} - DEV_ENV_FILE: ${{ secrets.DEV_ENV_FILE }} - run: | - echo "$CREDENTIALS" | base64 -d > credentials.json - echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV - echo "$DEV_ENV_FILE" | base64 -d > dev.env - echo "AIGNOSTICS_ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV - env - - name: Install uv uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1 with: @@ -60,10 +49,8 @@ jobs: if: ${{ !startsWith(github.ref, 'refs/tags/v') }} run: | TOML_VERSION=$(uv run python -c "import tomli; print(tomli.load(open('pyproject.toml', 'rb'))['project']['version'])") - echo "Development build - Current version in pyproject.toml: $TOML_VERSION" - - - + echo "Development build - Current version in pyproject.toml: $TOML_VERSION" + - name: Validate installation run: | OUTPUT=$(uv run --no-dev aignostics --help) @@ -72,6 +59,16 @@ jobs: exit 1 fi + - name: Set up cloud credentials & environment file + env: + CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} + DEV_ENV_FILE: ${{ secrets.DEV_ENV_FILE }} + run: | + echo "$CREDENTIALS" | base64 -d > credentials.json + echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV + echo "$DEV_ENV_FILE" | base64 -d > dev.env + echo "AIGNOSTICS_ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV + - name: Smoke tests run: | uv run --no-dev aignostics platform health diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index 3b7f5f84..c1218630 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -34,7 +34,7 @@ jobs: echo "$CREDENTIALS" | base64 -d > credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV echo "$DEV_ENV_FILE" | base64 -d > dev.env - echo "ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV + echo "AIGNOSTICS_ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV - name: Run tests marked as scheduled run: make test_scheduled diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 42f641d3..de924f0d 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -73,9 +73,6 @@ def authentication_settings() -> AuthenticationSettings: return __cached_authentication_settings -print(authentication_settings().scope_elements) - - def get_token(use_cache: bool = True) -> str: """Retrieves an authentication token, either from cache or via login. From be949593a077b13c930f35dd7d571ef20b14841f Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 13:57:35 +0200 Subject: [PATCH 044/110] chore: debug --- .github/workflows/test-and-report.yml | 5 ++++- .github/workflows/test-scheduled.yml | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 0d1065a9..01b25bc3 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -7,6 +7,9 @@ on: pull_request: branches: [main] +env: + AIGNX_REFRESH_TOKEN: ${{ secrets.AIGNX_REFRESH_TOKEN }} + jobs: test: runs-on: ubuntu-latest @@ -68,7 +71,7 @@ jobs: echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV echo "$DEV_ENV_FILE" | base64 -d > dev.env echo "AIGNOSTICS_ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV - + - name: Smoke tests run: | uv run --no-dev aignostics platform health diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index c1218630..f69a8962 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -37,4 +37,6 @@ jobs: echo "AIGNOSTICS_ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV - name: Run tests marked as scheduled + env: + AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNX_REFRESH_TOKEN }} run: make test_scheduled From 44e230a9e6a0a357c4f7c00f62d8692bf9c24b61 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 13:57:43 +0200 Subject: [PATCH 045/110] chore: debug --- .github/workflows/test-and-report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 01b25bc3..fbc98c01 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -8,7 +8,7 @@ on: branches: [main] env: - AIGNX_REFRESH_TOKEN: ${{ secrets.AIGNX_REFRESH_TOKEN }} + AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNX_REFRESH_TOKEN }} jobs: test: From 5fa83562b7a15682c1d92d0114c3f1aa0fbcaa25 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 14:03:43 +0200 Subject: [PATCH 046/110] chore: debug --- src/aignostics/client/_authentication.py | 2 ++ src/aignostics/client/_client.py | 6 ++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index de924f0d..7e85e9c7 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -34,6 +34,7 @@ class AuthenticationSettings(BaseSettings): env_prefix="AIGNOSTICS_", env_file=ENV_FILE, env_file_encoding="utf-8", extra="ignore" ) + api_root: str client_id_device: SecretStr client_id_interactive: SecretStr scope: str @@ -161,6 +162,7 @@ def _authenticate() -> str: RuntimeError: If authentication fails. AssertionError: If the returned token doesn't have the expected format. """ + print(authentication_settings().refresh_token) if refresh_token := authentication_settings().refresh_token: token = _token_from_refresh_token(refresh_token.get_secret_value()) elif _can_open_browser(): diff --git a/src/aignostics/client/_client.py b/src/aignostics/client/_client.py index 074d245b..09c92365 100644 --- a/src/aignostics/client/_client.py +++ b/src/aignostics/client/_client.py @@ -1,5 +1,3 @@ -import os - from aignx.codegen.api.externals_api import ExternalsApi from aignx.codegen.api_client import ApiClient from aignx.codegen.configuration import Configuration @@ -8,7 +6,7 @@ from aignostics.client.resources.applications import Applications, Versions from aignostics.client.resources.runs import Runs -API_ROOT = os.getenv("API_ROOT", "https://platform.aignostics.com") +from ._authentication import authentication_settings class Client: @@ -49,7 +47,7 @@ def get_api_client(cache_token: bool = True) -> ExternalsApi: token = get_token(use_cache=cache_token) client = ApiClient( Configuration( - host=API_ROOT, + host=authentication_settings().api_root, ), header_name="Authorization", header_value=f"Bearer {token}", From d3017a0b6c3b8fb74ffec8cb010feeb27c787504 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 14:08:29 +0200 Subject: [PATCH 047/110] chore: debug --- src/aignostics/client/_authentication.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 7e85e9c7..21172450 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -162,7 +162,6 @@ def _authenticate() -> str: RuntimeError: If authentication fails. AssertionError: If the returned token doesn't have the expected format. """ - print(authentication_settings().refresh_token) if refresh_token := authentication_settings().refresh_token: token = _token_from_refresh_token(refresh_token.get_secret_value()) elif _can_open_browser(): From e44a5d8defd4c3a5b4ba3ddc59f4e7c5c42a8eb2 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 14:17:49 +0200 Subject: [PATCH 048/110] chore: debug --- .github/workflows/test-and-report.yml | 2 +- .github/workflows/test-scheduled.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index fbc98c01..79b3ce50 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -8,7 +8,7 @@ on: branches: [main] env: - AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNX_REFRESH_TOKEN }} + AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} jobs: test: diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index f69a8962..42aa4191 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -38,5 +38,5 @@ jobs: - name: Run tests marked as scheduled env: - AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNX_REFRESH_TOKEN }} + AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} run: make test_scheduled From e4653dd1d46017ba9fdb2a7d23d1b26dfae40470 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 14:26:32 +0200 Subject: [PATCH 049/110] docs: no epilog in cli reference --no-verify --- ATTRIBUTIONS.md | 3267 ++++++++++++++++++----------------- CLI_REFERENCE.md | 175 +- src/aignostics/utils/cli.py | 6 +- 3 files changed, 1779 insertions(+), 1669 deletions(-) diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index 400a7932..b6d783f5 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -870,7 +870,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## argcomplete (3.6.0) - Apache Software License +## argcomplete (3.6.2) - Apache Software License Bash tab completion for argparse @@ -2031,7 +2031,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## boolean.py (4.0) - BSD-2-Clause +## boolean.py (5.0) - BSD-2-Clause Define boolean algebras, create and parse boolean expressions and create custom boolean DSL. @@ -2067,154 +2067,608 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## bracex (2.5.post1) - MIT License +## boto3 (1.37.28) - Apache Software License -Bash style brace expander. +The AWS SDK for Python -* URL: https://github.com/facelessuser/bracex -* Author(s): Isaac Muse +* URL: https://github.com/boto/boto3 +* Author(s): Amazon Web Services ### License Text ``` -MIT License - -Copyright (c) 2018 - 2024 Isaac Muse - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -``` + 1. Definitions. -## bump-my-version (1.1.1) - MIT License + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -Version bump your Python project + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -* URL: https://github.com/callowayproject/bump-my-version -* Author(s): Corey Oordt + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -### License Text + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -``` -MIT License + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -Copyright (c) 2013-2014 Filip Noetzel + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -``` + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -## cachetools (5.5.2) - MIT License + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -Extensible memoizing collections and decorators + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -* URL: https://github.com/tkem/cachetools/ -* Author(s): Thomas Kemmer + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -### License Text + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -``` -The MIT License (MIT) + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -Copyright (c) 2014-2025 Thomas Kemmer + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -``` + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -## certifi (2025.1.31) - Mozilla Public License 2.0 (MPL 2.0) + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -Python package for providing Mozilla's CA Bundle. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -* URL: https://github.com/certifi/python-certifi -* Author(s): Kenneth Reitz + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -### License Text + END OF TERMS AND CONDITIONS ``` -This package contains a modified version of ca-bundle.crt: - -ca-bundle.crt -- Bundle of CA Root Certificates - -This is a bundle of X.509 certificates of public Certificate Authorities -(CA). These were automatically extracted from Mozilla's root certificates -file (certdata.txt). This file can be found in the mozilla source tree: -https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt -It contains the certificates in PEM format and therefore -can be directly used with curl / libcurl / php_curl, or with -an Apache+mod_ssl webserver for SSL client authentication. -Just configure this file as the SSLCACertificateFile.# -***** BEGIN LICENSE BLOCK ***** -This Source Code Form is subject to the terms of the Mozilla Public License, -v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain -one at http://mozilla.org/MPL/2.0/. +### Notice -***** END LICENSE BLOCK ***** -@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ +``` +boto3 +Copyright 2013-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. ``` -## cffi (1.17.1) - MIT License +## botocore (1.37.28) - Apache Software License -Foreign Function Interface for Python calling C code. +Low-level, data-driven core of boto 3. -* URL: http://cffi.readthedocs.org -* Author(s): Armin Rigo, Maciej Fijalkowski +* URL: https://github.com/boto/botocore +* Author(s): Amazon Web Services ### License Text ``` -Except when otherwise stated (look for LICENSE files in directories or -information at the beginning of each file) all software and -documentation is licensed as follows: + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + +``` + +### Notice + +``` +Botocore +Copyright 2012-2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +---- + +Botocore includes vendorized parts of the requests python library for backwards compatibility. + +Requests License +================ + +Copyright 2013 Kenneth Reitz + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Botocore includes vendorized parts of the urllib3 library for backwards compatibility. + +Urllib3 License +=============== + +This is the MIT license: http://www.opensource.org/licenses/mit-license.php + +Copyright 2008-2011 Andrey Petrov and contributors (see CONTRIBUTORS.txt), +Modifications copyright 2012 Kenneth Reitz. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +Bundle of CA Root Certificates +============================== + +***** BEGIN LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the +Mozilla Public License, v. 2.0. If a copy of the MPL +was not distributed with this file, You can obtain +one at http://mozilla.org/MPL/2.0/. + +***** END LICENSE BLOCK ***** + +``` + +## bracex (2.5.post1) - MIT License + +Bash style brace expander. + +* URL: https://github.com/facelessuser/bracex +* Author(s): Isaac Muse + +### License Text + +``` +MIT License + +Copyright (c) 2018 - 2024 Isaac Muse + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## bump-my-version (1.1.1) - MIT License + +Version bump your Python project + +* URL: https://github.com/callowayproject/bump-my-version +* Author(s): Corey Oordt + +### License Text + +``` +MIT License + +Copyright (c) 2013-2014 Filip Noetzel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## cachetools (5.5.2) - MIT License + +Extensible memoizing collections and decorators + +* URL: https://github.com/tkem/cachetools/ +* Author(s): Thomas Kemmer + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2014-2025 Thomas Kemmer + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + +## certifi (2025.1.31) - Mozilla Public License 2.0 (MPL 2.0) + +Python package for providing Mozilla's CA Bundle. + +* URL: https://github.com/certifi/python-certifi +* Author(s): Kenneth Reitz + +### License Text + +``` +This package contains a modified version of ca-bundle.crt: + +ca-bundle.crt -- Bundle of CA Root Certificates + +This is a bundle of X.509 certificates of public Certificate Authorities +(CA). These were automatically extracted from Mozilla's root certificates +file (certdata.txt). This file can be found in the mozilla source tree: +https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt +It contains the certificates in PEM format and therefore +can be directly used with curl / libcurl / php_curl, or with +an Apache+mod_ssl webserver for SSL client authentication. +Just configure this file as the SSLCACertificateFile.# + +***** BEGIN LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public License, +v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain +one at http://mozilla.org/MPL/2.0/. + +***** END LICENSE BLOCK ***** +@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ + +``` + +## cffi (1.17.1) - MIT License + +Foreign Function Interface for Python calling C code. + +* URL: http://cffi.readthedocs.org +* Author(s): Armin Rigo, Maciej Fijalkowski + +### License Text + +``` + +Except when otherwise stated (look for LICENSE files in directories or +information at the beginning of each file) all software and +documentation is licensed as follows: The MIT License @@ -3021,12 +3475,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## coverage (7.7.0) - Apache Software License +## coverage (7.8.0) - Apache-2.0 Code coverage measurement for Python * URL: https://github.com/nedbat/coveragepy -* Author(s): Ned Batchelder and 236 others +* Author(s): Ned Batchelder and 237 others ### License Text @@ -3211,6 +3665,22 @@ Code coverage measurement for Python ``` +## cryptography (44.0.2) - Apache Software License; BSD License + +cryptography is a package which provides cryptographic recipes and primitives to Python developers. + +* URL: https://github.com/pyca/cryptography +* Author(s): The cryptography developers + +### License Text + +``` +This software is made available under the terms of *either* of the licenses +found in LICENSE.APACHE or LICENSE.BSD. Contributions to cryptography are made +under the terms of *both* these licenses. + +``` + ## cssutils (2.11.1) - GNU Library or Lesser General Public License (LGPL) A CSS Cascading Style Sheets library for Python @@ -4592,54 +5062,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` -## dnspython (2.7.0) - ISC License (ISCL) - -DNS toolkit - -* URL: https://www.dnspython.org -* Author(s): Bob Halley - -### License Text - -``` -ISC License - -Copyright (C) Dnspython Contributors - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all -copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR -PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - - - -Copyright (C) 2001-2017 Nominum, Inc. -Copyright (C) Google Inc. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose with or without fee is hereby granted, -provided that the above copyright notice and this permission notice -appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -``` - ## docutils (0.21.2) - BSD License; GNU General Public License (GPL); Public Domain; Python Software Foundation License Docutils -- Python Documentation Utilities @@ -4845,46 +5267,6 @@ OR OTHER DEALINGS IN THE SOFTWARE. ``` -## email_validator (2.2.0) - The Unlicense (Unlicense) - -A robust email address syntax and deliverability validation library. - -* URL: https://github.com/JoshData/python-email-validator -* Author(s): Joshua Tauberer - -### License Text - -``` -This is free and unencumbered software released into the public -domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a -compiled binary, for any purpose, commercial or non-commercial, -and by any means. - -In jurisdictions that recognize copyright laws, the author or -authors of this software dedicate any and all copyright -interest in the software to the public domain. We make this -dedication for the benefit of the public at large and to the -detriment of our heirs and successors. We intend this -dedication to be an overt act of relinquishment in perpetuity -of all present and future rights to this software under -copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -For more information, please refer to - -``` - ## enum-tools (0.12.0) - GNU Lesser General Public License v3 or later (LGPLv3+) Tools to expand Python's enum module. @@ -5055,126 +5437,58 @@ received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. - -``` - -## execnet (2.1.1) - MIT License - -execnet: rapid multi-Python deployment - -* URL: https://execnet.readthedocs.io/en/latest/ -* Author(s): holger krekel and others - -### License Text - -``` - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - -``` - -## executing (2.2.0) - MIT License - -Get the currently executing AST node of a frame, and other information - -* URL: https://github.com/alexmojaki/executing -* Author(s): Alex Hall - -### License Text - -``` -MIT License - -Copyright (c) 2019 Alex Hall - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. ``` -## fastapi (0.115.12) - MIT License +## execnet (2.1.1) - MIT License -FastAPI framework, high performance, easy to learn, fast to code, ready for production +execnet: rapid multi-Python deployment -* URL: https://github.com/fastapi/fastapi -* Author(s): =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= +* URL: https://execnet.readthedocs.io/en/latest/ +* Author(s): holger krekel and others ### License Text ``` -The MIT License (MIT) - -Copyright (c) 2018 Sebastián Ramírez -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. ``` -## fastapi-cli (0.0.7) - MIT License +## executing (2.2.0) - MIT License -Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀 +Get the currently executing AST node of a frame, and other information -* URL: https://github.com/fastapi/fastapi-cli -* Author(s): =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= +* URL: https://github.com/alexmojaki/executing +* Author(s): Alex Hall ### License Text ``` -The MIT License (MIT) +MIT License -Copyright (c) 2024 Sebastián Ramírez +Copyright (c) 2019 Alex Hall Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -5183,16 +5497,16 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` @@ -5273,7 +5587,7 @@ For more information, please refer to ``` -## fonttools (4.56.0) - MIT License +## fonttools (4.57.0) - MIT License Tools to manipulate font files @@ -7400,40 +7714,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## httptools (0.6.4) - MIT License - -A collection of framework independent HTTP protocol utils. - -* URL: https://github.com/MagicStack/httptools -* Author(s): Yury Selivanov - -### License Text - -``` -The MIT License - -Copyright (c) 2015 MagicStack Inc. http://magic.io - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -``` - ## httpx (0.28.1) - BSD License The next generation HTTP client. @@ -7886,6 +8166,39 @@ THE SOFTWARE. ``` +## jmespath (1.0.1) - MIT License + +JSON Matching Expressions + +* URL: https://github.com/jmespath/jmespath.py +* Author(s): James Saryerwinnie + +### License Text + +``` +Copyright (c) 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, dis- +tribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the fol- +lowing conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- +ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +``` + ## jsf (0.11.2) - MIT License Creates fake JSON files from a JSON schema @@ -7921,7 +8234,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## json5 (0.10.0) - Apache Software License +## json5 (0.12.0) - Apache Software License A Python implementation of the JSON5 data format. @@ -9228,7 +9541,7 @@ license-expression is a comprehensive utility library to parse, compare, simplif ``` -## lxml (5.3.1) - BSD License +## lxml (5.3.2) - BSD License Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. @@ -9271,7 +9584,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## marimo (0.12.2) - Apache Software License +## marimo (0.12.4) - Apache Software License A library for making reactive notebooks and apps @@ -10099,7 +10412,7 @@ DEALINGS IN THE SOFTWARE. ``` -## narwhals (1.31.0) - MIT License +## narwhals (1.33.0) - MIT License Extremely lightweight compatibility layer between dataframe libraries @@ -11606,315 +11919,101 @@ the "copyright" line and a pointer to where the full notice is found. (at your option) any later version. This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. - -Name: libquadmath -Files: numpy/.dylibs/libquadmath*.so -Description: dynamically linked to files compiled with gcc -Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libquadmath -License: LGPL-2.1-or-later - - GCC Quad-Precision Math Library - Copyright (C) 2010-2019 Free Software Foundation, Inc. - Written by Francois-Xavier Coudert - - This file is part of the libquadmath library. - Libquadmath is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - Libquadmath is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html - -``` - -## oauthlib (3.2.2) - BSD License - -A generic, spec-compliant, thorough implementation of the OAuth request-signing logic - -* URL: https://github.com/oauthlib/oauthlib -* Author(s): The OAuthlib Community -* Maintainer(s): Ib Lundgren - -### License Text - -``` -Copyright (c) 2019 The OAuthlib Community -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of this project nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -``` - -## orjson (3.10.15) - Apache Software License; MIT License - -Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy - -* URL: https://github.com/ijl/orjson -* Author(s): ijl - -### License Text - -``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." + You should have received a copy of the GNU General Public License + along with this program. If not, see . - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +Also add information on how to contact you by electronic and paper mail. -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +Name: libquadmath +Files: numpy/.dylibs/libquadmath*.so +Description: dynamically linked to files compiled with gcc +Availability: https://gcc.gnu.org/git/?p=gcc.git;a=tree;f=libquadmath +License: LGPL-2.1-or-later - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. + GCC Quad-Precision Math Library + Copyright (C) 2010-2019 Free Software Foundation, Inc. + Written by Francois-Xavier Coudert - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. + This file is part of the libquadmath library. + Libquadmath is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. + Libquadmath is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +``` -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +## oauthlib (3.2.2) - BSD License -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +A generic, spec-compliant, thorough implementation of the OAuth request-signing logic -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +* URL: https://github.com/oauthlib/oauthlib +* Author(s): The OAuthlib Community +* Maintainer(s): Ib Lundgren -END OF TERMS AND CONDITIONS +### License Text -APPENDIX: How to apply the Apache License to your work. +``` +Copyright (c) 2019 The OAuthlib Community +All rights reserved. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -Copyright [yyyy] [name of copyright owner] + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. - http://www.apache.org/licenses/LICENSE-2.0 + 3. Neither the name of this project nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` @@ -15498,7 +15597,7 @@ THE SOFTWARE. ``` -## prettytable (3.15.1) - UNKNOWN +## prettytable (3.16.0) - UNKNOWN A simple Python library for easily displaying tabular data in a visually appealing ASCII table format @@ -18902,7 +19001,7 @@ SOFTWARE. ``` -## pydantic (2.11.1) - MIT License +## pydantic (2.11.2) - MIT License Data validation using Python type hints @@ -18936,40 +19035,6 @@ SOFTWARE. ``` -## pydantic-extra-types (2.10.3) - MIT License - -Extra Pydantic types. - -* URL: https://github.com/pydantic/pydantic-extra-types -* Author(s): Samuel Colvin , Yasser Tahiri - -### License Text - -``` -The MIT License (MIT) - -Copyright (c) 2023 Samuel Colvin and other contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - ## pydantic-settings (2.8.1) - MIT License Settings management using Pydantic @@ -19004,7 +19069,7 @@ SOFTWARE. ``` -## pydantic_core (2.33.0) - MIT License +## pydantic_core (2.33.1) - MIT License Core functionality for Pydantic validation and serialization @@ -19190,7 +19255,7 @@ Complete Legal Terms: http://opensource.org/licenses/MIT ``` -## pyparsing (3.0.9) - MIT License +## pyparsing (3.2.3) - MIT License pyparsing module - Classes and methods to define and execute parsing grammars @@ -19504,7 +19569,7 @@ Apache License ``` -## pytest-cov (6.1.0) - MIT License +## pytest-cov (6.1.1) - MIT License Pytest plugin for measuring coverage. @@ -19914,38 +19979,11 @@ This software includes the following licenced software: - mkdocstrings-python Copyright (c) 2021, Timothée Mazzucotelli Licenced under ISC Licence - Source: https://github.com/mkdocstrings/python - -``` - -## python-multipart (0.0.20) - Apache Software License - -A streaming multipart parser for Python - -* URL: https://github.com/Kludex/python-multipart -* Author(s): Andrew Dunham , Marcelo Trylesinski - -### License Text - -``` -Copyright 2012, Andrew Dunham - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - + Source: https://github.com/mkdocstrings/python ``` -## pytz (2025.1) - MIT License +## pytz (2025.2) - MIT License World timezone definitions, modern and historical @@ -19978,7 +20016,7 @@ DEALINGS IN THE SOFTWARE. ``` -## pyzmq (26.3.0) - BSD License +## pyzmq (26.4.0) - BSD License Python bindings for 0MQ @@ -20429,7 +20467,7 @@ SOFTWARE. ``` -## rich (13.9.4) - MIT License +## rich (14.0.0) - MIT License Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal @@ -20496,39 +20534,6 @@ SOFTWARE. ``` -## rich-toolkit (0.13.2) - MIT License - -Rich toolkit for building command-line applications - -* URL: UNKNOWN - -### License Text - -``` -MIT License - -Copyright (c) 2024 Patrick Arminio - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - ## roman-numerals-py (3.1.0) - CC0 1.0 Universal (CC0 1.0) Public Domain Dedication; Zero-Clause BSD (0BSD) Manipulate well-formed Roman numerals @@ -20688,7 +20693,7 @@ d. Affirmer understands and acknowledges that Creative Commons is not a ``` -## rpds-py (0.23.1) - MIT +## rpds-py (0.24.0) - MIT Python bindings to Rust's persistent data structures (rpds) @@ -20821,7 +20826,7 @@ ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of com ``` -## ruff (0.11.2) - MIT License +## ruff (0.11.4) - MIT License An extremely fast Python linter and code formatter, written in Rust. @@ -22169,70 +22174,293 @@ are: shall be included in all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF - ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED - TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A - PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT - SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR - IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - """ + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF + ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED + TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT + SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR + IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + """ + +- rome/tools, licensed under the MIT license: + """ + MIT License + + Copyright (c) Rome Tools, Inc. and its affiliates. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + """ + +- pydoclint, licensed as follows: + """ + MIT License + + Copyright (c) 2023 jsh9 + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + """ + +``` + +## s3transfer (0.11.4) - Apache Software License + +An Amazon S3 Transfer Manager + +* URL: https://github.com/boto/s3transfer +* Author(s): Amazon Web Services + +### License Text + +``` + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -- rome/tools, licensed under the MIT license: - """ - MIT License + END OF TERMS AND CONDITIONS - Copyright (c) Rome Tools, Inc. and its affiliates. + APPENDIX: How to apply the Apache License to your work. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. + Copyright [yyyy] [name of copyright owner] - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - """ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -- pydoclint, licensed as follows: - """ - MIT License + http://www.apache.org/licenses/LICENSE-2.0 - Copyright (c) 2023 jsh9 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +``` - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. +### Notice - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - """ +``` +s3transfer +Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. ``` -## setuptools (77.0.3) - MIT License +## setuptools (78.1.0) - MIT License Easily download, build, install, upgrade, and uninstall Python packages @@ -23015,208 +23243,459 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## sphinxcontrib-qthelp (2.0.0) - BSD License +## sphinxcontrib-qthelp (2.0.0) - BSD License + +sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents + +* URL: https://www.sphinx-doc.org/ +* Author(s): Georg Brandl + +## sphinxcontrib-serializinghtml (2.0.0) - BSD License + +sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) + +* URL: https://www.sphinx-doc.org/ +* Author(s): Georg Brandl + +## sphinxext-opengraph (0.10.0) - UNKNOWN + +Sphinx Extension to enable OGP support + +* URL: https://github.com/sphinx-doc/sphinxext-opengraph/ +* Author(s): Itay Ziv + +### License Text + +``` +Copyright (c) 2020, FIRST +Copyright (c) 2025, the Sphinx developers +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of the FIRST nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY FIRST AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY NONINFRINGEMENT AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL FIRST OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## stack-data (0.6.3) - MIT License + +Extract data from python stack frames and tracebacks for informative displays + +* URL: http://github.com/alexmojaki/stack_data +* Author(s): Alex Hall + +### License Text + +``` +MIT License + +Copyright (c) 2019 Alex Hall + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## standard-imghdr (3.10.14) - Python Software Foundation License + +Standard library imghdr redistribution. "dead battery". + +* URL: https://github.com/youknowone/python-deadlib +* Author(s): Python Devleopers + +### License Text + +``` +Copyright © 2001-2023 Python Software Foundation; All Rights Reserved + +This code originally taken from the Python 3.11.3 distribution +and it is therefore now released under the following Python-style +license: + +1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and + the Individual or Organization ("Licensee") accessing and + otherwise using nntplib software in source or binary form and + its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby + grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, + analyze, test, perform and/or display publicly, prepare derivative works, + distribute, and otherwise use nntplib alone or in any derivative + version, provided, however, that PSF's License Agreement and PSF's notice of + copyright, i.e., "Copyright © 2001-2023 Python Software Foundation; All Rights + Reserved" are retained in nntplib alone or in any derivative version + prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on or + incorporates nntplib or any part thereof, and wants to make the + derivative work available to others as provided herein, then Licensee hereby + agrees to include in any such work a brief summary of the + changes made to nntplib. + +4. PSF is making nntplib available to Licensee on an "AS IS" basis. + PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF + EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR + WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE + USE OF NNTPLIB WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF NNTPLIB + FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF + MODIFYING, DISTRIBUTING, OR OTHERWISE USING NNTPLIB, OR ANY DERIVATIVE + THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material breach of + its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any relationship + of agency, partnership, or joint venture between PSF and Licensee. This License + Agreement does not grant permission to use PSF trademarks or trade name in a + trademark sense to endorse or promote products or services of Licensee, or any + third party. + +8. By copying, installing or otherwise using nntplib, Licensee agrees + to be bound by the terms and conditions of this License Agreement. + +``` + +## starlette (0.46.1) - BSD License + +The little ASGI library that shines. + +* URL: https://github.com/encode/starlette +* Author(s): Tom Christie + +### License Text + +``` +Copyright © 2018, [Encode OSS Ltd](https://www.encode.io/). +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## streamlit (1.44.1) - Apache Software License -sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +A faster way to build and share data apps -* URL: https://www.sphinx-doc.org/ -* Author(s): Georg Brandl +* URL: https://streamlit.io +* Author(s): Snowflake Inc -## sphinxcontrib-serializinghtml (2.0.0) - BSD License +## swagger-plugin-for-sphinx (5.1.0) - Apache Software License -sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +Sphinx plugin which renders a OpenAPI specification with Swagger -* URL: https://www.sphinx-doc.org/ -* Author(s): Georg Brandl +* URL: https://github.com/SAP/swagger-plugin-for-sphinx/blob/main/CHANGELOG.md +* Author(s): Kai Harder -## sphinxext-opengraph (0.9.1) - BSD License +### License Text -Sphinx Extension to enable OGP support +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -* URL: https://github.com/wpilibsuite/sphinxext-opengraph -* Author(s): Itay Ziv + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -### License Text + 1. Definitions. -``` -Copyright (c) 2020 FIRST -All rights reserved. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the FIRST nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -THIS SOFTWARE IS PROVIDED BY FIRST AND CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY NONINFRINGEMENT AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL FIRST OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -``` + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -## stack-data (0.6.3) - MIT License + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -Extract data from python stack frames and tracebacks for informative displays + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -* URL: http://github.com/alexmojaki/stack_data -* Author(s): Alex Hall + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -### License Text + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -``` -MIT License + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -Copyright (c) 2019 Alex Hall + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -``` + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: -## standard-imghdr (3.10.14) - Python Software Foundation License + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -Standard library imghdr redistribution. "dead battery". + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -* URL: https://github.com/youknowone/python-deadlib -* Author(s): Python Devleopers + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -### License Text + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -``` -Copyright © 2001-2023 Python Software Foundation; All Rights Reserved + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -This code originally taken from the Python 3.11.3 distribution -and it is therefore now released under the following Python-style -license: + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and - the Individual or Organization ("Licensee") accessing and - otherwise using nntplib software in source or binary form and - its associated documentation. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -2. Subject to the terms and conditions of this License Agreement, PSF hereby - grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, - analyze, test, perform and/or display publicly, prepare derivative works, - distribute, and otherwise use nntplib alone or in any derivative - version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright © 2001-2023 Python Software Foundation; All Rights - Reserved" are retained in nntplib alone or in any derivative version - prepared by Licensee. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -3. In the event Licensee prepares a derivative work that is based on or - incorporates nntplib or any part thereof, and wants to make the - derivative work available to others as provided herein, then Licensee hereby - agrees to include in any such work a brief summary of the - changes made to nntplib. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS -4. PSF is making nntplib available to Licensee on an "AS IS" basis. - PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF - EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR - WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE - USE OF NNTPLIB WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + APPENDIX: How to apply the Apache License to your work. -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF NNTPLIB - FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF - MODIFYING, DISTRIBUTING, OR OTHERWISE USING NNTPLIB, OR ANY DERIVATIVE - THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -6. This License Agreement will automatically terminate upon a material breach of - its terms and conditions. + Copyright [yyyy] [name of copyright owner] -7. Nothing in this License Agreement shall be deemed to create any relationship - of agency, partnership, or joint venture between PSF and Licensee. This License - Agreement does not grant permission to use PSF trademarks or trade name in a - trademark sense to endorse or promote products or services of Licensee, or any - third party. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -8. By copying, installing or otherwise using nntplib, Licensee agrees - to be bound by the terms and conditions of this License Agreement. + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## starlette (0.46.1) - BSD License +## tabulate (0.9.0) - MIT License -The little ASGI library that shines. +Pretty-print tabular data -* URL: https://github.com/encode/starlette -* Author(s): Tom Christie +* URL: https://github.com/astanin/python-tabulate +* Author(s): Sergey Astanin ### License Text ``` -Copyright © 2018, [Encode OSS Ltd](https://www.encode.io/). -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +Copyright (c) 2011-2020 Sergey Astanin and contributors -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## streamlit (1.44.1) - Apache Software License - -A faster way to build and share data apps - -* URL: https://streamlit.io -* Author(s): Snowflake Inc - -## swagger-plugin-for-sphinx (5.1.0) - Apache Software License +## tenacity (9.1.2) - Apache Software License -Sphinx plugin which renders a OpenAPI specification with Swagger +Retry code until it succeeds -* URL: https://github.com/SAP/swagger-plugin-for-sphinx/blob/main/CHANGELOG.md -* Author(s): Kai Harder +* URL: https://github.com/jd/tenacity +* Author(s): Julien Danjou ### License Text ``` + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -23392,46 +23871,201 @@ Sphinx plugin which renders a OpenAPI specification with Swagger incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - END OF TERMS AND CONDITIONS + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +## terminado (0.18.1) - BSD License + +Tornado websocket backend for the Xterm.js Javascript terminal emulator library. + +* URL: https://github.com/jupyter/terminado +* Author(s): Jupyter Development Team + +### License Text + +``` +BSD 2-Clause License + +- Copyright (c) 2014-, Jupyter development team +- Copyright (c) 2014, Ramalingam Saravanan + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## tinycss2 (1.4.0) - BSD License + +A tiny CSS parser + +* URL: https://www.courtbouillon.org/tinycss2 +* Author(s): Simon Sapin +* Maintainer(s): CourtBouillon + +### License Text + +``` +BSD 3-Clause License + +Copyright (c) 2013-2020, Simon Sapin and contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## toml (0.10.2) - MIT License + +Python Library for Tom's Obvious, Minimal Language + +* URL: https://github.com/uiri/toml +* Author(s): William Pearson + +### License Text + +``` +The MIT License + +Copyright 2013-2019 William Pearson +Copyright 2015-2016 Julien Enselme +Copyright 2016 Google Inc. +Copyright 2017 Samuel Vasko +Copyright 2017 Nate Prewitt +Copyright 2017 Jack Evans +Copyright 2019 Filippo Broggini + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +## tomli (2.2.1) - MIT License + +A lil' TOML parser + +* URL: https://github.com/hukkin/tomli +* Author(s): Taneli Hukkinen - APPENDIX: How to apply the Apache License to your work. +### License Text - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +``` +MIT License - Copyright [yyyy] [name of copyright owner] +Copyright (c) 2021 Taneli Hukkinen - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` -## tabulate (0.9.0) - MIT License +## tomlkit (0.13.2) - MIT License -Pretty-print tabular data +Style preserving TOML library -* URL: https://github.com/astanin/python-tabulate -* Author(s): Sergey Astanin +* URL: https://github.com/sdispater/tomlkit +* Author(s): Sébastien Eustace ### License Text ``` -Copyright (c) 2011-2020 Sergey Astanin and contributors +Copyright (c) 2018 Sébastien Eustace Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -23454,12 +24088,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## tenacity (9.0.0) - Apache Software License +## tornado (6.4.2) - Apache Software License -Retry code until it succeeds +Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. -* URL: https://github.com/jd/tenacity -* Author(s): Julien Danjou +* URL: http://www.tornadoweb.org/ +* Author(s): Facebook ### License Text @@ -23666,77 +24300,100 @@ Retry code until it succeeds WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + ``` -## terminado (0.18.1) - BSD License +## tqdm (4.67.1) - MIT License; Mozilla Public License 2.0 (MPL 2.0) -Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +Fast, Extensible Progress Meter -* URL: https://github.com/jupyter/terminado -* Author(s): Jupyter Development Team +* URL: https://tqdm.github.io +* Maintainer(s): tqdm developers ### License Text ``` -BSD 2-Clause License +`tqdm` is a product of collaborative work. +Unless otherwise stated, all authors (see commit logs) retain copyright +for their respective work, and release the work under the MIT licence +(text below). -- Copyright (c) 2014-, Jupyter development team -- Copyright (c) 2014, Ramalingam Saravanan +Exceptions or notable authors are listed below +in reverse chronological order: -All rights reserved. +* files: * + MPL-2.0 2015-2024 (c) Casper da Costa-Luis + [casperdcl](https://github.com/casperdcl). +* files: tqdm/_tqdm.py + MIT 2016 (c) [PR #96] on behalf of Google Inc. +* files: tqdm/_tqdm.py README.rst .gitignore + MIT 2013 (c) Noam Yorav-Raphael, original author. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +[PR #96]: https://github.com/tqdm/tqdm/pull/96 -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +Mozilla Public Licence (MPL) v. 2.0 - Exhibit A +----------------------------------------------- -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +This Source Code Form is subject to the terms of the +Mozilla Public License, v. 2.0. +If a copy of the MPL was not distributed with this project, +You can obtain one at https://mozilla.org/MPL/2.0/. + + +MIT License (MIT) +----------------- + +Copyright (c) 2013 noamraph + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## tinycss2 (1.4.0) - BSD License +## traitlets (5.14.3) - BSD License -A tiny CSS parser +Traitlets Python configuration system -* URL: https://www.courtbouillon.org/tinycss2 -* Author(s): Simon Sapin -* Maintainer(s): CourtBouillon +* URL: https://github.com/ipython/traitlets +* Author(s): IPython Development Team ### License Text ``` BSD 3-Clause License -Copyright (c) 2013-2020, Simon Sapin and contributors. +- Copyright (c) 2001-, IPython Development Team + All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -23751,25 +24408,19 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## toml (0.10.2) - MIT License +## typer (0.15.2) - MIT License -Python Library for Tom's Obvious, Minimal Language +Typer, build great CLIs. Easy to code. Based on Python type hints. -* URL: https://github.com/uiri/toml -* Author(s): William Pearson +* URL: https://github.com/fastapi/typer +* Author(s): =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ### License Text ``` -The MIT License +The MIT License (MIT) -Copyright 2013-2019 William Pearson -Copyright 2015-2016 Julien Enselme -Copyright 2016 Google Inc. -Copyright 2017 Samuel Vasko -Copyright 2017 Nate Prewitt -Copyright 2017 Jack Evans -Copyright 2019 Filippo Broggini +Copyright (c) 2019 Sebastián Ramírez Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23788,87 +24439,24 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -## tomli (2.2.1) - MIT License - -A lil' TOML parser - -* URL: https://github.com/hukkin/tomli -* Author(s): Taneli Hukkinen - -### License Text - -``` -MIT License - -Copyright (c) 2021 Taneli Hukkinen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ``` -## tomlkit (0.13.2) - MIT License +## types-PyYAML (6.0.12.20250402) - UNKNOWN -Style preserving TOML library +Typing stubs for PyYAML -* URL: https://github.com/sdispater/tomlkit -* Author(s): Sébastien Eustace +* URL: https://github.com/python/typeshed ### License Text ``` -Copyright (c) 2018 Sébastien Eustace - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## tornado (6.4.2) - Apache Software License - -Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. - -* URL: http://www.tornadoweb.org/ -* Author(s): Facebook - -### License Text +The "typeshed" project is licensed under the terms of the Apache license, as +reproduced below. -``` += = = = = - Apache License +Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -24048,7 +24636,7 @@ Tornado is a Python web framework and asynchronous networking library, originall APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -24056,7 +24644,7 @@ Tornado is a Python web framework and asynchronous networking library, originall same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -24070,133 +24658,23 @@ Tornado is a Python web framework and asynchronous networking library, originall See the License for the specific language governing permissions and limitations under the License. -``` - -## tqdm (4.67.1) - MIT License; Mozilla Public License 2.0 (MPL 2.0) - -Fast, Extensible Progress Meter - -* URL: https://tqdm.github.io -* Maintainer(s): tqdm developers - -### License Text - -``` -`tqdm` is a product of collaborative work. -Unless otherwise stated, all authors (see commit logs) retain copyright -for their respective work, and release the work under the MIT licence -(text below). - -Exceptions or notable authors are listed below -in reverse chronological order: - -* files: * - MPL-2.0 2015-2024 (c) Casper da Costa-Luis - [casperdcl](https://github.com/casperdcl). -* files: tqdm/_tqdm.py - MIT 2016 (c) [PR #96] on behalf of Google Inc. -* files: tqdm/_tqdm.py README.rst .gitignore - MIT 2013 (c) Noam Yorav-Raphael, original author. - -[PR #96]: https://github.com/tqdm/tqdm/pull/96 - - -Mozilla Public Licence (MPL) v. 2.0 - Exhibit A ------------------------------------------------ - -This Source Code Form is subject to the terms of the -Mozilla Public License, v. 2.0. -If a copy of the MPL was not distributed with this project, -You can obtain one at https://mozilla.org/MPL/2.0/. - - -MIT License (MIT) ------------------ - -Copyright (c) 2013 noamraph - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## traitlets (5.14.3) - BSD License - -Traitlets Python configuration system - -* URL: https://github.com/ipython/traitlets -* Author(s): IPython Development Team - -### License Text - -``` -BSD 3-Clause License - -- Copyright (c) 2001-, IPython Development Team - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -``` - -## typer (0.15.2) - MIT License - -Typer, build great CLIs. Easy to code. Based on Python type hints. += = = = = -* URL: https://github.com/fastapi/typer -* Author(s): =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= +Parts of typeshed are licensed under different licenses (like the MIT +license), reproduced below. -### License Text += = = = = -``` -The MIT License (MIT) +The MIT License -Copyright (c) 2019 Sebastián Ramírez +Copyright (c) 2015 Jukka Lehtosalo and contributors -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. @@ -24205,15 +24683,17 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + += = = = = ``` -## types-PyYAML (6.0.12.20250402) - UNKNOWN +## types-python-dateutil (2.9.0.20241206) - Apache Software License -Typing stubs for PyYAML +Typing stubs for python-dateutil * URL: https://github.com/python/typeshed @@ -24460,9 +24940,9 @@ DEALINGS IN THE SOFTWARE. ``` -## types-python-dateutil (2.9.0.20241206) - Apache Software License +## types-requests (2.32.0.20250328) - Apache Software License -Typing stubs for python-dateutil +Typing stubs for requests * URL: https://github.com/python/typeshed @@ -24743,7 +25223,7 @@ SOFTWARE. ``` -## typing_extensions (4.12.2) - Python Software Foundation License +## typing_extensions (4.13.1) - UNKNOWN Backported and Experimental Type Hints for Python 3.8+ @@ -25035,158 +25515,31 @@ PERFORMANCE OF THIS SOFTWARE. ``` -## tzdata (2025.1) - Apache Software License +## tzdata (2025.2) - Apache Software License Provider of IANA time zone data * URL: https://github.com/python/tzdata * Author(s): Python Software Foundation -### License Text - -``` -Apache Software License 2.0 - -Copyright (c) 2020, Paul Ganssle (Google) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - -## ujson (5.10.0) - BSD License - -Ultra fast JSON encoder and decoder for Python - -* URL: https://github.com/ultrajson/ultrajson -* Author(s): Jonas Tarnstrom - -### License Text - -``` -Developed by ESN, an Electronic Arts Inc. studio. -Copyright (c) 2014, Electronic Arts Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: -* Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -* Neither the name of ESN, Electronic Arts Inc. nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL ELECTRONIC ARTS INC. BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ----- - -Portions of code from MODP_ASCII - Ascii transformations (upper/lower, etc) -https://github.com/client9/stringencoders - - Copyright 2005, 2006, 2007 - Nick Galbreath -- nickg [at] modp [dot] com - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of the modp.com nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This is the standard "new" BSD license: - http://www.opensource.org/licenses/bsd-license.php - -https://github.com/client9/stringencoders/blob/cfd5c1507325ae497ea9bacdacba12c0ffd79d30/COPYING - ----- - -Numeric decoder derived from from TCL library -https://opensource.apple.com/source/tcl/tcl-14/tcl/license.terms - * Copyright (c) 1988-1993 The Regents of the University of California. - * Copyright (c) 1994 Sun Microsystems, Inc. - - This software is copyrighted by the Regents of the University of - California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState - Corporation and other parties. The following terms apply to all files - associated with the software unless explicitly disclaimed in - individual files. - - The authors hereby grant permission to use, copy, modify, distribute, - and license this software and its documentation for any purpose, provided - that existing copyright notices are retained in all copies and that this - notice is included verbatim in any distributions. No written agreement, - license, or royalty fee is required for any of the authorized uses. - Modifications to this software may be copyrighted by their authors - and need not follow the licensing terms described here, provided that - the new terms are clearly indicated on the first page of each file where - they apply. +### License Text - IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY - FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY - DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. +``` +Apache Software License 2.0 - THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE - IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE - NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR - MODIFICATIONS. +Copyright (c) 2020, Paul Ganssle (Google) - GOVERNMENT USE: If you are acquiring this software on behalf of the - U.S. government, the Government shall have only "Restricted Rights" - in the software and related documentation as defined in the Federal - Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you - are acquiring the software on behalf of the Department of Defense, the - software shall be classified as "Commercial Computer Software" and the - Government shall have only "Restricted Rights" as defined in Clause - 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the - authors grant the U.S. Government and others acting in its behalf - permission to use and distribute the software in accordance with the - terms specified in this license. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` @@ -25259,7 +25612,7 @@ SOFTWARE. ``` -## uv (0.6.9) - Apache Software License; MIT License +## uv (0.6.12) - Apache Software License; MIT License An extremely fast Python package and project manager, written in Rust. @@ -25513,223 +25866,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## uvloop (0.21.0) - Apache Software License; MIT License - -Fast implementation of asyncio event loop on top of libuv - -* URL: UNKNOWN -* Author(s): Yury Selivanov - -### License Text - -``` -Copyright (C) 2016-present the uvloop authors and contributors. - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright (c) 2015-present MagicStack Inc. http://magic.io - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -``` - -## virtualenv (20.29.3) - MIT License +## virtualenv (20.30.0) - MIT License Virtual Python Environment builder diff --git a/CLI_REFERENCE.md b/CLI_REFERENCE.md index 461a233a..47a3b7a3 100644 --- a/CLI_REFERENCE.md +++ b/CLI_REFERENCE.md @@ -10,16 +10,17 @@ $ aignostics [OPTIONS] COMMAND [ARGS]... **Options**: -* `--install-completion`: Install completion for the current shell. -* `--show-completion`: Show completion for the current shell, to copy it or customize the installation. -* `--help`: Show this message and exit. +- `--install-completion`: Install completion for the current shell. +- `--show-completion`: Show completion for the current shell, to copy it or + customize the installation. +- `--help`: Show this message and exit. 🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 **Commands**: -* `platform`: Platform diagnostics and utilities -* `application`: aignostics applications +- `platform`: Platform diagnostics and utilities +- `application`: aignostics applications ## `aignostics platform` @@ -33,17 +34,16 @@ $ aignostics platform [OPTIONS] COMMAND [ARGS]... **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. **Commands**: -* `install`: Complete and validate installation of the... -* `health`: Indicate if aignostics platform is healthy. -* `info`: Print info about service configuration. -* `openapi`: Dump the OpenAPI specification of to stdout. -* `bucket`: Transfer bucket provide by platform +- `install`: Complete and validate installation of the... +- `health`: Indicate if aignostics platform is healthy. +- `info`: Print info about service configuration. +- `authentication-settings`: Print info about service configuration. +- `openapi`: Dump the OpenAPI specification of to stdout. +- `bucket`: Transfer bucket provide by platform ### `aignostics platform install` @@ -57,9 +57,7 @@ $ aignostics platform install [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. ### `aignostics platform health` @@ -73,9 +71,7 @@ $ aignostics platform health [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. ### `aignostics platform info` @@ -89,12 +85,25 @@ $ aignostics platform info [OPTIONS] **Options**: -* `--output-format [yaml|json]`: Output format [default: yaml] -* `--env / --no-env`: Include environment variables in output [default: no-env] -* `--filter-secrets / --no-filter-secrets`: Filter out secret values from environment variables [default: filter-secrets] -* `--help`: Show this message and exit. +- `--output-format [yaml|json]`: Output format [default: yaml] +- `--env / --no-env`: Include environment variables in output [default: no-env] +- `--filter-secrets / --no-filter-secrets`: Filter out secret values from + environment variables [default: filter-secrets] +- `--help`: Show this message and exit. -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +### `aignostics platform authentication-settings` + +Print info about service configuration. + +**Usage**: + +```console +$ aignostics platform authentication-settings [OPTIONS] +``` + +**Options**: + +- `--help`: Show this message and exit. ### `aignostics platform openapi` @@ -108,11 +117,9 @@ $ aignostics platform openapi [OPTIONS] **Options**: -* `--api-version [v1]`: API Version [default: v1] -* `--output-format [yaml|json]`: Output format [default: yaml] -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--api-version [v1]`: API Version [default: v1] +- `--output-format [yaml|json]`: Output format [default: yaml] +- `--help`: Show this message and exit. ### `aignostics platform bucket` @@ -126,14 +133,12 @@ $ aignostics platform bucket [OPTIONS] COMMAND [ARGS]... **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. **Commands**: -* `ls`: List contents of tranfer bucket. -* `purge`: Purge content of transfer bucket. +- `ls`: List contents of tranfer bucket. +- `purge`: Purge content of transfer bucket. #### `aignostics platform bucket ls` @@ -147,9 +152,7 @@ $ aignostics platform bucket ls [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. #### `aignostics platform bucket purge` @@ -163,9 +166,7 @@ $ aignostics platform bucket purge [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. ## `aignostics application` @@ -179,17 +180,15 @@ $ aignostics application [OPTIONS] COMMAND [ARGS]... **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. **Commands**: -* `list`: List available applications. -* `describe`: Describe application. -* `dataset`: Datasets for use as input for applications -* `metadata`: Metadata required as input for applications -* `run`: Runs of applications +- `list`: List available applications. +- `describe`: Describe application. +- `dataset`: Datasets for use as input for applications +- `metadata`: Metadata required as input for applications +- `run`: Runs of applications ### `aignostics application list` @@ -203,9 +202,7 @@ $ aignostics application list [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. ### `aignostics application describe` @@ -219,9 +216,7 @@ $ aignostics application describe [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. ### `aignostics application dataset` @@ -235,13 +230,11 @@ $ aignostics application dataset [OPTIONS] COMMAND [ARGS]... **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. **Commands**: -* `download`: Download dataset. +- `download`: Download dataset. #### `aignostics application dataset download` @@ -255,9 +248,7 @@ $ aignostics application dataset download [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. ### `aignostics application metadata` @@ -271,13 +262,11 @@ $ aignostics application metadata [OPTIONS] COMMAND [ARGS]... **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. **Commands**: -* `generate`: Generate metadata. +- `generate`: Generate metadata. #### `aignostics application metadata generate` @@ -291,9 +280,7 @@ $ aignostics application metadata generate [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. ### `aignostics application run` @@ -307,17 +294,15 @@ $ aignostics application run [OPTIONS] COMMAND [ARGS]... **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. **Commands**: -* `submit`: Create run. -* `list`: List runs. -* `describe`: Describe run. -* `cancel`: Cancel run. -* `result`: Results of applications runs +- `submit`: Create run. +- `list`: List runs. +- `describe`: Describe run. +- `cancel`: Cancel run. +- `result`: Results of applications runs #### `aignostics application run submit` @@ -331,9 +316,7 @@ $ aignostics application run submit [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. #### `aignostics application run list` @@ -347,9 +330,7 @@ $ aignostics application run list [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. #### `aignostics application run describe` @@ -363,9 +344,7 @@ $ aignostics application run describe [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. #### `aignostics application run cancel` @@ -379,9 +358,7 @@ $ aignostics application run cancel [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. #### `aignostics application run result` @@ -395,15 +372,13 @@ $ aignostics application run result [OPTIONS] COMMAND [ARGS]... **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. **Commands**: -* `describe`: Describe the result of an application run. -* `download`: Download the result of an application run. -* `delete`: Delete the result of an application run. +- `describe`: Describe the result of an application run. +- `download`: Download the result of an application run. +- `delete`: Delete the result of an application run. ##### `aignostics application run result describe` @@ -417,9 +392,7 @@ $ aignostics application run result describe [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. ##### `aignostics application run result download` @@ -433,9 +406,7 @@ $ aignostics application run result download [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. ##### `aignostics application run result delete` @@ -449,6 +420,4 @@ $ aignostics application run result delete [OPTIONS] **Options**: -* `--help`: Show this message and exit. - -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +- `--help`: Show this message and exit. diff --git a/src/aignostics/utils/cli.py b/src/aignostics/utils/cli.py index 4e747eac..91cefc3a 100644 --- a/src/aignostics/utils/cli.py +++ b/src/aignostics/utils/cli.py @@ -1,5 +1,8 @@ """Command-line interface utilities.""" +import sys +from pathlib import Path + import typer @@ -18,7 +21,8 @@ def prepare_cli(cli: typer.Typer, epilog: str) -> None: command.epilog = cli.info.epilog # add epilog for all subcommands - _add_epilog_recursively(cli, epilog) + if not any(arg.endswith("typer") for arg in Path(sys.argv[0]).parts): + _add_epilog_recursively(cli, epilog) # add no_args_is_help for all subcommands _no_args_is_help_recursively(cli) From d5387b8b03b486a2d649b931fe10390a9afd2050 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 14:27:11 +0200 Subject: [PATCH 050/110] docs: no epilog in cli reference --no-verify --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7d77a171..959687ea 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ # .pre-commit-config.yaml default_install_hook_types: - - pre-commit + - pre-push fail_fast: true repos: - repo: meta @@ -58,7 +58,7 @@ repos: rev: v1.5.0 hooks: - id: detect-secrets - args: ['--baseline', '.secrets.baseline'] + args: ["--baseline", ".secrets.baseline"] additional_dependencies: ["gibberish-detector"] - repo: https://github.com/astral-sh/uv-pre-commit rev: 0.6.10 From 4f7f259cbbf985bf3e026c478bb4bd4ba84bf46b Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Sun, 6 Apr 2025 15:18:50 +0200 Subject: [PATCH 051/110] fix: Fix retrieving client id for refresh token login --- src/aignostics/client/_authentication.py | 60 ++++++++++++------------ 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 21172450..05aed3ab 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -114,6 +114,30 @@ def get_token(use_cache: bool = True) -> str: return new_token +def _authenticate() -> str: + """Allows the user to authenticate and obtain an access token. + + Determines the appropriate authentication flow based on whether + a browser can be opened, then executes that flow. + + Returns: + str: The JWT access token. + + Raises: + RuntimeError: If authentication fails. + AssertionError: If the returned token doesn't have the expected format. + """ + if refresh_token := authentication_settings().refresh_token: + token = _token_from_refresh_token(refresh_token) + elif _can_open_browser(): + token = _perform_authorization_code_with_pkce_flow() + else: + token = _perform_device_flow() + if not token: + raise RuntimeError(AUTHENTICATION_FAILED) + return token + + def verify_and_decode_token(token: str) -> dict[str, str]: """ Verifies and decodes the JWT token using the public key from JWS JSON URL. @@ -142,35 +166,9 @@ def verify_and_decode_token(token: str) -> dict[str, str]: jwt.decode(binary_token, key=key, algorithms=[algorithm], audience=authentication_settings().audience), ) except jwt.exceptions.PyJWKClientError as e: - msg = AUTHENTICATION_FAILED - raise RuntimeError(msg) from e + raise RuntimeError(AUTHENTICATION_FAILED) from e except jwt.exceptions.DecodeError as e: - msg = AUTHENTICATION_FAILED - raise RuntimeError(msg) from e - - -def _authenticate() -> str: - """Allows the user to login and obtain an access token. - - Determines the appropriate authentication flow based on whether - a browser can be opened, then executes that flow. - - Returns: - str: The JWT access token. - - Raises: - RuntimeError: If authentication fails. - AssertionError: If the returned token doesn't have the expected format. - """ - if refresh_token := authentication_settings().refresh_token: - token = _token_from_refresh_token(refresh_token.get_secret_value()) - elif _can_open_browser(): - token = _perform_authorization_code_with_pkce_flow() - else: - token = _perform_device_flow() - if not token: - raise RuntimeError(AUTHENTICATION_FAILED) - return token + raise RuntimeError(AUTHENTICATION_FAILED) from e def _can_open_browser() -> bool: @@ -347,7 +345,7 @@ def _perform_device_flow() -> str | None: return resp["access_token"] -def _token_from_refresh_token(refresh_token: str) -> str | None: +def _token_from_refresh_token(refresh_token: SecretStr) -> str | None: """Obtains a new access token using a refresh token. Args: @@ -365,8 +363,8 @@ def _token_from_refresh_token(refresh_token: str) -> str | None: headers={"Accept": "application/json"}, data={ "grant_type": "refresh_token", - "client_id": authentication_settings().client_id_interactive.get_secret_value, - "refresh_token": refresh_token, + "client_id": authentication_settings().client_id_interactive.get_secret_value(), + "refresh_token": refresh_token.get_secret_value(), }, timeout=REQUEST_TIMEOUT_SECONDS, ).json() From 340f58aae28df5e968ee3a53fec3971166fc8918 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Sun, 6 Apr 2025 15:46:16 +0200 Subject: [PATCH 052/110] chore: Update openapi spec --- API_REFERENCE_v1.md | 6327 ++++------------- CLI_REFERENCE.md | 118 +- codegen/in/api.json | 2 +- codegen/out/.openapi-generator/FILES | 25 - .../out/aignx/codegen/api/externals_api.py | 2323 ++---- codegen/out/aignx/codegen/api_client.py | 6 +- codegen/out/aignx/codegen/configuration.py | 19 +- codegen/out/aignx/codegen/exceptions.py | 20 +- codegen/out/aignx/codegen/models/__init__.py | 25 - .../models/application_creation_request.py | 88 - .../models/application_creation_response.py | 84 - .../models/application_read_response.py | 6 +- .../codegen/models/application_run_status.py | 6 +- .../codegen/models/application_version.py | 6 +- .../application_version_read_response.py | 6 +- .../aignx/codegen/models/artifact_event.py | 35 - .../aignx/codegen/models/artifact_status.py | 40 - .../codegen/models/http_validation_error.py | 6 +- .../aignx/codegen/models/input_artifact.py | 10 +- .../models/input_artifact_creation_request.py | 6 +- .../models/input_artifact_read_response.py | 10 +- .../input_artifact_schema_creation_request.py | 6 +- .../codegen/models/item_creation_request.py | 6 +- .../out/aignx/codegen/models/item_event.py | 34 - .../models/item_event_creation_request.py | 87 - .../models/item_event_creation_response.py | 87 - .../codegen/models/item_read_response.py | 103 - .../models/item_result_read_response.py | 6 +- .../out/aignx/codegen/models/item_status.py | 6 +- .../models/organization_creation_request.py | 90 - .../codegen/models/organization_quota.py | 91 - .../codegen/models/organization_response.py | 94 - .../models/organization_update_request.py | 96 - .../aignx/codegen/models/output_artifact.py | 10 +- .../output_artifact_event_trigger_request.py | 94 - .../output_artifact_event_trigger_response.py | 87 - .../models/output_artifact_read_response.py | 10 +- .../output_artifact_result_read_response.py | 10 +- ...output_artifact_schema_creation_request.py | 6 +- .../codegen/models/output_artifact_scope.py | 6 +- .../models/output_artifact_visibility.py | 6 +- .../codegen/models/payload_input_artifact.py | 10 +- .../out/aignx/codegen/models/payload_item.py | 6 +- .../codegen/models/payload_output_artifact.py | 6 +- .../out/aignx/codegen/models/quota_name.py | 41 - .../codegen/models/quota_read_response.py | 87 - .../codegen/models/quota_update_request.py | 87 - .../codegen/models/quota_update_response.py | 87 - .../codegen/models/quotas_read_response.py | 92 - .../codegen/models/quotas_update_request.py | 92 - .../codegen/models/quotas_update_response.py | 92 - .../codegen/models/run_creation_request.py | 6 +- .../codegen/models/run_creation_response.py | 6 +- .../aignx/codegen/models/run_read_response.py | 6 +- .../codegen/models/slug_version_request.py | 6 +- .../out/aignx/codegen/models/transfer_urls.py | 6 +- .../codegen/models/user_creation_request.py | 93 - .../out/aignx/codegen/models/user_payload.py | 6 +- .../out/aignx/codegen/models/user_quota.py | 91 - .../out/aignx/codegen/models/user_response.py | 102 - .../codegen/models/user_update_request.py | 96 - .../aignx/codegen/models/validation_error.py | 6 +- .../models/validation_error_loc_inner.py | 6 +- .../models/version_creation_request.py | 6 +- .../models/version_creation_response.py | 6 +- .../codegen/models/version_read_response.py | 6 +- codegen/out/aignx/codegen/rest.py | 6 +- codegen/out/docs/ExternalsApi.md | 489 +- codegen/out/test/test_externals_api.py | 34 +- docs/source/_static/openapi_v1.json | 2010 +----- docs/source/_static/openapi_v1.yaml | 980 +-- 71 files changed, 2515 insertions(+), 12155 deletions(-) delete mode 100644 codegen/out/aignx/codegen/models/application_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/application_creation_response.py delete mode 100644 codegen/out/aignx/codegen/models/artifact_event.py delete mode 100644 codegen/out/aignx/codegen/models/artifact_status.py delete mode 100644 codegen/out/aignx/codegen/models/item_event.py delete mode 100644 codegen/out/aignx/codegen/models/item_event_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/item_event_creation_response.py delete mode 100644 codegen/out/aignx/codegen/models/item_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/organization_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/organization_quota.py delete mode 100644 codegen/out/aignx/codegen/models/organization_response.py delete mode 100644 codegen/out/aignx/codegen/models/organization_update_request.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py delete mode 100644 codegen/out/aignx/codegen/models/quota_name.py delete mode 100644 codegen/out/aignx/codegen/models/quota_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/quota_update_request.py delete mode 100644 codegen/out/aignx/codegen/models/quota_update_response.py delete mode 100644 codegen/out/aignx/codegen/models/quotas_read_response.py delete mode 100644 codegen/out/aignx/codegen/models/quotas_update_request.py delete mode 100644 codegen/out/aignx/codegen/models/quotas_update_response.py delete mode 100644 codegen/out/aignx/codegen/models/user_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/user_quota.py delete mode 100644 codegen/out/aignx/codegen/models/user_response.py delete mode 100644 codegen/out/aignx/codegen/models/user_update_request.py diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md index 5de12e38..8f513915 100644 --- a/API_REFERENCE_v1.md +++ b/API_REFERENCE_v1.md @@ -1,5025 +1,1304 @@ # API v1 Reference -## Aignostics Platform API v0.1.0 - -> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. - -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - -## Authentication - -- oAuth2 authentication. - - - Flow: authorizationCode - - Authorization URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize) - - Token URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token) - -|Scope|Scope Description| -|---|---| - -## Default - -### get_documentation_docs_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/docs', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/docs', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /docs` - -*Get Documentation* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|access_token|cookie|any|false|none| - -> Example responses - -> 200 Response - -```json -null -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - - -This operation does not require authentication - - -## Externals - -Called by externals to interact with our API - -### list_applications_v1_applications_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/applications', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/applications', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications` - -*List Applications* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ], - "slug": "heta" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Applications V1 Applications Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Applications V1 Applications Get|[[ApplicationReadResponse](#schemaapplicationreadresponse)]|false|none|none| -|» ApplicationReadResponse|[ApplicationReadResponse](#schemaapplicationreadresponse)|false|none|none| -|»» application_id|string(uuid)|true|none|none| -|»» description|string|true|none|none| -|»» name|string|true|none|none| -|»» regulatory_classes|[string]|true|none|none| -|»» slug|string|true|none|none| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### read_application_by_id_v1_applications__application_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/applications/{application_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/applications/{application_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_id}` - -*Read Application By Id* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_id|path|string(uuid)|true|none| - -> Example responses - -> 200 Response - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ], - "slug": "heta" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[ApplicationReadResponse](#schemaapplicationreadresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### list_versions_by_application_id_v1_applications__application_id__versions_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/applications/{application_id}/versions', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/applications/{application_id}/versions', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_id}/versions` - -*List Versions By Application Id* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_id|path|string(uuid)|true|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|version|query|any|false|none| -|include|query|any|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "application_version_slug": "tissue-segmentation-qc:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Versions By Application Id V1 Applications Application Id Versions Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| -|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| -|»» application_id|string(uuid)|true|none|none| -|»» application_version_id|string(uuid)|true|none|none| -|»» application_version_slug|string|true|none|none| -|»» changelog|string|true|none|none| -|»» flow_id|any|false|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string(uuid)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| -|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| -|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|»» version|string|true|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|scope|item| -|scope|global| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### read_application_by_slug_v1_applications__application_slug__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/applications/{application_slug}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/applications/{application_slug}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_slug}` - -*Read Application By Slug* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_slug|path|string|true|none| - -> Example responses - -> 200 Response - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ], - "slug": "heta" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[ApplicationReadResponse](#schemaapplicationreadresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### list_versions_by_application_slug_v1_applications__application_slug__versions_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/applications/{application_slug}/versions', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/applications/{application_slug}/versions', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_slug}/versions` - -*List Versions By Application Slug* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_slug|path|string|true|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|version|query|any|false|none| -|include|query|any|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "application_version_slug": "tissue-segmentation-qc:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Versions By Application Slug V1 Applications Application Slug Versions Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Versions By Application Slug V1 Applications Application Slug Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| -|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| -|»» application_id|string(uuid)|true|none|none| -|»» application_version_id|string(uuid)|true|none|none| -|»» application_version_slug|string|true|none|none| -|»» changelog|string|true|none|none| -|»» flow_id|any|false|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string(uuid)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| -|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| -|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|»» version|string|true|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|scope|item| -|scope|global| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### list_application_runs_v1_runs_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/runs', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/runs', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs` - -*List Application Runs* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_id|query|any|false|none| -|application_version_id|query|any|false|none| -|include|query|any|false|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Application Runs V1 Runs Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Application Runs V1 Runs Get|[[RunReadResponse](#schemarunreadresponse)]|false|none|none| -|» RunReadResponse|[RunReadResponse](#schemarunreadresponse)|false|none|none| -|»» application_run_id|string(uuid)|true|none|none| -|»» application_version_id|string(uuid)|true|none|none| -|»» organization_id|string|true|none|none| -|»» status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| -|»» triggered_at|string(date-time)|true|none|none| -|»» triggered_by|string|true|none|none| -|»» user_payload|any|false|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| -|»»»» application_id|string(uuid)|true|none|none| -|»»»» application_run_id|string(uuid)|true|none|none| -|»»»» global_output_artifacts|any|true|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|object|false|none|none| -|»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| -|»»»»»»» data|[TransferUrls](#schematransferurls)|true|none|none| -|»»»»»»»» download_url|string(uri)|true|none|none| -|»»»»»»»» upload_url|string(uri)|true|none|none| -|»»»»»»» metadata|[TransferUrls](#schematransferurls)|true|none|none| -|»»»»»»» output_artifact_id|string(uuid)|true|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»» items|[[PayloadItem](#schemapayloaditem)]|true|none|none| -|»»»»» PayloadItem|[PayloadItem](#schemapayloaditem)|false|none|none| -|»»»»»» input_artifacts|object|true|none|none| -|»»»»»»» PayloadInputArtifact|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| -|»»»»»»»» download_url|string(uri)|true|none|none| -|»»»»»»»» input_artifact_id|string(uuid)|true|none|none| -|»»»»»»»» metadata|object|true|none|none| -|»»»»»» item_id|string(uuid)|true|none|none| -|»»»»»» output_artifacts|object|true|none|none| -|»»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|status|canceled_system| -|status|canceled_user| -|status|completed| -|status|completed_with_error| -|status|received| -|status|rejected| -|status|running| -|status|scheduled| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### create_application_run_v1_runs_post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.post('/v1/runs', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/runs', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/runs` - -*Create Application Run* - -> Body parameter - -```json -{ - "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[RunCreationRequest](#schemaruncreationrequest)|true|none| - -> Example responses - -> 201 Response - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[RunCreationResponse](#schemaruncreationresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### get_run_v1_runs__application_run_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/runs/{application_run_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/runs/{application_run_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs/{application_run_id}` - -*Get Run* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| -|include|query|any|false|none| - -> Example responses - -> 200 Response - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[RunReadResponse](#schemarunreadresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### cancel_run_v1_runs__application_run_id__cancel_post - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.post('/v1/runs/{application_run_id}/cancel', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/runs/{application_run_id}/cancel', -{ - method: 'POST', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/runs/{application_run_id}/cancel` - -*Cancel Run* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| - -> Example responses - -> 202 Response - -```json -null -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### delete_run_results_v1_runs__application_run_id__results_delete - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.delete('/v1/runs/{application_run_id}/results', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/runs/{application_run_id}/results', -{ - method: 'DELETE', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`DELETE /v1/runs/{application_run_id}/results` - -*Delete Run Results* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| - -> Example responses - -> 422 Response - -```json -{ - "detail": [ - { - "loc": [ - "string" - ], - "msg": "string", - "type": "string" - } - ] -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|Successful Response|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### list_run_results_v1_runs__application_run_id__results_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/runs/{application_run_id}/results', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/runs/{application_run_id}/results', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs/{application_run_id}/results` - -*List Run Results* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| -|item_id__in|query|any|false|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|reference__in|query|any|false|none| -|status__in|query|any|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "error": "string", - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": [ - { - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - ], - "reference": "string", - "status": "pending" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Run Results V1 Runs Application Run Id Results Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Run Results V1 Runs Application Run Id Results Get|[[ItemResultReadResponse](#schemaitemresultreadresponse)]|false|none|none| -|» ItemResultReadResponse|[ItemResultReadResponse](#schemaitemresultreadresponse)|false|none|none| -|»» application_run_id|string(uuid)|true|none|none| -|»» error|any|true|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» item_id|string(uuid)|true|none|none| -|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| -|»»» OutputArtifactResultReadResponse|[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)|false|none|none| -|»»»» download_url|any|true|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|string(uri)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»» metadata|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» output_artifact_id|string(uuid)|true|none|none| -|»» reference|string|true|none|none| -|»» status|[ItemStatus](#schemaitemstatus)|true|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|status|pending| -|status|canceled_user| -|status|canceled_system| -|status|error_user| -|status|error_system| -|status|succeeded| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### create_user_v1_users__post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.post('/v1/users/', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "email": "string", - "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", - "user_id": "string" -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/users/', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/users/` - -*Create User* - -> Body parameter - -```json -{ - "email": "string", - "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", - "user_id": "string" -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[UserCreationRequest](#schemausercreationrequest)|true|none| - -> Example responses - -> 200 Response - -```json -{ - "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", - "slide_quota": { - "total": 0, - "used": 0 - }, - "user_id": "string" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[UserResponse](#schemauserresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|User not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### get_user_v1_users__user_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/users/{user_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/users/{user_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/users/{user_id}` - -*Get User* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|user_id|path|string(uuid)|true|none| - -> Example responses - -> 200 Response - -```json -{ - "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", - "slide_quota": { - "total": 0, - "used": 0 - }, - "user_id": "string" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[UserResponse](#schemauserresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|User not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### update_user_v1_users__user_id__patch - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.patch('/v1/users/{user_id}', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "slide_quota": 0, - "user_id": "string" -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/users/{user_id}', -{ - method: 'PATCH', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`PATCH /v1/users/{user_id}` - -*Update User* - -> Body parameter - -```json -{ - "slide_quota": 0, - "user_id": "string" -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|user_id|path|string(uuid)|true|none| -|body|body|[UserUpdateRequest](#schemauserupdaterequest)|true|none| - -> Example responses - -> 200 Response - -```json -{ - "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", - "slide_quota": { - "total": 0, - "used": 0 - }, - "user_id": "string" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[UserResponse](#schemauserresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|User not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### register_version_v1_versions_post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.post('/v1/versions', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/versions', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/versions` - -*Register Version* - -> Body parameter - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[VersionCreationRequest](#schemaversioncreationrequest)|true|none| - -> Example responses - -> 201 Response - -```json -{ - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[VersionCreationResponse](#schemaversioncreationresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### get_version_v1_versions__application_version_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/versions/{application_version_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/versions/{application_version_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/versions/{application_version_id}` - -*Get Version* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_version_id|path|string(uuid)|true|none| -|include|query|any|false|none| - -> Example responses - -> 200 Response - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "changelog": "string", - "created_at": "2019-08-24T14:15:22Z", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[VersionReadResponse](#schemaversionreadresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -## Algorithms/Apps - -Called by the Algorithms and applications to update statuses - -### trigger_artifact_event_v1_artifacts__output_artifact_id__event_post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json' -} - -r = requests.post('/v1/artifacts/{output_artifact_id}/event', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "error": "string", - "event": "succeeded", - "metadata": {} -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('/v1/artifacts/{output_artifact_id}/event', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/artifacts/{output_artifact_id}/event` - -*Trigger Artifact Event* - -> Body parameter - -```json -{ - "error": "string", - "event": "succeeded", - "metadata": {} -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|output_artifact_id|path|string(uuid)|true|none| -|body|body|[OutputArtifactEventTriggerRequest](#schemaoutputartifacteventtriggerrequest)|true|none| - -> Example responses - -> 201 Response - -```json -{ - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b", - "status": "pending" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[OutputArtifactEventTriggerResponse](#schemaoutputartifacteventtriggerresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -## Scheduler - -Called by the Scheduler - -### get_item_v1_items__item_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/items/{item_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/items/{item_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/items/{item_id}` - -*Get Item* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|item_id|path|string(uuid)|true|none| - -> Example responses - -> 200 Response - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "error": "string", - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "reference": "string", - "status": "pending" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[ItemReadResponse](#schemaitemreadresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### register_item_event_v1_items__item_id__event_post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.post('/v1/items/{item_id}/event', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "error": "string", - "event": "failed_with_system_error" -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/items/{item_id}/event', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/items/{item_id}/event` - -*Register Item Event* - -> Body parameter - -```json -{ - "error": "string", - "event": "failed_with_system_error" -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|item_id|path|string(uuid)|true|none| -|body|body|[ItemEventCreationRequest](#schemaitemeventcreationrequest)|true|none| - -> Example responses - -> 202 Response - -```json -{ - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "status": "pending" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|[ItemEventCreationResponse](#schemaitemeventcreationresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -## Admins - -Called by Admins to manage and register entities - -### register_application_v1_applications_post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.post('/v1/applications', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "description": "H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, cell detection and cell classfication", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ] -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/applications', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/applications` - -*Register Application* - -> Body parameter - -```json -{ - "description": "H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, cell detection and cell classfication", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ] -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[ApplicationCreationRequest](#schemaapplicationcreationrequest)|true|none| - -> Example responses - -> 201 Response - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[ApplicationCreationResponse](#schemaapplicationcreationresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### list_quotas_v1_quotas_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/quotas', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/quotas', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/quotas` - -*List Quotas* - -> Example responses - -> 200 Response - -```json -{ - "quotas": [ - { - "name": "max_users", - "quota": 0 - } - ] -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[QuotasReadResponse](#schemaquotasreadresponse)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### update_quotas_v1_quotas_patch - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.patch('/v1/quotas', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "quotas": [ - { - "name": "max_users", - "quota": 0 - } - ] -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/quotas', -{ - method: 'PATCH', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`PATCH /v1/quotas` - -*Update Quotas* - -> Body parameter - -```json -{ - "quotas": [ - { - "name": "max_users", - "quota": 0 - } - ] -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[QuotasUpdateRequest](#schemaquotasupdaterequest)|true|none| - -> Example responses - -> 200 Response - -```json -{ - "updated_quotas": [ - { - "name": "max_users", - "quota": 0 - } - ] -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[QuotasUpdateResponse](#schemaquotasupdateresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -## Infrastructure - -Called by other Infra - -### health_health_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/health', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/health', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /health` - -*Health* - -Check that the API application is alive and responsive. - -> Example responses - -> 200 Response - -```json -null -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| - -#### Response Schema - - -This operation does not require authentication - - -### liveness_liveness_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/liveness', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/liveness', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /liveness` - -*Liveness* - -Check that the API application is alive and responsive. - -> Example responses - -> 200 Response - -```json -null -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| - -#### Response Schema - - -This operation does not require authentication - - -### readiness_readiness_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/readiness', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/readiness', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /readiness` - -*Readiness* - -Check that the API application is ready to serve. - -> Example responses - -> 200 Response - -```json -null -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| - -#### Response Schema - - -This operation does not require authentication - - -## Organizations - -### create_organization_v1_organizations_post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.post('/v1/organizations', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "batch_size": 0, - "organization_id": "string", - "owner_email": "string", - "slide_quota": 0 -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/organizations', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/organizations` - -*Create Organization* - -> Body parameter - -```json -{ - "batch_size": 0, - "organization_id": "string", - "owner_email": "string", - "slide_quota": 0 -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[OrganizationCreationRequest](#schemaorganizationcreationrequest)|true|none| - -> Example responses - -> 201 Response - -```json -{ - "batch_size": 0, - "organization_id": "string", - "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05", - "slide_quota": { - "total": 0, - "used": 0 - } -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[OrganizationResponse](#schemaorganizationresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### get_organization_v1_organizations__organization_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/v1/organizations/{organization_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/organizations/{organization_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/organizations/{organization_id}` - -*Get Organization* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|organization_id|path|string(uuid)|true|none| - -> Example responses - -> 200 Response - -```json -{ - "batch_size": 0, - "organization_id": "string", - "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05", - "slide_quota": { - "total": 0, - "used": 0 - } -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[OrganizationResponse](#schemaorganizationresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### update_organization_v1_organizations__organization_id__patch - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.patch('/v1/organizations/{organization_id}', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "batch_size": 0, - "slide_quota": 0 -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/v1/organizations/{organization_id}', -{ - method: 'PATCH', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`PATCH /v1/organizations/{organization_id}` - -*Update Organization* - -> Body parameter - -```json -{ - "batch_size": 0, - "slide_quota": 0 -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|organization_id|path|string|true|none| -|body|body|[OrganizationUpdateRequest](#schemaorganizationupdaterequest)|true|none| - -> Example responses - -> 200 Response - -```json -{ - "batch_size": 0, - "organization_id": "string", - "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05", - "slide_quota": { - "total": 0, - "used": 0 - } -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[OrganizationResponse](#schemaorganizationresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -## Schemas - -### ApplicationCreationRequest - - - - - - -```json -{ - "description": "H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, cell detection and cell classfication", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ] -} - -``` - -ApplicationCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|description|string|true|none|none| -|name|string|true|none|none| -|regulatory_classes|[string]|true|none|none| - -### ApplicationCreationResponse - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c" -} - -``` - -ApplicationCreationResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| - -### ApplicationReadResponse - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ], - "slug": "heta" -} - -``` - -ApplicationReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|description|string|true|none|none| -|name|string|true|none|none| -|regulatory_classes|[string]|true|none|none| -|slug|string|true|none|none| - -### ApplicationRunStatus - - - - - - -```json -"canceled_system" - -``` - -ApplicationRunStatus - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ApplicationRunStatus|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ApplicationRunStatus|canceled_system| -|ApplicationRunStatus|canceled_user| -|ApplicationRunStatus|completed| -|ApplicationRunStatus|completed_with_error| -|ApplicationRunStatus|received| -|ApplicationRunStatus|rejected| -|ApplicationRunStatus|running| -|ApplicationRunStatus|scheduled| - -### ApplicationVersionReadResponse - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "application_version_slug": "tissue-segmentation-qc:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" -} - -``` - -ApplicationVersionReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|application_version_id|string(uuid)|true|none|none| -|application_version_slug|string|true|none|none| -|changelog|string|true|none|none| -|flow_id|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| -|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| -|version|string|true|none|none| - -### ArtifactEvent - - - - - - -```json -"succeeded" - -``` - -ArtifactEvent - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ArtifactEvent|string|false|none|This is a subset of the OutputArtifactEvent used by the state machine.Only the variants defined below are allowed to be submitted from the Algorithms/Applications.| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ArtifactEvent|succeeded| -|ArtifactEvent|failed_with_user_error| -|ArtifactEvent|failed_with_system_error| - -### ArtifactStatus - - - - - - -```json -"pending" - -``` - -ArtifactStatus - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ArtifactStatus|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ArtifactStatus|pending| -|ArtifactStatus|canceled_user| -|ArtifactStatus|canceled_system| -|ArtifactStatus|error_user| -|ArtifactStatus|error_system_fatal| -|ArtifactStatus|error_system_recoverable| -|ArtifactStatus|skipped| -|ArtifactStatus|succeeded| - -### HTTPValidationError - - - - - - -```json -{ - "detail": [ - { - "loc": [ - "string" - ], - "msg": "string", - "type": "string" - } - ] -} - -``` - -HTTPValidationError - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|detail|[[ValidationError](#schemavalidationerror)]|false|none|none| - -### InputArtifact - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" -} - -``` - -InputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - -### InputArtifactCreationRequest - - - - - - -```json -{ - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" -} - -``` - -InputArtifactCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|metadata|object|true|none|none| -|name|string|true|none|none| - -### InputArtifactReadResponse - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" -} - -``` - -InputArtifactReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - -### InputArtifactSchemaCreationRequest - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" -} - -``` - -InputArtifactSchemaCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - -### ItemCreationRequest - - - - - - -```json -{ - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" -} - -``` - -ItemCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|none| -|reference|string|true|none|none| - -### ItemEvent - - - - - - -```json -"failed_with_system_error" - -``` - -ItemEvent - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ItemEvent|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ItemEvent|failed_with_system_error| -|ItemEvent|failed_recoverable| - -### ItemEventCreationRequest - - - - - - -```json -{ - "error": "string", - "event": "failed_with_system_error" -} - -``` - -ItemEventCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|error|string|true|none|none| -|event|[ItemEvent](#schemaitemevent)|true|none|none| - -### ItemEventCreationResponse - - - - - - -```json -{ - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "status": "pending" -} - -``` - -ItemEventCreationResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|item_id|string(uuid)|true|none|none| -|status|[ItemStatus](#schemaitemstatus)|true|none|none| - -### ItemReadResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "error": "string", - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "reference": "string", - "status": "pending" -} - -``` - -ItemReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|error|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|item_id|string(uuid)|true|none|none| -|reference|string|true|none|none| -|status|[ItemStatus](#schemaitemstatus)|true|none|none| - -### ItemResultReadResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "error": "string", - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": [ - { - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - ], - "reference": "string", - "status": "pending" -} - -``` - -ItemResultReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|none| -|error|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|item_id|string(uuid)|true|none|none| -|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| -|reference|string|true|none|none| -|status|[ItemStatus](#schemaitemstatus)|true|none|none| - -### ItemStatus - - - - - - -```json -"pending" - -``` - -ItemStatus - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ItemStatus|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ItemStatus|pending| -|ItemStatus|canceled_user| -|ItemStatus|canceled_system| -|ItemStatus|error_user| -|ItemStatus|error_system| -|ItemStatus|succeeded| - -### OrganizationCreationRequest - - - - - - -```json -{ - "batch_size": 0, - "organization_id": "string", - "owner_email": "string", - "slide_quota": 0 -} - -``` - -OrganizationCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|batch_size|integer|true|none|none| -|organization_id|string|true|none|none| -|owner_email|string|true|none|none| -|slide_quota|integer|true|none|none| - -### OrganizationQuota - - - - - - -```json -{ - "total": 0, - "used": 0 -} - -``` - -OrganizationQuota - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|total|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|integer|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|used|integer|true|none|none| - -### OrganizationResponse - - - - - - -```json -{ - "batch_size": 0, - "organization_id": "string", - "owner_id": "8826ee2e-7933-4665-aef2-2393f84a0d05", - "slide_quota": { - "total": 0, - "used": 0 - } -} - -``` - -OrganizationResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|batch_size|integer|true|none|none| -|organization_id|string|true|none|none| -|owner_id|string(uuid)|true|none|none| -|slide_quota|[OrganizationQuota](#schemaorganizationquota)|true|none|none| - -### OrganizationUpdateRequest - - - - - - -```json -{ - "batch_size": 0, - "slide_quota": 0 -} - -``` - -OrganizationUpdateRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|batch_size|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|integer|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|slide_quota|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|integer|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -### OutputArtifact - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" -} - -``` - -OutputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| - -### OutputArtifactEventTriggerRequest - - - - - - -```json -{ - "error": "string", - "event": "succeeded", - "metadata": {} -} - -``` - -OutputArtifactEventTriggerRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|error|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|event|[ArtifactEvent](#schemaartifactevent)|true|none|This is a subset of the OutputArtifactEvent used by the state machine.Only the variants defined below are allowed to be submitted from the Algorithms/Applications.| -|metadata|object|true|none|none| - -### OutputArtifactEventTriggerResponse - - - - - - -```json -{ - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b", - "status": "pending" -} - -``` - -OutputArtifactEventTriggerResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|output_artifact_id|string(uuid)|true|none|none| -|status|[ArtifactStatus](#schemaartifactstatus)|true|none|none| - -### OutputArtifactReadResponse - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" -} - -``` - -OutputArtifactReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| - -### OutputArtifactResultReadResponse - - - - - - -```json -{ - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" -} - -``` - -OutputArtifactResultReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uri)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|output_artifact_id|string(uuid)|true|none|none| - -### OutputArtifactSchemaCreationRequest - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" -} - -``` - -OutputArtifactSchemaCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| - -### OutputArtifactScope - - - - - - -```json -"item" - -``` - -OutputArtifactScope - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|OutputArtifactScope|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|OutputArtifactScope|item| -|OutputArtifactScope|global| - -### OutputArtifactVisibility - - - - - - -```json -"internal" - -``` - -OutputArtifactVisibility - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|OutputArtifactVisibility|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|OutputArtifactVisibility|internal| -|OutputArtifactVisibility|external| - -### PayloadInputArtifact - - - - - - -```json -{ - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} -} - -``` - -PayloadInputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|input_artifact_id|string(uuid)|true|none|none| -|metadata|object|true|none|none| - -### PayloadItem - - - - - - -```json -{ - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } -} - -``` - -PayloadItem - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|object|true|none|none| -|» **additionalProperties**|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| -|item_id|string(uuid)|true|none|none| -|output_artifacts|object|true|none|none| -|» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -### PayloadOutputArtifact - - - - - - -```json -{ - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" -} - -``` - -PayloadOutputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|data|[TransferUrls](#schematransferurls)|true|none|none| -|metadata|[TransferUrls](#schematransferurls)|true|none|none| -|output_artifact_id|string(uuid)|true|none|none| - -### QuotaName - - - - - - -```json -"max_users" - -``` - -QuotaName - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|QuotaName|string|false|none|Global, API-level, and slide-level quotas for Samia API.| - -##### Enumerated Values - -|Property|Value| -|---|---| -|QuotaName|max_users| -|QuotaName|max_organizations| -|QuotaName|max_users_per_organization| -|QuotaName|max_applications| -|QuotaName|max_application_versions| -|QuotaName|max_slides_per_run| -|QuotaName|max_parallel_runs| -|QuotaName|max_parallel_runs_per_organization| -|QuotaName|max_parallel_runs_per_user| - -### QuotaReadResponse - - - - - - -```json -{ - "name": "max_users", - "quota": 0 -} - -``` - -QuotaReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|name|[QuotaName](#schemaquotaname)|true|none|Global, API-level, and slide-level quotas for Samia API.| -|quota|integer|true|none|none| - -### QuotaUpdateRequest - - - - - - -```json -{ - "name": "max_users", - "quota": 0 -} - -``` - -QuotaUpdateRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|name|[QuotaName](#schemaquotaname)|true|none|Global, API-level, and slide-level quotas for Samia API.| -|quota|integer|true|none|none| - -### QuotaUpdateResponse - - - - - - -```json -{ - "name": "max_users", - "quota": 0 -} - -``` - -QuotaUpdateResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|name|[QuotaName](#schemaquotaname)|true|none|Global, API-level, and slide-level quotas for Samia API.| -|quota|integer|true|none|none| - -### QuotasReadResponse - - - - - - -```json -{ - "quotas": [ - { - "name": "max_users", - "quota": 0 - } - ] -} - -``` - -QuotasReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|quotas|[[QuotaReadResponse](#schemaquotareadresponse)]|true|none|[GET response payload for quota read.]| - -### QuotasUpdateRequest - - - - - - -```json -{ - "quotas": [ - { - "name": "max_users", - "quota": 0 - } - ] -} - -``` - -QuotasUpdateRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|quotas|[[QuotaUpdateRequest](#schemaquotaupdaterequest)]|true|none|[PATCH request payload for quota update.]| - -### QuotasUpdateResponse - - - - - - -```json -{ - "updated_quotas": [ - { - "name": "max_users", - "quota": 0 - } - ] -} - -``` - -QuotasUpdateResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|updated_quotas|[[QuotaUpdateResponse](#schemaquotaupdateresponse)]|true|none|[PATCH response payload for quota update.]| - -### RunCreationRequest - - - - - - -```json -{ - "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -} - -``` - -RunCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_version|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[SlugVersionRequest](#schemaslugversionrequest)|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|none| - -### RunCreationResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" -} - -``` - -RunCreationResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|none| - -### RunReadResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } -} - -``` - -RunReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|none| -|application_version_id|string(uuid)|true|none|none| -|organization_id|string|true|none|none| -|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| -|triggered_at|string(date-time)|true|none|none| -|triggered_by|string|true|none|none| -|user_payload|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -### SlugVersionRequest - - - - - - -```json -{ - "application_slug": "string", - "version": "string" -} - -``` - -SlugVersionRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_slug|string|true|none|none| -|version|string|true|none|none| - -### TransferUrls - - - - - - -```json -{ - "download_url": "http://example.com", - "upload_url": "http://example.com" -} - -``` - -TransferUrls - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|upload_url|string(uri)|true|none|none| - -### UserCreationRequest - - - - - - -```json -{ - "email": "string", - "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", - "user_id": "string" -} - -``` - -UserCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|email|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|organization_id|string(uuid)|true|none|none| -|user_id|string|true|none|none| - -### UserPayload - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] -} - -``` - -UserPayload - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|application_run_id|string(uuid)|true|none|none| -|global_output_artifacts|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|object|false|none|none| -|»» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|items|[[PayloadItem](#schemapayloaditem)]|true|none|none| - -### UserQuota - - - - - - -```json -{ - "total": 0, - "used": 0 -} - -``` - -UserQuota - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|total|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|integer|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|used|integer|true|none|none| - -### UserResponse - - - - - - -```json -{ - "organization_id": "7c60d51f-b44e-4682-87d6-449835ea4de6", - "slide_quota": { - "total": 0, - "used": 0 - }, - "user_id": "string" -} - -``` - -UserResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|organization_id|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|slide_quota|[UserQuota](#schemauserquota)|true|none|none| -|user_id|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -### UserUpdateRequest - - - - - - -```json -{ - "slide_quota": 0, - "user_id": "string" -} - -``` - -UserUpdateRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|slide_quota|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|integer|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|user_id|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -### ValidationError - - - - - - -```json -{ - "loc": [ - "string" - ], - "msg": "string", - "type": "string" -} - -``` - -ValidationError - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|loc|[anyOf]|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|integer|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|msg|string|true|none|none| -|type|string|true|none|none| - -### VersionCreationRequest - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} - -``` - -VersionCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|changelog|string|true|none|none| -|flow_id|string(uuid)|true|none|none| -|input_artifacts|[[InputArtifactSchemaCreationRequest](#schemainputartifactschemacreationrequest)]|true|none|none| -|output_artifacts|[[OutputArtifactSchemaCreationRequest](#schemaoutputartifactschemacreationrequest)]|true|none|none| -|version|string|true|none|none| - -### VersionCreationResponse - - - - - - -```json -{ - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" -} - -``` - -VersionCreationResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_version_id|string(uuid)|true|none|none| - -### VersionReadResponse - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "changelog": "string", - "created_at": "2019-08-24T14:15:22Z", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} - -``` - -VersionReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|application_version_id|string(uuid)|true|none|none| -|changelog|string|true|none|none| -|created_at|string(date-time)|true|none|none| -|flow_id|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifact](#schemainputartifact)]|true|none|none| -|output_artifacts|[[OutputArtifact](#schemaoutputartifact)]|true|none|none| -|version|string|true|none|none| +--- +title: - url: '' +language_tabs: +toc_footers: [] +includes: [] +search: true +highlight_theme: darkula +--- + + + + + + + + + + + + - Aignostics H&E TME application + title: Description + type: string + name: + examples: + - HETA + title: Name + type: string + regulatory_classes: + examples: + - - RuO + items: + type: string + title: Regulatory Classes + type: array + slug: + examples: + - heta + title: Slug + type: string + required: + - application_id + - name + - slug + - regulatory_classes + - description + title: ApplicationReadResponse + type: object + ApplicationRunStatus: + enum: + - canceled_system + - canceled_user + - completed + - completed_with_error + - received + - rejected + - running + - scheduled + title: ApplicationRunStatus + type: string + ApplicationVersionReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + application_version_slug: + examples: + - tissue-segmentation-qc:v0.0.1 + pattern: ^(?:|-)*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ + title: Application Version Slug + type: string + changelog: + title: Changelog + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Flow Id + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactReadResponse' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactReadResponse' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - application_version_id + - application_version_slug + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + title: ApplicationVersionReadResponse + type: object + HTTPValidationError: + properties: + detail: + items: + $ref: '#/components/schemas/ValidationError' + title: Detail + type: array + title: HTTPValidationError + type: object + InputArtifact: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifact + type: object + InputArtifactCreationRequest: + properties: + download_url: + examples: + - https://example.com/case-no-1-slide.tiff + format: uri + maxLength: 2083 + minLength: 1 + title: Download Url + type: string + metadata: + examples: + - checksum_crc32c: 752f9554 + height: 2000 + height_mpp: 0.5 + width: 10000 + width_mpp: 0.5 + title: Metadata + type: object + name: + examples: + - slide + title: Name + type: string + required: + - name + - download_url + - metadata + title: InputArtifactCreationRequest + type: object + InputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactReadResponse + type: object + InputArtifactSchemaCreationRequest: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactSchemaCreationRequest + type: object + ItemCreationRequest: + properties: + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactCreationRequest' + title: Input Artifacts + type: array + reference: + examples: + - case-no-1 + title: Reference + type: string + required: + - reference + - input_artifacts + title: ItemCreationRequest + type: object + ItemResultReadResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + error: + anyOf: + - type: string + - type: 'null' + title: Error + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactResultReadResponse' + title: Output Artifacts + type: array + reference: + title: Reference + type: string + status: + $ref: '#/components/schemas/ItemStatus' + required: + - item_id + - application_run_id + - reference + - status + - error + - output_artifacts + title: ItemResultReadResponse + type: object + ItemStatus: + enum: + - pending + - canceled_user + - canceled_system + - error_user + - error_system + - succeeded + title: ItemStatus + type: string + OutputArtifact: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + visibility: + $ref: '#/components/schemas/OutputArtifactVisibility' + required: + - name + - mime_type + - metadata_schema + - scope + - visibility + title: OutputArtifact + type: object + OutputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + required: + - name + - mime_type + - metadata_schema + - scope + title: OutputArtifactReadResponse + type: object + OutputArtifactResultReadResponse: + properties: + download_url: + anyOf: + - format: uri + maxLength: 2083 + minLength: 1 + type: string + - type: 'null' + title: Download Url + metadata: + title: Metadata + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - name + - mime_type + - metadata + - download_url + title: OutputArtifactResultReadResponse + type: object + OutputArtifactSchemaCreationRequest: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + visibility: + $ref: '#/components/schemas/OutputArtifactVisibility' + required: + - name + - mime_type + - scope + - visibility + - metadata_schema + title: OutputArtifactSchemaCreationRequest + type: object + OutputArtifactScope: + enum: + - item + - global + title: OutputArtifactScope + type: string + OutputArtifactVisibility: + enum: + - internal + - external + title: OutputArtifactVisibility + type: string + PayloadInputArtifact: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + input_artifact_id: + format: uuid + title: Input Artifact Id + type: string + metadata: + title: Metadata + type: object + required: + - metadata + - download_url + title: PayloadInputArtifact + type: object + PayloadItem: + properties: + input_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadInputArtifact' + title: Input Artifacts + type: object + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + title: Output Artifacts + type: object + required: + - item_id + - input_artifacts + - output_artifacts + title: PayloadItem + type: object + PayloadOutputArtifact: + properties: + data: + $ref: '#/components/schemas/TransferUrls' + metadata: + $ref: '#/components/schemas/TransferUrls' + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - data + - metadata + title: PayloadOutputArtifact + type: object + RunCreationRequest: + properties: + application_version: + anyOf: + - format: uuid + type: string + - $ref: '#/components/schemas/SlugVersionRequest' + examples: + - efbf9822-a1e5-4045-a283-dbf26e8064a9 + title: Application Version + items: + items: + $ref: '#/components/schemas/ItemCreationRequest' + title: Items + type: array + required: + - application_version + - items + title: RunCreationRequest + type: object + RunCreationResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + required: + - application_run_id + title: RunCreationResponse + type: object + RunReadResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + organization_id: + title: Organization Id + type: string + status: + $ref: '#/components/schemas/ApplicationRunStatus' + triggered_at: + format: date-time + title: Triggered At + type: string + triggered_by: + title: Triggered By + type: string + user_payload: + anyOf: + - $ref: '#/components/schemas/UserPayload' + - type: 'null' + required: + - application_run_id + - application_version_id + - organization_id + - status + - triggered_at + - triggered_by + title: RunReadResponse + type: object + SlugVersionRequest: + properties: + application_slug: + pattern: ^(-?)*$ + title: Application Slug + type: string + version: + title: Version + type: string + required: + - application_slug + - version + title: SlugVersionRequest + type: object + TransferUrls: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + upload_url: + format: uri + minLength: 1 + title: Upload Url + type: string + required: + - upload_url + - download_url + title: TransferUrls + type: object + UserPayload: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_run_id: + format: uuid + title: Application Run Id + type: string + global_output_artifacts: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + type: object + - type: 'null' + title: Global Output Artifacts + items: + items: + $ref: '#/components/schemas/PayloadItem' + title: Items + type: array + required: + - application_id + - application_run_id + - global_output_artifacts + - items + title: UserPayload + type: object + ValidationError: + properties: + loc: + items: + anyOf: + - type: string + - type: integer + title: Location + type: array + msg: + title: Message + type: string + type: + title: Error Type + type: string + required: + - loc + - msg + - type + title: ValidationError + type: object + VersionCreationRequest: + properties: + application_id: + format: uuid + title: Application Id + type: string + changelog: + title: Changelog + type: string + flow_id: + format: uuid + title: Flow Id + type: string + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactSchemaCreationRequest' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactSchemaCreationRequest' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - version + - application_id + - flow_id + - changelog + - input_artifacts + - output_artifacts + title: VersionCreationRequest + type: object + VersionCreationResponse: + properties: + application_version_id: + format: uuid + title: Application Version Id + type: string + required: + - application_version_id + title: VersionCreationResponse + type: object + VersionReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + changelog: + title: Changelog + type: string + created_at: + format: date-time + title: Created At + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Flow Id + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifact' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifact' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - application_version_id + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + - created_at + title: VersionReadResponse + type: object +info: + title: PAPI API Reference + version: 1.0.0 +openapi: 3.1.0 +paths: + /v1/applications: + get: + operationId: list_applications_v1_applications_get + parameters: + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationReadResponse' + title: Response List Applications V1 Applications Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Applications + tags: + - Externals + /v1/applications/{application_id}/versions: + get: + operationId: +list_versions_by_application_id_v1_applications__application_id__versions_get + parameters: + - in: path + name: application_id + required: true + schema: + format: uuid + title: Application Id + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Id V1 Applications +Application + Id Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Versions By Application Id + tags: + - Externals + /v1/applications/{application_slug}: + get: + operationId: +read_application_by_slug_v1_applications__application_slug__get + parameters: + - in: path + name: application_slug + required: true + schema: + title: Application Slug + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Read Application By Slug + tags: + - Externals + /v1/applications/{application_slug}/versions: + get: + operationId: +list_versions_by_application_slug_v1_applications__application_slug__versions_ge +t + parameters: + - in: path + name: application_slug + required: true + schema: + pattern: ^(-?)*$ + title: Application Slug + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Slug V1 +Applications Application + Slug Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Versions By Application Slug + tags: + - Externals + /v1/runs: + get: + operationId: list_application_runs_v1_runs_get + parameters: + - in: query + name: application_id + required: false + schema: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Id + - in: query + name: application_version_id + required: false + schema: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Version Id + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/RunReadResponse' + title: Response List Application Runs V1 Runs Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Application Runs + tags: + - Externals + post: + operationId: create_application_run_v1_runs_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Create Application Run + tags: + - Externals + /v1/runs/{application_run_id}: + get: + operationId: get_run_v1_runs__application_run_id__get + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RunReadResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Get Run + tags: + - Externals + /v1/runs/{application_run_id}/cancel: + post: + operationId: cancel_run_v1_runs__application_run_id__cancel_post + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + responses: + '202': + content: + application/json: + schema: {} + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Cancel Run + tags: + - Externals + /v1/runs/{application_run_id}/results: + delete: + operationId: +delete_run_results_v1_runs__application_run_id__results_delete + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + responses: + '204': + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Delete Run Results + tags: + - Externals + get: + operationId: list_run_results_v1_runs__application_run_id__results_get + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + - in: query + name: item_id__in + required: false + schema: + anyOf: + - items: + format: uuid + type: string + type: array + - type: 'null' + title: Item Id In + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: reference__in + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Reference In + - in: query + name: status__in + required: false + schema: + anyOf: + - items: + $ref: '#/components/schemas/ItemStatus' + type: array + - type: 'null' + title: Status In + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ItemResultReadResponse' + title: Response List Run Results V1 Runs Application Run Id +Results + Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Run Results + tags: + - Externals + /v1/versions: + post: + operationId: register_version_v1_versions_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VersionCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/VersionCreationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Register Version + tags: + - Externals + /v1/versions/{application_version_id}: + get: + operationId: get_version_v1_versions__application_version_id__get + parameters: + - in: path + name: application_version_id + required: true + schema: + format: uuid + title: Application Version Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VersionReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Get Version + tags: + - Externals +servers: +- url: '' + +> components: + +> schemas: + +> ApplicationReadResponse: + +> properties: + +> application_id: + +> format: uuid + +> title: Application Id + +> type: string + +> description: + +> examples: diff --git a/CLI_REFERENCE.md b/CLI_REFERENCE.md index 47a3b7a3..1490fbe9 100644 --- a/CLI_REFERENCE.md +++ b/CLI_REFERENCE.md @@ -10,17 +10,16 @@ $ aignostics [OPTIONS] COMMAND [ARGS]... **Options**: -- `--install-completion`: Install completion for the current shell. -- `--show-completion`: Show completion for the current shell, to copy it or - customize the installation. -- `--help`: Show this message and exit. +* `--install-completion`: Install completion for the current shell. +* `--show-completion`: Show completion for the current shell, to copy it or customize the installation. +* `--help`: Show this message and exit. 🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 **Commands**: -- `platform`: Platform diagnostics and utilities -- `application`: aignostics applications +* `platform`: Platform diagnostics and utilities +* `application`: aignostics applications ## `aignostics platform` @@ -34,16 +33,16 @@ $ aignostics platform [OPTIONS] COMMAND [ARGS]... **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. **Commands**: -- `install`: Complete and validate installation of the... -- `health`: Indicate if aignostics platform is healthy. -- `info`: Print info about service configuration. -- `authentication-settings`: Print info about service configuration. -- `openapi`: Dump the OpenAPI specification of to stdout. -- `bucket`: Transfer bucket provide by platform +* `install`: Complete and validate installation of the... +* `health`: Indicate if aignostics platform is healthy. +* `info`: Print info about service configuration. +* `authentication-settings`: Print info about service configuration. +* `openapi`: Dump the OpenAPI specification of to stdout. +* `bucket`: Transfer bucket provide by platform ### `aignostics platform install` @@ -57,7 +56,7 @@ $ aignostics platform install [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. ### `aignostics platform health` @@ -71,7 +70,7 @@ $ aignostics platform health [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. ### `aignostics platform info` @@ -85,11 +84,10 @@ $ aignostics platform info [OPTIONS] **Options**: -- `--output-format [yaml|json]`: Output format [default: yaml] -- `--env / --no-env`: Include environment variables in output [default: no-env] -- `--filter-secrets / --no-filter-secrets`: Filter out secret values from - environment variables [default: filter-secrets] -- `--help`: Show this message and exit. +* `--output-format [yaml|json]`: Output format [default: yaml] +* `--env / --no-env`: Include environment variables in output [default: no-env] +* `--filter-secrets / --no-filter-secrets`: Filter out secret values from environment variables [default: filter-secrets] +* `--help`: Show this message and exit. ### `aignostics platform authentication-settings` @@ -103,7 +101,7 @@ $ aignostics platform authentication-settings [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. ### `aignostics platform openapi` @@ -117,9 +115,9 @@ $ aignostics platform openapi [OPTIONS] **Options**: -- `--api-version [v1]`: API Version [default: v1] -- `--output-format [yaml|json]`: Output format [default: yaml] -- `--help`: Show this message and exit. +* `--api-version [v1]`: API Version [default: v1] +* `--output-format [yaml|json]`: Output format [default: yaml] +* `--help`: Show this message and exit. ### `aignostics platform bucket` @@ -133,12 +131,12 @@ $ aignostics platform bucket [OPTIONS] COMMAND [ARGS]... **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. **Commands**: -- `ls`: List contents of tranfer bucket. -- `purge`: Purge content of transfer bucket. +* `ls`: List contents of tranfer bucket. +* `purge`: Purge content of transfer bucket. #### `aignostics platform bucket ls` @@ -152,7 +150,7 @@ $ aignostics platform bucket ls [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. #### `aignostics platform bucket purge` @@ -166,7 +164,7 @@ $ aignostics platform bucket purge [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. ## `aignostics application` @@ -180,15 +178,15 @@ $ aignostics application [OPTIONS] COMMAND [ARGS]... **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. **Commands**: -- `list`: List available applications. -- `describe`: Describe application. -- `dataset`: Datasets for use as input for applications -- `metadata`: Metadata required as input for applications -- `run`: Runs of applications +* `list`: List available applications. +* `describe`: Describe application. +* `dataset`: Datasets for use as input for applications +* `metadata`: Metadata required as input for applications +* `run`: Runs of applications ### `aignostics application list` @@ -202,7 +200,7 @@ $ aignostics application list [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. ### `aignostics application describe` @@ -216,7 +214,7 @@ $ aignostics application describe [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. ### `aignostics application dataset` @@ -230,11 +228,11 @@ $ aignostics application dataset [OPTIONS] COMMAND [ARGS]... **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. **Commands**: -- `download`: Download dataset. +* `download`: Download dataset. #### `aignostics application dataset download` @@ -248,7 +246,7 @@ $ aignostics application dataset download [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. ### `aignostics application metadata` @@ -262,11 +260,11 @@ $ aignostics application metadata [OPTIONS] COMMAND [ARGS]... **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. **Commands**: -- `generate`: Generate metadata. +* `generate`: Generate metadata. #### `aignostics application metadata generate` @@ -280,7 +278,7 @@ $ aignostics application metadata generate [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. ### `aignostics application run` @@ -294,15 +292,15 @@ $ aignostics application run [OPTIONS] COMMAND [ARGS]... **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. **Commands**: -- `submit`: Create run. -- `list`: List runs. -- `describe`: Describe run. -- `cancel`: Cancel run. -- `result`: Results of applications runs +* `submit`: Create run. +* `list`: List runs. +* `describe`: Describe run. +* `cancel`: Cancel run. +* `result`: Results of applications runs #### `aignostics application run submit` @@ -316,7 +314,7 @@ $ aignostics application run submit [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. #### `aignostics application run list` @@ -330,7 +328,7 @@ $ aignostics application run list [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. #### `aignostics application run describe` @@ -344,7 +342,7 @@ $ aignostics application run describe [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. #### `aignostics application run cancel` @@ -358,7 +356,7 @@ $ aignostics application run cancel [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. #### `aignostics application run result` @@ -372,13 +370,13 @@ $ aignostics application run result [OPTIONS] COMMAND [ARGS]... **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. **Commands**: -- `describe`: Describe the result of an application run. -- `download`: Download the result of an application run. -- `delete`: Delete the result of an application run. +* `describe`: Describe the result of an application run. +* `download`: Download the result of an application run. +* `delete`: Delete the result of an application run. ##### `aignostics application run result describe` @@ -392,7 +390,7 @@ $ aignostics application run result describe [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. ##### `aignostics application run result download` @@ -406,7 +404,7 @@ $ aignostics application run result download [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. ##### `aignostics application run result delete` @@ -420,4 +418,4 @@ $ aignostics application run result delete [OPTIONS] **Options**: -- `--help`: Show this message and exit. +* `--help`: Show this message and exit. diff --git a/codegen/in/api.json b/codegen/in/api.json index d7df3f2b..75818a93 100644 --- a/codegen/in/api.json +++ b/codegen/in/api.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"Aignostics Platform API","summary":"Interact with Aignostics' Application Platform","description":"Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`.","version":"0.1.0"},"paths":{"/v1/applications":{"post":{"tags":["Admins"],"summary":"Register Application","operationId":"register_application_v1_applications_post","security":[{"OAuth2AuthorizationCodeBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationCreationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationCreationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Externals"],"summary":"List Applications","operationId":"list_applications_v1_applications_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationReadResponse"},"title":"Response List Applications V1 Applications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_id}":{"get":{"tags":["Externals"],"summary":"Read Application By Id","operationId":"read_application_by_id_v1_applications__application_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_slug}":{"get":{"tags":["Externals"],"summary":"Read Application By Slug","operationId":"read_application_by_slug_v1_applications__application_slug__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_slug","in":"path","required":true,"schema":{"type":"string","title":"Application Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_id}/versions":{"get":{"tags":["Externals"],"summary":"List Versions By Application Id","operationId":"list_versions_by_application_id_v1_applications__application_id__versions_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Id V1 Applications Application Id Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_slug}/versions":{"get":{"tags":["Externals"],"summary":"List Versions By Application Slug","operationId":"list_versions_by_application_slug_v1_applications__application_slug__versions_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z](-?[a-z])*$","title":"Application Slug"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Slug V1 Applications Application Slug Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/artifacts/{output_artifact_id}/event":{"post":{"tags":["Algorithms/Apps"],"summary":"Trigger Artifact Event","operationId":"trigger_artifact_event_v1_artifacts__output_artifact_id__event_post","parameters":[{"name":"output_artifact_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Output Artifact Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputArtifactEventTriggerRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutputArtifactEventTriggerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/items/{item_id}":{"get":{"tags":["Scheduler"],"summary":"Get Item","operationId":"get_item_v1_items__item_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/items/{item_id}/event":{"post":{"tags":["Scheduler"],"summary":"Register Item Event","operationId":"register_item_event_v1_items__item_id__event_post","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemEventCreationRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemEventCreationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/organizations":{"post":{"tags":["Organizations"],"summary":"Create Organization","operationId":"create_organization_v1_organizations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationCreationRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2AuthorizationCodeBearer":[]}]}},"/v1/organizations/{organization_id}":{"patch":{"tags":["Organizations"],"summary":"Update Organization","operationId":"update_organization_v1_organizations__organization_id__patch","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Organizations"],"summary":"Get Organization","operationId":"get_organization_v1_organizations__organization_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/quotas":{"get":{"tags":["Admins","Admins"],"summary":"List Quotas","operationId":"list_quotas_v1_quotas_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotasReadResponse"}}}}},"security":[{"OAuth2AuthorizationCodeBearer":[]}]},"patch":{"tags":["Admins","Admins"],"summary":"Update Quotas","operationId":"update_quotas_v1_quotas_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotasUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotasUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2AuthorizationCodeBearer":[]}]}},"/v1/runs":{"get":{"tags":["Externals"],"summary":"List Application Runs","operationId":"list_application_runs_v1_runs_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Id"}},{"name":"application_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Version Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RunReadResponse"},"title":"Response List Application Runs V1 Runs Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Externals"],"summary":"Create Application Run","operationId":"create_application_run_v1_runs_post","security":[{"OAuth2AuthorizationCodeBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}":{"get":{"tags":["Externals","Scheduler"],"summary":"Get Run","operationId":"get_run_v1_runs__application_run_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunReadResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/cancel":{"post":{"tags":["Externals"],"summary":"Cancel Run","operationId":"cancel_run_v1_runs__application_run_id__cancel_post","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/results":{"get":{"tags":["Externals"],"summary":"List Run Results","operationId":"list_run_results_v1_runs__application_run_id__results_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}},{"name":"item_id__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Item Id In"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"reference__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Reference In"}},{"name":"status__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ItemStatus"}},{"type":"null"}],"title":"Status In"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ItemResultReadResponse"},"title":"Response List Run Results V1 Runs Application Run Id Results Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Externals"],"summary":"Delete Run Results","operationId":"delete_run_results_v1_runs__application_run_id__results_delete","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}}],"responses":{"204":{"description":"Successful Response"},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users/":{"post":{"tags":["Externals"],"summary":"Create User","operationId":"create_user_v1_users__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"404":{"description":"User not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2AuthorizationCodeBearer":[]}]}},"/v1/users/{user_id}":{"patch":{"tags":["Externals"],"summary":"Update User","operationId":"update_user_v1_users__user_id__patch","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"404":{"description":"User not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Externals"],"summary":"Get User","operationId":"get_user_v1_users__user_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"404":{"description":"User not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/versions":{"post":{"tags":["Externals","Scheduler","Admins"],"summary":"Register Version","operationId":"register_version_v1_versions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreationRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2AuthorizationCodeBearer":[]}]}},"/v1/versions/{application_version_id}":{"get":{"tags":["Externals","Scheduler"],"summary":"Get Version","operationId":"get_version_v1_versions__application_version_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Version Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/liveness":{"get":{"tags":["Infrastructure"],"summary":"Liveness","description":"Check that the API application is alive and responsive.","operationId":"liveness_liveness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/readiness":{"get":{"tags":["Infrastructure"],"summary":"Readiness","description":"Check that the API application is ready to serve.","operationId":"readiness_readiness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["Infrastructure"],"summary":"Health","description":"Check that the API application is alive and responsive.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/docs":{"get":{"summary":"Get Documentation","operationId":"get_documentation_docs_get","parameters":[{"name":"access_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ApplicationCreationRequest":{"properties":{"name":{"type":"string","title":"Name","examples":["HETA"]},"description":{"type":"string","title":"Description","examples":["H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, cell detection and cell classfication"]},"regulatory_classes":{"items":{"type":"string"},"type":"array","title":"Regulatory Classes","examples":[["RuO"]]}},"type":"object","required":["name","description","regulatory_classes"],"title":"ApplicationCreationRequest"},"ApplicationCreationResponse":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"}},"type":"object","required":["application_id"],"title":"ApplicationCreationResponse"},"ApplicationReadResponse":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"},"name":{"type":"string","title":"Name","examples":["HETA"]},"slug":{"type":"string","title":"Slug","examples":["heta"]},"regulatory_classes":{"items":{"type":"string"},"type":"array","title":"Regulatory Classes","examples":[["RuO"]]},"description":{"type":"string","title":"Description","examples":["Aignostics H&E TME application"]}},"type":"object","required":["application_id","name","slug","regulatory_classes","description"],"title":"ApplicationReadResponse"},"ApplicationRunStatus":{"type":"string","enum":["canceled_system","canceled_user","completed","completed_with_error","received","rejected","running","scheduled"],"title":"ApplicationRunStatus"},"ApplicationVersionReadResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"application_version_slug":{"type":"string","pattern":"^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$","title":"Application Version Slug","examples":["tissue-segmentation-qc:v0.0.1"]},"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactReadResponse"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactReadResponse"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["application_version_id","application_version_slug","version","application_id","changelog","input_artifacts","output_artifacts"],"title":"ApplicationVersionReadResponse"},"ArtifactEvent":{"type":"string","enum":["succeeded","failed_with_user_error","failed_with_system_error"],"title":"ArtifactEvent","description":"This is a subset of the OutputArtifactEvent used by the state machine.\nOnly the variants defined below are allowed to be submitted from the Algorithms/Applications."},"ArtifactStatus":{"type":"string","enum":["pending","canceled_user","canceled_system","error_user","error_system_fatal","error_system_recoverable","skipped","succeeded"],"title":"ArtifactStatus"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InputArtifact":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifact"},"InputArtifactCreationRequest":{"properties":{"name":{"type":"string","title":"Name","examples":["slide"]},"download_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Download Url","examples":["https://example.com/case-no-1-slide.tiff"]},"metadata":{"type":"object","title":"Metadata","examples":[{"checksum_crc32c":"752f9554","height":2000,"height_mpp":0.5,"width":10000,"width_mpp":0.5}]}},"type":"object","required":["name","download_url","metadata"],"title":"InputArtifactCreationRequest"},"InputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactReadResponse"},"InputArtifactSchemaCreationRequest":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactSchemaCreationRequest"},"ItemCreationRequest":{"properties":{"reference":{"type":"string","title":"Reference","examples":["case-no-1"]},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactCreationRequest"},"type":"array","title":"Input Artifacts"}},"type":"object","required":["reference","input_artifacts"],"title":"ItemCreationRequest"},"ItemEvent":{"type":"string","enum":["failed_with_system_error","failed_recoverable"],"title":"ItemEvent"},"ItemEventCreationRequest":{"properties":{"event":{"$ref":"#/components/schemas/ItemEvent"},"error":{"type":"string","title":"Error"}},"type":"object","required":["event","error"],"title":"ItemEventCreationRequest"},"ItemEventCreationResponse":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"status":{"$ref":"#/components/schemas/ItemStatus"}},"type":"object","required":["item_id","status"],"title":"ItemEventCreationResponse"},"ItemReadResponse":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"application_run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Run Id"},"reference":{"type":"string","title":"Reference"},"status":{"$ref":"#/components/schemas/ItemStatus"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["item_id","reference","status","error"],"title":"ItemReadResponse"},"ItemResultReadResponse":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"reference":{"type":"string","title":"Reference"},"status":{"$ref":"#/components/schemas/ItemStatus"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactResultReadResponse"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["item_id","application_run_id","reference","status","error","output_artifacts"],"title":"ItemResultReadResponse"},"ItemStatus":{"type":"string","enum":["pending","canceled_user","canceled_system","error_user","error_system","succeeded"],"title":"ItemStatus"},"OrganizationCreationRequest":{"properties":{"organization_id":{"type":"string","title":"Organization Id"},"owner_email":{"type":"string","title":"Owner Email"},"slide_quota":{"type":"integer","title":"Slide Quota"},"batch_size":{"type":"integer","title":"Batch Size"}},"type":"object","required":["organization_id","owner_email","slide_quota","batch_size"],"title":"OrganizationCreationRequest"},"OrganizationQuota":{"properties":{"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"used":{"type":"integer","title":"Used"}},"type":"object","required":["total","used"],"title":"OrganizationQuota"},"OrganizationResponse":{"properties":{"organization_id":{"type":"string","title":"Organization Id"},"owner_id":{"type":"string","format":"uuid","title":"Owner Id"},"slide_quota":{"$ref":"#/components/schemas/OrganizationQuota"},"batch_size":{"type":"integer","title":"Batch Size"}},"type":"object","required":["organization_id","owner_id","slide_quota","batch_size"],"title":"OrganizationResponse"},"OrganizationUpdateRequest":{"properties":{"slide_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Slide Quota"},"batch_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Batch Size"}},"type":"object","title":"OrganizationUpdateRequest"},"OutputArtifact":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"},"visibility":{"$ref":"#/components/schemas/OutputArtifactVisibility"}},"type":"object","required":["name","mime_type","metadata_schema","scope","visibility"],"title":"OutputArtifact"},"OutputArtifactEventTriggerRequest":{"properties":{"event":{"$ref":"#/components/schemas/ArtifactEvent"},"metadata":{"type":"object","title":"Metadata"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["event","metadata"],"title":"OutputArtifactEventTriggerRequest"},"OutputArtifactEventTriggerResponse":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"status":{"$ref":"#/components/schemas/ArtifactStatus"}},"type":"object","required":["output_artifact_id","status"],"title":"OutputArtifactEventTriggerResponse"},"OutputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"}},"type":"object","required":["name","mime_type","metadata_schema","scope"],"title":"OutputArtifactReadResponse"},"OutputArtifactResultReadResponse":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata":{"type":"object","title":"Metadata"},"download_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Download Url"}},"type":"object","required":["output_artifact_id","name","mime_type","metadata","download_url"],"title":"OutputArtifactResultReadResponse"},"OutputArtifactSchemaCreationRequest":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"},"visibility":{"$ref":"#/components/schemas/OutputArtifactVisibility"},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","scope","visibility","metadata_schema"],"title":"OutputArtifactSchemaCreationRequest"},"OutputArtifactScope":{"type":"string","enum":["item","global"],"title":"OutputArtifactScope"},"OutputArtifactVisibility":{"type":"string","enum":["internal","external"],"title":"OutputArtifactVisibility"},"PayloadInputArtifact":{"properties":{"input_artifact_id":{"type":"string","format":"uuid","title":"Input Artifact Id"},"metadata":{"type":"object","title":"Metadata"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["input_artifact_id","metadata","download_url"],"title":"PayloadInputArtifact"},"PayloadItem":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"input_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadInputArtifact"},"type":"object","title":"Input Artifacts"},"output_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object","title":"Output Artifacts"}},"type":"object","required":["item_id","input_artifacts","output_artifacts"],"title":"PayloadItem"},"PayloadOutputArtifact":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"data":{"$ref":"#/components/schemas/TransferUrls"},"metadata":{"$ref":"#/components/schemas/TransferUrls"}},"type":"object","required":["output_artifact_id","data","metadata"],"title":"PayloadOutputArtifact"},"QuotaName":{"type":"string","enum":["max_users","max_organizations","max_users_per_organization","max_applications","max_application_versions","max_slides_per_run","max_parallel_runs","max_parallel_runs_per_organization","max_parallel_runs_per_user"],"title":"QuotaName","description":"Global, API-level, and slide-level quotas for Samia API."},"QuotaReadResponse":{"properties":{"name":{"$ref":"#/components/schemas/QuotaName"},"quota":{"type":"integer","title":"Quota"}},"type":"object","required":["name","quota"],"title":"QuotaReadResponse","description":"GET response payload for quota read."},"QuotaUpdateRequest":{"properties":{"name":{"$ref":"#/components/schemas/QuotaName"},"quota":{"type":"integer","exclusiveMinimum":0.0,"title":"Quota"}},"type":"object","required":["name","quota"],"title":"QuotaUpdateRequest","description":"PATCH request payload for quota update."},"QuotaUpdateResponse":{"properties":{"name":{"$ref":"#/components/schemas/QuotaName"},"quota":{"type":"integer","title":"Quota"}},"type":"object","required":["name","quota"],"title":"QuotaUpdateResponse","description":"PATCH response payload for quota update."},"QuotasReadResponse":{"properties":{"quotas":{"items":{"$ref":"#/components/schemas/QuotaReadResponse"},"type":"array","title":"Quotas"}},"type":"object","required":["quotas"],"title":"QuotasReadResponse","description":"GET response payload for multiple quota reads."},"QuotasUpdateRequest":{"properties":{"quotas":{"items":{"$ref":"#/components/schemas/QuotaUpdateRequest"},"type":"array","title":"Quotas"}},"type":"object","required":["quotas"],"title":"QuotasUpdateRequest","description":"PATCH request payload for quota updates."},"QuotasUpdateResponse":{"properties":{"updated_quotas":{"items":{"$ref":"#/components/schemas/QuotaUpdateResponse"},"type":"array","title":"Updated Quotas"}},"type":"object","required":["updated_quotas"],"title":"QuotasUpdateResponse","description":"PATCH response payload for quota updates."},"RunCreationRequest":{"properties":{"application_version":{"anyOf":[{"type":"string","format":"uuid"},{"$ref":"#/components/schemas/SlugVersionRequest"}],"title":"Application Version","examples":["efbf9822-a1e5-4045-a283-dbf26e8064a9"]},"items":{"items":{"$ref":"#/components/schemas/ItemCreationRequest"},"type":"array","title":"Items"}},"type":"object","required":["application_version","items"],"title":"RunCreationRequest"},"RunCreationResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"}},"type":"object","required":["application_run_id"],"title":"RunCreationResponse"},"RunReadResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"organization_id":{"type":"string","title":"Organization Id"},"user_payload":{"anyOf":[{"$ref":"#/components/schemas/UserPayload"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/ApplicationRunStatus"},"triggered_at":{"type":"string","format":"date-time","title":"Triggered At"},"triggered_by":{"type":"string","title":"Triggered By"}},"type":"object","required":["application_run_id","application_version_id","organization_id","status","triggered_at","triggered_by"],"title":"RunReadResponse"},"SlugVersionRequest":{"properties":{"application_slug":{"type":"string","pattern":"^[a-z](-?[a-z])*$","title":"Application Slug"},"version":{"type":"string","title":"Version"}},"type":"object","required":["application_slug","version"],"title":"SlugVersionRequest"},"TransferUrls":{"properties":{"upload_url":{"type":"string","minLength":1,"format":"uri","title":"Upload Url"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["upload_url","download_url"],"title":"TransferUrls"},"UserCreationRequest":{"properties":{"user_id":{"type":"string","title":"User Id"},"organization_id":{"type":"string","format":"uuid","title":"Organization Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["user_id","organization_id","email"],"title":"UserCreationRequest"},"UserPayload":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"global_output_artifacts":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object"},{"type":"null"}],"title":"Global Output Artifacts"},"items":{"items":{"$ref":"#/components/schemas/PayloadItem"},"type":"array","title":"Items"}},"type":"object","required":["application_id","application_run_id","global_output_artifacts","items"],"title":"UserPayload"},"UserQuota":{"properties":{"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"used":{"type":"integer","title":"Used"}},"type":"object","required":["total","used"],"title":"UserQuota"},"UserResponse":{"properties":{"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"slide_quota":{"$ref":"#/components/schemas/UserQuota"}},"type":"object","required":["user_id","organization_id","slide_quota"],"title":"UserResponse"},"UserUpdateRequest":{"properties":{"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"slide_quota":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Slide Quota"}},"type":"object","title":"UserUpdateRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionCreationRequest":{"properties":{"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"type":"string","format":"uuid","title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactSchemaCreationRequest"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactSchemaCreationRequest"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["version","application_id","flow_id","changelog","input_artifacts","output_artifacts"],"title":"VersionCreationRequest"},"VersionCreationResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"}},"type":"object","required":["application_version_id"],"title":"VersionCreationResponse"},"VersionReadResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifact"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifact"},"type":"array","title":"Output Artifacts"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["application_version_id","version","application_id","changelog","input_artifacts","output_artifacts","created_at"],"title":"VersionReadResponse"}},"securitySchemes":{"OAuth2AuthorizationCodeBearer":{"type":"oauth2","flows":{"authorizationCode":{"scopes":{},"authorizationUrl":"https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize","tokenUrl":"https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token"}}}}},"tags":[{"name":"Externals","description":"Called by externals to interact with our API"},{"name":"Algorithms/Apps","description":"Called by the Algorithms and applications to update statuses"},{"name":"Scheduler","description":"Called by the Scheduler"},{"name":"Admins","description":"Called by Admins to manage and register entities"},{"name":"Infrastructure","description":"Called by other Infra"}]} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"PAPI API Reference","version":"1.0.0"},"servers":[{"url":""}],"paths":{"/v1/applications":{"get":{"tags":["Externals"],"summary":"List Applications","operationId":"list_applications_v1_applications_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationReadResponse"},"title":"Response List Applications V1 Applications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_slug}":{"get":{"tags":["Externals"],"summary":"Read Application By Slug","operationId":"read_application_by_slug_v1_applications__application_slug__get","parameters":[{"name":"application_slug","in":"path","required":true,"schema":{"type":"string","title":"Application Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs":{"get":{"tags":["Externals"],"summary":"List Application Runs","operationId":"list_application_runs_v1_runs_get","parameters":[{"name":"application_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Id"}},{"name":"application_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Version Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RunReadResponse"},"title":"Response List Application Runs V1 Runs Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Externals"],"summary":"Create Application Run","operationId":"create_application_run_v1_runs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}":{"get":{"tags":["Externals"],"summary":"Get Run","operationId":"get_run_v1_runs__application_run_id__get","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunReadResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/cancel":{"post":{"tags":["Externals"],"summary":"Cancel Run","operationId":"cancel_run_v1_runs__application_run_id__cancel_post","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/results":{"get":{"tags":["Externals"],"summary":"List Run Results","operationId":"list_run_results_v1_runs__application_run_id__results_get","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}},{"name":"item_id__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Item Id In"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"reference__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Reference In"}},{"name":"status__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ItemStatus"}},{"type":"null"}],"title":"Status In"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ItemResultReadResponse"},"title":"Response List Run Results V1 Runs Application Run Id Results Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Externals"],"summary":"Delete Run Results","operationId":"delete_run_results_v1_runs__application_run_id__results_delete","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}}],"responses":{"204":{"description":"Successful Response"},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/versions":{"post":{"tags":["Externals"],"summary":"Register Version","operationId":"register_version_v1_versions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreationRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_id}/versions":{"get":{"tags":["Externals"],"summary":"List Versions By Application Id","operationId":"list_versions_by_application_id_v1_applications__application_id__versions_get","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Id V1 Applications Application Id Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_slug}/versions":{"get":{"tags":["Externals"],"summary":"List Versions By Application Slug","operationId":"list_versions_by_application_slug_v1_applications__application_slug__versions_get","parameters":[{"name":"application_slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z](-?[a-z])*$","title":"Application Slug"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Slug V1 Applications Application Slug Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/versions/{application_version_id}":{"get":{"tags":["Externals"],"summary":"Get Version","operationId":"get_version_v1_versions__application_version_id__get","parameters":[{"name":"application_version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Version Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ApplicationReadResponse":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"},"name":{"type":"string","title":"Name","examples":["HETA"]},"slug":{"type":"string","title":"Slug","examples":["heta"]},"regulatory_classes":{"items":{"type":"string"},"type":"array","title":"Regulatory Classes","examples":[["RuO"]]},"description":{"type":"string","title":"Description","examples":["Aignostics H&E TME application"]}},"type":"object","required":["application_id","name","slug","regulatory_classes","description"],"title":"ApplicationReadResponse"},"ApplicationRunStatus":{"type":"string","enum":["canceled_system","canceled_user","completed","completed_with_error","received","rejected","running","scheduled"],"title":"ApplicationRunStatus"},"ApplicationVersionReadResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"application_version_slug":{"type":"string","pattern":"^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$","title":"Application Version Slug","examples":["tissue-segmentation-qc:v0.0.1"]},"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactReadResponse"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactReadResponse"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["application_version_id","application_version_slug","version","application_id","changelog","input_artifacts","output_artifacts"],"title":"ApplicationVersionReadResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InputArtifact":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+/\\w+(?:[-+.]|\\w)+\\w+$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifact"},"InputArtifactCreationRequest":{"properties":{"name":{"type":"string","title":"Name","examples":["slide"]},"download_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Download Url","examples":["https://example.com/case-no-1-slide.tiff"]},"metadata":{"type":"object","title":"Metadata","examples":[{"checksum_crc32c":"752f9554","height":2000,"height_mpp":0.5,"width":10000,"width_mpp":0.5}]}},"type":"object","required":["name","download_url","metadata"],"title":"InputArtifactCreationRequest"},"InputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+/\\w+(?:[-+.]|\\w)+\\w+$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactReadResponse"},"InputArtifactSchemaCreationRequest":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactSchemaCreationRequest"},"ItemCreationRequest":{"properties":{"reference":{"type":"string","title":"Reference","examples":["case-no-1"]},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactCreationRequest"},"type":"array","title":"Input Artifacts"}},"type":"object","required":["reference","input_artifacts"],"title":"ItemCreationRequest"},"ItemResultReadResponse":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"reference":{"type":"string","title":"Reference"},"status":{"$ref":"#/components/schemas/ItemStatus"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactResultReadResponse"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["item_id","application_run_id","reference","status","error","output_artifacts"],"title":"ItemResultReadResponse"},"ItemStatus":{"type":"string","enum":["pending","canceled_user","canceled_system","error_user","error_system","succeeded"],"title":"ItemStatus"},"OutputArtifact":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+/\\w+(?:[-+.]|\\w)+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"},"visibility":{"$ref":"#/components/schemas/OutputArtifactVisibility"}},"type":"object","required":["name","mime_type","metadata_schema","scope","visibility"],"title":"OutputArtifact"},"OutputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+/\\w+(?:[-+.]|\\w)+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"}},"type":"object","required":["name","mime_type","metadata_schema","scope"],"title":"OutputArtifactReadResponse"},"OutputArtifactResultReadResponse":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+/\\w+(?:[-+.]|\\w)+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata":{"type":"object","title":"Metadata"},"download_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Download Url"}},"type":"object","required":["output_artifact_id","name","mime_type","metadata","download_url"],"title":"OutputArtifactResultReadResponse"},"OutputArtifactSchemaCreationRequest":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"},"visibility":{"$ref":"#/components/schemas/OutputArtifactVisibility"},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","scope","visibility","metadata_schema"],"title":"OutputArtifactSchemaCreationRequest"},"OutputArtifactScope":{"type":"string","enum":["item","global"],"title":"OutputArtifactScope"},"OutputArtifactVisibility":{"type":"string","enum":["internal","external"],"title":"OutputArtifactVisibility"},"PayloadInputArtifact":{"properties":{"input_artifact_id":{"type":"string","format":"uuid","title":"Input Artifact Id"},"metadata":{"type":"object","title":"Metadata"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["metadata","download_url"],"title":"PayloadInputArtifact"},"PayloadItem":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"input_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadInputArtifact"},"type":"object","title":"Input Artifacts"},"output_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object","title":"Output Artifacts"}},"type":"object","required":["item_id","input_artifacts","output_artifacts"],"title":"PayloadItem"},"PayloadOutputArtifact":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"data":{"$ref":"#/components/schemas/TransferUrls"},"metadata":{"$ref":"#/components/schemas/TransferUrls"}},"type":"object","required":["output_artifact_id","data","metadata"],"title":"PayloadOutputArtifact"},"RunCreationRequest":{"properties":{"application_version":{"anyOf":[{"type":"string","format":"uuid"},{"$ref":"#/components/schemas/SlugVersionRequest"}],"title":"Application Version","examples":["efbf9822-a1e5-4045-a283-dbf26e8064a9"]},"items":{"items":{"$ref":"#/components/schemas/ItemCreationRequest"},"type":"array","title":"Items"}},"type":"object","required":["application_version","items"],"title":"RunCreationRequest"},"RunCreationResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"}},"type":"object","required":["application_run_id"],"title":"RunCreationResponse"},"RunReadResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"organization_id":{"type":"string","title":"Organization Id"},"user_payload":{"anyOf":[{"$ref":"#/components/schemas/UserPayload"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/ApplicationRunStatus"},"triggered_at":{"type":"string","format":"date-time","title":"Triggered At"},"triggered_by":{"type":"string","title":"Triggered By"}},"type":"object","required":["application_run_id","application_version_id","organization_id","status","triggered_at","triggered_by"],"title":"RunReadResponse"},"SlugVersionRequest":{"properties":{"application_slug":{"type":"string","pattern":"^[a-z](-?[a-z])*$","title":"Application Slug"},"version":{"type":"string","title":"Version"}},"type":"object","required":["application_slug","version"],"title":"SlugVersionRequest"},"TransferUrls":{"properties":{"upload_url":{"type":"string","minLength":1,"format":"uri","title":"Upload Url"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["upload_url","download_url"],"title":"TransferUrls"},"UserPayload":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"global_output_artifacts":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object"},{"type":"null"}],"title":"Global Output Artifacts"},"items":{"items":{"$ref":"#/components/schemas/PayloadItem"},"type":"array","title":"Items"}},"type":"object","required":["application_id","application_run_id","global_output_artifacts","items"],"title":"UserPayload"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionCreationRequest":{"properties":{"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"type":"string","format":"uuid","title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactSchemaCreationRequest"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactSchemaCreationRequest"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["version","application_id","flow_id","changelog","input_artifacts","output_artifacts"],"title":"VersionCreationRequest"},"VersionCreationResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"}},"type":"object","required":["application_version_id"],"title":"VersionCreationResponse"},"VersionReadResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifact"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifact"},"type":"array","title":"Output Artifacts"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["application_version_id","version","application_id","changelog","input_artifacts","output_artifacts","created_at"],"title":"VersionReadResponse"}}}} \ No newline at end of file diff --git a/codegen/out/.openapi-generator/FILES b/codegen/out/.openapi-generator/FILES index b65f8044..1a1f5837 100644 --- a/codegen/out/.openapi-generator/FILES +++ b/codegen/out/.openapi-generator/FILES @@ -3,33 +3,19 @@ aignx/codegen/api_client.py aignx/codegen/api_response.py aignx/codegen/configuration.py aignx/codegen/exceptions.py -aignx/codegen/models/application_creation_request.py -aignx/codegen/models/application_creation_response.py aignx/codegen/models/application_read_response.py aignx/codegen/models/application_run_status.py aignx/codegen/models/application_version.py aignx/codegen/models/application_version_read_response.py -aignx/codegen/models/artifact_event.py -aignx/codegen/models/artifact_status.py aignx/codegen/models/http_validation_error.py aignx/codegen/models/input_artifact.py aignx/codegen/models/input_artifact_creation_request.py aignx/codegen/models/input_artifact_read_response.py aignx/codegen/models/input_artifact_schema_creation_request.py aignx/codegen/models/item_creation_request.py -aignx/codegen/models/item_event.py -aignx/codegen/models/item_event_creation_request.py -aignx/codegen/models/item_event_creation_response.py -aignx/codegen/models/item_read_response.py aignx/codegen/models/item_result_read_response.py aignx/codegen/models/item_status.py -aignx/codegen/models/organization_creation_request.py -aignx/codegen/models/organization_quota.py -aignx/codegen/models/organization_response.py -aignx/codegen/models/organization_update_request.py aignx/codegen/models/output_artifact.py -aignx/codegen/models/output_artifact_event_trigger_request.py -aignx/codegen/models/output_artifact_event_trigger_response.py aignx/codegen/models/output_artifact_read_response.py aignx/codegen/models/output_artifact_result_read_response.py aignx/codegen/models/output_artifact_schema_creation_request.py @@ -38,23 +24,12 @@ aignx/codegen/models/output_artifact_visibility.py aignx/codegen/models/payload_input_artifact.py aignx/codegen/models/payload_item.py aignx/codegen/models/payload_output_artifact.py -aignx/codegen/models/quota_name.py -aignx/codegen/models/quota_read_response.py -aignx/codegen/models/quota_update_request.py -aignx/codegen/models/quota_update_response.py -aignx/codegen/models/quotas_read_response.py -aignx/codegen/models/quotas_update_request.py -aignx/codegen/models/quotas_update_response.py aignx/codegen/models/run_creation_request.py aignx/codegen/models/run_creation_response.py aignx/codegen/models/run_read_response.py aignx/codegen/models/slug_version_request.py aignx/codegen/models/transfer_urls.py -aignx/codegen/models/user_creation_request.py aignx/codegen/models/user_payload.py -aignx/codegen/models/user_quota.py -aignx/codegen/models/user_response.py -aignx/codegen/models/user_update_request.py aignx/codegen/models/validation_error.py aignx/codegen/models/validation_error_loc_inner.py aignx/codegen/models/version_creation_request.py diff --git a/codegen/out/aignx/codegen/api/externals_api.py b/codegen/out/aignx/codegen/api/externals_api.py index 588cf0ee..34da838a 100644 --- a/codegen/out/aignx/codegen/api/externals_api.py +++ b/codegen/out/aignx/codegen/api/externals_api.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. @@ -25,9 +25,6 @@ from aignx.codegen.models.run_creation_request import RunCreationRequest from aignx.codegen.models.run_creation_response import RunCreationResponse from aignx.codegen.models.run_read_response import RunReadResponse -from aignx.codegen.models.user_creation_request import UserCreationRequest -from aignx.codegen.models.user_response import UserResponse -from aignx.codegen.models.user_update_request import UserUpdateRequest from aignx.codegen.models.version_creation_request import VersionCreationRequest from aignx.codegen.models.version_creation_response import VersionCreationResponse from aignx.codegen.models.version_read_response import VersionReadResponse @@ -293,7 +290,6 @@ def _cancel_run_v1_runs_application_run_id_cancel_post_serialize( # authentication setting _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( @@ -570,7 +566,6 @@ def _create_application_run_v1_runs_post_serialize( # authentication setting _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( @@ -592,9 +587,9 @@ def _create_application_run_v1_runs_post_serialize( @validate_call - def create_user_v1_users_post( + def delete_run_results_v1_runs_application_run_id_results_delete( self, - user_creation_request: UserCreationRequest, + application_run_id: StrictStr, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -607,12 +602,12 @@ def create_user_v1_users_post( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> UserResponse: - """Create User + ) -> None: + """Delete Run Results - :param user_creation_request: (required) - :type user_creation_request: UserCreationRequest + :param application_run_id: (required) + :type application_run_id: str :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -635,8 +630,8 @@ def create_user_v1_users_post( :return: Returns the result object. """ # noqa: E501 - _param = self._create_user_v1_users_post_serialize( - user_creation_request=user_creation_request, + _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + application_run_id=application_run_id, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -644,7 +639,7 @@ def create_user_v1_users_post( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", + '204': None, '404': None, '422': "HTTPValidationError", } @@ -660,9 +655,9 @@ def create_user_v1_users_post( @validate_call - def create_user_v1_users_post_with_http_info( + def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( self, - user_creation_request: UserCreationRequest, + application_run_id: StrictStr, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -675,12 +670,12 @@ def create_user_v1_users_post_with_http_info( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[UserResponse]: - """Create User + ) -> ApiResponse[None]: + """Delete Run Results - :param user_creation_request: (required) - :type user_creation_request: UserCreationRequest + :param application_run_id: (required) + :type application_run_id: str :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -703,8 +698,8 @@ def create_user_v1_users_post_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._create_user_v1_users_post_serialize( - user_creation_request=user_creation_request, + _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + application_run_id=application_run_id, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -712,7 +707,7 @@ def create_user_v1_users_post_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", + '204': None, '404': None, '422': "HTTPValidationError", } @@ -728,9 +723,9 @@ def create_user_v1_users_post_with_http_info( @validate_call - def create_user_v1_users_post_without_preload_content( + def delete_run_results_v1_runs_application_run_id_results_delete_without_preload_content( self, - user_creation_request: UserCreationRequest, + application_run_id: StrictStr, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -744,11 +739,11 @@ def create_user_v1_users_post_without_preload_content( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """Create User + """Delete Run Results - :param user_creation_request: (required) - :type user_creation_request: UserCreationRequest + :param application_run_id: (required) + :type application_run_id: str :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -771,8 +766,8 @@ def create_user_v1_users_post_without_preload_content( :return: Returns the result object. """ # noqa: E501 - _param = self._create_user_v1_users_post_serialize( - user_creation_request=user_creation_request, + _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + application_run_id=application_run_id, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -780,7 +775,7 @@ def create_user_v1_users_post_without_preload_content( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", + '204': None, '404': None, '422': "HTTPValidationError", } @@ -791,9 +786,9 @@ def create_user_v1_users_post_without_preload_content( return response_data.response - def _create_user_v1_users_post_serialize( + def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( self, - user_creation_request, + application_run_id, _request_auth, _content_type, _headers, @@ -815,12 +810,12 @@ def _create_user_v1_users_post_serialize( _body_params: Optional[bytes] = None # process the path parameters + if application_run_id is not None: + _path_params['application_run_id'] = application_run_id # process the query parameters # process the header parameters # process the form parameters # process the body parameter - if user_creation_request is not None: - _body_params = user_creation_request # set the HTTP header `Accept` @@ -831,28 +826,14 @@ def _create_user_v1_users_post_serialize( ] ) - # set the HTTP header `Content-Type` - if _content_type: - _header_params['Content-Type'] = _content_type - else: - _default_content_type = ( - self.api_client.select_header_content_type( - [ - 'application/json' - ] - ) - ) - if _default_content_type is not None: - _header_params['Content-Type'] = _default_content_type # authentication setting _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method='POST', - resource_path='/v1/users/', + method='DELETE', + resource_path='/v1/runs/{application_run_id}/results', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -869,9 +850,10 @@ def _create_user_v1_users_post_serialize( @validate_call - def delete_run_results_v1_runs_application_run_id_results_delete( + def get_run_v1_runs_application_run_id_get( self, application_run_id: StrictStr, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -884,12 +866,14 @@ def delete_run_results_v1_runs_application_run_id_results_delete( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> None: - """Delete Run Results + ) -> RunReadResponse: + """Get Run :param application_run_id: (required) :type application_run_id: str + :param include: + :type include: List[object] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -912,8 +896,9 @@ def delete_run_results_v1_runs_application_run_id_results_delete( :return: Returns the result object. """ # noqa: E501 - _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + _param = self._get_run_v1_runs_application_run_id_get_serialize( application_run_id=application_run_id, + include=include, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -921,7 +906,7 @@ def delete_run_results_v1_runs_application_run_id_results_delete( ) _response_types_map: Dict[str, Optional[str]] = { - '204': None, + '200': "RunReadResponse", '404': None, '422': "HTTPValidationError", } @@ -937,9 +922,10 @@ def delete_run_results_v1_runs_application_run_id_results_delete( @validate_call - def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( + def get_run_v1_runs_application_run_id_get_with_http_info( self, application_run_id: StrictStr, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -952,12 +938,14 @@ def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[None]: - """Delete Run Results + ) -> ApiResponse[RunReadResponse]: + """Get Run :param application_run_id: (required) :type application_run_id: str + :param include: + :type include: List[object] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -980,8 +968,9 @@ def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + _param = self._get_run_v1_runs_application_run_id_get_serialize( application_run_id=application_run_id, + include=include, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -989,7 +978,7 @@ def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - '204': None, + '200': "RunReadResponse", '404': None, '422': "HTTPValidationError", } @@ -1005,9 +994,10 @@ def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( @validate_call - def delete_run_results_v1_runs_application_run_id_results_delete_without_preload_content( + def get_run_v1_runs_application_run_id_get_without_preload_content( self, application_run_id: StrictStr, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -1021,11 +1011,13 @@ def delete_run_results_v1_runs_application_run_id_results_delete_without_preload _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """Delete Run Results + """Get Run :param application_run_id: (required) :type application_run_id: str + :param include: + :type include: List[object] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -1048,8 +1040,9 @@ def delete_run_results_v1_runs_application_run_id_results_delete_without_preload :return: Returns the result object. """ # noqa: E501 - _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + _param = self._get_run_v1_runs_application_run_id_get_serialize( application_run_id=application_run_id, + include=include, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -1057,7 +1050,7 @@ def delete_run_results_v1_runs_application_run_id_results_delete_without_preload ) _response_types_map: Dict[str, Optional[str]] = { - '204': None, + '200': "RunReadResponse", '404': None, '422': "HTTPValidationError", } @@ -1068,9 +1061,10 @@ def delete_run_results_v1_runs_application_run_id_results_delete_without_preload return response_data.response - def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( + def _get_run_v1_runs_application_run_id_get_serialize( self, application_run_id, + include, _request_auth, _content_type, _headers, @@ -1080,6 +1074,7 @@ def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( _host = None _collection_formats: Dict[str, str] = { + 'include': 'multi', } _path_params: Dict[str, str] = {} @@ -1095,6 +1090,10 @@ def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( if application_run_id is not None: _path_params['application_run_id'] = application_run_id # process the query parameters + if include is not None: + + _query_params.append(('include', include)) + # process the header parameters # process the form parameters # process the body parameter @@ -1111,12 +1110,11 @@ def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( # authentication setting _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method='DELETE', - resource_path='/v1/runs/{application_run_id}/results', + method='GET', + resource_path='/v1/runs/{application_run_id}', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -1133,9 +1131,9 @@ def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( @validate_call - def get_run_v1_runs_application_run_id_get( + def get_version_v1_versions_application_version_id_get( self, - application_run_id: StrictStr, + application_version_id: StrictStr, include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, _request_timeout: Union[ None, @@ -1149,12 +1147,12 @@ def get_run_v1_runs_application_run_id_get( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RunReadResponse: - """Get Run + ) -> VersionReadResponse: + """Get Version - :param application_run_id: (required) - :type application_run_id: str + :param application_version_id: (required) + :type application_version_id: str :param include: :type include: List[object] :param _request_timeout: timeout setting for this request. If one @@ -1179,8 +1177,8 @@ def get_run_v1_runs_application_run_id_get( :return: Returns the result object. """ # noqa: E501 - _param = self._get_run_v1_runs_application_run_id_get_serialize( - application_run_id=application_run_id, + _param = self._get_version_v1_versions_application_version_id_get_serialize( + application_version_id=application_version_id, include=include, _request_auth=_request_auth, _content_type=_content_type, @@ -1189,8 +1187,7 @@ def get_run_v1_runs_application_run_id_get( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "RunReadResponse", - '404': None, + '200': "VersionReadResponse", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -1205,9 +1202,9 @@ def get_run_v1_runs_application_run_id_get( @validate_call - def get_run_v1_runs_application_run_id_get_with_http_info( + def get_version_v1_versions_application_version_id_get_with_http_info( self, - application_run_id: StrictStr, + application_version_id: StrictStr, include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, _request_timeout: Union[ None, @@ -1221,12 +1218,12 @@ def get_run_v1_runs_application_run_id_get_with_http_info( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[RunReadResponse]: - """Get Run + ) -> ApiResponse[VersionReadResponse]: + """Get Version - :param application_run_id: (required) - :type application_run_id: str + :param application_version_id: (required) + :type application_version_id: str :param include: :type include: List[object] :param _request_timeout: timeout setting for this request. If one @@ -1251,8 +1248,8 @@ def get_run_v1_runs_application_run_id_get_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._get_run_v1_runs_application_run_id_get_serialize( - application_run_id=application_run_id, + _param = self._get_version_v1_versions_application_version_id_get_serialize( + application_version_id=application_version_id, include=include, _request_auth=_request_auth, _content_type=_content_type, @@ -1261,8 +1258,7 @@ def get_run_v1_runs_application_run_id_get_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "RunReadResponse", - '404': None, + '200': "VersionReadResponse", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -1277,9 +1273,9 @@ def get_run_v1_runs_application_run_id_get_with_http_info( @validate_call - def get_run_v1_runs_application_run_id_get_without_preload_content( + def get_version_v1_versions_application_version_id_get_without_preload_content( self, - application_run_id: StrictStr, + application_version_id: StrictStr, include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, _request_timeout: Union[ None, @@ -1294,11 +1290,11 @@ def get_run_v1_runs_application_run_id_get_without_preload_content( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """Get Run + """Get Version - :param application_run_id: (required) - :type application_run_id: str + :param application_version_id: (required) + :type application_version_id: str :param include: :type include: List[object] :param _request_timeout: timeout setting for this request. If one @@ -1323,8 +1319,8 @@ def get_run_v1_runs_application_run_id_get_without_preload_content( :return: Returns the result object. """ # noqa: E501 - _param = self._get_run_v1_runs_application_run_id_get_serialize( - application_run_id=application_run_id, + _param = self._get_version_v1_versions_application_version_id_get_serialize( + application_version_id=application_version_id, include=include, _request_auth=_request_auth, _content_type=_content_type, @@ -1333,8 +1329,7 @@ def get_run_v1_runs_application_run_id_get_without_preload_content( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "RunReadResponse", - '404': None, + '200': "VersionReadResponse", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -1344,9 +1339,9 @@ def get_run_v1_runs_application_run_id_get_without_preload_content( return response_data.response - def _get_run_v1_runs_application_run_id_get_serialize( + def _get_version_v1_versions_application_version_id_get_serialize( self, - application_run_id, + application_version_id, include, _request_auth, _content_type, @@ -1370,13 +1365,13 @@ def _get_run_v1_runs_application_run_id_get_serialize( _body_params: Optional[bytes] = None # process the path parameters - if application_run_id is not None: - _path_params['application_run_id'] = application_run_id + if application_version_id is not None: + _path_params['application_version_id'] = application_version_id # process the query parameters if include is not None: - + _query_params.append(('include', include)) - + # process the header parameters # process the form parameters # process the body parameter @@ -1393,12 +1388,11 @@ def _get_run_v1_runs_application_run_id_get_serialize( # authentication setting _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( method='GET', - resource_path='/v1/runs/{application_run_id}', + resource_path='/v1/versions/{application_version_id}', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -1415,9 +1409,14 @@ def _get_run_v1_runs_application_run_id_get_serialize( @validate_call - def get_user_v1_users_user_id_get( + def list_application_runs_v1_runs_get( self, - user_id: StrictStr, + application_id: Optional[StrictStr] = None, + application_version_id: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -1430,12 +1429,22 @@ def get_user_v1_users_user_id_get( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> UserResponse: - """Get User + ) -> List[RunReadResponse]: + """List Application Runs - :param user_id: (required) - :type user_id: str + :param application_id: + :type application_id: str + :param application_version_id: + :type application_version_id: str + :param include: + :type include: List[object] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -1458,8 +1467,13 @@ def get_user_v1_users_user_id_get( :return: Returns the result object. """ # noqa: E501 - _param = self._get_user_v1_users_user_id_get_serialize( - user_id=user_id, + _param = self._list_application_runs_v1_runs_get_serialize( + application_id=application_id, + application_version_id=application_version_id, + include=include, + page=page, + page_size=page_size, + sort=sort, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -1467,7 +1481,7 @@ def get_user_v1_users_user_id_get( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", + '200': "List[RunReadResponse]", '404': None, '422': "HTTPValidationError", } @@ -1483,9 +1497,14 @@ def get_user_v1_users_user_id_get( @validate_call - def get_user_v1_users_user_id_get_with_http_info( + def list_application_runs_v1_runs_get_with_http_info( self, - user_id: StrictStr, + application_id: Optional[StrictStr] = None, + application_version_id: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -1498,12 +1517,22 @@ def get_user_v1_users_user_id_get_with_http_info( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[UserResponse]: - """Get User + ) -> ApiResponse[List[RunReadResponse]]: + """List Application Runs - :param user_id: (required) - :type user_id: str + :param application_id: + :type application_id: str + :param application_version_id: + :type application_version_id: str + :param include: + :type include: List[object] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -1526,8 +1555,13 @@ def get_user_v1_users_user_id_get_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._get_user_v1_users_user_id_get_serialize( - user_id=user_id, + _param = self._list_application_runs_v1_runs_get_serialize( + application_id=application_id, + application_version_id=application_version_id, + include=include, + page=page, + page_size=page_size, + sort=sort, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -1535,7 +1569,7 @@ def get_user_v1_users_user_id_get_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", + '200': "List[RunReadResponse]", '404': None, '422': "HTTPValidationError", } @@ -1551,9 +1585,14 @@ def get_user_v1_users_user_id_get_with_http_info( @validate_call - def get_user_v1_users_user_id_get_without_preload_content( + def list_application_runs_v1_runs_get_without_preload_content( self, - user_id: StrictStr, + application_id: Optional[StrictStr] = None, + application_version_id: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -1567,11 +1606,21 @@ def get_user_v1_users_user_id_get_without_preload_content( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """Get User + """List Application Runs - :param user_id: (required) - :type user_id: str + :param application_id: + :type application_id: str + :param application_version_id: + :type application_version_id: str + :param include: + :type include: List[object] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -1594,8 +1643,13 @@ def get_user_v1_users_user_id_get_without_preload_content( :return: Returns the result object. """ # noqa: E501 - _param = self._get_user_v1_users_user_id_get_serialize( - user_id=user_id, + _param = self._list_application_runs_v1_runs_get_serialize( + application_id=application_id, + application_version_id=application_version_id, + include=include, + page=page, + page_size=page_size, + sort=sort, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -1603,7 +1657,7 @@ def get_user_v1_users_user_id_get_without_preload_content( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", + '200': "List[RunReadResponse]", '404': None, '422': "HTTPValidationError", } @@ -1614,9 +1668,14 @@ def get_user_v1_users_user_id_get_without_preload_content( return response_data.response - def _get_user_v1_users_user_id_get_serialize( + def _list_application_runs_v1_runs_get_serialize( self, - user_id, + application_id, + application_version_id, + include, + page, + page_size, + sort, _request_auth, _content_type, _headers, @@ -1626,1281 +1685,7 @@ def _get_user_v1_users_user_id_get_serialize( _host = None _collection_formats: Dict[str, str] = { - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if user_id is not None: - _path_params['user_id'] = user_id - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/users/{user_id}', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def get_version_v1_versions_application_version_id_get( - self, - application_version_id: StrictStr, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> VersionReadResponse: - """Get Version - - - :param application_version_id: (required) - :type application_version_id: str - :param include: - :type include: List[object] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._get_version_v1_versions_application_version_id_get_serialize( - application_version_id=application_version_id, - include=include, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "VersionReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def get_version_v1_versions_application_version_id_get_with_http_info( - self, - application_version_id: StrictStr, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[VersionReadResponse]: - """Get Version - - - :param application_version_id: (required) - :type application_version_id: str - :param include: - :type include: List[object] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._get_version_v1_versions_application_version_id_get_serialize( - application_version_id=application_version_id, - include=include, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "VersionReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def get_version_v1_versions_application_version_id_get_without_preload_content( - self, - application_version_id: StrictStr, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Get Version - - - :param application_version_id: (required) - :type application_version_id: str - :param include: - :type include: List[object] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._get_version_v1_versions_application_version_id_get_serialize( - application_version_id=application_version_id, - include=include, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "VersionReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _get_version_v1_versions_application_version_id_get_serialize( - self, - application_version_id, - include, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'include': 'multi', - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_version_id is not None: - _path_params['application_version_id'] = application_version_id - # process the query parameters - if include is not None: - - _query_params.append(('include', include)) - - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/versions/{application_version_id}', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def list_application_runs_v1_runs_get( - self, - application_id: Optional[StrictStr] = None, - application_version_id: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[RunReadResponse]: - """List Application Runs - - - :param application_id: - :type application_id: str - :param application_version_id: - :type application_version_id: str - :param include: - :type include: List[object] - :param page: - :type page: int - :param page_size: - :type page_size: int - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_application_runs_v1_runs_get_serialize( - application_id=application_id, - application_version_id=application_version_id, - include=include, - page=page, - page_size=page_size, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[RunReadResponse]", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def list_application_runs_v1_runs_get_with_http_info( - self, - application_id: Optional[StrictStr] = None, - application_version_id: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[RunReadResponse]]: - """List Application Runs - - - :param application_id: - :type application_id: str - :param application_version_id: - :type application_version_id: str - :param include: - :type include: List[object] - :param page: - :type page: int - :param page_size: - :type page_size: int - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_application_runs_v1_runs_get_serialize( - application_id=application_id, - application_version_id=application_version_id, - include=include, - page=page, - page_size=page_size, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[RunReadResponse]", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def list_application_runs_v1_runs_get_without_preload_content( - self, - application_id: Optional[StrictStr] = None, - application_version_id: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """List Application Runs - - - :param application_id: - :type application_id: str - :param application_version_id: - :type application_version_id: str - :param include: - :type include: List[object] - :param page: - :type page: int - :param page_size: - :type page_size: int - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_application_runs_v1_runs_get_serialize( - application_id=application_id, - application_version_id=application_version_id, - include=include, - page=page, - page_size=page_size, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[RunReadResponse]", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _list_application_runs_v1_runs_get_serialize( - self, - application_id, - application_version_id, - include, - page, - page_size, - sort, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'include': 'multi', - 'sort': 'multi', - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - # process the query parameters - if application_id is not None: - - _query_params.append(('application_id', application_id)) - - if application_version_id is not None: - - _query_params.append(('application_version_id', application_version_id)) - - if include is not None: - - _query_params.append(('include', include)) - - if page is not None: - - _query_params.append(('page', page)) - - if page_size is not None: - - _query_params.append(('page_size', page_size)) - - if sort is not None: - - _query_params.append(('sort', sort)) - - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/runs', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def list_applications_v1_applications_get( - self, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[ApplicationReadResponse]: - """List Applications - - - :param page: - :type page: int - :param page_size: - :type page_size: int - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_applications_v1_applications_get_serialize( - page=page, - page_size=page_size, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def list_applications_v1_applications_get_with_http_info( - self, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[ApplicationReadResponse]]: - """List Applications - - - :param page: - :type page: int - :param page_size: - :type page_size: int - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_applications_v1_applications_get_serialize( - page=page, - page_size=page_size, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def list_applications_v1_applications_get_without_preload_content( - self, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """List Applications - - - :param page: - :type page: int - :param page_size: - :type page_size: int - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_applications_v1_applications_get_serialize( - page=page, - page_size=page_size, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _list_applications_v1_applications_get_serialize( - self, - page, - page_size, - sort, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'sort': 'multi', - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - # process the query parameters - if page is not None: - - _query_params.append(('page', page)) - - if page_size is not None: - - _query_params.append(('page_size', page_size)) - - if sort is not None: - - _query_params.append(('sort', sort)) - - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/applications', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def list_run_results_v1_runs_application_run_id_results_get( - self, - application_run_id: StrictStr, - item_id__in: Optional[List[Optional[StrictStr]]] = None, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - reference__in: Optional[List[StrictStr]] = None, - status__in: Optional[List[ItemStatus]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[ItemResultReadResponse]: - """List Run Results - - - :param application_run_id: (required) - :type application_run_id: str - :param item_id__in: - :type item_id__in: List[Optional[str]] - :param page: - :type page: int - :param page_size: - :type page_size: int - :param reference__in: - :type reference__in: List[str] - :param status__in: - :type status__in: List[ItemStatus] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( - application_run_id=application_run_id, - item_id__in=item_id__in, - page=page, - page_size=page_size, - reference__in=reference__in, - status__in=status__in, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ItemResultReadResponse]", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def list_run_results_v1_runs_application_run_id_results_get_with_http_info( - self, - application_run_id: StrictStr, - item_id__in: Optional[List[Optional[StrictStr]]] = None, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - reference__in: Optional[List[StrictStr]] = None, - status__in: Optional[List[ItemStatus]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[ItemResultReadResponse]]: - """List Run Results - - - :param application_run_id: (required) - :type application_run_id: str - :param item_id__in: - :type item_id__in: List[Optional[str]] - :param page: - :type page: int - :param page_size: - :type page_size: int - :param reference__in: - :type reference__in: List[str] - :param status__in: - :type status__in: List[ItemStatus] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( - application_run_id=application_run_id, - item_id__in=item_id__in, - page=page, - page_size=page_size, - reference__in=reference__in, - status__in=status__in, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ItemResultReadResponse]", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def list_run_results_v1_runs_application_run_id_results_get_without_preload_content( - self, - application_run_id: StrictStr, - item_id__in: Optional[List[Optional[StrictStr]]] = None, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - reference__in: Optional[List[StrictStr]] = None, - status__in: Optional[List[ItemStatus]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """List Run Results - - - :param application_run_id: (required) - :type application_run_id: str - :param item_id__in: - :type item_id__in: List[Optional[str]] - :param page: - :type page: int - :param page_size: - :type page_size: int - :param reference__in: - :type reference__in: List[str] - :param status__in: - :type status__in: List[ItemStatus] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( - application_run_id=application_run_id, - item_id__in=item_id__in, - page=page, - page_size=page_size, - reference__in=reference__in, - status__in=status__in, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ItemResultReadResponse]", - '404': None, - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _list_run_results_v1_runs_application_run_id_results_get_serialize( - self, - application_run_id, - item_id__in, - page, - page_size, - reference__in, - status__in, - sort, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'item_id__in': 'multi', - 'reference__in': 'multi', - 'status__in': 'multi', + 'include': 'multi', 'sort': 'multi', } @@ -2914,33 +1699,31 @@ def _list_run_results_v1_runs_application_run_id_results_get_serialize( _body_params: Optional[bytes] = None # process the path parameters - if application_run_id is not None: - _path_params['application_run_id'] = application_run_id # process the query parameters - if item_id__in is not None: - - _query_params.append(('item_id__in', item_id__in)) - + if application_id is not None: + + _query_params.append(('application_id', application_id)) + + if application_version_id is not None: + + _query_params.append(('application_version_id', application_version_id)) + + if include is not None: + + _query_params.append(('include', include)) + if page is not None: - + _query_params.append(('page', page)) - + if page_size is not None: - + _query_params.append(('page_size', page_size)) - - if reference__in is not None: - - _query_params.append(('reference__in', reference__in)) - - if status__in is not None: - - _query_params.append(('status__in', status__in)) - + if sort is not None: - + _query_params.append(('sort', sort)) - + # process the header parameters # process the form parameters # process the body parameter @@ -2957,12 +1740,11 @@ def _list_run_results_v1_runs_application_run_id_results_get_serialize( # authentication setting _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( method='GET', - resource_path='/v1/runs/{application_run_id}/results', + resource_path='/v1/runs', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -2979,13 +1761,10 @@ def _list_run_results_v1_runs_application_run_id_results_get_serialize( @validate_call - def list_versions_by_application_id_v1_applications_application_id_versions_get( + def list_applications_v1_applications_get( self, - application_id: StrictStr, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, @@ -2999,20 +1778,14 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[ApplicationVersionReadResponse]: - """List Versions By Application Id + ) -> List[ApplicationReadResponse]: + """List Applications - :param application_id: (required) - :type application_id: str :param page: :type page: int :param page_size: :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] :param sort: :type sort: List[str] :param _request_timeout: timeout setting for this request. If one @@ -3037,12 +1810,9 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get( :return: Returns the result object. """ # noqa: E501 - _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( - application_id=application_id, + _param = self._list_applications_v1_applications_get_serialize( page=page, page_size=page_size, - version=version, - include=include, sort=sort, _request_auth=_request_auth, _content_type=_content_type, @@ -3051,7 +1821,7 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", + '200': "List[ApplicationReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -3066,13 +1836,10 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get( @validate_call - def list_versions_by_application_id_v1_applications_application_id_versions_get_with_http_info( + def list_applications_v1_applications_get_with_http_info( self, - application_id: StrictStr, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, @@ -3086,20 +1853,14 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[ApplicationVersionReadResponse]]: - """List Versions By Application Id + ) -> ApiResponse[List[ApplicationReadResponse]]: + """List Applications - :param application_id: (required) - :type application_id: str :param page: :type page: int :param page_size: :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] :param sort: :type sort: List[str] :param _request_timeout: timeout setting for this request. If one @@ -3124,12 +1885,9 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ :return: Returns the result object. """ # noqa: E501 - _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( - application_id=application_id, + _param = self._list_applications_v1_applications_get_serialize( page=page, page_size=page_size, - version=version, - include=include, sort=sort, _request_auth=_request_auth, _content_type=_content_type, @@ -3138,7 +1896,7 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", + '200': "List[ApplicationReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -3153,13 +1911,10 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ @validate_call - def list_versions_by_application_id_v1_applications_application_id_versions_get_without_preload_content( + def list_applications_v1_applications_get_without_preload_content( self, - application_id: StrictStr, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, @@ -3174,19 +1929,13 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """List Versions By Application Id + """List Applications - :param application_id: (required) - :type application_id: str :param page: :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] + :param page_size: + :type page_size: int :param sort: :type sort: List[str] :param _request_timeout: timeout setting for this request. If one @@ -3211,12 +1960,9 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ :return: Returns the result object. """ # noqa: E501 - _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( - application_id=application_id, + _param = self._list_applications_v1_applications_get_serialize( page=page, page_size=page_size, - version=version, - include=include, sort=sort, _request_auth=_request_auth, _content_type=_content_type, @@ -3225,7 +1971,7 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", + '200': "List[ApplicationReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -3235,13 +1981,10 @@ def list_versions_by_application_id_v1_applications_application_id_versions_get_ return response_data.response - def _list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( + def _list_applications_v1_applications_get_serialize( self, - application_id, page, page_size, - version, - include, sort, _request_auth, _content_type, @@ -3252,7 +1995,6 @@ def _list_versions_by_application_id_v1_applications_application_id_versions_get _host = None _collection_formats: Dict[str, str] = { - 'include': 'multi', 'sort': 'multi', } @@ -3266,29 +2008,19 @@ def _list_versions_by_application_id_v1_applications_application_id_versions_get _body_params: Optional[bytes] = None # process the path parameters - if application_id is not None: - _path_params['application_id'] = application_id # process the query parameters if page is not None: - + _query_params.append(('page', page)) - + if page_size is not None: - + _query_params.append(('page_size', page_size)) - - if version is not None: - - _query_params.append(('version', version)) - - if include is not None: - - _query_params.append(('include', include)) - + if sort is not None: - + _query_params.append(('sort', sort)) - + # process the header parameters # process the form parameters # process the body parameter @@ -3305,12 +2037,11 @@ def _list_versions_by_application_id_v1_applications_application_id_versions_get # authentication setting _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( method='GET', - resource_path='/v1/applications/{application_id}/versions', + resource_path='/v1/applications', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -3327,13 +2058,14 @@ def _list_versions_by_application_id_v1_applications_application_id_versions_get @validate_call - def list_versions_by_application_slug_v1_applications_application_slug_versions_get( + def list_run_results_v1_runs_application_run_id_results_get( self, - application_slug: Annotated[str, Field(strict=True)], + application_run_id: StrictStr, + item_id__in: Optional[List[Optional[StrictStr]]] = None, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + reference__in: Optional[List[StrictStr]] = None, + status__in: Optional[List[ItemStatus]] = None, sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, @@ -3347,20 +2079,22 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[ApplicationVersionReadResponse]: - """List Versions By Application Slug + ) -> List[ItemResultReadResponse]: + """List Run Results - :param application_slug: (required) - :type application_slug: str + :param application_run_id: (required) + :type application_run_id: str + :param item_id__in: + :type item_id__in: List[Optional[str]] :param page: :type page: int :param page_size: :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] + :param reference__in: + :type reference__in: List[str] + :param status__in: + :type status__in: List[ItemStatus] :param sort: :type sort: List[str] :param _request_timeout: timeout setting for this request. If one @@ -3385,12 +2119,13 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ :return: Returns the result object. """ # noqa: E501 - _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( - application_slug=application_slug, + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( + application_run_id=application_run_id, + item_id__in=item_id__in, page=page, page_size=page_size, - version=version, - include=include, + reference__in=reference__in, + status__in=status__in, sort=sort, _request_auth=_request_auth, _content_type=_content_type, @@ -3399,7 +2134,8 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", + '200': "List[ItemResultReadResponse]", + '404': None, '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -3414,13 +2150,14 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ @validate_call - def list_versions_by_application_slug_v1_applications_application_slug_versions_get_with_http_info( + def list_run_results_v1_runs_application_run_id_results_get_with_http_info( self, - application_slug: Annotated[str, Field(strict=True)], + application_run_id: StrictStr, + item_id__in: Optional[List[Optional[StrictStr]]] = None, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + reference__in: Optional[List[StrictStr]] = None, + status__in: Optional[List[ItemStatus]] = None, sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, @@ -3434,20 +2171,22 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[ApplicationVersionReadResponse]]: - """List Versions By Application Slug + ) -> ApiResponse[List[ItemResultReadResponse]]: + """List Run Results - :param application_slug: (required) - :type application_slug: str + :param application_run_id: (required) + :type application_run_id: str + :param item_id__in: + :type item_id__in: List[Optional[str]] :param page: :type page: int :param page_size: :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] + :param reference__in: + :type reference__in: List[str] + :param status__in: + :type status__in: List[ItemStatus] :param sort: :type sort: List[str] :param _request_timeout: timeout setting for this request. If one @@ -3472,12 +2211,13 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ :return: Returns the result object. """ # noqa: E501 - _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( - application_slug=application_slug, + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( + application_run_id=application_run_id, + item_id__in=item_id__in, page=page, page_size=page_size, - version=version, - include=include, + reference__in=reference__in, + status__in=status__in, sort=sort, _request_auth=_request_auth, _content_type=_content_type, @@ -3486,7 +2226,8 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", + '200': "List[ItemResultReadResponse]", + '404': None, '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -3501,13 +2242,14 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ @validate_call - def list_versions_by_application_slug_v1_applications_application_slug_versions_get_without_preload_content( + def list_run_results_v1_runs_application_run_id_results_get_without_preload_content( self, - application_slug: Annotated[str, Field(strict=True)], + application_run_id: StrictStr, + item_id__in: Optional[List[Optional[StrictStr]]] = None, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + reference__in: Optional[List[StrictStr]] = None, + status__in: Optional[List[ItemStatus]] = None, sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, @@ -3522,19 +2264,21 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """List Versions By Application Slug + """List Run Results - :param application_slug: (required) - :type application_slug: str + :param application_run_id: (required) + :type application_run_id: str + :param item_id__in: + :type item_id__in: List[Optional[str]] :param page: :type page: int :param page_size: :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] + :param reference__in: + :type reference__in: List[str] + :param status__in: + :type status__in: List[ItemStatus] :param sort: :type sort: List[str] :param _request_timeout: timeout setting for this request. If one @@ -3559,12 +2303,13 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ :return: Returns the result object. """ # noqa: E501 - _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( - application_slug=application_slug, + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( + application_run_id=application_run_id, + item_id__in=item_id__in, page=page, page_size=page_size, - version=version, - include=include, + reference__in=reference__in, + status__in=status__in, sort=sort, _request_auth=_request_auth, _content_type=_content_type, @@ -3573,7 +2318,8 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", + '200': "List[ItemResultReadResponse]", + '404': None, '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -3583,13 +2329,14 @@ def list_versions_by_application_slug_v1_applications_application_slug_versions_ return response_data.response - def _list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( + def _list_run_results_v1_runs_application_run_id_results_get_serialize( self, - application_slug, + application_run_id, + item_id__in, page, page_size, - version, - include, + reference__in, + status__in, sort, _request_auth, _content_type, @@ -3600,7 +2347,9 @@ def _list_versions_by_application_slug_v1_applications_application_slug_versions _host = None _collection_formats: Dict[str, str] = { - 'include': 'multi', + 'item_id__in': 'multi', + 'reference__in': 'multi', + 'status__in': 'multi', 'sort': 'multi', } @@ -3614,29 +2363,33 @@ def _list_versions_by_application_slug_v1_applications_application_slug_versions _body_params: Optional[bytes] = None # process the path parameters - if application_slug is not None: - _path_params['application_slug'] = application_slug + if application_run_id is not None: + _path_params['application_run_id'] = application_run_id # process the query parameters + if item_id__in is not None: + + _query_params.append(('item_id__in', item_id__in)) + if page is not None: - + _query_params.append(('page', page)) - + if page_size is not None: - + _query_params.append(('page_size', page_size)) - - if version is not None: - - _query_params.append(('version', version)) - - if include is not None: - - _query_params.append(('include', include)) - + + if reference__in is not None: + + _query_params.append(('reference__in', reference__in)) + + if status__in is not None: + + _query_params.append(('status__in', status__in)) + if sort is not None: - + _query_params.append(('sort', sort)) - + # process the header parameters # process the form parameters # process the body parameter @@ -3653,12 +2406,11 @@ def _list_versions_by_application_slug_v1_applications_application_slug_versions # authentication setting _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( method='GET', - resource_path='/v1/applications/{application_slug}/versions', + resource_path='/v1/runs/{application_run_id}/results', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -3675,9 +2427,14 @@ def _list_versions_by_application_slug_v1_applications_application_slug_versions @validate_call - def read_application_by_id_v1_applications_application_id_get( + def list_versions_by_application_id_v1_applications_application_id_versions_get( self, application_id: StrictStr, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -3690,12 +2447,22 @@ def read_application_by_id_v1_applications_application_id_get( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApplicationReadResponse: - """Read Application By Id + ) -> List[ApplicationVersionReadResponse]: + """List Versions By Application Id :param application_id: (required) :type application_id: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -3718,8 +2485,13 @@ def read_application_by_id_v1_applications_application_id_get( :return: Returns the result object. """ # noqa: E501 - _param = self._read_application_by_id_v1_applications_application_id_get_serialize( + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( application_id=application_id, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -3727,7 +2499,7 @@ def read_application_by_id_v1_applications_application_id_get( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", + '200': "List[ApplicationVersionReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -3742,9 +2514,14 @@ def read_application_by_id_v1_applications_application_id_get( @validate_call - def read_application_by_id_v1_applications_application_id_get_with_http_info( + def list_versions_by_application_id_v1_applications_application_id_versions_get_with_http_info( self, application_id: StrictStr, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -3757,12 +2534,22 @@ def read_application_by_id_v1_applications_application_id_get_with_http_info( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[ApplicationReadResponse]: - """Read Application By Id + ) -> ApiResponse[List[ApplicationVersionReadResponse]]: + """List Versions By Application Id :param application_id: (required) :type application_id: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -3785,8 +2572,13 @@ def read_application_by_id_v1_applications_application_id_get_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._read_application_by_id_v1_applications_application_id_get_serialize( + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( application_id=application_id, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -3794,7 +2586,7 @@ def read_application_by_id_v1_applications_application_id_get_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", + '200': "List[ApplicationVersionReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -3809,9 +2601,14 @@ def read_application_by_id_v1_applications_application_id_get_with_http_info( @validate_call - def read_application_by_id_v1_applications_application_id_get_without_preload_content( + def list_versions_by_application_id_v1_applications_application_id_versions_get_without_preload_content( self, application_id: StrictStr, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -3825,11 +2622,21 @@ def read_application_by_id_v1_applications_application_id_get_without_preload_co _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """Read Application By Id + """List Versions By Application Id :param application_id: (required) :type application_id: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -3852,8 +2659,13 @@ def read_application_by_id_v1_applications_application_id_get_without_preload_co :return: Returns the result object. """ # noqa: E501 - _param = self._read_application_by_id_v1_applications_application_id_get_serialize( + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( application_id=application_id, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -3861,7 +2673,7 @@ def read_application_by_id_v1_applications_application_id_get_without_preload_co ) _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", + '200': "List[ApplicationVersionReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -3871,9 +2683,14 @@ def read_application_by_id_v1_applications_application_id_get_without_preload_co return response_data.response - def _read_application_by_id_v1_applications_application_id_get_serialize( + def _list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( self, application_id, + page, + page_size, + version, + include, + sort, _request_auth, _content_type, _headers, @@ -3883,6 +2700,8 @@ def _read_application_by_id_v1_applications_application_id_get_serialize( _host = None _collection_formats: Dict[str, str] = { + 'include': 'multi', + 'sort': 'multi', } _path_params: Dict[str, str] = {} @@ -3898,6 +2717,26 @@ def _read_application_by_id_v1_applications_application_id_get_serialize( if application_id is not None: _path_params['application_id'] = application_id # process the query parameters + if page is not None: + + _query_params.append(('page', page)) + + if page_size is not None: + + _query_params.append(('page_size', page_size)) + + if version is not None: + + _query_params.append(('version', version)) + + if include is not None: + + _query_params.append(('include', include)) + + if sort is not None: + + _query_params.append(('sort', sort)) + # process the header parameters # process the form parameters # process the body parameter @@ -3914,12 +2753,11 @@ def _read_application_by_id_v1_applications_application_id_get_serialize( # authentication setting _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( method='GET', - resource_path='/v1/applications/{application_id}', + resource_path='/v1/applications/{application_id}/versions', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -3936,9 +2774,14 @@ def _read_application_by_id_v1_applications_application_id_get_serialize( @validate_call - def read_application_by_slug_v1_applications_application_slug_get( + def list_versions_by_application_slug_v1_applications_application_slug_versions_get( self, - application_slug: StrictStr, + application_slug: Annotated[str, Field(strict=True)], + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -3951,12 +2794,22 @@ def read_application_by_slug_v1_applications_application_slug_get( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApplicationReadResponse: - """Read Application By Slug + ) -> List[ApplicationVersionReadResponse]: + """List Versions By Application Slug :param application_slug: (required) :type application_slug: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -3979,8 +2832,13 @@ def read_application_by_slug_v1_applications_application_slug_get( :return: Returns the result object. """ # noqa: E501 - _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( + _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( application_slug=application_slug, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -3988,7 +2846,7 @@ def read_application_by_slug_v1_applications_application_slug_get( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", + '200': "List[ApplicationVersionReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -4003,9 +2861,14 @@ def read_application_by_slug_v1_applications_application_slug_get( @validate_call - def read_application_by_slug_v1_applications_application_slug_get_with_http_info( + def list_versions_by_application_slug_v1_applications_application_slug_versions_get_with_http_info( self, - application_slug: StrictStr, + application_slug: Annotated[str, Field(strict=True)], + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -4018,12 +2881,22 @@ def read_application_by_slug_v1_applications_application_slug_get_with_http_info _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[ApplicationReadResponse]: - """Read Application By Slug + ) -> ApiResponse[List[ApplicationVersionReadResponse]]: + """List Versions By Application Slug :param application_slug: (required) :type application_slug: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -4046,8 +2919,13 @@ def read_application_by_slug_v1_applications_application_slug_get_with_http_info :return: Returns the result object. """ # noqa: E501 - _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( + _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( application_slug=application_slug, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -4055,7 +2933,7 @@ def read_application_by_slug_v1_applications_application_slug_get_with_http_info ) _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", + '200': "List[ApplicationVersionReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -4070,9 +2948,14 @@ def read_application_by_slug_v1_applications_application_slug_get_with_http_info @validate_call - def read_application_by_slug_v1_applications_application_slug_get_without_preload_content( + def list_versions_by_application_slug_v1_applications_application_slug_versions_get_without_preload_content( self, - application_slug: StrictStr, + application_slug: Annotated[str, Field(strict=True)], + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -4086,11 +2969,21 @@ def read_application_by_slug_v1_applications_application_slug_get_without_preloa _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """Read Application By Slug + """List Versions By Application Slug :param application_slug: (required) :type application_slug: str + :param page: + :type page: int + :param page_size: + :type page_size: int + :param version: + :type version: str + :param include: + :type include: List[object] + :param sort: + :type sort: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -4113,8 +3006,13 @@ def read_application_by_slug_v1_applications_application_slug_get_without_preloa :return: Returns the result object. """ # noqa: E501 - _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( + _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( application_slug=application_slug, + page=page, + page_size=page_size, + version=version, + include=include, + sort=sort, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -4122,7 +3020,7 @@ def read_application_by_slug_v1_applications_application_slug_get_without_preloa ) _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", + '200': "List[ApplicationVersionReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -4132,9 +3030,14 @@ def read_application_by_slug_v1_applications_application_slug_get_without_preloa return response_data.response - def _read_application_by_slug_v1_applications_application_slug_get_serialize( + def _list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( self, application_slug, + page, + page_size, + version, + include, + sort, _request_auth, _content_type, _headers, @@ -4144,6 +3047,8 @@ def _read_application_by_slug_v1_applications_application_slug_get_serialize( _host = None _collection_formats: Dict[str, str] = { + 'include': 'multi', + 'sort': 'multi', } _path_params: Dict[str, str] = {} @@ -4159,6 +3064,26 @@ def _read_application_by_slug_v1_applications_application_slug_get_serialize( if application_slug is not None: _path_params['application_slug'] = application_slug # process the query parameters + if page is not None: + + _query_params.append(('page', page)) + + if page_size is not None: + + _query_params.append(('page_size', page_size)) + + if version is not None: + + _query_params.append(('version', version)) + + if include is not None: + + _query_params.append(('include', include)) + + if sort is not None: + + _query_params.append(('sort', sort)) + # process the header parameters # process the form parameters # process the body parameter @@ -4175,12 +3100,11 @@ def _read_application_by_slug_v1_applications_application_slug_get_serialize( # authentication setting _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( method='GET', - resource_path='/v1/applications/{application_slug}', + resource_path='/v1/applications/{application_slug}/versions', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -4197,9 +3121,9 @@ def _read_application_by_slug_v1_applications_application_slug_get_serialize( @validate_call - def register_version_v1_versions_post( + def read_application_by_slug_v1_applications_application_slug_get( self, - version_creation_request: VersionCreationRequest, + application_slug: StrictStr, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -4212,12 +3136,12 @@ def register_version_v1_versions_post( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> VersionCreationResponse: - """Register Version + ) -> ApplicationReadResponse: + """Read Application By Slug - :param version_creation_request: (required) - :type version_creation_request: VersionCreationRequest + :param application_slug: (required) + :type application_slug: str :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -4240,8 +3164,8 @@ def register_version_v1_versions_post( :return: Returns the result object. """ # noqa: E501 - _param = self._register_version_v1_versions_post_serialize( - version_creation_request=version_creation_request, + _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( + application_slug=application_slug, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -4249,7 +3173,7 @@ def register_version_v1_versions_post( ) _response_types_map: Dict[str, Optional[str]] = { - '201': "VersionCreationResponse", + '200': "ApplicationReadResponse", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -4264,9 +3188,9 @@ def register_version_v1_versions_post( @validate_call - def register_version_v1_versions_post_with_http_info( + def read_application_by_slug_v1_applications_application_slug_get_with_http_info( self, - version_creation_request: VersionCreationRequest, + application_slug: StrictStr, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -4279,12 +3203,12 @@ def register_version_v1_versions_post_with_http_info( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[VersionCreationResponse]: - """Register Version + ) -> ApiResponse[ApplicationReadResponse]: + """Read Application By Slug - :param version_creation_request: (required) - :type version_creation_request: VersionCreationRequest + :param application_slug: (required) + :type application_slug: str :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -4307,8 +3231,8 @@ def register_version_v1_versions_post_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._register_version_v1_versions_post_serialize( - version_creation_request=version_creation_request, + _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( + application_slug=application_slug, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -4316,7 +3240,7 @@ def register_version_v1_versions_post_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - '201': "VersionCreationResponse", + '200': "ApplicationReadResponse", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -4331,9 +3255,9 @@ def register_version_v1_versions_post_with_http_info( @validate_call - def register_version_v1_versions_post_without_preload_content( + def read_application_by_slug_v1_applications_application_slug_get_without_preload_content( self, - version_creation_request: VersionCreationRequest, + application_slug: StrictStr, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -4347,11 +3271,11 @@ def register_version_v1_versions_post_without_preload_content( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """Register Version + """Read Application By Slug - :param version_creation_request: (required) - :type version_creation_request: VersionCreationRequest + :param application_slug: (required) + :type application_slug: str :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -4374,8 +3298,8 @@ def register_version_v1_versions_post_without_preload_content( :return: Returns the result object. """ # noqa: E501 - _param = self._register_version_v1_versions_post_serialize( - version_creation_request=version_creation_request, + _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( + application_slug=application_slug, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -4383,7 +3307,7 @@ def register_version_v1_versions_post_without_preload_content( ) _response_types_map: Dict[str, Optional[str]] = { - '201': "VersionCreationResponse", + '200': "ApplicationReadResponse", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -4393,9 +3317,9 @@ def register_version_v1_versions_post_without_preload_content( return response_data.response - def _register_version_v1_versions_post_serialize( + def _read_application_by_slug_v1_applications_application_slug_get_serialize( self, - version_creation_request, + application_slug, _request_auth, _content_type, _headers, @@ -4417,12 +3341,12 @@ def _register_version_v1_versions_post_serialize( _body_params: Optional[bytes] = None # process the path parameters + if application_slug is not None: + _path_params['application_slug'] = application_slug # process the query parameters # process the header parameters # process the form parameters # process the body parameter - if version_creation_request is not None: - _body_params = version_creation_request # set the HTTP header `Accept` @@ -4433,28 +3357,14 @@ def _register_version_v1_versions_post_serialize( ] ) - # set the HTTP header `Content-Type` - if _content_type: - _header_params['Content-Type'] = _content_type - else: - _default_content_type = ( - self.api_client.select_header_content_type( - [ - 'application/json' - ] - ) - ) - if _default_content_type is not None: - _header_params['Content-Type'] = _default_content_type # authentication setting _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method='POST', - resource_path='/v1/versions', + method='GET', + resource_path='/v1/applications/{application_slug}', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -4471,10 +3381,9 @@ def _register_version_v1_versions_post_serialize( @validate_call - def update_user_v1_users_user_id_patch( + def register_version_v1_versions_post( self, - user_id: StrictStr, - user_update_request: UserUpdateRequest, + version_creation_request: VersionCreationRequest, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -4487,14 +3396,12 @@ def update_user_v1_users_user_id_patch( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> UserResponse: - """Update User + ) -> VersionCreationResponse: + """Register Version - :param user_id: (required) - :type user_id: str - :param user_update_request: (required) - :type user_update_request: UserUpdateRequest + :param version_creation_request: (required) + :type version_creation_request: VersionCreationRequest :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -4517,9 +3424,8 @@ def update_user_v1_users_user_id_patch( :return: Returns the result object. """ # noqa: E501 - _param = self._update_user_v1_users_user_id_patch_serialize( - user_id=user_id, - user_update_request=user_update_request, + _param = self._register_version_v1_versions_post_serialize( + version_creation_request=version_creation_request, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -4527,8 +3433,7 @@ def update_user_v1_users_user_id_patch( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", - '404': None, + '201': "VersionCreationResponse", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -4543,10 +3448,9 @@ def update_user_v1_users_user_id_patch( @validate_call - def update_user_v1_users_user_id_patch_with_http_info( + def register_version_v1_versions_post_with_http_info( self, - user_id: StrictStr, - user_update_request: UserUpdateRequest, + version_creation_request: VersionCreationRequest, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -4559,14 +3463,12 @@ def update_user_v1_users_user_id_patch_with_http_info( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[UserResponse]: - """Update User + ) -> ApiResponse[VersionCreationResponse]: + """Register Version - :param user_id: (required) - :type user_id: str - :param user_update_request: (required) - :type user_update_request: UserUpdateRequest + :param version_creation_request: (required) + :type version_creation_request: VersionCreationRequest :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -4589,9 +3491,8 @@ def update_user_v1_users_user_id_patch_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._update_user_v1_users_user_id_patch_serialize( - user_id=user_id, - user_update_request=user_update_request, + _param = self._register_version_v1_versions_post_serialize( + version_creation_request=version_creation_request, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -4599,8 +3500,7 @@ def update_user_v1_users_user_id_patch_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", - '404': None, + '201': "VersionCreationResponse", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -4615,10 +3515,9 @@ def update_user_v1_users_user_id_patch_with_http_info( @validate_call - def update_user_v1_users_user_id_patch_without_preload_content( + def register_version_v1_versions_post_without_preload_content( self, - user_id: StrictStr, - user_update_request: UserUpdateRequest, + version_creation_request: VersionCreationRequest, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -4632,13 +3531,11 @@ def update_user_v1_users_user_id_patch_without_preload_content( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """Update User + """Register Version - :param user_id: (required) - :type user_id: str - :param user_update_request: (required) - :type user_update_request: UserUpdateRequest + :param version_creation_request: (required) + :type version_creation_request: VersionCreationRequest :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -4661,9 +3558,8 @@ def update_user_v1_users_user_id_patch_without_preload_content( :return: Returns the result object. """ # noqa: E501 - _param = self._update_user_v1_users_user_id_patch_serialize( - user_id=user_id, - user_update_request=user_update_request, + _param = self._register_version_v1_versions_post_serialize( + version_creation_request=version_creation_request, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -4671,8 +3567,7 @@ def update_user_v1_users_user_id_patch_without_preload_content( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "UserResponse", - '404': None, + '201': "VersionCreationResponse", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -4682,10 +3577,9 @@ def update_user_v1_users_user_id_patch_without_preload_content( return response_data.response - def _update_user_v1_users_user_id_patch_serialize( + def _register_version_v1_versions_post_serialize( self, - user_id, - user_update_request, + version_creation_request, _request_auth, _content_type, _headers, @@ -4707,14 +3601,12 @@ def _update_user_v1_users_user_id_patch_serialize( _body_params: Optional[bytes] = None # process the path parameters - if user_id is not None: - _path_params['user_id'] = user_id # process the query parameters # process the header parameters # process the form parameters # process the body parameter - if user_update_request is not None: - _body_params = user_update_request + if version_creation_request is not None: + _body_params = version_creation_request # set the HTTP header `Accept` @@ -4741,12 +3633,11 @@ def _update_user_v1_users_user_id_patch_serialize( # authentication setting _auth_settings: List[str] = [ - 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( - method='PATCH', - resource_path='/v1/users/{user_id}', + method='POST', + resource_path='/v1/versions', path_params=_path_params, query_params=_query_params, header_params=_header_params, diff --git a/codegen/out/aignx/codegen/api_client.py b/codegen/out/aignx/codegen/api_client.py index 7c690b8c..28ff5b57 100644 --- a/codegen/out/aignx/codegen/api_client.py +++ b/codegen/out/aignx/codegen/api_client.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/configuration.py b/codegen/out/aignx/codegen/configuration.py index 5ff0465a..8657b694 100644 --- a/codegen/out/aignx/codegen/configuration.py +++ b/codegen/out/aignx/codegen/configuration.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. @@ -112,7 +112,6 @@ AuthSettings = TypedDict( "AuthSettings", { - "OAuth2AuthorizationCodeBearer": OAuth2AuthSetting, }, total=False, ) @@ -161,7 +160,6 @@ class Configuration: in PEM format. :param retries: Number of retries for API requests. - :Example: """ _default: ClassVar[Optional[Self]] = None @@ -174,7 +172,7 @@ def __init__( username: Optional[str]=None, password: Optional[str]=None, access_token: Optional[str]=None, - server_index: Optional[int]=None, + server_index: Optional[int]=None, server_variables: Optional[ServerVariablesT]=None, server_operation_index: Optional[Dict[int, int]]=None, server_operation_variables: Optional[Dict[int, ServerVariablesT]]=None, @@ -484,13 +482,6 @@ def auth_settings(self)-> AuthSettings: :return: The Auth Settings information dict. """ auth: AuthSettings = {} - if self.access_token is not None: - auth['OAuth2AuthorizationCodeBearer'] = { - 'type': 'oauth2', - 'in': 'header', - 'key': 'Authorization', - 'value': 'Bearer ' + self.access_token - } return auth def to_debug_report(self) -> str: @@ -501,7 +492,7 @@ def to_debug_report(self) -> str: return "Python SDK Debug Report:\n"\ "OS: {env}\n"\ "Python Version: {pyversion}\n"\ - "Version of the API: 0.1.0\n"\ + "Version of the API: 1.0.0\n"\ "SDK Package Version: 1.0.0".\ format(env=sys.platform, pyversion=sys.version) diff --git a/codegen/out/aignx/codegen/exceptions.py b/codegen/out/aignx/codegen/exceptions.py index 98349c59..c83a99c1 100644 --- a/codegen/out/aignx/codegen/exceptions.py +++ b/codegen/out/aignx/codegen/exceptions.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. @@ -103,9 +103,9 @@ def __init__(self, msg, path_to_item=None) -> None: class ApiException(OpenApiException): def __init__( - self, - status=None, - reason=None, + self, + status=None, + reason=None, http_resp=None, *, body: Optional[str] = None, @@ -131,10 +131,10 @@ def __init__( @classmethod def from_response( - cls, - *, - http_resp, - body: Optional[str], + cls, + *, + http_resp, + body: Optional[str], data: Optional[Any], ) -> Self: if http_resp.status == 400: diff --git a/codegen/out/aignx/codegen/models/__init__.py b/codegen/out/aignx/codegen/models/__init__.py index 33ff63eb..884ff678 100644 --- a/codegen/out/aignx/codegen/models/__init__.py +++ b/codegen/out/aignx/codegen/models/__init__.py @@ -1,7 +1,5 @@ -from .user_creation_request import * from .item_result_read_response import * from .input_artifact_schema_creation_request import * -from .organization_update_request import * from .validation_error_loc_inner import * from .application_version_read_response import * from .item_status import * @@ -11,47 +9,24 @@ from .user_payload import * from .validation_error import * from .application_read_response import * -from .application_creation_response import * -from .output_artifact_event_trigger_response import * -from .output_artifact_event_trigger_request import * -from .application_creation_request import * -from .quota_name import * from .output_artifact_scope import * from .version_creation_response import * -from .item_event_creation_response import * -from .item_read_response import * from .input_artifact_creation_request import * -from .item_event_creation_request import * -from .user_update_request import * from .item_creation_request import * -from .organization_response import * -from .quotas_read_response import * from .application_version import * from .http_validation_error import * from .transfer_urls import * -from .item_event import * from .slug_version_request import * from .input_artifact import * from .output_artifact_result_read_response import * from .version_read_response import * -from .quotas_update_request import * from .output_artifact_schema_creation_request import * from .run_read_response import * from .application_run_status import * from .run_creation_request import * -from .quota_read_response import * from .payload_output_artifact import * from .payload_input_artifact import * -from .organization_quota import * -from .organization_creation_request import * -from .user_response import * -from .user_quota import * -from .artifact_event import * from .output_artifact_visibility import * -from .quota_update_response import * from .payload_item import * from .output_artifact_read_response import * -from .quota_update_request import * -from .quotas_update_response import * -from .artifact_status import * from .output_artifact import * diff --git a/codegen/out/aignx/codegen/models/application_creation_request.py b/codegen/out/aignx/codegen/models/application_creation_request.py deleted file mode 100644 index 87b89a43..00000000 --- a/codegen/out/aignx/codegen/models/application_creation_request.py +++ /dev/null @@ -1,88 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from typing import Optional, Set -from typing_extensions import Self - -class ApplicationCreationRequest(BaseModel): - """ - ApplicationCreationRequest - """ # noqa: E501 - name: StrictStr - description: StrictStr - regulatory_classes: List[StrictStr] - __properties: ClassVar[List[str]] = ["name", "description", "regulatory_classes"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ApplicationCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ApplicationCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "description": obj.get("description"), - "regulatory_classes": obj.get("regulatory_classes") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/application_creation_response.py b/codegen/out/aignx/codegen/models/application_creation_response.py deleted file mode 100644 index be493a06..00000000 --- a/codegen/out/aignx/codegen/models/application_creation_response.py +++ /dev/null @@ -1,84 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from typing import Optional, Set -from typing_extensions import Self - -class ApplicationCreationResponse(BaseModel): - """ - ApplicationCreationResponse - """ # noqa: E501 - application_id: StrictStr - __properties: ClassVar[List[str]] = ["application_id"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ApplicationCreationResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ApplicationCreationResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_id": obj.get("application_id") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/application_read_response.py b/codegen/out/aignx/codegen/models/application_read_response.py index ad37912a..0e7868ec 100644 --- a/codegen/out/aignx/codegen/models/application_read_response.py +++ b/codegen/out/aignx/codegen/models/application_read_response.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/application_run_status.py b/codegen/out/aignx/codegen/models/application_run_status.py index afd1b320..15c12aa7 100644 --- a/codegen/out/aignx/codegen/models/application_run_status.py +++ b/codegen/out/aignx/codegen/models/application_run_status.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/application_version.py b/codegen/out/aignx/codegen/models/application_version.py index 5c968ce9..897acf35 100644 --- a/codegen/out/aignx/codegen/models/application_version.py +++ b/codegen/out/aignx/codegen/models/application_version.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/application_version_read_response.py b/codegen/out/aignx/codegen/models/application_version_read_response.py index ba162378..39569858 100644 --- a/codegen/out/aignx/codegen/models/application_version_read_response.py +++ b/codegen/out/aignx/codegen/models/application_version_read_response.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/artifact_event.py b/codegen/out/aignx/codegen/models/artifact_event.py deleted file mode 100644 index 1ef35c3a..00000000 --- a/codegen/out/aignx/codegen/models/artifact_event.py +++ /dev/null @@ -1,35 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class ArtifactEvent(str, Enum): - """ - This is a subset of the OutputArtifactEvent used by the state machine. Only the variants defined below are allowed to be submitted from the Algorithms/Applications. - """ - - """ - allowed enum values - """ - SUCCEEDED = 'succeeded' - FAILED_WITH_USER_ERROR = 'failed_with_user_error' - FAILED_WITH_SYSTEM_ERROR = 'failed_with_system_error' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ArtifactEvent from a JSON string""" - return cls(json.loads(json_str)) diff --git a/codegen/out/aignx/codegen/models/artifact_status.py b/codegen/out/aignx/codegen/models/artifact_status.py deleted file mode 100644 index 2cdfbecf..00000000 --- a/codegen/out/aignx/codegen/models/artifact_status.py +++ /dev/null @@ -1,40 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class ArtifactStatus(str, Enum): - """ - ArtifactStatus - """ - - """ - allowed enum values - """ - PENDING = 'pending' - CANCELED_USER = 'canceled_user' - CANCELED_SYSTEM = 'canceled_system' - ERROR_USER = 'error_user' - ERROR_SYSTEM_FATAL = 'error_system_fatal' - ERROR_SYSTEM_RECOVERABLE = 'error_system_recoverable' - SKIPPED = 'skipped' - SUCCEEDED = 'succeeded' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ArtifactStatus from a JSON string""" - return cls(json.loads(json_str)) diff --git a/codegen/out/aignx/codegen/models/http_validation_error.py b/codegen/out/aignx/codegen/models/http_validation_error.py index 7516585d..c4c2ccad 100644 --- a/codegen/out/aignx/codegen/models/http_validation_error.py +++ b/codegen/out/aignx/codegen/models/http_validation_error.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/input_artifact.py b/codegen/out/aignx/codegen/models/input_artifact.py index b3be6b65..7755f4e6 100644 --- a/codegen/out/aignx/codegen/models/input_artifact.py +++ b/codegen/out/aignx/codegen/models/input_artifact.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. @@ -34,8 +34,8 @@ class InputArtifact(BaseModel): @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + if not re.match(r"^\w+\/\w+(?:[-+.]|\w)+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+(?:[-+.]|\w)+\w+$/") return value model_config = ConfigDict( diff --git a/codegen/out/aignx/codegen/models/input_artifact_creation_request.py b/codegen/out/aignx/codegen/models/input_artifact_creation_request.py index be5d5577..81dab994 100644 --- a/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +++ b/codegen/out/aignx/codegen/models/input_artifact_creation_request.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/input_artifact_read_response.py b/codegen/out/aignx/codegen/models/input_artifact_read_response.py index f52f8bab..ec1c3329 100644 --- a/codegen/out/aignx/codegen/models/input_artifact_read_response.py +++ b/codegen/out/aignx/codegen/models/input_artifact_read_response.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. @@ -34,8 +34,8 @@ class InputArtifactReadResponse(BaseModel): @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + if not re.match(r"^\w+\/\w+(?:[-+.]|\w)+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+(?:[-+.]|\w)+\w+$/") return value model_config = ConfigDict( diff --git a/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py b/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py index 9bf88b28..1e18e972 100644 --- a/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py +++ b/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/item_creation_request.py b/codegen/out/aignx/codegen/models/item_creation_request.py index 3fd787c8..bca56b62 100644 --- a/codegen/out/aignx/codegen/models/item_creation_request.py +++ b/codegen/out/aignx/codegen/models/item_creation_request.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/item_event.py b/codegen/out/aignx/codegen/models/item_event.py deleted file mode 100644 index e0ba63f6..00000000 --- a/codegen/out/aignx/codegen/models/item_event.py +++ /dev/null @@ -1,34 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class ItemEvent(str, Enum): - """ - ItemEvent - """ - - """ - allowed enum values - """ - FAILED_WITH_SYSTEM_ERROR = 'failed_with_system_error' - FAILED_RECOVERABLE = 'failed_recoverable' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of ItemEvent from a JSON string""" - return cls(json.loads(json_str)) diff --git a/codegen/out/aignx/codegen/models/item_event_creation_request.py b/codegen/out/aignx/codegen/models/item_event_creation_request.py deleted file mode 100644 index d9b523c7..00000000 --- a/codegen/out/aignx/codegen/models/item_event_creation_request.py +++ /dev/null @@ -1,87 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.item_event import ItemEvent -from typing import Optional, Set -from typing_extensions import Self - -class ItemEventCreationRequest(BaseModel): - """ - ItemEventCreationRequest - """ # noqa: E501 - event: ItemEvent - error: StrictStr - __properties: ClassVar[List[str]] = ["event", "error"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ItemEventCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ItemEventCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "event": obj.get("event"), - "error": obj.get("error") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/item_event_creation_response.py b/codegen/out/aignx/codegen/models/item_event_creation_response.py deleted file mode 100644 index a22a32ad..00000000 --- a/codegen/out/aignx/codegen/models/item_event_creation_response.py +++ /dev/null @@ -1,87 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.item_status import ItemStatus -from typing import Optional, Set -from typing_extensions import Self - -class ItemEventCreationResponse(BaseModel): - """ - ItemEventCreationResponse - """ # noqa: E501 - item_id: StrictStr - status: ItemStatus - __properties: ClassVar[List[str]] = ["item_id", "status"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ItemEventCreationResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ItemEventCreationResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "item_id": obj.get("item_id"), - "status": obj.get("status") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/item_read_response.py b/codegen/out/aignx/codegen/models/item_read_response.py deleted file mode 100644 index 7ef0cd1e..00000000 --- a/codegen/out/aignx/codegen/models/item_read_response.py +++ /dev/null @@ -1,103 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from aignx.codegen.models.item_status import ItemStatus -from typing import Optional, Set -from typing_extensions import Self - -class ItemReadResponse(BaseModel): - """ - ItemReadResponse - """ # noqa: E501 - item_id: StrictStr - application_run_id: Optional[StrictStr] = None - reference: StrictStr - status: ItemStatus - error: Optional[StrictStr] - __properties: ClassVar[List[str]] = ["item_id", "application_run_id", "reference", "status", "error"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of ItemReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if application_run_id (nullable) is None - # and model_fields_set contains the field - if self.application_run_id is None and "application_run_id" in self.model_fields_set: - _dict['application_run_id'] = None - - # set to None if error (nullable) is None - # and model_fields_set contains the field - if self.error is None and "error" in self.model_fields_set: - _dict['error'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of ItemReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "item_id": obj.get("item_id"), - "application_run_id": obj.get("application_run_id"), - "reference": obj.get("reference"), - "status": obj.get("status"), - "error": obj.get("error") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/item_result_read_response.py b/codegen/out/aignx/codegen/models/item_result_read_response.py index 50a67cc8..c5bf257d 100644 --- a/codegen/out/aignx/codegen/models/item_result_read_response.py +++ b/codegen/out/aignx/codegen/models/item_result_read_response.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/item_status.py b/codegen/out/aignx/codegen/models/item_status.py index 6ffcf237..92f1064a 100644 --- a/codegen/out/aignx/codegen/models/item_status.py +++ b/codegen/out/aignx/codegen/models/item_status.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/organization_creation_request.py b/codegen/out/aignx/codegen/models/organization_creation_request.py deleted file mode 100644 index c4514010..00000000 --- a/codegen/out/aignx/codegen/models/organization_creation_request.py +++ /dev/null @@ -1,90 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr -from typing import Any, ClassVar, Dict, List -from typing import Optional, Set -from typing_extensions import Self - -class OrganizationCreationRequest(BaseModel): - """ - OrganizationCreationRequest - """ # noqa: E501 - organization_id: StrictStr - owner_email: StrictStr - slide_quota: StrictInt - batch_size: StrictInt - __properties: ClassVar[List[str]] = ["organization_id", "owner_email", "slide_quota", "batch_size"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OrganizationCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OrganizationCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "organization_id": obj.get("organization_id"), - "owner_email": obj.get("owner_email"), - "slide_quota": obj.get("slide_quota"), - "batch_size": obj.get("batch_size") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/organization_quota.py b/codegen/out/aignx/codegen/models/organization_quota.py deleted file mode 100644 index 74b66431..00000000 --- a/codegen/out/aignx/codegen/models/organization_quota.py +++ /dev/null @@ -1,91 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt -from typing import Any, ClassVar, Dict, List, Optional -from typing import Optional, Set -from typing_extensions import Self - -class OrganizationQuota(BaseModel): - """ - OrganizationQuota - """ # noqa: E501 - total: Optional[StrictInt] - used: StrictInt - __properties: ClassVar[List[str]] = ["total", "used"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OrganizationQuota from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if total (nullable) is None - # and model_fields_set contains the field - if self.total is None and "total" in self.model_fields_set: - _dict['total'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OrganizationQuota from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "total": obj.get("total"), - "used": obj.get("used") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/organization_response.py b/codegen/out/aignx/codegen/models/organization_response.py deleted file mode 100644 index f90120d4..00000000 --- a/codegen/out/aignx/codegen/models/organization_response.py +++ /dev/null @@ -1,94 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.organization_quota import OrganizationQuota -from typing import Optional, Set -from typing_extensions import Self - -class OrganizationResponse(BaseModel): - """ - OrganizationResponse - """ # noqa: E501 - organization_id: StrictStr - owner_id: StrictStr - slide_quota: OrganizationQuota - batch_size: StrictInt - __properties: ClassVar[List[str]] = ["organization_id", "owner_id", "slide_quota", "batch_size"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OrganizationResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of slide_quota - if self.slide_quota: - _dict['slide_quota'] = self.slide_quota.to_dict() - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OrganizationResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "organization_id": obj.get("organization_id"), - "owner_id": obj.get("owner_id"), - "slide_quota": OrganizationQuota.from_dict(obj["slide_quota"]) if obj.get("slide_quota") is not None else None, - "batch_size": obj.get("batch_size") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/organization_update_request.py b/codegen/out/aignx/codegen/models/organization_update_request.py deleted file mode 100644 index 38f40627..00000000 --- a/codegen/out/aignx/codegen/models/organization_update_request.py +++ /dev/null @@ -1,96 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt -from typing import Any, ClassVar, Dict, List, Optional -from typing import Optional, Set -from typing_extensions import Self - -class OrganizationUpdateRequest(BaseModel): - """ - OrganizationUpdateRequest - """ # noqa: E501 - slide_quota: Optional[StrictInt] = None - batch_size: Optional[StrictInt] = None - __properties: ClassVar[List[str]] = ["slide_quota", "batch_size"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OrganizationUpdateRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if slide_quota (nullable) is None - # and model_fields_set contains the field - if self.slide_quota is None and "slide_quota" in self.model_fields_set: - _dict['slide_quota'] = None - - # set to None if batch_size (nullable) is None - # and model_fields_set contains the field - if self.batch_size is None and "batch_size" in self.model_fields_set: - _dict['batch_size'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OrganizationUpdateRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "slide_quota": obj.get("slide_quota"), - "batch_size": obj.get("batch_size") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/output_artifact.py b/codegen/out/aignx/codegen/models/output_artifact.py index 3cf1bcf6..f19d227e 100644 --- a/codegen/out/aignx/codegen/models/output_artifact.py +++ b/codegen/out/aignx/codegen/models/output_artifact.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. @@ -38,8 +38,8 @@ class OutputArtifact(BaseModel): @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + if not re.match(r"^\w+\/\w+(?:[-+.]|\w)+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+(?:[-+.]|\w)+\w+$/") return value model_config = ConfigDict( diff --git a/codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py b/codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py deleted file mode 100644 index 2927bca7..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact_event_trigger_request.py +++ /dev/null @@ -1,94 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from aignx.codegen.models.artifact_event import ArtifactEvent -from typing import Optional, Set -from typing_extensions import Self - -class OutputArtifactEventTriggerRequest(BaseModel): - """ - OutputArtifactEventTriggerRequest - """ # noqa: E501 - event: ArtifactEvent - metadata: Dict[str, Any] - error: Optional[StrictStr] = None - __properties: ClassVar[List[str]] = ["event", "metadata", "error"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OutputArtifactEventTriggerRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if error (nullable) is None - # and model_fields_set contains the field - if self.error is None and "error" in self.model_fields_set: - _dict['error'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OutputArtifactEventTriggerRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "event": obj.get("event"), - "metadata": obj.get("metadata"), - "error": obj.get("error") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py b/codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py deleted file mode 100644 index 7cb12cbe..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact_event_trigger_response.py +++ /dev/null @@ -1,87 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.artifact_status import ArtifactStatus -from typing import Optional, Set -from typing_extensions import Self - -class OutputArtifactEventTriggerResponse(BaseModel): - """ - OutputArtifactEventTriggerResponse - """ # noqa: E501 - output_artifact_id: StrictStr - status: ArtifactStatus - __properties: ClassVar[List[str]] = ["output_artifact_id", "status"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OutputArtifactEventTriggerResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OutputArtifactEventTriggerResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "output_artifact_id": obj.get("output_artifact_id"), - "status": obj.get("status") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/output_artifact_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_read_response.py index 1e721f15..5b7d391a 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_read_response.py +++ b/codegen/out/aignx/codegen/models/output_artifact_read_response.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. @@ -36,8 +36,8 @@ class OutputArtifactReadResponse(BaseModel): @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + if not re.match(r"^\w+\/\w+(?:[-+.]|\w)+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+(?:[-+.]|\w)+\w+$/") return value model_config = ConfigDict( diff --git a/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py index 765a3ce8..ffbc6cbc 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +++ b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. @@ -36,8 +36,8 @@ class OutputArtifactResultReadResponse(BaseModel): @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") + if not re.match(r"^\w+\/\w+(?:[-+.]|\w)+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+(?:[-+.]|\w)+\w+$/") return value model_config = ConfigDict( diff --git a/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py b/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py index 9ba0f7e7..d38bfb2d 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py +++ b/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/output_artifact_scope.py b/codegen/out/aignx/codegen/models/output_artifact_scope.py index cade78c0..b3359895 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_scope.py +++ b/codegen/out/aignx/codegen/models/output_artifact_scope.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/output_artifact_visibility.py b/codegen/out/aignx/codegen/models/output_artifact_visibility.py index 357ed2a5..5e72dccc 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_visibility.py +++ b/codegen/out/aignx/codegen/models/output_artifact_visibility.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/payload_input_artifact.py b/codegen/out/aignx/codegen/models/payload_input_artifact.py index 1eec8b69..da82bcb6 100644 --- a/codegen/out/aignx/codegen/models/payload_input_artifact.py +++ b/codegen/out/aignx/codegen/models/payload_input_artifact.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. @@ -17,7 +17,7 @@ import json from pydantic import BaseModel, ConfigDict, Field, StrictStr -from typing import Any, ClassVar, Dict, List +from typing import Any, ClassVar, Dict, List, Optional from typing_extensions import Annotated from typing import Optional, Set from typing_extensions import Self @@ -26,7 +26,7 @@ class PayloadInputArtifact(BaseModel): """ PayloadInputArtifact """ # noqa: E501 - input_artifact_id: StrictStr + input_artifact_id: Optional[StrictStr] = None metadata: Dict[str, Any] download_url: Annotated[str, Field(min_length=1, strict=True)] __properties: ClassVar[List[str]] = ["input_artifact_id", "metadata", "download_url"] diff --git a/codegen/out/aignx/codegen/models/payload_item.py b/codegen/out/aignx/codegen/models/payload_item.py index 472ce936..6ff5fc09 100644 --- a/codegen/out/aignx/codegen/models/payload_item.py +++ b/codegen/out/aignx/codegen/models/payload_item.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/payload_output_artifact.py b/codegen/out/aignx/codegen/models/payload_output_artifact.py index bc149705..8d6b98d5 100644 --- a/codegen/out/aignx/codegen/models/payload_output_artifact.py +++ b/codegen/out/aignx/codegen/models/payload_output_artifact.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/quota_name.py b/codegen/out/aignx/codegen/models/quota_name.py deleted file mode 100644 index d912727c..00000000 --- a/codegen/out/aignx/codegen/models/quota_name.py +++ /dev/null @@ -1,41 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class QuotaName(str, Enum): - """ - Global, API-level, and slide-level quotas for Samia API. - """ - - """ - allowed enum values - """ - MAX_USERS = 'max_users' - MAX_ORGANIZATIONS = 'max_organizations' - MAX_USERS_PER_ORGANIZATION = 'max_users_per_organization' - MAX_APPLICATIONS = 'max_applications' - MAX_APPLICATION_VERSIONS = 'max_application_versions' - MAX_SLIDES_PER_RUN = 'max_slides_per_run' - MAX_PARALLEL_RUNS = 'max_parallel_runs' - MAX_PARALLEL_RUNS_PER_ORGANIZATION = 'max_parallel_runs_per_organization' - MAX_PARALLEL_RUNS_PER_USER = 'max_parallel_runs_per_user' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of QuotaName from a JSON string""" - return cls(json.loads(json_str)) diff --git a/codegen/out/aignx/codegen/models/quota_read_response.py b/codegen/out/aignx/codegen/models/quota_read_response.py deleted file mode 100644 index f49313d4..00000000 --- a/codegen/out/aignx/codegen/models/quota_read_response.py +++ /dev/null @@ -1,87 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.quota_name import QuotaName -from typing import Optional, Set -from typing_extensions import Self - -class QuotaReadResponse(BaseModel): - """ - GET response payload for quota read. - """ # noqa: E501 - name: QuotaName - quota: StrictInt - __properties: ClassVar[List[str]] = ["name", "quota"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of QuotaReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of QuotaReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "quota": obj.get("quota") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/quota_update_request.py b/codegen/out/aignx/codegen/models/quota_update_request.py deleted file mode 100644 index 578667c9..00000000 --- a/codegen/out/aignx/codegen/models/quota_update_request.py +++ /dev/null @@ -1,87 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.quota_name import QuotaName -from typing import Optional, Set -from typing_extensions import Self - -class QuotaUpdateRequest(BaseModel): - """ - PATCH request payload for quota update. - """ # noqa: E501 - name: QuotaName - quota: StrictInt - __properties: ClassVar[List[str]] = ["name", "quota"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of QuotaUpdateRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of QuotaUpdateRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "quota": obj.get("quota") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/quota_update_response.py b/codegen/out/aignx/codegen/models/quota_update_response.py deleted file mode 100644 index 257acb29..00000000 --- a/codegen/out/aignx/codegen/models/quota_update_response.py +++ /dev/null @@ -1,87 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.quota_name import QuotaName -from typing import Optional, Set -from typing_extensions import Self - -class QuotaUpdateResponse(BaseModel): - """ - PATCH response payload for quota update. - """ # noqa: E501 - name: QuotaName - quota: StrictInt - __properties: ClassVar[List[str]] = ["name", "quota"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of QuotaUpdateResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of QuotaUpdateResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "quota": obj.get("quota") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/quotas_read_response.py b/codegen/out/aignx/codegen/models/quotas_read_response.py deleted file mode 100644 index 317340d2..00000000 --- a/codegen/out/aignx/codegen/models/quotas_read_response.py +++ /dev/null @@ -1,92 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.quota_read_response import QuotaReadResponse -from typing import Optional, Set -from typing_extensions import Self - -class QuotasReadResponse(BaseModel): - """ - GET response payload for multiple quota reads. - """ # noqa: E501 - quotas: List[QuotaReadResponse] - __properties: ClassVar[List[str]] = ["quotas"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of QuotasReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in quotas (list) - _items = [] - if self.quotas: - for _item_quotas in self.quotas: - if _item_quotas: - _items.append(_item_quotas.to_dict()) - _dict['quotas'] = _items - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of QuotasReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "quotas": [QuotaReadResponse.from_dict(_item) for _item in obj["quotas"]] if obj.get("quotas") is not None else None - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/quotas_update_request.py b/codegen/out/aignx/codegen/models/quotas_update_request.py deleted file mode 100644 index 62fc9981..00000000 --- a/codegen/out/aignx/codegen/models/quotas_update_request.py +++ /dev/null @@ -1,92 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.quota_update_request import QuotaUpdateRequest -from typing import Optional, Set -from typing_extensions import Self - -class QuotasUpdateRequest(BaseModel): - """ - PATCH request payload for quota updates. - """ # noqa: E501 - quotas: List[QuotaUpdateRequest] - __properties: ClassVar[List[str]] = ["quotas"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of QuotasUpdateRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in quotas (list) - _items = [] - if self.quotas: - for _item_quotas in self.quotas: - if _item_quotas: - _items.append(_item_quotas.to_dict()) - _dict['quotas'] = _items - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of QuotasUpdateRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "quotas": [QuotaUpdateRequest.from_dict(_item) for _item in obj["quotas"]] if obj.get("quotas") is not None else None - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/quotas_update_response.py b/codegen/out/aignx/codegen/models/quotas_update_response.py deleted file mode 100644 index 6ba5048a..00000000 --- a/codegen/out/aignx/codegen/models/quotas_update_response.py +++ /dev/null @@ -1,92 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.quota_update_response import QuotaUpdateResponse -from typing import Optional, Set -from typing_extensions import Self - -class QuotasUpdateResponse(BaseModel): - """ - PATCH response payload for quota updates. - """ # noqa: E501 - updated_quotas: List[QuotaUpdateResponse] - __properties: ClassVar[List[str]] = ["updated_quotas"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of QuotasUpdateResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in updated_quotas (list) - _items = [] - if self.updated_quotas: - for _item_updated_quotas in self.updated_quotas: - if _item_updated_quotas: - _items.append(_item_updated_quotas.to_dict()) - _dict['updated_quotas'] = _items - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of QuotasUpdateResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "updated_quotas": [QuotaUpdateResponse.from_dict(_item) for _item in obj["updated_quotas"]] if obj.get("updated_quotas") is not None else None - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/run_creation_request.py b/codegen/out/aignx/codegen/models/run_creation_request.py index 5e27d316..371f032f 100644 --- a/codegen/out/aignx/codegen/models/run_creation_request.py +++ b/codegen/out/aignx/codegen/models/run_creation_request.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/run_creation_response.py b/codegen/out/aignx/codegen/models/run_creation_response.py index c3b02e67..295aace8 100644 --- a/codegen/out/aignx/codegen/models/run_creation_response.py +++ b/codegen/out/aignx/codegen/models/run_creation_response.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/run_read_response.py b/codegen/out/aignx/codegen/models/run_read_response.py index ab747a09..f4653f19 100644 --- a/codegen/out/aignx/codegen/models/run_read_response.py +++ b/codegen/out/aignx/codegen/models/run_read_response.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/slug_version_request.py b/codegen/out/aignx/codegen/models/slug_version_request.py index f7d17143..70ddb318 100644 --- a/codegen/out/aignx/codegen/models/slug_version_request.py +++ b/codegen/out/aignx/codegen/models/slug_version_request.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/transfer_urls.py b/codegen/out/aignx/codegen/models/transfer_urls.py index 3a329aa0..c202ff4a 100644 --- a/codegen/out/aignx/codegen/models/transfer_urls.py +++ b/codegen/out/aignx/codegen/models/transfer_urls.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/user_creation_request.py b/codegen/out/aignx/codegen/models/user_creation_request.py deleted file mode 100644 index 12777e73..00000000 --- a/codegen/out/aignx/codegen/models/user_creation_request.py +++ /dev/null @@ -1,93 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from typing import Optional, Set -from typing_extensions import Self - -class UserCreationRequest(BaseModel): - """ - UserCreationRequest - """ # noqa: E501 - user_id: StrictStr - organization_id: StrictStr - email: Optional[StrictStr] - __properties: ClassVar[List[str]] = ["user_id", "organization_id", "email"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of UserCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if email (nullable) is None - # and model_fields_set contains the field - if self.email is None and "email" in self.model_fields_set: - _dict['email'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of UserCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "user_id": obj.get("user_id"), - "organization_id": obj.get("organization_id"), - "email": obj.get("email") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/user_payload.py b/codegen/out/aignx/codegen/models/user_payload.py index 7800d69a..de12f128 100644 --- a/codegen/out/aignx/codegen/models/user_payload.py +++ b/codegen/out/aignx/codegen/models/user_payload.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/user_quota.py b/codegen/out/aignx/codegen/models/user_quota.py deleted file mode 100644 index a2265946..00000000 --- a/codegen/out/aignx/codegen/models/user_quota.py +++ /dev/null @@ -1,91 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt -from typing import Any, ClassVar, Dict, List, Optional -from typing import Optional, Set -from typing_extensions import Self - -class UserQuota(BaseModel): - """ - UserQuota - """ # noqa: E501 - total: Optional[StrictInt] - used: StrictInt - __properties: ClassVar[List[str]] = ["total", "used"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of UserQuota from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if total (nullable) is None - # and model_fields_set contains the field - if self.total is None and "total" in self.model_fields_set: - _dict['total'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of UserQuota from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "total": obj.get("total"), - "used": obj.get("used") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/user_response.py b/codegen/out/aignx/codegen/models/user_response.py deleted file mode 100644 index ecc0d0ff..00000000 --- a/codegen/out/aignx/codegen/models/user_response.py +++ /dev/null @@ -1,102 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from aignx.codegen.models.user_quota import UserQuota -from typing import Optional, Set -from typing_extensions import Self - -class UserResponse(BaseModel): - """ - UserResponse - """ # noqa: E501 - user_id: Optional[StrictStr] - organization_id: Optional[StrictStr] - slide_quota: UserQuota - __properties: ClassVar[List[str]] = ["user_id", "organization_id", "slide_quota"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of UserResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of slide_quota - if self.slide_quota: - _dict['slide_quota'] = self.slide_quota.to_dict() - # set to None if user_id (nullable) is None - # and model_fields_set contains the field - if self.user_id is None and "user_id" in self.model_fields_set: - _dict['user_id'] = None - - # set to None if organization_id (nullable) is None - # and model_fields_set contains the field - if self.organization_id is None and "organization_id" in self.model_fields_set: - _dict['organization_id'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of UserResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "user_id": obj.get("user_id"), - "organization_id": obj.get("organization_id"), - "slide_quota": UserQuota.from_dict(obj["slide_quota"]) if obj.get("slide_quota") is not None else None - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/user_update_request.py b/codegen/out/aignx/codegen/models/user_update_request.py deleted file mode 100644 index a60b9eda..00000000 --- a/codegen/out/aignx/codegen/models/user_update_request.py +++ /dev/null @@ -1,96 +0,0 @@ - -""" - Aignostics Platform API - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - - The version of the OpenAPI document: 0.1.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictInt, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from typing import Optional, Set -from typing_extensions import Self - -class UserUpdateRequest(BaseModel): - """ - UserUpdateRequest - """ # noqa: E501 - user_id: Optional[StrictStr] = None - slide_quota: Optional[StrictInt] = None - __properties: ClassVar[List[str]] = ["user_id", "slide_quota"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of UserUpdateRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # set to None if user_id (nullable) is None - # and model_fields_set contains the field - if self.user_id is None and "user_id" in self.model_fields_set: - _dict['user_id'] = None - - # set to None if slide_quota (nullable) is None - # and model_fields_set contains the field - if self.slide_quota is None and "slide_quota" in self.model_fields_set: - _dict['slide_quota'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of UserUpdateRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "user_id": obj.get("user_id"), - "slide_quota": obj.get("slide_quota") - }) - return _obj diff --git a/codegen/out/aignx/codegen/models/validation_error.py b/codegen/out/aignx/codegen/models/validation_error.py index f9c19f35..6c2061b9 100644 --- a/codegen/out/aignx/codegen/models/validation_error.py +++ b/codegen/out/aignx/codegen/models/validation_error.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/validation_error_loc_inner.py b/codegen/out/aignx/codegen/models/validation_error_loc_inner.py index 6e532d48..7a396747 100644 --- a/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +++ b/codegen/out/aignx/codegen/models/validation_error_loc_inner.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/version_creation_request.py b/codegen/out/aignx/codegen/models/version_creation_request.py index a0fc6749..b8366a1c 100644 --- a/codegen/out/aignx/codegen/models/version_creation_request.py +++ b/codegen/out/aignx/codegen/models/version_creation_request.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/version_creation_response.py b/codegen/out/aignx/codegen/models/version_creation_response.py index 0150b084..f34891b5 100644 --- a/codegen/out/aignx/codegen/models/version_creation_response.py +++ b/codegen/out/aignx/codegen/models/version_creation_response.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/models/version_read_response.py b/codegen/out/aignx/codegen/models/version_read_response.py index c979a837..66c0611c 100644 --- a/codegen/out/aignx/codegen/models/version_read_response.py +++ b/codegen/out/aignx/codegen/models/version_read_response.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/aignx/codegen/rest.py b/codegen/out/aignx/codegen/rest.py index d7232881..a9c1d729 100644 --- a/codegen/out/aignx/codegen/rest.py +++ b/codegen/out/aignx/codegen/rest.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. diff --git a/codegen/out/docs/ExternalsApi.md b/codegen/out/docs/ExternalsApi.md index 7e15a440..552d9cde 100644 --- a/codegen/out/docs/ExternalsApi.md +++ b/codegen/out/docs/ExternalsApi.md @@ -6,20 +6,16 @@ Method | HTTP request | Description ------------- | ------------- | ------------- [**cancel_run_v1_runs_application_run_id_cancel_post**](ExternalsApi.md#cancel_run_v1_runs_application_run_id_cancel_post) | **POST** /v1/runs/{application_run_id}/cancel | Cancel Run [**create_application_run_v1_runs_post**](ExternalsApi.md#create_application_run_v1_runs_post) | **POST** /v1/runs | Create Application Run -[**create_user_v1_users_post**](ExternalsApi.md#create_user_v1_users_post) | **POST** /v1/users/ | Create User [**delete_run_results_v1_runs_application_run_id_results_delete**](ExternalsApi.md#delete_run_results_v1_runs_application_run_id_results_delete) | **DELETE** /v1/runs/{application_run_id}/results | Delete Run Results [**get_run_v1_runs_application_run_id_get**](ExternalsApi.md#get_run_v1_runs_application_run_id_get) | **GET** /v1/runs/{application_run_id} | Get Run -[**get_user_v1_users_user_id_get**](ExternalsApi.md#get_user_v1_users_user_id_get) | **GET** /v1/users/{user_id} | Get User [**get_version_v1_versions_application_version_id_get**](ExternalsApi.md#get_version_v1_versions_application_version_id_get) | **GET** /v1/versions/{application_version_id} | Get Version [**list_application_runs_v1_runs_get**](ExternalsApi.md#list_application_runs_v1_runs_get) | **GET** /v1/runs | List Application Runs [**list_applications_v1_applications_get**](ExternalsApi.md#list_applications_v1_applications_get) | **GET** /v1/applications | List Applications [**list_run_results_v1_runs_application_run_id_results_get**](ExternalsApi.md#list_run_results_v1_runs_application_run_id_results_get) | **GET** /v1/runs/{application_run_id}/results | List Run Results [**list_versions_by_application_id_v1_applications_application_id_versions_get**](ExternalsApi.md#list_versions_by_application_id_v1_applications_application_id_versions_get) | **GET** /v1/applications/{application_id}/versions | List Versions By Application Id [**list_versions_by_application_slug_v1_applications_application_slug_versions_get**](ExternalsApi.md#list_versions_by_application_slug_v1_applications_application_slug_versions_get) | **GET** /v1/applications/{application_slug}/versions | List Versions By Application Slug -[**read_application_by_id_v1_applications_application_id_get**](ExternalsApi.md#read_application_by_id_v1_applications_application_id_get) | **GET** /v1/applications/{application_id} | Read Application By Id [**read_application_by_slug_v1_applications_application_slug_get**](ExternalsApi.md#read_application_by_slug_v1_applications_application_slug_get) | **GET** /v1/applications/{application_slug} | Read Application By Slug [**register_version_v1_versions_post**](ExternalsApi.md#register_version_v1_versions_post) | **POST** /v1/versions | Register Version -[**update_user_v1_users_user_id_patch**](ExternalsApi.md#update_user_v1_users_user_id_patch) | **PATCH** /v1/users/{user_id} | Update User # **cancel_run_v1_runs_application_run_id_cancel_post** @@ -29,7 +25,6 @@ Cancel Run ### Example -* OAuth Authentication (OAuth2AuthorizationCodeBearer): ```python import aignx.codegen @@ -42,18 +37,12 @@ configuration = aignx.codegen.Configuration( host = "http://localhost" ) -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] # Enter a context with an instance of the API client with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | + application_run_id = 'application_run_id_example' # str | try: # Cancel Run @@ -71,7 +60,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | + **application_run_id** | **str**| | ### Return type @@ -79,7 +68,7 @@ Name | Type | Description | Notes ### Authorization -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) +No authorization required ### HTTP request headers @@ -103,7 +92,6 @@ Create Application Run ### Example -* OAuth Authentication (OAuth2AuthorizationCodeBearer): ```python import aignx.codegen @@ -118,18 +106,12 @@ configuration = aignx.codegen.Configuration( host = "http://localhost" ) -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] # Enter a context with an instance of the API client with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - run_creation_request = aignx.codegen.RunCreationRequest() # RunCreationRequest | + run_creation_request = aignx.codegen.RunCreationRequest() # RunCreationRequest | try: # Create Application Run @@ -147,7 +129,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **run_creation_request** | [**RunCreationRequest**](RunCreationRequest.md)| | + **run_creation_request** | [**RunCreationRequest**](RunCreationRequest.md)| | ### Return type @@ -155,7 +137,7 @@ Name | Type | Description | Notes ### Authorization -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) +No authorization required ### HTTP request headers @@ -172,82 +154,6 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) -# **create_user_v1_users_post** -> UserResponse create_user_v1_users_post(user_creation_request) - -Create User - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.user_creation_request import UserCreationRequest -from aignx.codegen.models.user_response import UserResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - user_creation_request = aignx.codegen.UserCreationRequest() # UserCreationRequest | - - try: - # Create User - api_response = api_instance.create_user_v1_users_post(user_creation_request) - print("The response of ExternalsApi->create_user_v1_users_post:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->create_user_v1_users_post: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **user_creation_request** | [**UserCreationRequest**](UserCreationRequest.md)| | - -### Return type - -[**UserResponse**](UserResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**404** | User not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - # **delete_run_results_v1_runs_application_run_id_results_delete** > delete_run_results_v1_runs_application_run_id_results_delete(application_run_id) @@ -255,7 +161,6 @@ Delete Run Results ### Example -* OAuth Authentication (OAuth2AuthorizationCodeBearer): ```python import aignx.codegen @@ -268,18 +173,12 @@ configuration = aignx.codegen.Configuration( host = "http://localhost" ) -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] # Enter a context with an instance of the API client with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | + application_run_id = 'application_run_id_example' # str | try: # Delete Run Results @@ -295,7 +194,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | + **application_run_id** | **str**| | ### Return type @@ -303,7 +202,7 @@ void (empty response body) ### Authorization -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) +No authorization required ### HTTP request headers @@ -327,7 +226,6 @@ Get Run ### Example -* OAuth Authentication (OAuth2AuthorizationCodeBearer): ```python import aignx.codegen @@ -341,18 +239,12 @@ configuration = aignx.codegen.Configuration( host = "http://localhost" ) -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] # Enter a context with an instance of the API client with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | + application_run_id = 'application_run_id_example' # str | include = None # List[object] | (optional) try: @@ -371,8 +263,8 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | - **include** | [**List[object]**](object.md)| | [optional] + **application_run_id** | **str**| | + **include** | [**List[object]**](object.md)| | [optional] ### Return type @@ -380,7 +272,7 @@ Name | Type | Description | Notes ### Authorization -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) +No authorization required ### HTTP request headers @@ -397,81 +289,6 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) -# **get_user_v1_users_user_id_get** -> UserResponse get_user_v1_users_user_id_get(user_id) - -Get User - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.user_response import UserResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - user_id = 'user_id_example' # str | - - try: - # Get User - api_response = api_instance.get_user_v1_users_user_id_get(user_id) - print("The response of ExternalsApi->get_user_v1_users_user_id_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->get_user_v1_users_user_id_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **user_id** | **str**| | - -### Return type - -[**UserResponse**](UserResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**404** | User not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - # **get_version_v1_versions_application_version_id_get** > VersionReadResponse get_version_v1_versions_application_version_id_get(application_version_id, include=include) @@ -479,7 +296,6 @@ Get Version ### Example -* OAuth Authentication (OAuth2AuthorizationCodeBearer): ```python import aignx.codegen @@ -493,18 +309,12 @@ configuration = aignx.codegen.Configuration( host = "http://localhost" ) -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] # Enter a context with an instance of the API client with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_version_id = 'application_version_id_example' # str | + application_version_id = 'application_version_id_example' # str | include = None # List[object] | (optional) try: @@ -523,8 +333,8 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_version_id** | **str**| | - **include** | [**List[object]**](object.md)| | [optional] + **application_version_id** | **str**| | + **include** | [**List[object]**](object.md)| | [optional] ### Return type @@ -532,7 +342,7 @@ Name | Type | Description | Notes ### Authorization -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) +No authorization required ### HTTP request headers @@ -555,7 +365,6 @@ List Application Runs ### Example -* OAuth Authentication (OAuth2AuthorizationCodeBearer): ```python import aignx.codegen @@ -569,12 +378,6 @@ configuration = aignx.codegen.Configuration( host = "http://localhost" ) -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] # Enter a context with an instance of the API client with aignx.codegen.ApiClient(configuration) as api_client: @@ -603,12 +406,12 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_id** | **str**| | [optional] - **application_version_id** | **str**| | [optional] - **include** | [**List[object]**](object.md)| | [optional] + **application_id** | **str**| | [optional] + **application_version_id** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] **page** | **int**| | [optional] [default to 1] **page_size** | **int**| | [optional] [default to 50] - **sort** | [**List[str]**](str.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] ### Return type @@ -616,7 +419,7 @@ Name | Type | Description | Notes ### Authorization -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) +No authorization required ### HTTP request headers @@ -640,7 +443,6 @@ List Applications ### Example -* OAuth Authentication (OAuth2AuthorizationCodeBearer): ```python import aignx.codegen @@ -654,12 +456,6 @@ configuration = aignx.codegen.Configuration( host = "http://localhost" ) -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] # Enter a context with an instance of the API client with aignx.codegen.ApiClient(configuration) as api_client: @@ -687,7 +483,7 @@ Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **page** | **int**| | [optional] [default to 1] **page_size** | **int**| | [optional] [default to 50] - **sort** | [**List[str]**](str.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] ### Return type @@ -695,7 +491,7 @@ Name | Type | Description | Notes ### Authorization -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) +No authorization required ### HTTP request headers @@ -718,7 +514,6 @@ List Run Results ### Example -* OAuth Authentication (OAuth2AuthorizationCodeBearer): ```python import aignx.codegen @@ -733,18 +528,12 @@ configuration = aignx.codegen.Configuration( host = "http://localhost" ) -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] # Enter a context with an instance of the API client with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | + application_run_id = 'application_run_id_example' # str | item_id__in = ['item_id__in_example'] # List[Optional[str]] | (optional) page = 1 # int | (optional) (default to 1) page_size = 50 # int | (optional) (default to 50) @@ -768,13 +557,13 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | - **item_id__in** | [**List[Optional[str]]**](str.md)| | [optional] + **application_run_id** | **str**| | + **item_id__in** | [**List[Optional[str]]**](str.md)| | [optional] **page** | **int**| | [optional] [default to 1] **page_size** | **int**| | [optional] [default to 50] - **reference__in** | [**List[str]**](str.md)| | [optional] - **status__in** | [**List[ItemStatus]**](ItemStatus.md)| | [optional] - **sort** | [**List[str]**](str.md)| | [optional] + **reference__in** | [**List[str]**](str.md)| | [optional] + **status__in** | [**List[ItemStatus]**](ItemStatus.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] ### Return type @@ -782,7 +571,7 @@ Name | Type | Description | Notes ### Authorization -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) +No authorization required ### HTTP request headers @@ -806,7 +595,6 @@ List Versions By Application Id ### Example -* OAuth Authentication (OAuth2AuthorizationCodeBearer): ```python import aignx.codegen @@ -820,18 +608,12 @@ configuration = aignx.codegen.Configuration( host = "http://localhost" ) -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] # Enter a context with an instance of the API client with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_id = 'application_id_example' # str | + application_id = 'application_id_example' # str | page = 1 # int | (optional) (default to 1) page_size = 50 # int | (optional) (default to 50) version = 'version_example' # str | (optional) @@ -854,12 +636,12 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_id** | **str**| | + **application_id** | **str**| | **page** | **int**| | [optional] [default to 1] **page_size** | **int**| | [optional] [default to 50] - **version** | **str**| | [optional] - **include** | [**List[object]**](object.md)| | [optional] - **sort** | [**List[str]**](str.md)| | [optional] + **version** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] ### Return type @@ -867,7 +649,7 @@ Name | Type | Description | Notes ### Authorization -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) +No authorization required ### HTTP request headers @@ -890,7 +672,6 @@ List Versions By Application Slug ### Example -* OAuth Authentication (OAuth2AuthorizationCodeBearer): ```python import aignx.codegen @@ -904,18 +685,12 @@ configuration = aignx.codegen.Configuration( host = "http://localhost" ) -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] # Enter a context with an instance of the API client with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_slug = 'application_slug_example' # str | + application_slug = 'application_slug_example' # str | page = 1 # int | (optional) (default to 1) page_size = 50 # int | (optional) (default to 50) version = 'version_example' # str | (optional) @@ -938,12 +713,12 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_slug** | **str**| | + **application_slug** | **str**| | **page** | **int**| | [optional] [default to 1] **page_size** | **int**| | [optional] [default to 50] - **version** | **str**| | [optional] - **include** | [**List[object]**](object.md)| | [optional] - **sort** | [**List[str]**](str.md)| | [optional] + **version** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] ### Return type @@ -951,81 +726,7 @@ Name | Type | Description | Notes ### Authorization -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **read_application_by_id_v1_applications_application_id_get** -> ApplicationReadResponse read_application_by_id_v1_applications_application_id_get(application_id) - -Read Application By Id - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.application_read_response import ApplicationReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_id = 'application_id_example' # str | - - try: - # Read Application By Id - api_response = api_instance.read_application_by_id_v1_applications_application_id_get(application_id) - print("The response of ExternalsApi->read_application_by_id_v1_applications_application_id_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->read_application_by_id_v1_applications_application_id_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_id** | **str**| | - -### Return type - -[**ApplicationReadResponse**](ApplicationReadResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) +No authorization required ### HTTP request headers @@ -1048,7 +749,6 @@ Read Application By Slug ### Example -* OAuth Authentication (OAuth2AuthorizationCodeBearer): ```python import aignx.codegen @@ -1062,18 +762,12 @@ configuration = aignx.codegen.Configuration( host = "http://localhost" ) -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] # Enter a context with an instance of the API client with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - application_slug = 'application_slug_example' # str | + application_slug = 'application_slug_example' # str | try: # Read Application By Slug @@ -1091,7 +785,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_slug** | **str**| | + **application_slug** | **str**| | ### Return type @@ -1099,7 +793,7 @@ Name | Type | Description | Notes ### Authorization -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) +No authorization required ### HTTP request headers @@ -1122,7 +816,6 @@ Register Version ### Example -* OAuth Authentication (OAuth2AuthorizationCodeBearer): ```python import aignx.codegen @@ -1137,18 +830,12 @@ configuration = aignx.codegen.Configuration( host = "http://localhost" ) -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] # Enter a context with an instance of the API client with aignx.codegen.ApiClient(configuration) as api_client: # Create an instance of the API class api_instance = aignx.codegen.ExternalsApi(api_client) - version_creation_request = aignx.codegen.VersionCreationRequest() # VersionCreationRequest | + version_creation_request = aignx.codegen.VersionCreationRequest() # VersionCreationRequest | try: # Register Version @@ -1166,7 +853,7 @@ with aignx.codegen.ApiClient(configuration) as api_client: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **version_creation_request** | [**VersionCreationRequest**](VersionCreationRequest.md)| | + **version_creation_request** | [**VersionCreationRequest**](VersionCreationRequest.md)| | ### Return type @@ -1174,7 +861,7 @@ Name | Type | Description | Notes ### Authorization -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) +No authorization required ### HTTP request headers @@ -1189,81 +876,3 @@ Name | Type | Description | Notes **422** | Validation Error | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **update_user_v1_users_user_id_patch** -> UserResponse update_user_v1_users_user_id_patch(user_id, user_update_request) - -Update User - -### Example - -* OAuth Authentication (OAuth2AuthorizationCodeBearer): - -```python -import aignx.codegen -from aignx.codegen.models.user_response import UserResponse -from aignx.codegen.models.user_update_request import UserUpdateRequest -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - -# The client must configure the authentication and authorization parameters -# in accordance with the API server security policy. -# Examples for each auth method are provided below, use the example that -# satisfies your auth use case. - -configuration.access_token = os.environ["ACCESS_TOKEN"] - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - user_id = 'user_id_example' # str | - user_update_request = aignx.codegen.UserUpdateRequest() # UserUpdateRequest | - - try: - # Update User - api_response = api_instance.update_user_v1_users_user_id_patch(user_id, user_update_request) - print("The response of ExternalsApi->update_user_v1_users_user_id_patch:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->update_user_v1_users_user_id_patch: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **user_id** | **str**| | - **user_update_request** | [**UserUpdateRequest**](UserUpdateRequest.md)| | - -### Return type - -[**UserResponse**](UserResponse.md) - -### Authorization - -[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**404** | User not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/codegen/out/test/test_externals_api.py b/codegen/out/test/test_externals_api.py index 28aef4b0..1d20906e 100644 --- a/codegen/out/test/test_externals_api.py +++ b/codegen/out/test/test_externals_api.py @@ -1,10 +1,10 @@ """ - Aignostics Platform API + PAPI API Reference - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. + No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - The version of the OpenAPI document: 0.1.0 + The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. @@ -39,13 +39,6 @@ def test_create_application_run_v1_runs_post(self) -> None: """ pass - def test_create_user_v1_users_post(self) -> None: - """Test case for create_user_v1_users_post - - Create User - """ - pass - def test_delete_run_results_v1_runs_application_run_id_results_delete(self) -> None: """Test case for delete_run_results_v1_runs_application_run_id_results_delete @@ -60,13 +53,6 @@ def test_get_run_v1_runs_application_run_id_get(self) -> None: """ pass - def test_get_user_v1_users_user_id_get(self) -> None: - """Test case for get_user_v1_users_user_id_get - - Get User - """ - pass - def test_get_version_v1_versions_application_version_id_get(self) -> None: """Test case for get_version_v1_versions_application_version_id_get @@ -109,13 +95,6 @@ def test_list_versions_by_application_slug_v1_applications_application_slug_vers """ pass - def test_read_application_by_id_v1_applications_application_id_get(self) -> None: - """Test case for read_application_by_id_v1_applications_application_id_get - - Read Application By Id - """ - pass - def test_read_application_by_slug_v1_applications_application_slug_get(self) -> None: """Test case for read_application_by_slug_v1_applications_application_slug_get @@ -130,13 +109,6 @@ def test_register_version_v1_versions_post(self) -> None: """ pass - def test_update_user_v1_users_user_id_patch(self) -> None: - """Test case for update_user_v1_users_user_id_patch - - Update User - """ - pass - if __name__ == '__main__': unittest.main() diff --git a/docs/source/_static/openapi_v1.json b/docs/source/_static/openapi_v1.json index f9182b03..3c3d8af2 100644 --- a/docs/source/_static/openapi_v1.json +++ b/docs/source/_static/openapi_v1.json @@ -1,68 +1,22 @@ { "openapi": "3.1.0", "info": { - "title": "Aignostics Platform API", - "summary": "Interact with Aignostics' Application Platform", - "description": "Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. sort is a comma-separated list of field names. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`.", - "version": "0.1.0" + "title": "PAPI API Reference", + "version": "1.0.0" }, + "servers": [ + { + "url": "" + } + ], "paths": { "/v1/applications": { - "post": { - "tags": [ - "Admins" - ], - "summary": "Register Application", - "operationId": "register_application_v1_applications_post", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApplicationCreationRequest" - } - } - } - }, - "responses": { - "201": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApplicationCreationResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, "get": { "tags": [ "Externals" ], "summary": "List Applications", "operationId": "list_applications_v1_applications_get", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], "parameters": [ { "name": "page", @@ -135,54 +89,6 @@ } } }, - "/v1/applications/{application_id}": { - "get": { - "tags": [ - "Externals" - ], - "summary": "Read Application By Id", - "operationId": "read_application_by_id_v1_applications__application_id__get", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], - "parameters": [ - { - "name": "application_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Application Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApplicationReadResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, "/v1/applications/{application_slug}": { "get": { "tags": [ @@ -190,11 +96,6 @@ ], "summary": "Read Application By Slug", "operationId": "read_application_by_slug_v1_applications__application_slug__get", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], "parameters": [ { "name": "application_slug", @@ -230,66 +131,46 @@ } } }, - "/v1/applications/{application_id}/versions": { + "/v1/runs": { "get": { "tags": [ "Externals" ], - "summary": "List Versions By Application Id", - "operationId": "list_versions_by_application_id_v1_applications__application_id__versions_get", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], + "summary": "List Application Runs", + "operationId": "list_application_runs_v1_runs_get", "parameters": [ { "name": "application_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Application Id" - } - }, - { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "minimum": 1, - "default": 1, - "title": "Page" - } - }, - { - "name": "page_size", "in": "query", "required": false, "schema": { - "type": "integer", - "maximum": 100, - "minimum": 5, - "default": 50, - "title": "Page Size" + "anyOf": [ + { + "type": "string", + "format": "uuid" + }, + { + "type": "null" + } + ], + "title": "Application Id" } }, { - "name": "version", + "name": "application_version_id", "in": "query", "required": false, "schema": { "anyOf": [ { - "type": "string" + "type": "string", + "format": "uuid" }, { "type": "null" } ], - "title": "Version" + "title": "Application Version Id" } }, { @@ -315,77 +196,6 @@ "title": "Include" } }, - { - "name": "sort", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "null" - } - ], - "title": "Sort" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationVersionReadResponse" - }, - "title": "Response List Versions By Application Id V1 Applications Application Id Versions Get" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/applications/{application_slug}/versions": { - "get": { - "tags": [ - "Externals" - ], - "summary": "List Versions By Application Slug", - "operationId": "list_versions_by_application_slug_v1_applications__application_slug__versions_get", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], - "parameters": [ - { - "name": "application_slug", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^[a-z](-?[a-z])*$", - "title": "Application Slug" - } - }, { "name": "page", "in": "query", @@ -409,45 +219,6 @@ "title": "Page Size" } }, - { - "name": "version", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Version" - } - }, - { - "name": "include", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "array", - "prefixItems": [ - { - "type": "string" - } - ], - "minItems": 1, - "maxItems": 1 - }, - { - "type": "null" - } - ], - "title": "Include" - } - }, { "name": "sort", "in": "query", @@ -476,537 +247,16 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/ApplicationVersionReadResponse" + "$ref": "#/components/schemas/RunReadResponse" }, - "title": "Response List Versions By Application Slug V1 Applications Application Slug Versions Get" + "title": "Response List Application Runs V1 Runs Get" } } } }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/artifacts/{output_artifact_id}/event": { - "post": { - "tags": [ - "Algorithms/Apps" - ], - "summary": "Trigger Artifact Event", - "operationId": "trigger_artifact_event_v1_artifacts__output_artifact_id__event_post", - "parameters": [ - { - "name": "output_artifact_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Output Artifact Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OutputArtifactEventTriggerRequest" - } - } - } - }, - "responses": { - "201": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OutputArtifactEventTriggerResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/items/{item_id}": { - "get": { - "tags": [ - "Scheduler" - ], - "summary": "Get Item", - "operationId": "get_item_v1_items__item_id__get", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Item Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ItemReadResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/items/{item_id}/event": { - "post": { - "tags": [ - "Scheduler" - ], - "summary": "Register Item Event", - "operationId": "register_item_event_v1_items__item_id__event_post", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], - "parameters": [ - { - "name": "item_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Item Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ItemEventCreationRequest" - } - } - } - }, - "responses": { - "202": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ItemEventCreationResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/organizations": { - "post": { - "tags": [ - "Organizations" - ], - "summary": "Create Organization", - "operationId": "create_organization_v1_organizations_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OrganizationCreationRequest" - } - } - }, - "required": true - }, - "responses": { - "201": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OrganizationResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ] - } - }, - "/v1/organizations/{organization_id}": { - "patch": { - "tags": [ - "Organizations" - ], - "summary": "Update Organization", - "operationId": "update_organization_v1_organizations__organization_id__patch", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], - "parameters": [ - { - "name": "organization_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Organization Id" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OrganizationUpdateRequest" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OrganizationResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "get": { - "tags": [ - "Organizations" - ], - "summary": "Get Organization", - "operationId": "get_organization_v1_organizations__organization_id__get", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], - "parameters": [ - { - "name": "organization_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Organization Id" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OrganizationResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/quotas": { - "get": { - "tags": [ - "Admins", - "Admins" - ], - "summary": "List Quotas", - "operationId": "list_quotas_v1_quotas_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/QuotasReadResponse" - } - } - } - } - }, - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ] - }, - "patch": { - "tags": [ - "Admins", - "Admins" - ], - "summary": "Update Quotas", - "operationId": "update_quotas_v1_quotas_patch", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/QuotasUpdateRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/QuotasUpdateResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ] - } - }, - "/v1/runs": { - "get": { - "tags": [ - "Externals" - ], - "summary": "List Application Runs", - "operationId": "list_application_runs_v1_runs_get", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], - "parameters": [ - { - "name": "application_id", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "Application Id" - } - }, - { - "name": "application_version_id", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "Application Version Id" - } - }, - { - "name": "include", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "array", - "prefixItems": [ - { - "type": "string" - } - ], - "minItems": 1, - "maxItems": 1 - }, - { - "type": "null" - } - ], - "title": "Include" - } - }, - { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "minimum": 1, - "default": 1, - "title": "Page" - } - }, - { - "name": "page_size", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 5, - "default": 50, - "title": "Page Size" - } - }, - { - "name": "sort", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "null" - } - ], - "title": "Sort" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/RunReadResponse" - }, - "title": "Response List Application Runs V1 Runs Get" - } - } - } - }, - "404": { - "description": "Application run not found" - }, + "404": { + "description": "Application run not found" + }, "422": { "description": "Validation Error", "content": { @@ -1025,11 +275,6 @@ ], "summary": "Create Application Run", "operationId": "create_application_run_v1_runs_post", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], "requestBody": { "required": true, "content": { @@ -1070,16 +315,10 @@ "/v1/runs/{application_run_id}": { "get": { "tags": [ - "Externals", - "Scheduler" + "Externals" ], "summary": "Get Run", "operationId": "get_run_v1_runs__application_run_id__get", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], "parameters": [ { "name": "application_run_id", @@ -1149,11 +388,6 @@ ], "summary": "Cancel Run", "operationId": "cancel_run_v1_runs__application_run_id__cancel_post", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], "parameters": [ { "name": "application_run_id", @@ -1198,11 +432,6 @@ ], "summary": "List Run Results", "operationId": "list_run_results_v1_runs__application_run_id__results_get", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], "parameters": [ { "name": "application_run_id", @@ -1299,191 +528,39 @@ "name": "sort", "in": "query", "required": false, - "schema": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "null" - } - ], - "title": "Sort" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ItemResultReadResponse" - }, - "title": "Response List Run Results V1 Runs Application Run Id Results Get" - } - } - } - }, - "404": { - "description": "Application run not found" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "delete": { - "tags": [ - "Externals" - ], - "summary": "Delete Run Results", - "operationId": "delete_run_results_v1_runs__application_run_id__results_delete", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], - "parameters": [ - { - "name": "application_run_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Application Run Id" - } - } - ], - "responses": { - "204": { - "description": "Successful Response" - }, - "404": { - "description": "Application run not found" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/users/": { - "post": { - "tags": [ - "Externals" - ], - "summary": "Create User", - "operationId": "create_user_v1_users__post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserCreationRequest" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserResponse" - } - } - } - }, - "404": { - "description": "User not found" - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ] - } - }, - "/v1/users/{user_id}": { - "patch": { - "tags": [ - "Externals" - ], - "summary": "Update User", - "operationId": "update_user_v1_users__user_id__patch", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], - "parameters": [ - { - "name": "user_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "User Id" + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "title": "Sort" } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserUpdateRequest" - } - } - } - }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UserResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/ItemResultReadResponse" + }, + "title": "Response List Run Results V1 Runs Application Run Id Results Get" } } } }, "404": { - "description": "User not found" + "description": "Application run not found" }, "422": { "description": "Validation Error", @@ -1497,42 +574,30 @@ } } }, - "get": { + "delete": { "tags": [ "Externals" ], - "summary": "Get User", - "operationId": "get_user_v1_users__user_id__get", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ], + "summary": "Delete Run Results", + "operationId": "delete_run_results_v1_runs__application_run_id__results_delete", "parameters": [ { - "name": "user_id", + "name": "application_run_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "User Id" + "title": "Application Run Id" } } ], "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserResponse" - } - } - } + "204": { + "description": "Successful Response" }, "404": { - "description": "User not found" + "description": "Application run not found" }, "422": { "description": "Validation Error", @@ -1550,9 +615,7 @@ "/v1/versions": { "post": { "tags": [ - "Externals", - "Scheduler", - "Admins" + "Externals" ], "summary": "Register Version", "operationId": "register_version_v1_versions_post", @@ -1587,36 +650,64 @@ } } } - }, - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } - ] + } } }, - "/v1/versions/{application_version_id}": { + "/v1/applications/{application_id}/versions": { "get": { "tags": [ - "Externals", - "Scheduler" - ], - "summary": "Get Version", - "operationId": "get_version_v1_versions__application_version_id__get", - "security": [ - { - "OAuth2AuthorizationCodeBearer": [] - } + "Externals" ], + "summary": "List Versions By Application Id", + "operationId": "list_versions_by_application_id_v1_applications__application_id__versions_get", "parameters": [ { - "name": "application_version_id", + "name": "application_id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid", - "title": "Application Version Id" + "title": "Application Id" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "default": 1, + "title": "Page" + } + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 5, + "default": 50, + "title": "Page Size" + } + }, + { + "name": "version", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version" } }, { @@ -1641,6 +732,25 @@ ], "title": "Include" } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "title": "Sort" + } } ], "responses": { @@ -1649,7 +759,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/VersionReadResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationVersionReadResponse" + }, + "title": "Response List Versions By Application Id V1 Applications Application Id Versions Get" } } } @@ -1667,85 +781,173 @@ } } }, - "/liveness": { + "/v1/applications/{application_slug}/versions": { "get": { "tags": [ - "Infrastructure" + "Externals" ], - "summary": "Liveness", - "description": "Check that the API application is alive and responsive.", - "operationId": "liveness_liveness_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": {} - } + "summary": "List Versions By Application Slug", + "operationId": "list_versions_by_application_slug_v1_applications__application_slug__versions_get", + "parameters": [ + { + "name": "application_slug", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z](-?[a-z])*$", + "title": "Application Slug" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "default": 1, + "title": "Page" + } + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 5, + "default": 50, + "title": "Page Size" + } + }, + { + "name": "version", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version" + } + }, + { + "name": "include", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "prefixItems": [ + { + "type": "string" + } + ], + "minItems": 1, + "maxItems": 1 + }, + { + "type": "null" + } + ], + "title": "Include" + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "title": "Sort" } } - } - } - }, - "/readiness": { - "get": { - "tags": [ - "Infrastructure" ], - "summary": "Readiness", - "description": "Check that the API application is ready to serve.", - "operationId": "readiness_readiness_get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { - "schema": {} + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationVersionReadResponse" + }, + "title": "Response List Versions By Application Slug V1 Applications Application Slug Versions Get" + } } } - } - } - } - }, - "/health": { - "get": { - "tags": [ - "Infrastructure" - ], - "summary": "Health", - "description": "Check that the API application is alive and responsive.", - "operationId": "health_health_get", - "responses": { - "200": { - "description": "Successful Response", + }, + "422": { + "description": "Validation Error", "content": { "application/json": { - "schema": {} + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } } } } } } }, - "/docs": { + "/v1/versions/{application_version_id}": { "get": { - "summary": "Get Documentation", - "operationId": "get_documentation_docs_get", + "tags": [ + "Externals" + ], + "summary": "Get Version", + "operationId": "get_version_v1_versions__application_version_id__get", "parameters": [ { - "name": "access_token", - "in": "cookie", + "name": "application_version_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "title": "Application Version Id" + } + }, + { + "name": "include", + "in": "query", "required": false, "schema": { "anyOf": [ { - "type": "string" + "type": "array", + "prefixItems": [ + { + "type": "string" + } + ], + "minItems": 1, + "maxItems": 1 }, { "type": "null" } ], - "title": "Access Token" + "title": "Include" } } ], @@ -1754,7 +956,9 @@ "description": "Successful Response", "content": { "application/json": { - "schema": {} + "schema": { + "$ref": "#/components/schemas/VersionReadResponse" + } } } }, @@ -1774,57 +978,6 @@ }, "components": { "schemas": { - "ApplicationCreationRequest": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "examples": [ - "HETA" - ] - }, - "description": { - "type": "string", - "title": "Description", - "examples": [ - "H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, cell detection and cell classfication" - ] - }, - "regulatory_classes": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Regulatory Classes", - "examples": [ - [ - "RuO" - ] - ] - } - }, - "type": "object", - "required": [ - "name", - "description", - "regulatory_classes" - ], - "title": "ApplicationCreationRequest" - }, - "ApplicationCreationResponse": { - "properties": { - "application_id": { - "type": "string", - "format": "uuid", - "title": "Application Id" - } - }, - "type": "object", - "required": [ - "application_id" - ], - "title": "ApplicationCreationResponse" - }, "ApplicationReadResponse": { "properties": { "application_id": { @@ -1957,30 +1110,6 @@ ], "title": "ApplicationVersionReadResponse" }, - "ArtifactEvent": { - "type": "string", - "enum": [ - "succeeded", - "failed_with_user_error", - "failed_with_system_error" - ], - "title": "ArtifactEvent", - "description": "This is a subset of the OutputArtifactEvent used by the state machine.\nOnly the variants defined below are allowed to be submitted from the Algorithms/Applications." - }, - "ArtifactStatus": { - "type": "string", - "enum": [ - "pending", - "canceled_user", - "canceled_system", - "error_user", - "error_system_fatal", - "error_system_recoverable", - "skipped", - "succeeded" - ], - "title": "ArtifactStatus" - }, "HTTPValidationError": { "properties": { "detail": { @@ -2002,7 +1131,7 @@ }, "mime_type": { "type": "string", - "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", + "pattern": "^\\w+/\\w+(?:[-+.]|\\w)+\\w+$", "title": "Mime Type", "examples": [ "image/tiff" @@ -2070,7 +1199,7 @@ }, "mime_type": { "type": "string", - "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", + "pattern": "^\\w+/\\w+(?:[-+.]|\\w)+\\w+$", "title": "Mime Type", "examples": [ "image/tiff" @@ -2139,96 +1268,6 @@ ], "title": "ItemCreationRequest" }, - "ItemEvent": { - "type": "string", - "enum": [ - "failed_with_system_error", - "failed_recoverable" - ], - "title": "ItemEvent" - }, - "ItemEventCreationRequest": { - "properties": { - "event": { - "$ref": "#/components/schemas/ItemEvent" - }, - "error": { - "type": "string", - "title": "Error" - } - }, - "type": "object", - "required": [ - "event", - "error" - ], - "title": "ItemEventCreationRequest" - }, - "ItemEventCreationResponse": { - "properties": { - "item_id": { - "type": "string", - "format": "uuid", - "title": "Item Id" - }, - "status": { - "$ref": "#/components/schemas/ItemStatus" - } - }, - "type": "object", - "required": [ - "item_id", - "status" - ], - "title": "ItemEventCreationResponse" - }, - "ItemReadResponse": { - "properties": { - "item_id": { - "type": "string", - "format": "uuid", - "title": "Item Id" - }, - "application_run_id": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "Application Run Id" - }, - "reference": { - "type": "string", - "title": "Reference" - }, - "status": { - "$ref": "#/components/schemas/ItemStatus" - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Error" - } - }, - "type": "object", - "required": [ - "item_id", - "reference", - "status", - "error" - ], - "title": "ItemReadResponse" - }, "ItemResultReadResponse": { "properties": { "item_id": { @@ -2239,165 +1278,56 @@ "application_run_id": { "type": "string", "format": "uuid", - "title": "Application Run Id" - }, - "reference": { - "type": "string", - "title": "Reference" - }, - "status": { - "$ref": "#/components/schemas/ItemStatus" - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Error" - }, - "output_artifacts": { - "items": { - "$ref": "#/components/schemas/OutputArtifactResultReadResponse" - }, - "type": "array", - "title": "Output Artifacts" - } - }, - "type": "object", - "required": [ - "item_id", - "application_run_id", - "reference", - "status", - "error", - "output_artifacts" - ], - "title": "ItemResultReadResponse" - }, - "ItemStatus": { - "type": "string", - "enum": [ - "pending", - "canceled_user", - "canceled_system", - "error_user", - "error_system", - "succeeded" - ], - "title": "ItemStatus" - }, - "OrganizationCreationRequest": { - "properties": { - "organization_id": { - "type": "string", - "title": "Organization Id" - }, - "owner_email": { - "type": "string", - "title": "Owner Email" - }, - "slide_quota": { - "type": "integer", - "title": "Slide Quota" - }, - "batch_size": { - "type": "integer", - "title": "Batch Size" - } - }, - "type": "object", - "required": [ - "organization_id", - "owner_email", - "slide_quota", - "batch_size" - ], - "title": "OrganizationCreationRequest" - }, - "OrganizationQuota": { - "properties": { - "total": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Total" - }, - "used": { - "type": "integer", - "title": "Used" - } - }, - "type": "object", - "required": [ - "total", - "used" - ], - "title": "OrganizationQuota" - }, - "OrganizationResponse": { - "properties": { - "organization_id": { - "type": "string", - "title": "Organization Id" - }, - "owner_id": { - "type": "string", - "format": "uuid", - "title": "Owner Id" + "title": "Application Run Id" }, - "slide_quota": { - "$ref": "#/components/schemas/OrganizationQuota" + "reference": { + "type": "string", + "title": "Reference" }, - "batch_size": { - "type": "integer", - "title": "Batch Size" - } - }, - "type": "object", - "required": [ - "organization_id", - "owner_id", - "slide_quota", - "batch_size" - ], - "title": "OrganizationResponse" - }, - "OrganizationUpdateRequest": { - "properties": { - "slide_quota": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Slide Quota" + "status": { + "$ref": "#/components/schemas/ItemStatus" }, - "batch_size": { + "error": { "anyOf": [ { - "type": "integer" + "type": "string" }, { "type": "null" } ], - "title": "Batch Size" + "title": "Error" + }, + "output_artifacts": { + "items": { + "$ref": "#/components/schemas/OutputArtifactResultReadResponse" + }, + "type": "array", + "title": "Output Artifacts" } }, "type": "object", - "title": "OrganizationUpdateRequest" + "required": [ + "item_id", + "application_run_id", + "reference", + "status", + "error", + "output_artifacts" + ], + "title": "ItemResultReadResponse" + }, + "ItemStatus": { + "type": "string", + "enum": [ + "pending", + "canceled_user", + "canceled_system", + "error_user", + "error_system", + "succeeded" + ], + "title": "ItemStatus" }, "OutputArtifact": { "properties": { @@ -2407,7 +1337,7 @@ }, "mime_type": { "type": "string", - "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", + "pattern": "^\\w+/\\w+(?:[-+.]|\\w)+\\w+$", "title": "Mime Type", "examples": [ "application/vnd.apache.parquet" @@ -2434,52 +1364,6 @@ ], "title": "OutputArtifact" }, - "OutputArtifactEventTriggerRequest": { - "properties": { - "event": { - "$ref": "#/components/schemas/ArtifactEvent" - }, - "metadata": { - "type": "object", - "title": "Metadata" - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Error" - } - }, - "type": "object", - "required": [ - "event", - "metadata" - ], - "title": "OutputArtifactEventTriggerRequest" - }, - "OutputArtifactEventTriggerResponse": { - "properties": { - "output_artifact_id": { - "type": "string", - "format": "uuid", - "title": "Output Artifact Id" - }, - "status": { - "$ref": "#/components/schemas/ArtifactStatus" - } - }, - "type": "object", - "required": [ - "output_artifact_id", - "status" - ], - "title": "OutputArtifactEventTriggerResponse" - }, "OutputArtifactReadResponse": { "properties": { "name": { @@ -2488,7 +1372,7 @@ }, "mime_type": { "type": "string", - "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", + "pattern": "^\\w+/\\w+(?:[-+.]|\\w)+\\w+$", "title": "Mime Type", "examples": [ "application/vnd.apache.parquet" @@ -2524,7 +1408,7 @@ }, "mime_type": { "type": "string", - "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", + "pattern": "^\\w+/\\w+(?:[-+.]|\\w)+\\w+$", "title": "Mime Type", "examples": [ "application/vnd.apache.parquet" @@ -2629,7 +1513,6 @@ }, "type": "object", "required": [ - "input_artifact_id", "metadata", "download_url" ], @@ -2687,128 +1570,6 @@ ], "title": "PayloadOutputArtifact" }, - "QuotaName": { - "type": "string", - "enum": [ - "max_users", - "max_organizations", - "max_users_per_organization", - "max_applications", - "max_application_versions", - "max_slides_per_run", - "max_parallel_runs", - "max_parallel_runs_per_organization", - "max_parallel_runs_per_user" - ], - "title": "QuotaName", - "description": "Global, API-level, and slide-level quotas for Samia API." - }, - "QuotaReadResponse": { - "properties": { - "name": { - "$ref": "#/components/schemas/QuotaName" - }, - "quota": { - "type": "integer", - "title": "Quota" - } - }, - "type": "object", - "required": [ - "name", - "quota" - ], - "title": "QuotaReadResponse", - "description": "GET response payload for quota read." - }, - "QuotaUpdateRequest": { - "properties": { - "name": { - "$ref": "#/components/schemas/QuotaName" - }, - "quota": { - "type": "integer", - "exclusiveMinimum": 0.0, - "title": "Quota" - } - }, - "type": "object", - "required": [ - "name", - "quota" - ], - "title": "QuotaUpdateRequest", - "description": "PATCH request payload for quota update." - }, - "QuotaUpdateResponse": { - "properties": { - "name": { - "$ref": "#/components/schemas/QuotaName" - }, - "quota": { - "type": "integer", - "title": "Quota" - } - }, - "type": "object", - "required": [ - "name", - "quota" - ], - "title": "QuotaUpdateResponse", - "description": "PATCH response payload for quota update." - }, - "QuotasReadResponse": { - "properties": { - "quotas": { - "items": { - "$ref": "#/components/schemas/QuotaReadResponse" - }, - "type": "array", - "title": "Quotas" - } - }, - "type": "object", - "required": [ - "quotas" - ], - "title": "QuotasReadResponse", - "description": "GET response payload for multiple quota reads." - }, - "QuotasUpdateRequest": { - "properties": { - "quotas": { - "items": { - "$ref": "#/components/schemas/QuotaUpdateRequest" - }, - "type": "array", - "title": "Quotas" - } - }, - "type": "object", - "required": [ - "quotas" - ], - "title": "QuotasUpdateRequest", - "description": "PATCH request payload for quota updates." - }, - "QuotasUpdateResponse": { - "properties": { - "updated_quotas": { - "items": { - "$ref": "#/components/schemas/QuotaUpdateResponse" - }, - "type": "array", - "title": "Updated Quotas" - } - }, - "type": "object", - "required": [ - "updated_quotas" - ], - "title": "QuotasUpdateResponse", - "description": "PATCH response payload for quota updates." - }, "RunCreationRequest": { "properties": { "application_version": { @@ -2946,37 +1707,6 @@ ], "title": "TransferUrls" }, - "UserCreationRequest": { - "properties": { - "user_id": { - "type": "string", - "title": "User Id" - }, - "organization_id": { - "type": "string", - "format": "uuid", - "title": "Organization Id" - }, - "email": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Email" - } - }, - "type": "object", - "required": [ - "user_id", - "organization_id", - "email" - ], - "title": "UserCreationRequest" - }, "UserPayload": { "properties": { "application_id": { @@ -3020,96 +1750,6 @@ ], "title": "UserPayload" }, - "UserQuota": { - "properties": { - "total": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Total" - }, - "used": { - "type": "integer", - "title": "Used" - } - }, - "type": "object", - "required": [ - "total", - "used" - ], - "title": "UserQuota" - }, - "UserResponse": { - "properties": { - "user_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "User Id" - }, - "organization_id": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "Organization Id" - }, - "slide_quota": { - "$ref": "#/components/schemas/UserQuota" - } - }, - "type": "object", - "required": [ - "user_id", - "organization_id", - "slide_quota" - ], - "title": "UserResponse" - }, - "UserUpdateRequest": { - "properties": { - "user_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "User Id" - }, - "slide_quota": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Slide Quota" - } - }, - "type": "object", - "title": "UserUpdateRequest" - }, "ValidationError": { "properties": { "loc": { @@ -3267,40 +1907,6 @@ ], "title": "VersionReadResponse" } - }, - "securitySchemes": { - "OAuth2AuthorizationCodeBearer": { - "type": "oauth2", - "flows": { - "authorizationCode": { - "scopes": {}, - "authorizationUrl": "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize", - "tokenUrl": "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" - } - } - } - } - }, - "tags": [ - { - "name": "Externals", - "description": "Called by externals to interact with our API" - }, - { - "name": "Algorithms/Apps", - "description": "Called by the Algorithms and applications to update statuses" - }, - { - "name": "Scheduler", - "description": "Called by the Scheduler" - }, - { - "name": "Admins", - "description": "Called by Admins to manage and register entities" - }, - { - "name": "Infrastructure", - "description": "Called by other Infra" } - ] + } } diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index f1a167fb..b5123666 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -1,41 +1,5 @@ components: schemas: - ApplicationCreationRequest: - properties: - description: - examples: - - 'H&E Tumor Micro Environment Analysis: Performing tissue QC, segmentation, - cell detection and cell classfication' - title: Description - type: string - name: - examples: - - HETA - title: Name - type: string - regulatory_classes: - examples: - - - RuO - items: - type: string - title: Regulatory Classes - type: array - required: - - name - - description - - regulatory_classes - title: ApplicationCreationRequest - type: object - ApplicationCreationResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - required: - - application_id - title: ApplicationCreationResponse - type: object ApplicationReadResponse: properties: application_id: @@ -132,29 +96,6 @@ components: - output_artifacts title: ApplicationVersionReadResponse type: object - ArtifactEvent: - description: 'This is a subset of the OutputArtifactEvent used by the state - machine. - - Only the variants defined below are allowed to be submitted from the Algorithms/Applications.' - enum: - - succeeded - - failed_with_user_error - - failed_with_system_error - title: ArtifactEvent - type: string - ArtifactStatus: - enum: - - pending - - canceled_user - - canceled_system - - error_user - - error_system_fatal - - error_system_recoverable - - skipped - - succeeded - title: ArtifactStatus - type: string HTTPValidationError: properties: detail: @@ -172,7 +113,7 @@ components: mime_type: examples: - image/tiff - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ title: Mime Type type: string name: @@ -222,7 +163,7 @@ components: mime_type: examples: - image/tiff - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ title: Mime Type type: string name: @@ -270,66 +211,6 @@ components: - input_artifacts title: ItemCreationRequest type: object - ItemEvent: - enum: - - failed_with_system_error - - failed_recoverable - title: ItemEvent - type: string - ItemEventCreationRequest: - properties: - error: - title: Error - type: string - event: - $ref: '#/components/schemas/ItemEvent' - required: - - event - - error - title: ItemEventCreationRequest - type: object - ItemEventCreationResponse: - properties: - item_id: - format: uuid - title: Item Id - type: string - status: - $ref: '#/components/schemas/ItemStatus' - required: - - item_id - - status - title: ItemEventCreationResponse - type: object - ItemReadResponse: - properties: - application_run_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Run Id - error: - anyOf: - - type: string - - type: 'null' - title: Error - item_id: - format: uuid - title: Item Id - type: string - reference: - title: Reference - type: string - status: - $ref: '#/components/schemas/ItemStatus' - required: - - item_id - - reference - - status - - error - title: ItemReadResponse - type: object ItemResultReadResponse: properties: application_run_id: @@ -374,77 +255,6 @@ components: - succeeded title: ItemStatus type: string - OrganizationCreationRequest: - properties: - batch_size: - title: Batch Size - type: integer - organization_id: - title: Organization Id - type: string - owner_email: - title: Owner Email - type: string - slide_quota: - title: Slide Quota - type: integer - required: - - organization_id - - owner_email - - slide_quota - - batch_size - title: OrganizationCreationRequest - type: object - OrganizationQuota: - properties: - total: - anyOf: - - type: integer - - type: 'null' - title: Total - used: - title: Used - type: integer - required: - - total - - used - title: OrganizationQuota - type: object - OrganizationResponse: - properties: - batch_size: - title: Batch Size - type: integer - organization_id: - title: Organization Id - type: string - owner_id: - format: uuid - title: Owner Id - type: string - slide_quota: - $ref: '#/components/schemas/OrganizationQuota' - required: - - organization_id - - owner_id - - slide_quota - - batch_size - title: OrganizationResponse - type: object - OrganizationUpdateRequest: - properties: - batch_size: - anyOf: - - type: integer - - type: 'null' - title: Batch Size - slide_quota: - anyOf: - - type: integer - - type: 'null' - title: Slide Quota - title: OrganizationUpdateRequest - type: object OutputArtifact: properties: metadata_schema: @@ -453,7 +263,7 @@ components: mime_type: examples: - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ title: Mime Type type: string name: @@ -471,36 +281,6 @@ components: - visibility title: OutputArtifact type: object - OutputArtifactEventTriggerRequest: - properties: - error: - anyOf: - - type: string - - type: 'null' - title: Error - event: - $ref: '#/components/schemas/ArtifactEvent' - metadata: - title: Metadata - type: object - required: - - event - - metadata - title: OutputArtifactEventTriggerRequest - type: object - OutputArtifactEventTriggerResponse: - properties: - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - status: - $ref: '#/components/schemas/ArtifactStatus' - required: - - output_artifact_id - - status - title: OutputArtifactEventTriggerResponse - type: object OutputArtifactReadResponse: properties: metadata_schema: @@ -509,7 +289,7 @@ components: mime_type: examples: - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ title: Mime Type type: string name: @@ -540,7 +320,7 @@ components: mime_type: examples: - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ title: Mime Type type: string name: @@ -610,7 +390,6 @@ components: title: Metadata type: object required: - - input_artifact_id - metadata - download_url title: PayloadInputArtifact @@ -653,96 +432,6 @@ components: - metadata title: PayloadOutputArtifact type: object - QuotaName: - description: Global, API-level, and slide-level quotas for Samia API. - enum: - - max_users - - max_organizations - - max_users_per_organization - - max_applications - - max_application_versions - - max_slides_per_run - - max_parallel_runs - - max_parallel_runs_per_organization - - max_parallel_runs_per_user - title: QuotaName - type: string - QuotaReadResponse: - description: GET response payload for quota read. - properties: - name: - $ref: '#/components/schemas/QuotaName' - quota: - title: Quota - type: integer - required: - - name - - quota - title: QuotaReadResponse - type: object - QuotaUpdateRequest: - description: PATCH request payload for quota update. - properties: - name: - $ref: '#/components/schemas/QuotaName' - quota: - exclusiveMinimum: 0.0 - title: Quota - type: integer - required: - - name - - quota - title: QuotaUpdateRequest - type: object - QuotaUpdateResponse: - description: PATCH response payload for quota update. - properties: - name: - $ref: '#/components/schemas/QuotaName' - quota: - title: Quota - type: integer - required: - - name - - quota - title: QuotaUpdateResponse - type: object - QuotasReadResponse: - description: GET response payload for multiple quota reads. - properties: - quotas: - items: - $ref: '#/components/schemas/QuotaReadResponse' - title: Quotas - type: array - required: - - quotas - title: QuotasReadResponse - type: object - QuotasUpdateRequest: - description: PATCH request payload for quota updates. - properties: - quotas: - items: - $ref: '#/components/schemas/QuotaUpdateRequest' - title: Quotas - type: array - required: - - quotas - title: QuotasUpdateRequest - type: object - QuotasUpdateResponse: - description: PATCH response payload for quota updates. - properties: - updated_quotas: - items: - $ref: '#/components/schemas/QuotaUpdateResponse' - title: Updated Quotas - type: array - required: - - updated_quotas - title: QuotasUpdateResponse - type: object RunCreationRequest: properties: application_version: @@ -839,26 +528,6 @@ components: - download_url title: TransferUrls type: object - UserCreationRequest: - properties: - email: - anyOf: - - type: string - - type: 'null' - title: Email - organization_id: - format: uuid - title: Organization Id - type: string - user_id: - title: User Id - type: string - required: - - user_id - - organization_id - - email - title: UserCreationRequest - type: object UserPayload: properties: application_id: @@ -888,56 +557,6 @@ components: - items title: UserPayload type: object - UserQuota: - properties: - total: - anyOf: - - type: integer - - type: 'null' - title: Total - used: - title: Used - type: integer - required: - - total - - used - title: UserQuota - type: object - UserResponse: - properties: - organization_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Organization Id - slide_quota: - $ref: '#/components/schemas/UserQuota' - user_id: - anyOf: - - type: string - - type: 'null' - title: User Id - required: - - user_id - - organization_id - - slide_quota - title: UserResponse - type: object - UserUpdateRequest: - properties: - slide_quota: - anyOf: - - type: integer - - type: 'null' - title: Slide Quota - user_id: - anyOf: - - type: string - - type: 'null' - title: User Id - title: UserUpdateRequest - type: object ValidationError: properties: loc: @@ -1050,40 +669,51 @@ components: - created_at title: VersionReadResponse type: object - securitySchemes: - OAuth2AuthorizationCodeBearer: - flows: - authorizationCode: - authorizationUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize - scopes: {} - tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token - type: oauth2 info: - description: Pagination is done via `page` and `page_size`. Sorting via `sort` query - parameter. sort is a comma-separated list of field names. The sorting direction - can be indicated via `+` (ascending) or `-` (descending) (e.g. `/applications?sort=+name)`. - summary: Interact with Aignostics' Application Platform - title: Aignostics Platform API - version: 0.1.0 + title: PAPI API Reference + version: 1.0.0 openapi: 3.1.0 paths: - /docs: + /v1/applications: get: - operationId: get_documentation_docs_get + operationId: list_applications_v1_applications_get parameters: - - in: cookie - name: access_token + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort required: false schema: anyOf: - - type: string + - items: + type: string + type: array - type: 'null' - title: Access Token + title: Sort responses: '200': content: application/json: - schema: {} + schema: + items: + $ref: '#/components/schemas/ApplicationReadResponse' + title: Response List Applications V1 Applications Get + type: array description: Successful Response '422': content: @@ -1091,156 +721,13 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - summary: Get Documentation - /health: - get: - description: Check that the API application is alive and responsive. - operationId: health_health_get - responses: - '200': - content: - application/json: - schema: {} - description: Successful Response - summary: Health + summary: List Applications tags: - - Infrastructure - /liveness: + - Externals + /v1/applications/{application_id}/versions: get: - description: Check that the API application is alive and responsive. - operationId: liveness_liveness_get - responses: - '200': - content: - application/json: - schema: {} - description: Successful Response - summary: Liveness - tags: - - Infrastructure - /readiness: - get: - description: Check that the API application is ready to serve. - operationId: readiness_readiness_get - responses: - '200': - content: - application/json: - schema: {} - description: Successful Response - summary: Readiness - tags: - - Infrastructure - /v1/applications: - get: - operationId: list_applications_v1_applications_get - parameters: - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationReadResponse' - title: Response List Applications V1 Applications Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Applications - tags: - - Externals - post: - operationId: register_application_v1_applications_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationCreationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Register Application - tags: - - Admins - /v1/applications/{application_id}: - get: - operationId: read_application_by_id_v1_applications__application_id__get - parameters: - - in: path - name: application_id - required: true - schema: - format: uuid - title: Application Id - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Read Application By Id - tags: - - Externals - /v1/applications/{application_id}/versions: - get: - operationId: list_versions_by_application_id_v1_applications__application_id__versions_get + operationId: +list_versions_by_application_id_v1_applications__application_id__versions_get parameters: - in: path name: application_id @@ -1303,7 +790,8 @@ paths: schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications Application + title: Response List Versions By Application Id V1 Applications +Application Id Versions Get type: array description: Successful Response @@ -1313,14 +801,13 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] summary: List Versions By Application Id tags: - Externals /v1/applications/{application_slug}: get: - operationId: read_application_by_slug_v1_applications__application_slug__get + operationId: +read_application_by_slug_v1_applications__application_slug__get parameters: - in: path name: application_slug @@ -1341,14 +828,14 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] summary: Read Application By Slug tags: - Externals /v1/applications/{application_slug}/versions: get: - operationId: list_versions_by_application_slug_v1_applications__application_slug__versions_get + operationId: +list_versions_by_application_slug_v1_applications__application_slug__versions_ge +t parameters: - in: path name: application_slug @@ -1411,7 +898,8 @@ paths: schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 Applications Application + title: Response List Versions By Application Slug V1 +Applications Application Slug Versions Get type: array description: Successful Response @@ -1421,240 +909,9 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] summary: List Versions By Application Slug tags: - Externals - /v1/artifacts/{output_artifact_id}/event: - post: - operationId: trigger_artifact_event_v1_artifacts__output_artifact_id__event_post - parameters: - - in: path - name: output_artifact_id - required: true - schema: - format: uuid - title: Output Artifact Id - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/OutputArtifactEventTriggerRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/OutputArtifactEventTriggerResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Trigger Artifact Event - tags: - - Algorithms/Apps - /v1/items/{item_id}: - get: - operationId: get_item_v1_items__item_id__get - parameters: - - in: path - name: item_id - required: true - schema: - format: uuid - title: Item Id - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ItemReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get Item - tags: - - Scheduler - /v1/items/{item_id}/event: - post: - operationId: register_item_event_v1_items__item_id__event_post - parameters: - - in: path - name: item_id - required: true - schema: - format: uuid - title: Item Id - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ItemEventCreationRequest' - required: true - responses: - '202': - content: - application/json: - schema: - $ref: '#/components/schemas/ItemEventCreationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Register Item Event - tags: - - Scheduler - /v1/organizations: - post: - operationId: create_organization_v1_organizations_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Create Organization - tags: - - Organizations - /v1/organizations/{organization_id}: - get: - operationId: get_organization_v1_organizations__organization_id__get - parameters: - - in: path - name: organization_id - required: true - schema: - format: uuid - title: Organization Id - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get Organization - tags: - - Organizations - patch: - operationId: update_organization_v1_organizations__organization_id__patch - parameters: - - in: path - name: organization_id - required: true - schema: - title: Organization Id - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationUpdateRequest' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/OrganizationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Update Organization - tags: - - Organizations - /v1/quotas: - get: - operationId: list_quotas_v1_quotas_get - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/QuotasReadResponse' - description: Successful Response - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Quotas - tags: - - Admins - - Admins - patch: - operationId: update_quotas_v1_quotas_patch - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/QuotasUpdateRequest' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/QuotasUpdateResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Update Quotas - tags: - - Admins - - Admins /v1/runs: get: operationId: list_application_runs_v1_runs_get @@ -1734,8 +991,6 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] summary: List Application Runs tags: - Externals @@ -1762,8 +1017,6 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] summary: Create Application Run tags: - Externals @@ -1805,12 +1058,9 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] summary: Get Run tags: - Externals - - Scheduler /v1/runs/{application_run_id}/cancel: post: operationId: cancel_run_v1_runs__application_run_id__cancel_post @@ -1836,14 +1086,13 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] summary: Cancel Run tags: - Externals /v1/runs/{application_run_id}/results: delete: - operationId: delete_run_results_v1_runs__application_run_id__results_delete + operationId: +delete_run_results_v1_runs__application_run_id__results_delete parameters: - in: path name: application_run_id @@ -1863,8 +1112,6 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] summary: Delete Run Results tags: - Externals @@ -1943,7 +1190,8 @@ paths: schema: items: $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id Results + title: Response List Run Results V1 Runs Application Run Id +Results Get type: array description: Successful Response @@ -1955,107 +1203,9 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] summary: List Run Results tags: - Externals - /v1/users/: - post: - operationId: create_user_v1_users__post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserCreationRequest' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/UserResponse' - description: Successful Response - '404': - description: User not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Create User - tags: - - Externals - /v1/users/{user_id}: - get: - operationId: get_user_v1_users__user_id__get - parameters: - - in: path - name: user_id - required: true - schema: - format: uuid - title: User Id - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/UserResponse' - description: Successful Response - '404': - description: User not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get User - tags: - - Externals - patch: - operationId: update_user_v1_users__user_id__patch - parameters: - - in: path - name: user_id - required: true - schema: - format: uuid - title: User Id - type: string - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UserUpdateRequest' - required: true - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/UserResponse' - description: Successful Response - '404': - description: User not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Update User - tags: - - Externals /v1/versions: post: operationId: register_version_v1_versions_post @@ -2078,13 +1228,9 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] summary: Register Version tags: - Externals - - Scheduler - - Admins /v1/versions/{application_version_id}: get: operationId: get_version_v1_versions__application_version_id__get @@ -2121,20 +1267,8 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] summary: Get Version tags: - Externals - - Scheduler -tags: -- description: Called by externals to interact with our API - name: Externals -- description: Called by the Algorithms and applications to update statuses - name: Algorithms/Apps -- description: Called by the Scheduler - name: Scheduler -- description: Called by Admins to manage and register entities - name: Admins -- description: Called by other Infra - name: Infrastructure +servers: +- url: '' From d09c4fc8e5dbdc314c76f34d98308dc2f8db67a1 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 17:22:07 +0200 Subject: [PATCH 053/110] fix(security): dont't expose refresh token to 3rd party actions --- .github/workflows/test-and-report.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 79b3ce50..9df2bacc 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -6,10 +6,7 @@ on: - "**" pull_request: branches: [main] - -env: - AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} - + jobs: test: runs-on: ubuntu-latest @@ -73,6 +70,8 @@ jobs: echo "AIGNOSTICS_ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV - name: Smoke tests + env: + AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} run: | uv run --no-dev aignostics platform health uv run --no-dev aignostics platform authentication-settings @@ -84,6 +83,8 @@ jobs: run: make audit - name: Test + env: + AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} run: make test - name: Upload test results From c366d149b2ab138c1a19f1363c0784bd2f2a14eb Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 17:23:18 +0200 Subject: [PATCH 054/110] chore(sonarqube): don't check codegen --- sonar-project.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sonar-project.properties b/sonar-project.properties index 110ab1b9..6ccf0488 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -8,6 +8,6 @@ sonar.links.ci=https://github.com/aignostics/python-sdk/actions sonar.links.issues=https://github.com/aignostics/python-sdk/issues sonar.python.coverage.reportPaths=reports/coverage.xml sonar.python.version=3.11, 3.12, 3.13 -sonar.coverage.exclusions=noxfile.py, tests/**, examples/**, docs/** -sonar.exclusions=examples/**, docs/** +sonar.coverage.exclusions=noxfile.py, tests/**, examples/**, docs/**, codegen/** +sonar.exclusions=examples/**, docs/**, codegen/** sonar.cpd.exclusions=noxfile.py From 82ee17b7f2525edd1ae1f883119f4098355c0899 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 18:56:27 +0200 Subject: [PATCH 055/110] refactor(settings): now in _settings, computing defaults from api_root; added a few modules to Lib Reference --- .github/workflows/test-and-report.yml | 11 +- .github/workflows/test-scheduled.yml | 6 +- API_REFERENCE_v1.md | 4025 +++++++++++++++------- CLI_REFERENCE.md | 15 - docs/source/_static/openapi_v1.yaml | 22 +- docs/source/lib_reference.rst | 6 + src/aignostics/cli.py | 7 - src/aignostics/client/__init__.py | 5 +- src/aignostics/client/_authentication.py | 81 +- src/aignostics/client/_client.py | 2 +- src/aignostics/client/_messages.py | 5 + src/aignostics/client/_settings.py | 98 + src/aignostics/client/messages.py | 3 - src/aignostics/platform.py | 12 +- 14 files changed, 2872 insertions(+), 1426 deletions(-) create mode 100644 src/aignostics/client/_messages.py create mode 100644 src/aignostics/client/_settings.py delete mode 100644 src/aignostics/client/messages.py diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index 9df2bacc..d9d1fd42 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -59,18 +59,18 @@ jobs: exit 1 fi - - name: Set up cloud credentials & environment file + - name: Set up cloud credentials env: CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} - DEV_ENV_FILE: ${{ secrets.DEV_ENV_FILE }} run: | echo "$CREDENTIALS" | base64 -d > credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV - echo "$DEV_ENV_FILE" | base64 -d > dev.env - echo "AIGNOSTICS_ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV - name: Smoke tests env: + AIGNOSTICS_API_ROOT: https://platform-dev.aignostics.com + AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_DEVICE_ID }} + AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} run: | uv run --no-dev aignostics platform health @@ -84,6 +84,9 @@ jobs: - name: Test env: + AIGNOSTICS_API_ROOT: https://platform-dev.aignostics.com + AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_DEVICE_ID }} + AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} run: make test diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index 42aa4191..117329ab 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -29,14 +29,14 @@ jobs: - name: Set up cloud credentials & environment file env: CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} - DEV_ENV_FILE: ${{ secrets.DEV_ENV_FILE }} run: | echo "$CREDENTIALS" | base64 -d > credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV - echo "$DEV_ENV_FILE" | base64 -d > dev.env - echo "AIGNOSTICS_ENV_FILE=$(pwd)/dev.env" >> $GITHUB_ENV - name: Run tests marked as scheduled env: + AIGNOSTICS_API_ROOT: https://platform-dev.aignostics.com + AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_DEVICE_ID }} + AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} run: make test_scheduled diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md index 8f513915..42cc5470 100644 --- a/API_REFERENCE_v1.md +++ b/API_REFERENCE_v1.md @@ -1,1304 +1,2723 @@ # API v1 Reference ---- -title: - url: '' -language_tabs: -toc_footers: [] -includes: [] -search: true -highlight_theme: darkula ---- - - - - - - - - - - - - - Aignostics H&E TME application - title: Description - type: string - name: - examples: - - HETA - title: Name - type: string - regulatory_classes: - examples: - - - RuO - items: - type: string - title: Regulatory Classes - type: array - slug: - examples: - - heta - title: Slug - type: string - required: - - application_id - - name - - slug - - regulatory_classes - - description - title: ApplicationReadResponse - type: object - ApplicationRunStatus: - enum: - - canceled_system - - canceled_user - - completed - - completed_with_error - - received - - rejected - - running - - scheduled - title: ApplicationRunStatus - type: string - ApplicationVersionReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - application_version_slug: - examples: - - tissue-segmentation-qc:v0.0.1 - pattern: ^(?:|-)*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ - title: Application Version Slug - type: string - changelog: - title: Changelog - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Flow Id - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactReadResponse' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactReadResponse' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - application_version_id - - application_version_slug - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - title: ApplicationVersionReadResponse - type: object - HTTPValidationError: - properties: - detail: - items: - $ref: '#/components/schemas/ValidationError' - title: Detail - type: array - title: HTTPValidationError - type: object - InputArtifact: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifact - type: object - InputArtifactCreationRequest: - properties: - download_url: - examples: - - https://example.com/case-no-1-slide.tiff - format: uri - maxLength: 2083 - minLength: 1 - title: Download Url - type: string - metadata: - examples: - - checksum_crc32c: 752f9554 - height: 2000 - height_mpp: 0.5 - width: 10000 - width_mpp: 0.5 - title: Metadata - type: object - name: - examples: - - slide - title: Name - type: string - required: - - name - - download_url - - metadata - title: InputArtifactCreationRequest - type: object - InputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactReadResponse - type: object - InputArtifactSchemaCreationRequest: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactSchemaCreationRequest - type: object - ItemCreationRequest: - properties: - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactCreationRequest' - title: Input Artifacts - type: array - reference: - examples: - - case-no-1 - title: Reference - type: string - required: - - reference - - input_artifacts - title: ItemCreationRequest - type: object - ItemResultReadResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - error: - anyOf: - - type: string - - type: 'null' - title: Error - item_id: - format: uuid - title: Item Id - type: string - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactResultReadResponse' - title: Output Artifacts - type: array - reference: - title: Reference - type: string - status: - $ref: '#/components/schemas/ItemStatus' - required: - - item_id - - application_run_id - - reference - - status - - error - - output_artifacts - title: ItemResultReadResponse - type: object - ItemStatus: - enum: - - pending - - canceled_user - - canceled_system - - error_user - - error_system - - succeeded - title: ItemStatus - type: string - OutputArtifact: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - visibility: - $ref: '#/components/schemas/OutputArtifactVisibility' - required: - - name - - mime_type - - metadata_schema - - scope - - visibility - title: OutputArtifact - type: object - OutputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - required: - - name - - mime_type - - metadata_schema - - scope - title: OutputArtifactReadResponse - type: object - OutputArtifactResultReadResponse: - properties: - download_url: - anyOf: - - format: uri - maxLength: 2083 - minLength: 1 - type: string - - type: 'null' - title: Download Url - metadata: - title: Metadata - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - name - - mime_type - - metadata - - download_url - title: OutputArtifactResultReadResponse - type: object - OutputArtifactSchemaCreationRequest: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - visibility: - $ref: '#/components/schemas/OutputArtifactVisibility' - required: - - name - - mime_type - - scope - - visibility - - metadata_schema - title: OutputArtifactSchemaCreationRequest - type: object - OutputArtifactScope: - enum: - - item - - global - title: OutputArtifactScope - type: string - OutputArtifactVisibility: - enum: - - internal - - external - title: OutputArtifactVisibility - type: string - PayloadInputArtifact: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - input_artifact_id: - format: uuid - title: Input Artifact Id - type: string - metadata: - title: Metadata - type: object - required: - - metadata - - download_url - title: PayloadInputArtifact - type: object - PayloadItem: - properties: - input_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadInputArtifact' - title: Input Artifacts - type: object - item_id: - format: uuid - title: Item Id - type: string - output_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - title: Output Artifacts - type: object - required: - - item_id - - input_artifacts - - output_artifacts - title: PayloadItem - type: object - PayloadOutputArtifact: - properties: - data: - $ref: '#/components/schemas/TransferUrls' - metadata: - $ref: '#/components/schemas/TransferUrls' - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - data - - metadata - title: PayloadOutputArtifact - type: object - RunCreationRequest: - properties: - application_version: - anyOf: - - format: uuid - type: string - - $ref: '#/components/schemas/SlugVersionRequest' - examples: - - efbf9822-a1e5-4045-a283-dbf26e8064a9 - title: Application Version - items: - items: - $ref: '#/components/schemas/ItemCreationRequest' - title: Items - type: array - required: - - application_version - - items - title: RunCreationRequest - type: object - RunCreationResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - required: - - application_run_id - title: RunCreationResponse - type: object - RunReadResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - organization_id: - title: Organization Id - type: string - status: - $ref: '#/components/schemas/ApplicationRunStatus' - triggered_at: - format: date-time - title: Triggered At - type: string - triggered_by: - title: Triggered By - type: string - user_payload: - anyOf: - - $ref: '#/components/schemas/UserPayload' - - type: 'null' - required: - - application_run_id - - application_version_id - - organization_id - - status - - triggered_at - - triggered_by - title: RunReadResponse - type: object - SlugVersionRequest: - properties: - application_slug: - pattern: ^(-?)*$ - title: Application Slug - type: string - version: - title: Version - type: string - required: - - application_slug - - version - title: SlugVersionRequest - type: object - TransferUrls: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - upload_url: - format: uri - minLength: 1 - title: Upload Url - type: string - required: - - upload_url - - download_url - title: TransferUrls - type: object - UserPayload: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_run_id: - format: uuid - title: Application Run Id - type: string - global_output_artifacts: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - type: object - - type: 'null' - title: Global Output Artifacts - items: - items: - $ref: '#/components/schemas/PayloadItem' - title: Items - type: array - required: - - application_id - - application_run_id - - global_output_artifacts - - items - title: UserPayload - type: object - ValidationError: - properties: - loc: - items: - anyOf: - - type: string - - type: integer - title: Location - type: array - msg: - title: Message - type: string - type: - title: Error Type - type: string - required: - - loc - - msg - - type - title: ValidationError - type: object - VersionCreationRequest: - properties: - application_id: - format: uuid - title: Application Id - type: string - changelog: - title: Changelog - type: string - flow_id: - format: uuid - title: Flow Id - type: string - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactSchemaCreationRequest' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactSchemaCreationRequest' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - version - - application_id - - flow_id - - changelog - - input_artifacts - - output_artifacts - title: VersionCreationRequest - type: object - VersionCreationResponse: - properties: - application_version_id: - format: uuid - title: Application Version Id - type: string - required: - - application_version_id - title: VersionCreationResponse - type: object - VersionReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - changelog: - title: Changelog - type: string - created_at: - format: date-time - title: Created At - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Flow Id - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifact' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifact' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - application_version_id - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - - created_at - title: VersionReadResponse - type: object -info: - title: PAPI API Reference - version: 1.0.0 -openapi: 3.1.0 -paths: - /v1/applications: - get: - operationId: list_applications_v1_applications_get - parameters: - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationReadResponse' - title: Response List Applications V1 Applications Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Applications - tags: - - Externals - /v1/applications/{application_id}/versions: - get: - operationId: -list_versions_by_application_id_v1_applications__application_id__versions_get - parameters: - - in: path - name: application_id - required: true - schema: - format: uuid - title: Application Id - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications -Application - Id Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Versions By Application Id - tags: - - Externals - /v1/applications/{application_slug}: - get: - operationId: -read_application_by_slug_v1_applications__application_slug__get - parameters: - - in: path - name: application_slug - required: true - schema: - title: Application Slug - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Read Application By Slug - tags: - - Externals - /v1/applications/{application_slug}/versions: - get: - operationId: -list_versions_by_application_slug_v1_applications__application_slug__versions_ge -t - parameters: - - in: path - name: application_slug - required: true - schema: - pattern: ^(-?)*$ - title: Application Slug - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 -Applications Application - Slug Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Versions By Application Slug - tags: - - Externals - /v1/runs: - get: - operationId: list_application_runs_v1_runs_get - parameters: - - in: query - name: application_id - required: false - schema: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Id - - in: query - name: application_version_id - required: false - schema: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Version Id - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/RunReadResponse' - title: Response List Application Runs V1 Runs Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Application Runs - tags: - - Externals - post: - operationId: create_application_run_v1_runs_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Create Application Run - tags: - - Externals - /v1/runs/{application_run_id}: - get: - operationId: get_run_v1_runs__application_run_id__get - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/RunReadResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Get Run - tags: - - Externals - /v1/runs/{application_run_id}/cancel: - post: - operationId: cancel_run_v1_runs__application_run_id__cancel_post - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - responses: - '202': - content: - application/json: - schema: {} - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Cancel Run - tags: - - Externals - /v1/runs/{application_run_id}/results: - delete: - operationId: -delete_run_results_v1_runs__application_run_id__results_delete - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - responses: - '204': - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Delete Run Results - tags: - - Externals - get: - operationId: list_run_results_v1_runs__application_run_id__results_get - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - - in: query - name: item_id__in - required: false - schema: - anyOf: - - items: - format: uuid - type: string - type: array - - type: 'null' - title: Item Id In - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: reference__in - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Reference In - - in: query - name: status__in - required: false - schema: - anyOf: - - items: - $ref: '#/components/schemas/ItemStatus' - type: array - - type: 'null' - title: Status In - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id -Results - Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Run Results - tags: - - Externals - /v1/versions: - post: - operationId: register_version_v1_versions_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Register Version - tags: - - Externals - /v1/versions/{application_version_id}: - get: - operationId: get_version_v1_versions__application_version_id__get - parameters: - - in: path - name: application_version_id - required: true - schema: - format: uuid - title: Application Version Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/VersionReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Get Version - tags: - - Externals -servers: -- url: '' - -> components: - -> schemas: - -> ApplicationReadResponse: - -> properties: - -> application_id: - -> format: uuid - -> title: Application Id - -> type: string - -> description: - -> examples: +## PAPI API Reference v1.0.0 + +> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. + +Base URLs: + +* + +## Externals + +### list_applications_v1_applications_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/applications', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/applications', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications` + +*List Applications* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Applications V1 Applications Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Applications V1 Applications Get|[[ApplicationReadResponse](#schemaapplicationreadresponse)]|false|none|none| +|» ApplicationReadResponse|[ApplicationReadResponse](#schemaapplicationreadresponse)|false|none|none| +|»» application_id|string(uuid)|true|none|none| +|»» description|string|true|none|none| +|»» name|string|true|none|none| +|»» regulatory_classes|[string]|true|none|none| +|»» slug|string|true|none|none| + + +This operation does not require authentication + + +### list_versions_by_application_id_v1_applications__application_id__versions_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/applications/{application_id}/versions', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/applications/{application_id}/versions', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_id}/versions` + +*List Versions By Application Id* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|path|string(uuid)|true|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|version|query|any|false|none| +|include|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Versions By Application Id V1 Applications Application Id Versions Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| +|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| +|»» application_id|string(uuid)|true|none|none| +|»» application_version_id|string(uuid)|true|none|none| +|»» application_version_slug|string|true|none|none| +|»» changelog|string|true|none|none| +|»» flow_id|any|false|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string(uuid)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|»» version|string|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|scope|item| +|scope|global| + + +This operation does not require authentication + + +### read_application_by_slug_v1_applications__application_slug__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/applications/{application_slug}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/applications/{application_slug}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_slug}` + +*Read Application By Slug* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_slug|path|string|true|none| + +> Example responses + +> 200 Response + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[ApplicationReadResponse](#schemaapplicationreadresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### list_versions_by_application_slug_v1_applications__application_slug__versions_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/applications/{application_slug}/versions', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/applications/{application_slug}/versions', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_slug}/versions` + +*List Versions By Application Slug* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_slug|path|string|true|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|version|query|any|false|none| +|include|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Versions By Application Slug V1 Applications Application Slug Versions Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Versions By Application Slug V1 Applications Application Slug Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| +|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| +|»» application_id|string(uuid)|true|none|none| +|»» application_version_id|string(uuid)|true|none|none| +|»» application_version_slug|string|true|none|none| +|»» changelog|string|true|none|none| +|»» flow_id|any|false|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string(uuid)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|»» version|string|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|scope|item| +|scope|global| + + +This operation does not require authentication + + +### list_application_runs_v1_runs_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/runs', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs` + +*List Application Runs* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|query|any|false|none| +|application_version_id|query|any|false|none| +|include|query|any|false|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Application Runs V1 Runs Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Application Runs V1 Runs Get|[[RunReadResponse](#schemarunreadresponse)]|false|none|none| +|» RunReadResponse|[RunReadResponse](#schemarunreadresponse)|false|none|none| +|»» application_run_id|string(uuid)|true|none|none| +|»» application_version_id|string(uuid)|true|none|none| +|»» organization_id|string|true|none|none| +|»» status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| +|»» triggered_at|string(date-time)|true|none|none| +|»» triggered_by|string|true|none|none| +|»» user_payload|any|false|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| +|»»»» application_id|string(uuid)|true|none|none| +|»»»» application_run_id|string(uuid)|true|none|none| +|»»»» global_output_artifacts|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|object|false|none|none| +|»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| +|»»»»»»» data|[TransferUrls](#schematransferurls)|true|none|none| +|»»»»»»»» download_url|string(uri)|true|none|none| +|»»»»»»»» upload_url|string(uri)|true|none|none| +|»»»»»»» metadata|[TransferUrls](#schematransferurls)|true|none|none| +|»»»»»»» output_artifact_id|string(uuid)|true|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»» items|[[PayloadItem](#schemapayloaditem)]|true|none|none| +|»»»»» PayloadItem|[PayloadItem](#schemapayloaditem)|false|none|none| +|»»»»»» input_artifacts|object|true|none|none| +|»»»»»»» PayloadInputArtifact|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| +|»»»»»»»» download_url|string(uri)|true|none|none| +|»»»»»»»» input_artifact_id|string(uuid)|false|none|none| +|»»»»»»»» metadata|object|true|none|none| +|»»»»»» item_id|string(uuid)|true|none|none| +|»»»»»» output_artifacts|object|true|none|none| +|»»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|status|canceled_system| +|status|canceled_user| +|status|completed| +|status|completed_with_error| +|status|received| +|status|rejected| +|status|running| +|status|scheduled| + + +This operation does not require authentication + + +### create_application_run_v1_runs_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json' +} + +r = requests.post('/v1/runs', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json' +}; + +fetch('/v1/runs', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/runs` + +*Create Application Run* + +> Body parameter + +```json +{ + "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[RunCreationRequest](#schemaruncreationrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[RunCreationResponse](#schemaruncreationresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### get_run_v1_runs__application_run_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/runs/{application_run_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs/{application_run_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs/{application_run_id}` + +*Get Run* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| +|include|query|any|false|none| + +> Example responses + +> 200 Response + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[RunReadResponse](#schemarunreadresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### cancel_run_v1_runs__application_run_id__cancel_post + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.post('/v1/runs/{application_run_id}/cancel', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs/{application_run_id}/cancel', +{ + method: 'POST', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/runs/{application_run_id}/cancel` + +*Cancel Run* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| + +> Example responses + +> 202 Response + +```json +null +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + + +This operation does not require authentication + + +### delete_run_results_v1_runs__application_run_id__results_delete + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.delete('/v1/runs/{application_run_id}/results', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs/{application_run_id}/results', +{ + method: 'DELETE', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`DELETE /v1/runs/{application_run_id}/results` + +*Delete Run Results* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| + +> Example responses + +> 422 Response + +```json +{ + "detail": [ + { + "loc": [ + "string" + ], + "msg": "string", + "type": "string" + } + ] +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|Successful Response|None| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### list_run_results_v1_runs__application_run_id__results_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/runs/{application_run_id}/results', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs/{application_run_id}/results', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs/{application_run_id}/results` + +*List Run Results* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| +|item_id__in|query|any|false|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|reference__in|query|any|false|none| +|status__in|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": [ + { + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + ], + "reference": "string", + "status": "pending" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Run Results V1 Runs Application Run Id Results Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Run Results V1 Runs Application Run Id Results Get|[[ItemResultReadResponse](#schemaitemresultreadresponse)]|false|none|none| +|» ItemResultReadResponse|[ItemResultReadResponse](#schemaitemresultreadresponse)|false|none|none| +|»» application_run_id|string(uuid)|true|none|none| +|»» error|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» item_id|string(uuid)|true|none|none| +|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| +|»»» OutputArtifactResultReadResponse|[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)|false|none|none| +|»»»» download_url|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|string(uri)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»» metadata|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» output_artifact_id|string(uuid)|true|none|none| +|»» reference|string|true|none|none| +|»» status|[ItemStatus](#schemaitemstatus)|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|status|pending| +|status|canceled_user| +|status|canceled_system| +|status|error_user| +|status|error_system| +|status|succeeded| + + +This operation does not require authentication + + +### register_version_v1_versions_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json' +} + +r = requests.post('/v1/versions', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json' +}; + +fetch('/v1/versions', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/versions` + +*Register Version* + +> Body parameter + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[VersionCreationRequest](#schemaversioncreationrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[VersionCreationResponse](#schemaversioncreationresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### get_version_v1_versions__application_version_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/versions/{application_version_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/versions/{application_version_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/versions/{application_version_id}` + +*Get Version* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_version_id|path|string(uuid)|true|none| +|include|query|any|false|none| + +> Example responses + +> 200 Response + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "changelog": "string", + "created_at": "2019-08-24T14:15:22Z", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[VersionReadResponse](#schemaversionreadresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +## Schemas + +### ApplicationReadResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" +} + +``` + +ApplicationReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|description|string|true|none|none| +|name|string|true|none|none| +|regulatory_classes|[string]|true|none|none| +|slug|string|true|none|none| + +### ApplicationRunStatus + + + + + + +```json +"canceled_system" + +``` + +ApplicationRunStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ApplicationRunStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ApplicationRunStatus|canceled_system| +|ApplicationRunStatus|canceled_user| +|ApplicationRunStatus|completed| +|ApplicationRunStatus|completed_with_error| +|ApplicationRunStatus|received| +|ApplicationRunStatus|rejected| +|ApplicationRunStatus|running| +|ApplicationRunStatus|scheduled| + +### ApplicationVersionReadResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" +} + +``` + +ApplicationVersionReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|application_version_id|string(uuid)|true|none|none| +|application_version_slug|string|true|none|none| +|changelog|string|true|none|none| +|flow_id|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|version|string|true|none|none| + +### HTTPValidationError + + + + + + +```json +{ + "detail": [ + { + "loc": [ + "string" + ], + "msg": "string", + "type": "string" + } + ] +} + +``` + +HTTPValidationError + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|detail|[[ValidationError](#schemavalidationerror)]|false|none|none| + +### InputArtifact + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" +} + +``` + +InputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### InputArtifactCreationRequest + + + + + + +```json +{ + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" +} + +``` + +InputArtifactCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|metadata|object|true|none|none| +|name|string|true|none|none| + +### InputArtifactReadResponse + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" +} + +``` + +InputArtifactReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### InputArtifactSchemaCreationRequest + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" +} + +``` + +InputArtifactSchemaCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### ItemCreationRequest + + + + + + +```json +{ + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" +} + +``` + +ItemCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|none| +|reference|string|true|none|none| + +### ItemResultReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": [ + { + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + ], + "reference": "string", + "status": "pending" +} + +``` + +ItemResultReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|none| +|error|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|item_id|string(uuid)|true|none|none| +|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| +|reference|string|true|none|none| +|status|[ItemStatus](#schemaitemstatus)|true|none|none| + +### ItemStatus + + + + + + +```json +"pending" + +``` + +ItemStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ItemStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ItemStatus|pending| +|ItemStatus|canceled_user| +|ItemStatus|canceled_system| +|ItemStatus|error_user| +|ItemStatus|error_system| +|ItemStatus|succeeded| + +### OutputArtifact + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" +} + +``` + +OutputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| + +### OutputArtifactReadResponse + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" +} + +``` + +OutputArtifactReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| + +### OutputArtifactResultReadResponse + + + + + + +```json +{ + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" +} + +``` + +OutputArtifactResultReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uri)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|output_artifact_id|string(uuid)|true|none|none| + +### OutputArtifactSchemaCreationRequest + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" +} + +``` + +OutputArtifactSchemaCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| + +### OutputArtifactScope + + + + + + +```json +"item" + +``` + +OutputArtifactScope + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|OutputArtifactScope|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|OutputArtifactScope|item| +|OutputArtifactScope|global| + +### OutputArtifactVisibility + + + + + + +```json +"internal" + +``` + +OutputArtifactVisibility + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|OutputArtifactVisibility|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|OutputArtifactVisibility|internal| +|OutputArtifactVisibility|external| + +### PayloadInputArtifact + + + + + + +```json +{ + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} +} + +``` + +PayloadInputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|input_artifact_id|string(uuid)|false|none|none| +|metadata|object|true|none|none| + +### PayloadItem + + + + + + +```json +{ + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } +} + +``` + +PayloadItem + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|object|true|none|none| +|» **additionalProperties**|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| +|item_id|string(uuid)|true|none|none| +|output_artifacts|object|true|none|none| +|» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +### PayloadOutputArtifact + + + + + + +```json +{ + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" +} + +``` + +PayloadOutputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|data|[TransferUrls](#schematransferurls)|true|none|none| +|metadata|[TransferUrls](#schematransferurls)|true|none|none| +|output_artifact_id|string(uuid)|true|none|none| + +### RunCreationRequest + + + + + + +```json +{ + "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +} + +``` + +RunCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_version|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|[SlugVersionRequest](#schemaslugversionrequest)|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|none| + +### RunCreationResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" +} + +``` + +RunCreationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|none| + +### RunReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } +} + +``` + +RunReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|none| +|application_version_id|string(uuid)|true|none|none| +|organization_id|string|true|none|none| +|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| +|triggered_at|string(date-time)|true|none|none| +|triggered_by|string|true|none|none| +|user_payload|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +### SlugVersionRequest + + + + + + +```json +{ + "application_slug": "string", + "version": "string" +} + +``` + +SlugVersionRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_slug|string|true|none|none| +|version|string|true|none|none| + +### TransferUrls + + + + + + +```json +{ + "download_url": "http://example.com", + "upload_url": "http://example.com" +} + +``` + +TransferUrls + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|upload_url|string(uri)|true|none|none| + +### UserPayload + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] +} + +``` + +UserPayload + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|application_run_id|string(uuid)|true|none|none| +|global_output_artifacts|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|object|false|none|none| +|»» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|items|[[PayloadItem](#schemapayloaditem)]|true|none|none| + +### ValidationError + + + + + + +```json +{ + "loc": [ + "string" + ], + "msg": "string", + "type": "string" +} + +``` + +ValidationError + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|loc|[anyOf]|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|integer|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|msg|string|true|none|none| +|type|string|true|none|none| + +### VersionCreationRequest + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} + +``` + +VersionCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|changelog|string|true|none|none| +|flow_id|string(uuid)|true|none|none| +|input_artifacts|[[InputArtifactSchemaCreationRequest](#schemainputartifactschemacreationrequest)]|true|none|none| +|output_artifacts|[[OutputArtifactSchemaCreationRequest](#schemaoutputartifactschemacreationrequest)]|true|none|none| +|version|string|true|none|none| + +### VersionCreationResponse + + + + + + +```json +{ + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" +} + +``` + +VersionCreationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_version_id|string(uuid)|true|none|none| + +### VersionReadResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "changelog": "string", + "created_at": "2019-08-24T14:15:22Z", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} + +``` + +VersionReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|application_version_id|string(uuid)|true|none|none| +|changelog|string|true|none|none| +|created_at|string(date-time)|true|none|none| +|flow_id|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifact](#schemainputartifact)]|true|none|none| +|output_artifacts|[[OutputArtifact](#schemaoutputartifact)]|true|none|none| +|version|string|true|none|none| diff --git a/CLI_REFERENCE.md b/CLI_REFERENCE.md index 1490fbe9..46f26567 100644 --- a/CLI_REFERENCE.md +++ b/CLI_REFERENCE.md @@ -40,7 +40,6 @@ $ aignostics platform [OPTIONS] COMMAND [ARGS]... * `install`: Complete and validate installation of the... * `health`: Indicate if aignostics platform is healthy. * `info`: Print info about service configuration. -* `authentication-settings`: Print info about service configuration. * `openapi`: Dump the OpenAPI specification of to stdout. * `bucket`: Transfer bucket provide by platform @@ -89,20 +88,6 @@ $ aignostics platform info [OPTIONS] * `--filter-secrets / --no-filter-secrets`: Filter out secret values from environment variables [default: filter-secrets] * `--help`: Show this message and exit. -### `aignostics platform authentication-settings` - -Print info about service configuration. - -**Usage**: - -```console -$ aignostics platform authentication-settings [OPTIONS] -``` - -**Options**: - -* `--help`: Show this message and exit. - ### `aignostics platform openapi` Dump the OpenAPI specification of to stdout. diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index b5123666..ef48f11f 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -726,8 +726,7 @@ paths: - Externals /v1/applications/{application_id}/versions: get: - operationId: -list_versions_by_application_id_v1_applications__application_id__versions_get + operationId: list_versions_by_application_id_v1_applications__application_id__versions_get parameters: - in: path name: application_id @@ -790,8 +789,7 @@ list_versions_by_application_id_v1_applications__application_id__versions_get schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications -Application + title: Response List Versions By Application Id V1 Applications Application Id Versions Get type: array description: Successful Response @@ -806,8 +804,7 @@ Application - Externals /v1/applications/{application_slug}: get: - operationId: -read_application_by_slug_v1_applications__application_slug__get + operationId: read_application_by_slug_v1_applications__application_slug__get parameters: - in: path name: application_slug @@ -833,9 +830,7 @@ read_application_by_slug_v1_applications__application_slug__get - Externals /v1/applications/{application_slug}/versions: get: - operationId: -list_versions_by_application_slug_v1_applications__application_slug__versions_ge -t + operationId: list_versions_by_application_slug_v1_applications__application_slug__versions_get parameters: - in: path name: application_slug @@ -898,8 +893,7 @@ t schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 -Applications Application + title: Response List Versions By Application Slug V1 Applications Application Slug Versions Get type: array description: Successful Response @@ -1091,8 +1085,7 @@ Applications Application - Externals /v1/runs/{application_run_id}/results: delete: - operationId: -delete_run_results_v1_runs__application_run_id__results_delete + operationId: delete_run_results_v1_runs__application_run_id__results_delete parameters: - in: path name: application_run_id @@ -1190,8 +1183,7 @@ delete_run_results_v1_runs__application_run_id__results_delete schema: items: $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id -Results + title: Response List Run Results V1 Runs Application Run Id Results Get type: array description: Successful Response diff --git a/docs/source/lib_reference.rst b/docs/source/lib_reference.rst index 93185896..ff4b9dbf 100644 --- a/docs/source/lib_reference.rst +++ b/docs/source/lib_reference.rst @@ -3,3 +3,9 @@ Library Reference .. automodule:: aignostics :members: + +.. automodule:: aignostics.client + :members: + +.. automodule:: aignx.codegen.api.externals_api + :members: diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index 9515f7cc..a295aef3 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -9,7 +9,6 @@ import aignostics.client from . import APIVersion, InfoOutputFormat, OpenAPIOutputFormat, Platform, __version__ -from .client import authentication_settings as auth_settings from .utils import prepare_cli _console = Console() @@ -67,12 +66,6 @@ def info( _console.print(yaml.dump(info, default_flow_style=False), end="") -@platform_app.command("authentication-settings") -def authentication_settings() -> None: - """Print info about service configuration.""" - print(auth_settings().model_dump()) - - @platform_app.command("openapi") def openapi( api_version: Annotated[APIVersion, typer.Option(help="API Version", case_sensitive=False)] = APIVersion.V1, diff --git a/src/aignostics/client/__init__.py b/src/aignostics/client/__init__.py index 7587cf66..25bb963c 100644 --- a/src/aignostics/client/__init__.py +++ b/src/aignostics/client/__init__.py @@ -6,12 +6,13 @@ for all interactions with the Aignostics platform. """ -from aignostics.client._authentication import authentication_settings from aignostics.client._client import Client -from aignostics.client.messages import AUTHENTICATION_FAILED +from aignostics.client._messages import AUTHENTICATION_FAILED, NOT_YET_IMPLEMENTED +from aignostics.client._settings import authentication_settings __all__ = [ "AUTHENTICATION_FAILED", + "NOT_YET_IMPLEMENTED", "Client", "authentication_settings", ] diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 05aed3ab..55615177 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -1,4 +1,3 @@ -import os import time import typing as t import webbrowser @@ -8,70 +7,13 @@ from urllib import parse from urllib.parse import urlparse -import appdirs import jwt import requests -from pydantic import SecretStr, computed_field -from pydantic_settings import BaseSettings, SettingsConfigDict +from pydantic import SecretStr from requests_oauthlib import OAuth2Session -from .messages import AUTHENTICATION_FAILED - -# Constants -CLIENT_APP_NAME = "python-sdk" - -CACHE_DIR = appdirs.user_cache_dir(CLIENT_APP_NAME, "aignostics") -TOKEN_FILE = Path(CACHE_DIR) / ".token" -ENV_FILE = os.getenv("AIGNOSTICS_ENV_FILE", Path.home() / ".aignostics/env") - -AUTHORIZATION_BACKOFF_SECONDS = 3 -REQUEST_TIMEOUT_SECONDS = 30 - - -# Settings -class AuthenticationSettings(BaseSettings): - model_config = SettingsConfigDict( - env_prefix="AIGNOSTICS_", env_file=ENV_FILE, env_file_encoding="utf-8", extra="ignore" - ) - - api_root: str - client_id_device: SecretStr - client_id_interactive: SecretStr - scope: str - redirect_uri: str - audience: str - authorization_base_url: str - token_url: str - device_url: str - jws_json_url: str - refresh_token: SecretStr | None = None - - @computed_field # type: ignore[prop-decorator] - @property - def scope_elements(self) -> list[str]: - if not self.scope: - return [] - return [element.strip() for element in self.scope.split(",")] - - -__cached_authentication_settings: AuthenticationSettings | None = None - - -def authentication_settings() -> AuthenticationSettings: - """Lazy load authentication settings from the environment or a file. - - * Given we use Pydantic Settings, validation is done automatically. - * We only load and validate if we actually need the settings, - thereby not killing the client on other actions. - * If the settings have already been loaded, return the cached instance. - - Returns: - AuthenticationSettings: The loaded authentication settings. - """ - global __cached_authentication_settings # noqa: PLW0603 - if __cached_authentication_settings is None: - __cached_authentication_settings = AuthenticationSettings() # pyright: ignore[reportCallIssue] - return __cached_authentication_settings +from ._messages import AUTHENTICATION_FAILED +from ._settings import authentication_settings def get_token(use_cache: bool = True) -> str: @@ -87,8 +29,8 @@ def get_token(use_cache: bool = True) -> str: Raises: RuntimeError: If token retrieval fails. """ - if use_cache and TOKEN_FILE.exists(): - stored_token = Path(TOKEN_FILE).read_text(encoding="utf-8") + if use_cache and authentication_settings().token_file.exists(): + stored_token = Path(authentication_settings().token_file).read_text(encoding="utf-8") # Parse stored string "token:expiry_timestamp" parts = stored_token.split(":") token, expiry_str = parts @@ -108,8 +50,8 @@ def get_token(use_cache: bool = True) -> str: # Store new token with expiry if use_cache: timestamp = claims["exp"] - TOKEN_FILE.parent.mkdir(parents=True, exist_ok=True) - Path(TOKEN_FILE).write_text(f"{new_token}:{timestamp}", encoding="utf-8") + authentication_settings().token_file.parent.mkdir(parents=True, exist_ok=True) + Path(authentication_settings().token_file).write_text(f"{new_token}:{timestamp}", encoding="utf-8") return new_token @@ -318,7 +260,7 @@ def _perform_device_flow() -> str | None: "scope": authentication_settings().scope_elements, "audience": authentication_settings().audience, }, - timeout=REQUEST_TIMEOUT_SECONDS, + timeout=authentication_settings().request_timeout_seconds, ).json() device_code = resp["device_code"] print(f"Please visit: {resp['verification_uri_complete']}") @@ -334,7 +276,7 @@ def _perform_device_flow() -> str | None: "device_code": device_code, "client_id": authentication_settings().client_id_device.get_secret_value(), }, - timeout=REQUEST_TIMEOUT_SECONDS, + timeout=authentication_settings().request_timeout_seconds, ).json() if "error" in resp: @@ -366,15 +308,16 @@ def _token_from_refresh_token(refresh_token: SecretStr) -> str | None: "client_id": authentication_settings().client_id_interactive.get_secret_value(), "refresh_token": refresh_token.get_secret_value(), }, - timeout=REQUEST_TIMEOUT_SECONDS, + timeout=authentication_settings().request_timeout_seconds, ).json() if "error" in resp: if resp["error"] in {"authorization_pending", "slow_down"}: - time.sleep(AUTHORIZATION_BACKOFF_SECONDS) + time.sleep(authentication_settings().authorization_backoff_seconds) continue raise RuntimeError(resp["error"]) return t.cast("str", resp["access_token"]) +# TODO(Andreas): hhva: Can we remove this? if __name__ == "__main__": print(get_token(use_cache=False)) diff --git a/src/aignostics/client/_client.py b/src/aignostics/client/_client.py index 09c92365..a23ddfea 100644 --- a/src/aignostics/client/_client.py +++ b/src/aignostics/client/_client.py @@ -6,7 +6,7 @@ from aignostics.client.resources.applications import Applications, Versions from aignostics.client.resources.runs import Runs -from ._authentication import authentication_settings +from ._settings import authentication_settings class Client: diff --git a/src/aignostics/client/_messages.py b/src/aignostics/client/_messages.py new file mode 100644 index 00000000..087ca39d --- /dev/null +++ b/src/aignostics/client/_messages.py @@ -0,0 +1,5 @@ +"""Messages for the Aignostics client.""" + +AUTHENTICATION_FAILED = "Authentication failed. Please check your credentials." +NOT_YET_IMPLEMENTED = "Not yet implemented." +UNKNOWN_ENDPOINT_URL = "Unknown endpoint URL. Please check the API documentation." diff --git a/src/aignostics/client/_settings.py b/src/aignostics/client/_settings.py new file mode 100644 index 00000000..317aeb82 --- /dev/null +++ b/src/aignostics/client/_settings.py @@ -0,0 +1,98 @@ +import os +from pathlib import Path + +import appdirs +from pydantic import SecretStr, computed_field, model_validator +from pydantic_settings import BaseSettings, SettingsConfigDict + +from aignostics import __project_name__ + +from ._messages import NOT_YET_IMPLEMENTED, UNKNOWN_ENDPOINT_URL + + +class AuthenticationSettings(BaseSettings): + model_config = SettingsConfigDict( + env_prefix=f"{__project_name__.upper()}_", + env_file=( + os.getenv(f"{__project_name__.upper()}_ENV_FILE", Path.home() / f".{__project_name__}/env"), + os.getenv(f"{__project_name__.upper()}_ENV_FILE", Path.home() / f".{__project_name__}/.env"), + ), + env_file_encoding="utf-8", + extra="ignore", + ) + + client_id_device: SecretStr + client_id_interactive: SecretStr + api_root: str = "https://platform.aignostics.com" + + scope: str = "offline_access" + + @computed_field # type: ignore[prop-decorator] + @property + def scope_elements(self) -> list[str]: + if not self.scope: + return [] + return [element.strip() for element in self.scope.split(",")] + + audience: str + authorization_base_url: str + token_url: str + redirect_uri: str + device_url: str + jws_json_url: str + + refresh_token: SecretStr | None = None + + cache_dir: str = appdirs.user_cache_dir(__project_name__) + + @computed_field # type: ignore[prop-decorator] + @property + def token_file(self) -> Path: + return Path(self.cache_dir) / ".token" + + request_timeout_seconds: int = 30 + authorization_backoff_seconds: int = 3 + + @model_validator(mode="before") + def pre_init(cls, values): # type: ignore[no-untyped-def] # noqa: ANN001, ANN202, N805 + # See https://github.com/pydantic/pydantic/issues/9789 + api_root = values.get("api_root", "https://platform.aignostics.com") + print(api_root) + match api_root: + case "https://platform.aignostics.com": + # TODO (Andreas): hhva: please fill in + raise RuntimeError(NOT_YET_IMPLEMENTED) + case "http://platform-staging.aignostics.com": + # TODO (Andreas): hhva: please fill in + raise RuntimeError(NOT_YET_IMPLEMENTED) + case "https://platform-dev.aignostics.com": + values["audience"] = "https://dev-8ouohmmrbuh2h4vu-samia" + values["authorization_base_url"] = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize" + values["token_url"] = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" # noqa: S105 + values["redirect_uri"] = "http://localhost:8080/" + values["device_url"] = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/device/code" + values["jws_json_url"] = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/.well-known/jwks.json" + case _: + raise ValueError(UNKNOWN_ENDPOINT_URL) + + return values + + +__cached_authentication_settings: AuthenticationSettings | None = None + + +def authentication_settings() -> AuthenticationSettings: + """Lazy load authentication settings from the environment or a file. + + * Given we use Pydantic Settings, validation is done automatically. + * We only load and validate if we actually need the settings, + thereby not killing the client on other actions. + * If the settings have already been loaded, return the cached instance. + + Returns: + AuthenticationSettings: The loaded authentication settings. + """ + global __cached_authentication_settings # noqa: PLW0603 + if __cached_authentication_settings is None: + __cached_authentication_settings = AuthenticationSettings() # pyright: ignore[reportCallIssue] + return __cached_authentication_settings diff --git a/src/aignostics/client/messages.py b/src/aignostics/client/messages.py deleted file mode 100644 index 54953b51..00000000 --- a/src/aignostics/client/messages.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Messages for the Aignostics client.""" - -AUTHENTICATION_FAILED = "Authentication failed. Please check your credentials." diff --git a/src/aignostics/platform.py b/src/aignostics/platform.py index 9fea67c0..7ae86543 100644 --- a/src/aignostics/platform.py +++ b/src/aignostics/platform.py @@ -10,6 +10,7 @@ from dotenv import load_dotenv from . import OpenAPISchemaError +from .client import authentication_settings from .constants import __project_name__, __project_path__, __version__ from .settings import Settings from .types import JsonType @@ -80,18 +81,21 @@ def info(self, env: bool = True, filter_secrets: bool = True) -> dict[str, Any]: "implementation": platform.python_implementation(), }, }, - "settings": self._settings.model_dump_json(), + "settings": { + "core": self._settings.model_dump(), + "authentication": authentication_settings().model_dump(), + }, }, "remote": { "platform": { "dev": { - "url": "https://api.dev.aignostics.com", + "API_ROOT": "https://platform-dev.aignostics.com", }, "staging": { - "url": "https://api.staging.aignostics.com", + "API_ROOT": "https://patform-staging.aignostics.com", }, "production": { - "url": "https://api.aignostics.com", + "API_ROOT": "https://platform.aignostics.com", }, } }, From 6f911f4d1a6705b5ca4d60873a7447a6dba49052 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 18:59:32 +0200 Subject: [PATCH 056/110] fix(smoke test): removed authentication-settings, now part of platform info --- .github/workflows/test-and-report.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index d9d1fd42..a1a7d324 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -74,7 +74,7 @@ jobs: AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} run: | uv run --no-dev aignostics platform health - uv run --no-dev aignostics platform authentication-settings + uv run --no-dev aignostics platform info - name: Lint run: make lint From 11260fe2086f54717ca20957c608cce932d6c102 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 19:19:01 +0200 Subject: [PATCH 057/110] feat(cli): human readable info --- src/aignostics/platform.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/aignostics/platform.py b/src/aignostics/platform.py index 7ae86543..d66054d2 100644 --- a/src/aignostics/platform.py +++ b/src/aignostics/platform.py @@ -82,8 +82,8 @@ def info(self, env: bool = True, filter_secrets: bool = True) -> dict[str, Any]: }, }, "settings": { - "core": self._settings.model_dump(), - "authentication": authentication_settings().model_dump(), + "core": json.loads(self._settings.model_dump_json()), + "authentication": json.loads(authentication_settings().model_dump_json()), }, }, "remote": { From 6bd7fa9c99d74fc4ccfff7463926e0c0860093b3 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 19:44:36 +0200 Subject: [PATCH 058/110] docs(readme): headline --- docs/partials/README_main.md | 337 ++++++++++------------------------- 1 file changed, 96 insertions(+), 241 deletions(-) diff --git a/docs/partials/README_main.md b/docs/partials/README_main.md index d803a77d..b86c7df0 100644 --- a/docs/partials/README_main.md +++ b/docs/partials/README_main.md @@ -1,163 +1,118 @@ -Python SDK providing access to Aignostics AI services. - -### Scaffolding - -This [Copier](https://copier.readthedocs.io/en/stable/) template enables you to quickly generate (scaffold) a Python package with fully functioning build and test automation: - -1. Projects generated from this template can be [easily updated](https://copier.readthedocs.io/en/stable/updating/) to benefit from improvements and new features of the template. -2. During project generation, you can flexibly configure naming of the Python distribution, import package, main author, GitHub repository, organization, and many other aspects to match your specific requirements (see [copier.yml](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/copier.yml) for all available options). - -### Development Infrastructure - -Projects generated with this template come with a comprehensive development toolchain and quality assurance framework that supports the entire software development lifecycle - from coding and testing to documentation, release management, and compliance auditing. This infrastructure automates routine tasks, enforces code quality standards, and streamlines the path to production: - -1. Linting with [Ruff](https://github.com/astral-sh/ruff) -2. Static type checking with [mypy](https://mypy.readthedocs.io/en/stable/) -3. Complete set of [pre-commit](https://pre-commit.com/) hooks including [detect-secrets](https://github.com/Yelp/detect-secrets) and [pygrep](https://github.com/pre-commit/pygrep-hooks) -4. Unit and E2E testing with [pytest](https://docs.pytest.org/en/stable/) including parallel test execution -5. Matrix testing in multiple environments with [nox](https://nox.thea.codes/en/stable/) -6. Test coverage reported with [Codecov](https://codecov.io/) and published as release artifact -7. CI/CD pipeline automated with [GitHub Actions](https://github.com/features/actions) -8. CI/CD pipeline can be run locally with [act](https://github.com/nektos/act) -9. Code quality and security checks with [SonarQube](https://www.sonarsource.com/products/sonarcloud) and [GitHub CodeQL](https://codeql.github.com/) -10. Dependency monitoring and vulnerability scanning with [pip-audit](https://pypi.org/project/pip-audit/), [trivy](https://trivy.dev/latest/), [Renovate](https://github.com/renovatebot/renovate), and [GitHub Dependabot](https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide) -11. Licenses of dependencies extracted with [pip-licenses](https://pypi.org/project/pip-licenses/), matched with allow list, and published as release artifacts in CSV and JSON format for further compliance checks -12. Generation of attributions from extracted licenses -13. Software Bill of Materials (SBOM) generated in [CycloneDX](https://cyclonedx.org/) and [SPDX](https://spdx.dev/) formats with [cyclonedx-python](https://github.com/CycloneDX/cyclonedx-python) resp. [trivy](https://trivy.dev/latest/), published as release artifacts -14. Version and release management with [bump-my-version](https://callowayproject.github.io/bump-my-version/) -15. Changelog and release notes generated with [git-cliff](https://git-cliff.org/) -16. Documentation generated with [Sphinx](https://www.sphinx-doc.org/en/master/) including reference documentation and PDF export -17. Documentation published to [Read The Docs](https://readthedocs.org/) -18. Interactive OpenAPI specification with [Swagger](https://swagger.io/) -19. Python package published to [PyPI](https://pypi.org/) -20. Docker images published to [Docker.io](https://hub.docker.com/) and [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry) with [artifact attestations](https://docs.github.com/en/actions/security-for-github-actions/using-artifact-attestations/using-artifact-attestations-to-establish-provenance-for-builds) -21. One-click development environments with [Dev Containers](https://code.visualstudio.com/docs/devcontainers/containers) and [GitHub Codespaces](https://github.com/features/codespaces) -22. Settings for use with [VSCode](https://code.visualstudio.com/) -23. Settings and custom instructions for use with [GitHub Copilot](https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot) - -### Application Features - -Beyond development tooling, projects generated with this template include the code, documentation, and configuration of a fully functioning demo application and service. This reference implementation serves as a starting point for your own business logic with modern patterns and practices already in place: - -1. Service architecture suitable for use as shared library -2. Validation with [pydantic](https://docs.pydantic.dev/) -3. Command-line interface (CLI) with [Typer](https://typer.tiangolo.com/) -4. Versioned Web API with [FastAPI](https://fastapi.tiangolo.com/) -5. [Interactive Jupyter notebook](https://jupyter.org/) and [reactive Marimo notebook](https://marimo.io/) -6. Simple Web UI with [Streamlit](https://streamlit.io/) -7. Configuration to run the CLI and API in a Docker container including setup for [Docker Compose](https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-docker-compose/) -8. Documentation including badges, setup instructions, contribution guide and security policy -9. Preparation to deploy API as serverless function to Vercel - -Explore [here](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example) for what's generated out of the box. - -## Generate a new project - -To generate, build and release a fully functioning project in a few minutes, follow these 5 steps: - -**Step 1**: Execute the following command to install or update tooling. -```shell -# Install Homebrew, uv package manager, copier and further dev tools -curl -LsSf https://raw.githubusercontent.com/helmut-hoffer-von-ankershoffen/oe-python-template/HEAD/install.sh | sh -``` - -**Step 2**: [Create a repository on GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-new-repository), clone to your local machine, and change into it's directory. - -**Step 3**: Execute the following command to generate a new project based on this template. -```shell -# Ensure to stand in your freshly created git repository before executing this command -copier copy --trust gh:helmut-hoffer-von-ankershoffen/oe-python-template . -``` - -**Step 4**: Execute the following commands to push your initial commit to GitHub. -```shell -git add . -git commit -m "chore: Initial commit" -git push -``` +Python SDK enabling access to aignostics platform. + +## Introduction + +TODO (Helmut): Cunctionality and features. + +### Operational Excellence + +TODO (Helmut): Simplify. Focus on earning trust of customers. + +The aignostics Python SDK is built with operational excellence, using modern +Python tooling and practices. This includes: + +1. Various examples demonstrating usage: a. + [Simple Python script](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) + b. [Streamlit web application](https://aignostics.streamlit.app/) deployed on + [Streamlit Community Cloud](https://streamlit.io/cloud) c. + [Jupyter](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) + and + [Marimo](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) + notebook +2. [Complete reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html) + on Read the Docs +3. [Transparent test coverage](https://app.codecov.io/gh/aignostics/python-sdk) + including unit and E2E tests (reported on Codecov) +4. Matrix tested with + [multiple python versions](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) + to ensure compatibility (powered by [Nox](https://nox.thea.codes/en/stable/)) +5. Compliant with modern linting and formatting standards (powered by + [Ruff](https://github.com/astral-sh/ruff)) +6. Up-to-date dependencies (monitored by + [Renovate](https://github.com/renovatebot/renovate) and + [Dependabot](https://github.com/aignostics/python-sdk/security/dependabot)) +7. [A-grade code quality](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) + in security, maintainability, and reliability with low technical debt and + codesmell (verified by SonarQube) +8. Additional code security checks using + [CodeQL](https://github.com/aignostics/python-sdk/security/code-scanning) +9. [Security Policy](SECURITY.md) +10. [License](LICENSE) compliant with the Open Source Initiative (OSI) +11. 1-liner for installation and execution of command line interface (CLI) via + [uv(x)](https://github.com/astral-sh/uv) or + [Docker](https://hub.docker.com/r/helmuthva/aignostics-python-sdk/tags) +12. Setup for developing inside a + [devcontainer](https://code.visualstudio.com/docs/devcontainers/containers) + included (supports VSCode and GitHub Codespaces) -Check the [Actions tab](https://github.com/aignostics/python-sdk/actions) of your GitHub repository: The CI/CD workflow of your project is already running! +## Setup -The workflow will fail at the SonarQube step, as this external service is not yet configured for our new repository. We will configure SonarQube and other services in the next step! +TODO (Helmut): Explain, starting with copy of script on +https://platform.aignostics.com -Notes: -1. Check out [this manual](https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key) on how to set up signed commits +## CLI Usage -**Step 5**: Follow the [instructions](SERVICE_CONNECTIONS.md) to wire up -external services such as CloudCov, SonarQube Cloud, Read The Docs, Docker.io, and Streamlit Community Cloud. +Executing the command line interface (CLI) in an isolated Python environment is +just as easy: -**Step 6**: Release the first version of your project ```shell -make bump +uvx aignostics platform health # checks if CLI and Platform are health +uvx aignostics platform info # shows information about the platform +uvx aignostics application list # lists AI applications available for the user ``` -Notes: -1. You can remove the above sections - from "Scaffolding" to this notes - post having successfully generated your project. -2. The following sections refer to the dummy application and service generated into the `tests` and `src` folder by this template. - Use the documentation and code as inspiration, adapt to your business logic, or remove and start documenting and coding from scratch. +Notes: -## Overview - -Adding Aignostics Python SDK to your project as a dependency is easy. See below for usage examples. +The CLI provides extensive help: ```shell -uv add aignostics # add dependency to your project +uvx aignostics --help # all CLI commands +uvx aignostics application --help # help for specific topic +uvx aignostics application list --help # help for specific topic +uvx aignostics serve --help ``` -If you don't have uv installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). If you still prefer pip over the modern and fast package manager [uv](https://github.com/astral-sh/uv), you can install the library like this: +### Run with Docker +You can as well run the CLI within Docker. ```shell -pip install aignostics # add dependency to your project +docker run helmuthva/aignostics-python-sdk --help +docker run helmuthva/aignostics-python-sdk platform health ``` -Executing the command line interface (CLI) in an isolated Python environment is just as easy: +Execute command: ```shell -uvx aignostics hello-world # prints "Hello, world! [..]" -uvx aignostics serve # serves web API -uvx aignostics serve --port=4711 # serves web API on port 4711 +docker run --env THE_VAR=MY_VALUE helmuthva/aignostics-python-sdk platform health ``` -Notes: -1. The API is versioned, mounted at `/api/v1` resp. `/api/v2` -2. While serving the web API go to [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world) to see the respons of the `hello-world` operation. -3. Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs) - +Or use docker compose -The CLI provides extensive help: +The .env is passed through from the host to the Docker container. ```shell -uvx aignostics --help # all CLI commands -uvx aignostics hello-world --help # help for specific command -uvx aignostics echo --help -uvx aignostics openapi --help -uvx aignostics serve --help +docker compose run aignostics --help +docker compose run aignostics platform health ``` +## Library Concepts -## Operational Excellence +Adding Aignostics Python SDK to your project as a dependency is easy. See below +for usage examples. -This project is designed with operational excellence in mind, using modern Python tooling and practices. It includes: - -1. Various examples demonstrating usage: - a. [Simple Python script](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) - b. [Streamlit web application](https://aignostics.streamlit.app/) deployed on [Streamlit Community Cloud](https://streamlit.io/cloud) - c. [Jupyter](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) and [Marimo](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) notebook -2. [Complete reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html) on Read the Docs -3. [Transparent test coverage](https://app.codecov.io/gh/aignostics/python-sdk) including unit and E2E tests (reported on Codecov) -4. Matrix tested with [multiple python versions](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) to ensure compatibility (powered by [Nox](https://nox.thea.codes/en/stable/)) -5. Compliant with modern linting and formatting standards (powered by [Ruff](https://github.com/astral-sh/ruff)) -6. Up-to-date dependencies (monitored by [Renovate](https://github.com/renovatebot/renovate) and [Dependabot](https://github.com/aignostics/python-sdk/security/dependabot)) -7. [A-grade code quality](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) in security, maintainability, and reliability with low technical debt and codesmell (verified by SonarQube) -8. Additional code security checks using [CodeQL](https://github.com/aignostics/python-sdk/security/code-scanning) -9. [Security Policy](SECURITY.md) -10. [License](LICENSE) compliant with the Open Source Initiative (OSI) -11. 1-liner for installation and execution of command line interface (CLI) via [uv(x)](https://github.com/astral-sh/uv) or [Docker](https://hub.docker.com/r/helmuthva/aignostics-python-sdk/tags) -12. Setup for developing inside a [devcontainer](https://code.visualstudio.com/docs/devcontainers/containers) included (supports VSCode and GitHub Codespaces) +```shell +uv add aignostics # add SDK as dependency to your project +``` +If you don't have uv installed follow +[these instructions](https://docs.astral.sh/uv/getting-started/installation/). +If you still prefer pip over the modern and fast package manager +[uv](https://github.com/astral-sh/uv), you can install the library like this: -## Usage Examples +```shell +pip install aignostics # add SDK as dependency to your project +``` The following examples run from source - clone this repository using `git clone git@github.com:aignostics/python-sdk.git`. @@ -180,22 +135,10 @@ message = Service.get_hello_world() console.print(f"[blue]{message}[/blue]") ``` -[Show script code](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) - [Read the reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html) - -### Streamlit App - -Serve the functionality provided by Aignostics Python SDK in the web by easily integrating the service into a Streamlit application. - -[Try it out!](https://aignostics.streamlit.app) - [Show the code](https://github.com/aignostics/python-sdk/blob/main/examples/streamlit.py) - -... or serve the app locally -```shell -uv sync --all-extras # Install streamlit dependency part of the examples extra, see pyproject.toml -uv run streamlit run examples/streamlit.py # Serve on localhost:8501, opens browser -``` - +[Show script code](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) - +[Read the reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html) -## Notebooks +## Use in Notebooks ### Jupyter @@ -206,7 +149,9 @@ uv run streamlit run examples/streamlit.py # Serve on localhost:8501, o ```shell uv sync --all-extras # Install dependencies required for examples such as Juypyter kernel, see pyproject.toml ``` -Install the [Jupyter extension for VSCode](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter) + +Install the +[Jupyter extension for VSCode](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter) Click on `examples/notebook.ipynb` in VSCode and run it. @@ -230,102 +175,12 @@ uv run marimo edit examples/notebook.py --watch # Edit on localhost:2718, op ... or edit interactively within VSCode -Install the [Marimo extension for VSCode](https://marketplace.visualstudio.com/items?itemName=marimo-team.vscode-marimo) - -Click on `examples/notebook.py` in VSCode and click on the caret next to the Run icon above the code (looks like a pencil) > "Start in marimo editor" (edit). - -## Command Line Interface (CLI) - -### Run with [uvx](https://docs.astral.sh/uv/guides/tools/) - -Show available commands: - -```shell -uvx aignostics --help -``` - -Execute commands: - -```shell -uvx aignostics hello-world -uvx aignostics echo --help -uvx aignostics echo "Lorem" -uvx aignostics echo "Lorem" --json -uvx aignostics openapi -uvx aignostics openapi --output-format=json -uvx aignostics serve -``` - -### Environment - -The service loads environment variables including support for .env files. - -```shell -cp .env.example .env # copy example file -echo "THE_VAR=MY_VALUE" > .env # overwrite with your values -``` - -Now run the usage examples again. +Install the +[Marimo extension for VSCode](https://marketplace.visualstudio.com/items?itemName=marimo-team.vscode-marimo) -### Run with Docker - -You can as well run the CLI within Docker. - -```shell -docker run helmuthva/aignostics-python-sdk --help -docker run helmuthva/aignostics-python-sdk hello-world -docker run helmuthva/aignostics-python-sdk echo --help -docker run helmuthva/aignostics-python-sdk echo "Lorem" -docker run helmuthva/aignostics-python-sdk echo "Lorem" --json -docker run helmuthva/aignostics-python-sdk openapi -docker run helmuthva/aignostics-python-sdk openapi --output-format=json -docker run helmuthva/aignostics-python-sdk serve -``` - -Execute command: - -```shell -docker run --env THE_VAR=MY_VALUE helmuthva/aignostics-python-sdk echo "Lorem Ipsum" -``` - -Or use docker compose - -The .env is passed through from the host to the Docker container. - -```shell -docker compose run aignostics --help -docker compose run aignostics hello-world -docker compose run aignostics echo --help -docker compose run aignostics echo "Lorem" -docker compose run aignostics echo "Lorem" --json -docker compose run aignostics openapi -docker compose run aignostics openapi --output-format=json -echo "Running Aignostics Python SDK's API container as a daemon ..." -docker compose up -d -echo "Waiting for the API server to start ..." -sleep 5 -echo "Checking health of v1 API ..." -curl http://127.0.0.1:8000/api/v1/healthz -echo "" -echo "Saying hello world with v1 API ..." -curl http://127.0.0.1:8000/api/v1/hello-world -echo "" -echo "Swagger docs of v1 API ..." -curl http://127.0.0.1:8000/api/v1/docs -echo "" -echo "Checking health of v2 API ..." -curl http://127.0.0.1:8000/api/v2/healthz -echo "" -echo "Saying hello world with v1 API ..." -curl http://127.0.0.1:8000/api/v2/hello-world -echo "" -echo "Swagger docs of v2 API ..." -curl http://127.0.0.1:8000/api/v2/docs -echo "" -echo "Shutting down the API container ..." -docker compose down -``` +Click on `examples/notebook.py` in VSCode and click on the caret next to the Run +icon above the code (looks like a pencil) > "Start in marimo editor" (edit). -## Extra: Lorem Ipsum +## API Concepts -Dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam. +TODO (Andreas): Explain API concepts, such as authentication, resources etc.. From 003f6fffef238d5d55f8e782697c2cc31fab99b0 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 19:46:46 +0200 Subject: [PATCH 059/110] docs: rebuild --- README.md | 337 ++++++++++++++++-------------------------------------- 1 file changed, 96 insertions(+), 241 deletions(-) diff --git a/README.md b/README.md index 73a8e3aa..26968dc1 100644 --- a/README.md +++ b/README.md @@ -43,166 +43,121 @@ --- -Python SDK providing access to Aignostics AI services. - -### Scaffolding - -This [Copier](https://copier.readthedocs.io/en/stable/) template enables you to quickly generate (scaffold) a Python package with fully functioning build and test automation: - -1. Projects generated from this template can be [easily updated](https://copier.readthedocs.io/en/stable/updating/) to benefit from improvements and new features of the template. -2. During project generation, you can flexibly configure naming of the Python distribution, import package, main author, GitHub repository, organization, and many other aspects to match your specific requirements (see [copier.yml](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template/blob/main/copier.yml) for all available options). - -### Development Infrastructure - -Projects generated with this template come with a comprehensive development toolchain and quality assurance framework that supports the entire software development lifecycle - from coding and testing to documentation, release management, and compliance auditing. This infrastructure automates routine tasks, enforces code quality standards, and streamlines the path to production: - -1. Linting with [Ruff](https://github.com/astral-sh/ruff) -2. Static type checking with [mypy](https://mypy.readthedocs.io/en/stable/) -3. Complete set of [pre-commit](https://pre-commit.com/) hooks including [detect-secrets](https://github.com/Yelp/detect-secrets) and [pygrep](https://github.com/pre-commit/pygrep-hooks) -4. Unit and E2E testing with [pytest](https://docs.pytest.org/en/stable/) including parallel test execution -5. Matrix testing in multiple environments with [nox](https://nox.thea.codes/en/stable/) -6. Test coverage reported with [Codecov](https://codecov.io/) and published as release artifact -7. CI/CD pipeline automated with [GitHub Actions](https://github.com/features/actions) -8. CI/CD pipeline can be run locally with [act](https://github.com/nektos/act) -9. Code quality and security checks with [SonarQube](https://www.sonarsource.com/products/sonarcloud) and [GitHub CodeQL](https://codeql.github.com/) -10. Dependency monitoring and vulnerability scanning with [pip-audit](https://pypi.org/project/pip-audit/), [trivy](https://trivy.dev/latest/), [Renovate](https://github.com/renovatebot/renovate), and [GitHub Dependabot](https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide) -11. Licenses of dependencies extracted with [pip-licenses](https://pypi.org/project/pip-licenses/), matched with allow list, and published as release artifacts in CSV and JSON format for further compliance checks -12. Generation of attributions from extracted licenses -13. Software Bill of Materials (SBOM) generated in [CycloneDX](https://cyclonedx.org/) and [SPDX](https://spdx.dev/) formats with [cyclonedx-python](https://github.com/CycloneDX/cyclonedx-python) resp. [trivy](https://trivy.dev/latest/), published as release artifacts -14. Version and release management with [bump-my-version](https://callowayproject.github.io/bump-my-version/) -15. Changelog and release notes generated with [git-cliff](https://git-cliff.org/) -16. Documentation generated with [Sphinx](https://www.sphinx-doc.org/en/master/) including reference documentation and PDF export -17. Documentation published to [Read The Docs](https://readthedocs.org/) -18. Interactive OpenAPI specification with [Swagger](https://swagger.io/) -19. Python package published to [PyPI](https://pypi.org/) -20. Docker images published to [Docker.io](https://hub.docker.com/) and [GitHub Container Registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry) with [artifact attestations](https://docs.github.com/en/actions/security-for-github-actions/using-artifact-attestations/using-artifact-attestations-to-establish-provenance-for-builds) -21. One-click development environments with [Dev Containers](https://code.visualstudio.com/docs/devcontainers/containers) and [GitHub Codespaces](https://github.com/features/codespaces) -22. Settings for use with [VSCode](https://code.visualstudio.com/) -23. Settings and custom instructions for use with [GitHub Copilot](https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot) - -### Application Features - -Beyond development tooling, projects generated with this template include the code, documentation, and configuration of a fully functioning demo application and service. This reference implementation serves as a starting point for your own business logic with modern patterns and practices already in place: - -1. Service architecture suitable for use as shared library -2. Validation with [pydantic](https://docs.pydantic.dev/) -3. Command-line interface (CLI) with [Typer](https://typer.tiangolo.com/) -4. Versioned Web API with [FastAPI](https://fastapi.tiangolo.com/) -5. [Interactive Jupyter notebook](https://jupyter.org/) and [reactive Marimo notebook](https://marimo.io/) -6. Simple Web UI with [Streamlit](https://streamlit.io/) -7. Configuration to run the CLI and API in a Docker container including setup for [Docker Compose](https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-docker-compose/) -8. Documentation including badges, setup instructions, contribution guide and security policy -9. Preparation to deploy API as serverless function to Vercel - -Explore [here](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template-example) for what's generated out of the box. - -## Generate a new project - -To generate, build and release a fully functioning project in a few minutes, follow these 5 steps: - -**Step 1**: Execute the following command to install or update tooling. -```shell -# Install Homebrew, uv package manager, copier and further dev tools -curl -LsSf https://raw.githubusercontent.com/helmut-hoffer-von-ankershoffen/oe-python-template/HEAD/install.sh | sh -``` - -**Step 2**: [Create a repository on GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-new-repository), clone to your local machine, and change into it's directory. - -**Step 3**: Execute the following command to generate a new project based on this template. -```shell -# Ensure to stand in your freshly created git repository before executing this command -copier copy --trust gh:helmut-hoffer-von-ankershoffen/oe-python-template . -``` - -**Step 4**: Execute the following commands to push your initial commit to GitHub. -```shell -git add . -git commit -m "chore: Initial commit" -git push -``` +Python SDK enabling access to aignostics platform. + +## Introduction + +TODO (Helmut): Cunctionality and features. + +### Operational Excellence + +TODO (Helmut): Simplify. Focus on earning trust of customers. + +The aignostics Python SDK is built with operational excellence, using modern +Python tooling and practices. This includes: + +1. Various examples demonstrating usage: a. + [Simple Python script](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) + b. [Streamlit web application](https://aignostics.streamlit.app/) deployed on + [Streamlit Community Cloud](https://streamlit.io/cloud) c. + [Jupyter](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) + and + [Marimo](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) + notebook +2. [Complete reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html) + on Read the Docs +3. [Transparent test coverage](https://app.codecov.io/gh/aignostics/python-sdk) + including unit and E2E tests (reported on Codecov) +4. Matrix tested with + [multiple python versions](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) + to ensure compatibility (powered by [Nox](https://nox.thea.codes/en/stable/)) +5. Compliant with modern linting and formatting standards (powered by + [Ruff](https://github.com/astral-sh/ruff)) +6. Up-to-date dependencies (monitored by + [Renovate](https://github.com/renovatebot/renovate) and + [Dependabot](https://github.com/aignostics/python-sdk/security/dependabot)) +7. [A-grade code quality](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) + in security, maintainability, and reliability with low technical debt and + codesmell (verified by SonarQube) +8. Additional code security checks using + [CodeQL](https://github.com/aignostics/python-sdk/security/code-scanning) +9. [Security Policy](SECURITY.md) +10. [License](LICENSE) compliant with the Open Source Initiative (OSI) +11. 1-liner for installation and execution of command line interface (CLI) via + [uv(x)](https://github.com/astral-sh/uv) or + [Docker](https://hub.docker.com/r/helmuthva/aignostics-python-sdk/tags) +12. Setup for developing inside a + [devcontainer](https://code.visualstudio.com/docs/devcontainers/containers) + included (supports VSCode and GitHub Codespaces) -Check the [Actions tab](https://github.com/aignostics/python-sdk/actions) of your GitHub repository: The CI/CD workflow of your project is already running! +## Setup -The workflow will fail at the SonarQube step, as this external service is not yet configured for our new repository. We will configure SonarQube and other services in the next step! +TODO (Helmut): Explain, starting with copy of script on +https://platform.aignostics.com -Notes: -1. Check out [this manual](https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key) on how to set up signed commits +## CLI Usage -**Step 5**: Follow the [instructions](SERVICE_CONNECTIONS.md) to wire up -external services such as CloudCov, SonarQube Cloud, Read The Docs, Docker.io, and Streamlit Community Cloud. +Executing the command line interface (CLI) in an isolated Python environment is +just as easy: -**Step 6**: Release the first version of your project ```shell -make bump +uvx aignostics platform health # checks if CLI and Platform are health +uvx aignostics platform info # shows information about the platform +uvx aignostics application list # lists AI applications available for the user ``` -Notes: -1. You can remove the above sections - from "Scaffolding" to this notes - post having successfully generated your project. -2. The following sections refer to the dummy application and service generated into the `tests` and `src` folder by this template. - Use the documentation and code as inspiration, adapt to your business logic, or remove and start documenting and coding from scratch. +Notes: -## Overview - -Adding Aignostics Python SDK to your project as a dependency is easy. See below for usage examples. +The CLI provides extensive help: ```shell -uv add aignostics # add dependency to your project +uvx aignostics --help # all CLI commands +uvx aignostics application --help # help for specific topic +uvx aignostics application list --help # help for specific topic +uvx aignostics serve --help ``` -If you don't have uv installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). If you still prefer pip over the modern and fast package manager [uv](https://github.com/astral-sh/uv), you can install the library like this: +### Run with Docker +You can as well run the CLI within Docker. ```shell -pip install aignostics # add dependency to your project +docker run helmuthva/aignostics-python-sdk --help +docker run helmuthva/aignostics-python-sdk platform health ``` -Executing the command line interface (CLI) in an isolated Python environment is just as easy: +Execute command: ```shell -uvx aignostics hello-world # prints "Hello, world! [..]" -uvx aignostics serve # serves web API -uvx aignostics serve --port=4711 # serves web API on port 4711 +docker run --env THE_VAR=MY_VALUE helmuthva/aignostics-python-sdk platform health ``` -Notes: -1. The API is versioned, mounted at `/api/v1` resp. `/api/v2` -2. While serving the web API go to [http://127.0.0.1:8000/api/v1/hello-world](http://127.0.0.1:8000/api/v1/hello-world) to see the respons of the `hello-world` operation. -3. Interactive documentation is provided at [http://127.0.0.1:8000/api/docs](http://127.0.0.1:8000/api/docs) - +Or use docker compose -The CLI provides extensive help: +The .env is passed through from the host to the Docker container. ```shell -uvx aignostics --help # all CLI commands -uvx aignostics hello-world --help # help for specific command -uvx aignostics echo --help -uvx aignostics openapi --help -uvx aignostics serve --help +docker compose run aignostics --help +docker compose run aignostics platform health ``` +## Library Concepts -## Operational Excellence +Adding Aignostics Python SDK to your project as a dependency is easy. See below +for usage examples. -This project is designed with operational excellence in mind, using modern Python tooling and practices. It includes: - -1. Various examples demonstrating usage: - a. [Simple Python script](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) - b. [Streamlit web application](https://aignostics.streamlit.app/) deployed on [Streamlit Community Cloud](https://streamlit.io/cloud) - c. [Jupyter](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) and [Marimo](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) notebook -2. [Complete reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html) on Read the Docs -3. [Transparent test coverage](https://app.codecov.io/gh/aignostics/python-sdk) including unit and E2E tests (reported on Codecov) -4. Matrix tested with [multiple python versions](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) to ensure compatibility (powered by [Nox](https://nox.thea.codes/en/stable/)) -5. Compliant with modern linting and formatting standards (powered by [Ruff](https://github.com/astral-sh/ruff)) -6. Up-to-date dependencies (monitored by [Renovate](https://github.com/renovatebot/renovate) and [Dependabot](https://github.com/aignostics/python-sdk/security/dependabot)) -7. [A-grade code quality](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) in security, maintainability, and reliability with low technical debt and codesmell (verified by SonarQube) -8. Additional code security checks using [CodeQL](https://github.com/aignostics/python-sdk/security/code-scanning) -9. [Security Policy](SECURITY.md) -10. [License](LICENSE) compliant with the Open Source Initiative (OSI) -11. 1-liner for installation and execution of command line interface (CLI) via [uv(x)](https://github.com/astral-sh/uv) or [Docker](https://hub.docker.com/r/helmuthva/aignostics-python-sdk/tags) -12. Setup for developing inside a [devcontainer](https://code.visualstudio.com/docs/devcontainers/containers) included (supports VSCode and GitHub Codespaces) +```shell +uv add aignostics # add SDK as dependency to your project +``` +If you don't have uv installed follow +[these instructions](https://docs.astral.sh/uv/getting-started/installation/). +If you still prefer pip over the modern and fast package manager +[uv](https://github.com/astral-sh/uv), you can install the library like this: -## Usage Examples +```shell +pip install aignostics # add SDK as dependency to your project +``` The following examples run from source - clone this repository using `git clone git@github.com:aignostics/python-sdk.git`. @@ -225,22 +180,10 @@ message = Service.get_hello_world() console.print(f"[blue]{message}[/blue]") ``` -[Show script code](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) - [Read the reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html) - -### Streamlit App - -Serve the functionality provided by Aignostics Python SDK in the web by easily integrating the service into a Streamlit application. - -[Try it out!](https://aignostics.streamlit.app) - [Show the code](https://github.com/aignostics/python-sdk/blob/main/examples/streamlit.py) - -... or serve the app locally -```shell -uv sync --all-extras # Install streamlit dependency part of the examples extra, see pyproject.toml -uv run streamlit run examples/streamlit.py # Serve on localhost:8501, opens browser -``` - +[Show script code](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) - +[Read the reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html) -## Notebooks +## Use in Notebooks ### Jupyter @@ -251,7 +194,9 @@ uv run streamlit run examples/streamlit.py # Serve on localhost:8501, o ```shell uv sync --all-extras # Install dependencies required for examples such as Juypyter kernel, see pyproject.toml ``` -Install the [Jupyter extension for VSCode](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter) + +Install the +[Jupyter extension for VSCode](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter) Click on `examples/notebook.ipynb` in VSCode and run it. @@ -275,105 +220,15 @@ uv run marimo edit examples/notebook.py --watch # Edit on localhost:2718, op ... or edit interactively within VSCode -Install the [Marimo extension for VSCode](https://marketplace.visualstudio.com/items?itemName=marimo-team.vscode-marimo) - -Click on `examples/notebook.py` in VSCode and click on the caret next to the Run icon above the code (looks like a pencil) > "Start in marimo editor" (edit). - -## Command Line Interface (CLI) - -### Run with [uvx](https://docs.astral.sh/uv/guides/tools/) - -Show available commands: - -```shell -uvx aignostics --help -``` - -Execute commands: - -```shell -uvx aignostics hello-world -uvx aignostics echo --help -uvx aignostics echo "Lorem" -uvx aignostics echo "Lorem" --json -uvx aignostics openapi -uvx aignostics openapi --output-format=json -uvx aignostics serve -``` - -### Environment - -The service loads environment variables including support for .env files. - -```shell -cp .env.example .env # copy example file -echo "THE_VAR=MY_VALUE" > .env # overwrite with your values -``` - -Now run the usage examples again. +Install the +[Marimo extension for VSCode](https://marketplace.visualstudio.com/items?itemName=marimo-team.vscode-marimo) -### Run with Docker - -You can as well run the CLI within Docker. - -```shell -docker run helmuthva/aignostics-python-sdk --help -docker run helmuthva/aignostics-python-sdk hello-world -docker run helmuthva/aignostics-python-sdk echo --help -docker run helmuthva/aignostics-python-sdk echo "Lorem" -docker run helmuthva/aignostics-python-sdk echo "Lorem" --json -docker run helmuthva/aignostics-python-sdk openapi -docker run helmuthva/aignostics-python-sdk openapi --output-format=json -docker run helmuthva/aignostics-python-sdk serve -``` - -Execute command: - -```shell -docker run --env THE_VAR=MY_VALUE helmuthva/aignostics-python-sdk echo "Lorem Ipsum" -``` - -Or use docker compose - -The .env is passed through from the host to the Docker container. - -```shell -docker compose run aignostics --help -docker compose run aignostics hello-world -docker compose run aignostics echo --help -docker compose run aignostics echo "Lorem" -docker compose run aignostics echo "Lorem" --json -docker compose run aignostics openapi -docker compose run aignostics openapi --output-format=json -echo "Running Aignostics Python SDK's API container as a daemon ..." -docker compose up -d -echo "Waiting for the API server to start ..." -sleep 5 -echo "Checking health of v1 API ..." -curl http://127.0.0.1:8000/api/v1/healthz -echo "" -echo "Saying hello world with v1 API ..." -curl http://127.0.0.1:8000/api/v1/hello-world -echo "" -echo "Swagger docs of v1 API ..." -curl http://127.0.0.1:8000/api/v1/docs -echo "" -echo "Checking health of v2 API ..." -curl http://127.0.0.1:8000/api/v2/healthz -echo "" -echo "Saying hello world with v1 API ..." -curl http://127.0.0.1:8000/api/v2/hello-world -echo "" -echo "Swagger docs of v2 API ..." -curl http://127.0.0.1:8000/api/v2/docs -echo "" -echo "Shutting down the API container ..." -docker compose down -``` +Click on `examples/notebook.py` in VSCode and click on the caret next to the Run +icon above the code (looks like a pencil) > "Start in marimo editor" (edit). -## Extra: Lorem Ipsum +## API Concepts -Dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam. +TODO (Andreas): Explain API concepts, such as authentication, resources etc.. ## Further Reading From a4b9bb4398522fcd7a0a1f9d10f562bf70795c3b Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 19:57:47 +0200 Subject: [PATCH 060/110] docs(readme): fix typo --- README.md | 2 +- docs/partials/README_main.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 26968dc1..0c18a828 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Python SDK enabling access to aignostics platform. ## Introduction -TODO (Helmut): Cunctionality and features. +TODO (Helmut): Functionality and features. ### Operational Excellence diff --git a/docs/partials/README_main.md b/docs/partials/README_main.md index b86c7df0..086073a9 100644 --- a/docs/partials/README_main.md +++ b/docs/partials/README_main.md @@ -2,7 +2,7 @@ Python SDK enabling access to aignostics platform. ## Introduction -TODO (Helmut): Cunctionality and features. +TODO (Helmut): Functionality and features. ### Operational Excellence From 296f9b7c4214f7d8ec7a9045a7991a466bbdc5cc Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 21:06:31 +0200 Subject: [PATCH 061/110] refactor(settings): move consts to constants --- src/aignostics/__init__.py | 42 ++++++++++++++++++++ src/aignostics/client/_settings.py | 61 ++++++++++++++++++++++-------- src/aignostics/constants.py | 26 +++++++++++++ src/aignostics/platform.py | 19 +++++++--- 4 files changed, 126 insertions(+), 22 deletions(-) diff --git a/src/aignostics/__init__.py b/src/aignostics/__init__.py index c110136a..ff6f960d 100644 --- a/src/aignostics/__init__.py +++ b/src/aignostics/__init__.py @@ -1,6 +1,27 @@ """Python SDK providing access to Aignostics AI services.""" from .constants import ( + API_ROOT_DEV, + API_ROOT_PRODUCTION, + API_ROOT_STAGING, + AUDIENCE_DEV, + AUDIENCE_PRODUCTION, + AUDIENCE_STAGING, + AUTHORIZATION_BASE_URL_DEV, + AUTHORIZATION_BASE_URL_PRODUCTION, + AUTHORIZATION_BASE_URL_STAGING, + DEVICE_URL_DEV, + DEVICE_URL_PRODUCTION, + DEVICE_URL_STAGING, + JWS_JSON_URL_DEV, + JWS_JSON_URL_PRODUCTION, + JWS_JSON_URL_STAGING, + REDIRECT_URI_DEV, + REDIRECT_URI_PRODUCTION, + REDIRECT_URI_STAGING, + TOKEN_URL_DEV, + TOKEN_URL_PRODUCTION, + TOKEN_URL_STAGING, __project_name__, __project_path__, __version__, @@ -11,6 +32,27 @@ from .types import APIVersion, InfoOutputFormat, JsonType, JsonValue, OpenAPIOutputFormat __all__ = [ + "API_ROOT_DEV", + "API_ROOT_PRODUCTION", + "API_ROOT_STAGING", + "AUDIENCE_DEV", + "AUDIENCE_PRODUCTION", + "AUDIENCE_STAGING", + "AUTHORIZATION_BASE_URL_DEV", + "AUTHORIZATION_BASE_URL_PRODUCTION", + "AUTHORIZATION_BASE_URL_STAGING", + "DEVICE_URL_DEV", + "DEVICE_URL_PRODUCTION", + "DEVICE_URL_STAGING", + "JWS_JSON_URL_DEV", + "JWS_JSON_URL_PRODUCTION", + "JWS_JSON_URL_STAGING", + "REDIRECT_URI_DEV", + "REDIRECT_URI_PRODUCTION", + "REDIRECT_URI_STAGING", + "TOKEN_URL_DEV", + "TOKEN_URL_PRODUCTION", + "TOKEN_URL_STAGING", "APIVersion", "Health", "HealthStatus", diff --git a/src/aignostics/client/_settings.py b/src/aignostics/client/_settings.py index 317aeb82..5299a6bf 100644 --- a/src/aignostics/client/_settings.py +++ b/src/aignostics/client/_settings.py @@ -5,9 +5,30 @@ from pydantic import SecretStr, computed_field, model_validator from pydantic_settings import BaseSettings, SettingsConfigDict -from aignostics import __project_name__ - -from ._messages import NOT_YET_IMPLEMENTED, UNKNOWN_ENDPOINT_URL +from aignostics import ( + API_ROOT_PRODUCTION, + AUDIENCE_DEV, + AUDIENCE_PRODUCTION, + AUDIENCE_STAGING, + AUTHORIZATION_BASE_URL_DEV, + AUTHORIZATION_BASE_URL_PRODUCTION, + AUTHORIZATION_BASE_URL_STAGING, + DEVICE_URL_DEV, + DEVICE_URL_PRODUCTION, + DEVICE_URL_STAGING, + JWS_JSON_URL_DEV, + JWS_JSON_URL_PRODUCTION, + JWS_JSON_URL_STAGING, + REDIRECT_URI_DEV, + REDIRECT_URI_PRODUCTION, + REDIRECT_URI_STAGING, + TOKEN_URL_DEV, + TOKEN_URL_PRODUCTION, + TOKEN_URL_STAGING, + __project_name__, +) + +from ._messages import UNKNOWN_ENDPOINT_URL class AuthenticationSettings(BaseSettings): @@ -23,7 +44,7 @@ class AuthenticationSettings(BaseSettings): client_id_device: SecretStr client_id_interactive: SecretStr - api_root: str = "https://platform.aignostics.com" + api_root: str = API_ROOT_PRODUCTION scope: str = "offline_access" @@ -56,22 +77,30 @@ def token_file(self) -> Path: @model_validator(mode="before") def pre_init(cls, values): # type: ignore[no-untyped-def] # noqa: ANN001, ANN202, N805 # See https://github.com/pydantic/pydantic/issues/9789 - api_root = values.get("api_root", "https://platform.aignostics.com") - print(api_root) + api_root = values.get("api_root", API_ROOT_PRODUCTION) match api_root: case "https://platform.aignostics.com": # TODO (Andreas): hhva: please fill in - raise RuntimeError(NOT_YET_IMPLEMENTED) - case "http://platform-staging.aignostics.com": - # TODO (Andreas): hhva: please fill in - raise RuntimeError(NOT_YET_IMPLEMENTED) + values["audience"] = AUDIENCE_PRODUCTION + values["authorization_base_url"] = AUTHORIZATION_BASE_URL_PRODUCTION + values["token_url"] = TOKEN_URL_PRODUCTION + values["redirect_uri"] = REDIRECT_URI_PRODUCTION + values["device_url"] = DEVICE_URL_PRODUCTION + values["jws_json_url"] = JWS_JSON_URL_PRODUCTION + case "https://platform-staging.aignostics.com": + values["audience"] = AUDIENCE_STAGING + values["authorization_base_url"] = AUTHORIZATION_BASE_URL_STAGING + values["token_url"] = TOKEN_URL_STAGING + values["redirect_uri"] = REDIRECT_URI_STAGING + values["device_url"] = DEVICE_URL_STAGING + values["jws_json_url"] = JWS_JSON_URL_STAGING case "https://platform-dev.aignostics.com": - values["audience"] = "https://dev-8ouohmmrbuh2h4vu-samia" - values["authorization_base_url"] = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize" - values["token_url"] = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" # noqa: S105 - values["redirect_uri"] = "http://localhost:8080/" - values["device_url"] = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/device/code" - values["jws_json_url"] = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/.well-known/jwks.json" + values["audience"] = AUDIENCE_DEV + values["authorization_base_url"] = AUTHORIZATION_BASE_URL_DEV + values["token_url"] = TOKEN_URL_DEV + values["redirect_uri"] = REDIRECT_URI_DEV + values["device_url"] = DEVICE_URL_DEV + values["jws_json_url"] = JWS_JSON_URL_DEV case _: raise ValueError(UNKNOWN_ENDPOINT_URL) diff --git a/src/aignostics/constants.py b/src/aignostics/constants.py index f4fd1aaf..c24dea72 100644 --- a/src/aignostics/constants.py +++ b/src/aignostics/constants.py @@ -6,3 +6,29 @@ __project_name__ = __name__.split(".")[0] __project_path__ = str(pathlib.Path(__file__).parent.parent.parent) __version__ = importlib.metadata.version(__project_name__) + +API_ROOT_PRODUCTION = "https://platform.aignostics.com" +# TODO (Andreas): hhva: please fill in +AUDIENCE_PRODUCTION = "https://todo" +AUTHORIZATION_BASE_URL_PRODUCTION = "https://todo" +TOKEN_URL_PRODUCTION = "https://todo" # noqa: S105 +REDIRECT_URI_PRODUCTION = "https://todo" +DEVICE_URL_PRODUCTION = "https://todo" +JWS_JSON_URL_PRODUCTION = "https://todo" + +API_ROOT_STAGING = "https://platform-staging.aignostics.com" +# TODO (Andreas): hhva: please fill in +AUDIENCE_STAGING = "https://todo" +AUTHORIZATION_BASE_URL_STAGING = "https://todo" +TOKEN_URL_STAGING = "https://todo" # noqa: S105 +REDIRECT_URI_STAGING = "https://todo" +DEVICE_URL_STAGING = "https://todo" +JWS_JSON_URL_STAGING = "https://todo" + +API_ROOT_DEV = "https://platform-dev.aignostics.com" +AUDIENCE_DEV = "https://dev-8ouohmmrbuh2h4vu-samia" +AUTHORIZATION_BASE_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize" +TOKEN_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" # noqa: S105 +REDIRECT_URI_DEV = "http://localhost:8080/" +DEVICE_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/device/code" +JWS_JSON_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/.well-known/jwks.json" diff --git a/src/aignostics/platform.py b/src/aignostics/platform.py index d66054d2..a2e4467c 100644 --- a/src/aignostics/platform.py +++ b/src/aignostics/platform.py @@ -11,7 +11,14 @@ from . import OpenAPISchemaError from .client import authentication_settings -from .constants import __project_name__, __project_path__, __version__ +from .constants import ( + API_ROOT_DEV, + API_ROOT_PRODUCTION, + API_ROOT_STAGING, + __project_name__, + __project_path__, + __version__, +) from .settings import Settings from .types import JsonType @@ -88,14 +95,14 @@ def info(self, env: bool = True, filter_secrets: bool = True) -> dict[str, Any]: }, "remote": { "platform": { - "dev": { - "API_ROOT": "https://platform-dev.aignostics.com", + "production": { + "API_ROOT": API_ROOT_PRODUCTION, }, "staging": { - "API_ROOT": "https://patform-staging.aignostics.com", + "API_ROOT": API_ROOT_STAGING, }, - "production": { - "API_ROOT": "https://platform.aignostics.com", + "dev": { + "API_ROOT": API_ROOT_DEV, }, } }, From 61115950d64870f3a54ba6b4ab3f3ae47ae8b5a5 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 21:08:39 +0200 Subject: [PATCH 062/110] chore(deps): update from template --- .copier-answers.yml | 2 +- README.md | 4 +++- docs/partials/README_footer.md | 4 +++- src/aignostics/client/_settings.py | 1 - 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index f2ddd791..c7bc969f 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.8.31 +_commit: v0.8.32 _src_path: gh:helmut-hoffer-von-ankershoffen/oe-python-template attestations_enabled: false author_email: helmut@aignostics.com diff --git a/README.md b/README.md index 0c18a828..f5a356eb 100644 --- a/README.md +++ b/README.md @@ -234,8 +234,10 @@ TODO (Andreas): Explain API concepts, such as authentication, resources etc.. ## Further Reading * Inspect our [security policy](https://aignostics.readthedocs.io/en/latest/security.html) with detailed documentation of checks, tools and principles. +* Check out the [CLI Reference](https://aignostics.readthedocs.io/en/latest/cli_reference.html) with detailed documentation of all CLI commands and options. +* Check out the [Library Reference](https://aignostics.readthedocs.io/en/latest/lib_reference.html) with detailed documentation of public classes and functions. +* Check out the [API Reference](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) with detailed documentation of all API operations and parameters. * Our [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) provide a complete log of recent improvements and changes. -* Check out the [reference](https://aignostics.readthedocs.io/en/latest/reference.html) with detailed documentation of public classes and functions. * In case you want to help us improve 🔬 Aignostics Python SDK: The [contribution guidelines](https://aignostics.readthedocs.io/en/latest/contributing.html) explain how to setup your development environment and create pull requests. * We gratefully acknowledge the [open source projects](ATTRIBUTIONS.md) that this project builds upon. Thank you to all these wonderful contributors! diff --git a/docs/partials/README_footer.md b/docs/partials/README_footer.md index cfd1d4bc..09426467 100644 --- a/docs/partials/README_footer.md +++ b/docs/partials/README_footer.md @@ -1,8 +1,10 @@ ## Further Reading * Inspect our [security policy](https://aignostics.readthedocs.io/en/latest/security.html) with detailed documentation of checks, tools and principles. +* Check out the [CLI Reference](https://aignostics.readthedocs.io/en/latest/cli_reference.html) with detailed documentation of all CLI commands and options. +* Check out the [Library Reference](https://aignostics.readthedocs.io/en/latest/lib_reference.html) with detailed documentation of public classes and functions. +* Check out the [API Reference](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) with detailed documentation of all API operations and parameters. * Our [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) provide a complete log of recent improvements and changes. -* Check out the [reference](https://aignostics.readthedocs.io/en/latest/reference.html) with detailed documentation of public classes and functions. * In case you want to help us improve 🔬 Aignostics Python SDK: The [contribution guidelines](https://aignostics.readthedocs.io/en/latest/contributing.html) explain how to setup your development environment and create pull requests. * We gratefully acknowledge the [open source projects](ATTRIBUTIONS.md) that this project builds upon. Thank you to all these wonderful contributors! diff --git a/src/aignostics/client/_settings.py b/src/aignostics/client/_settings.py index 5299a6bf..ef33e338 100644 --- a/src/aignostics/client/_settings.py +++ b/src/aignostics/client/_settings.py @@ -80,7 +80,6 @@ def pre_init(cls, values): # type: ignore[no-untyped-def] # noqa: ANN001, ANN2 api_root = values.get("api_root", API_ROOT_PRODUCTION) match api_root: case "https://platform.aignostics.com": - # TODO (Andreas): hhva: please fill in values["audience"] = AUDIENCE_PRODUCTION values["authorization_base_url"] = AUTHORIZATION_BASE_URL_PRODUCTION values["token_url"] = TOKEN_URL_PRODUCTION From a43be099eeb4d92ed4912da2280e307ba01d1981 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 21:36:51 +0200 Subject: [PATCH 063/110] refactor(sonarqube): some --- .copier-answers.yml | 2 +- noxfile.py | 78 ++++++++++++-------- src/aignostics/client/_authentication.py | 5 -- src/aignostics/constants.py | 25 ++++--- tests/aignostics/client/applications_test.py | 10 ++- 5 files changed, 66 insertions(+), 54 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index c7bc969f..ba03dfcb 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.8.32 +_commit: v0.8.33 _src_path: gh:helmut-hoffer-von-ankershoffen/oe-python-template attestations_enabled: false author_email: helmut@aignostics.com diff --git a/noxfile.py b/noxfile.py index 49912e50..b7bf0f53 100644 --- a/noxfile.py +++ b/noxfile.py @@ -178,48 +178,62 @@ def _generate_attributions(session: nox.Session, licenses_json_path: Path) -> No attributions += "This project includes code from the following third-party open source projects:\n\n" for pkg in licenses_data: - name = pkg.get("Name", "Unknown") - version = pkg.get("Version", "Unknown") - license_name = pkg.get("License", "Unknown") - authors = pkg.get("Author", "Unknown") - maintainers = pkg.get("Maintainer", "") - url = pkg.get("URL", "") - description = pkg.get("Description", "") + attributions += _format_package_attribution(pkg) - attributions += f"## {name} ({version}) - {license_name}\n\n" + attributions = attributions.rstrip() + "\n" + Path("ATTRIBUTIONS.md").write_text(attributions, encoding="utf-8") - if description: - attributions += f"{description}\n\n" + session.log("Generated ATTRIBUTIONS.md file") - if url: - attributions += f"* URL: {url}\n" - if authors and authors != "UNKNOWN": - attributions += f"* Author(s): {authors}\n" +def _format_package_attribution(pkg: dict) -> str: + """Format attribution for a single package. - if maintainers and maintainers != "UNKNOWN": - attributions += f"* Maintainer(s): {maintainers}\n" + Args: + pkg: Package information dictionary - attributions += "\n" + Returns: + str: Formatted attribution text for the package + """ + name = pkg.get("Name", "Unknown") + version = pkg.get("Version", "Unknown") + license_name = pkg.get("License", "Unknown") + authors = pkg.get("Author", "Unknown") + maintainers = pkg.get("Maintainer", "") + url = pkg.get("URL", "") + description = pkg.get("Description", "") - license_text = pkg.get("LicenseText", "") - if license_text and license_text != "UNKNOWN": - attributions += "### License Text\n\n" - # Sanitize backtick sequences to not escape the code block - sanitized_license_text = license_text.replace("```", "~~~") - attributions += f"```\n{sanitized_license_text}\n```\n\n" + attribution = f"## {name} ({version}) - {license_name}\n\n" - notice_text = pkg.get("NoticeText", "") - if notice_text and notice_text != "UNKNOWN": - attributions += "### Notice\n\n" - # Sanitize backtick sequences to not escape the code block - sanitized_notice_text = notice_text.replace("```", "~~~") - attributions += f"```\n{sanitized_notice_text}\n```\n\n" + if description: + attribution += f"{description}\n\n" - attributions = attributions.rstrip() + "\n" - Path("ATTRIBUTIONS.md").write_text(attributions, encoding="utf-8") + if url: + attribution += f"* URL: {url}\n" - session.log("Generated ATTRIBUTIONS.md file") + if authors and authors != "UNKNOWN": + attribution += f"* Author(s): {authors}\n" + + if maintainers and maintainers != "UNKNOWN": + attribution += f"* Maintainer(s): {maintainers}\n" + + attribution += "\n" + + license_text = pkg.get("LicenseText", "") + if license_text and license_text != "UNKNOWN": + attribution += "### License Text\n\n" + # Sanitize backtick sequences to not escape the code block + sanitized_license_text = license_text.replace("```", "~~~") + attribution += f"```\n{sanitized_license_text}\n```\n\n" + + notice_text = pkg.get("NoticeText", "") + if notice_text and notice_text != "UNKNOWN": + attribution += "### Notice\n\n" + # Sanitize backtick sequences to not escape the code block + sanitized_notice_text = notice_text.replace("```", "~~~") + attribution += f"```\n{sanitized_notice_text}\n```\n\n" + + return attribution def _generate_readme(session: nox.Session) -> None: diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 55615177..c228ed18 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -165,11 +165,6 @@ def do_GET(self) -> None: # noqa: N802 parsed = parse.urlparse(self.path) qs = parse.parse_qs(parsed.query) - response = b""" - - {status} - """ - # see if auth was successful # TODO(Andreas): The base server does not have .error or .error_description. Was this tested? if "error" in qs: diff --git a/src/aignostics/constants.py b/src/aignostics/constants.py index c24dea72..86848ad0 100644 --- a/src/aignostics/constants.py +++ b/src/aignostics/constants.py @@ -7,23 +7,24 @@ __project_path__ = str(pathlib.Path(__file__).parent.parent.parent) __version__ = importlib.metadata.version(__project_name__) +TODO_URL = "https://todo" API_ROOT_PRODUCTION = "https://platform.aignostics.com" # TODO (Andreas): hhva: please fill in -AUDIENCE_PRODUCTION = "https://todo" -AUTHORIZATION_BASE_URL_PRODUCTION = "https://todo" -TOKEN_URL_PRODUCTION = "https://todo" # noqa: S105 -REDIRECT_URI_PRODUCTION = "https://todo" -DEVICE_URL_PRODUCTION = "https://todo" -JWS_JSON_URL_PRODUCTION = "https://todo" +AUDIENCE_PRODUCTION = TODO_URL +AUTHORIZATION_BASE_URL_PRODUCTION = TODO_URL +TOKEN_URL_PRODUCTION = TODO_URL +REDIRECT_URI_PRODUCTION = TODO_URL +DEVICE_URL_PRODUCTION = TODO_URL +JWS_JSON_URL_PRODUCTION = TODO_URL API_ROOT_STAGING = "https://platform-staging.aignostics.com" # TODO (Andreas): hhva: please fill in -AUDIENCE_STAGING = "https://todo" -AUTHORIZATION_BASE_URL_STAGING = "https://todo" -TOKEN_URL_STAGING = "https://todo" # noqa: S105 -REDIRECT_URI_STAGING = "https://todo" -DEVICE_URL_STAGING = "https://todo" -JWS_JSON_URL_STAGING = "https://todo" +AUDIENCE_STAGING = TODO_URL +AUTHORIZATION_BASE_URL_STAGING = TODO_URL +TOKEN_URL_STAGING = TODO_URL +REDIRECT_URI_STAGING = TODO_URL +DEVICE_URL_STAGING = TODO_URL +JWS_JSON_URL_STAGING = TODO_URL API_ROOT_DEV = "https://platform-dev.aignostics.com" AUDIENCE_DEV = "https://dev-8ouohmmrbuh2h4vu-samia" diff --git a/tests/aignostics/client/applications_test.py b/tests/aignostics/client/applications_test.py index 3c26a813..9242a6e2 100644 --- a/tests/aignostics/client/applications_test.py +++ b/tests/aignostics/client/applications_test.py @@ -13,6 +13,8 @@ from aignostics.client.resources.applications import Applications, Versions +API_ERROR = "API error" + @pytest.fixture def mock_api() -> Mock: @@ -87,10 +89,10 @@ def test_applications_list_passes_through_api_exception(applications, mock_api) mock_api: Mock ExternalsApi instance. """ # Arrange - mock_api.list_applications_v1_applications_get.side_effect = Exception("API error") + mock_api.list_applications_v1_applications_get.side_effect = Exception(API_ERROR) # Act & Assert - with pytest.raises(Exception, match="API error"): + with pytest.raises(Exception, match=API_ERROR): applications.list() mock_api.list_applications_v1_applications_get.assert_called_once() @@ -168,9 +170,9 @@ def test_versions_list_passes_through_api_exception(mock_api) -> None: mock_app = Mock(spec=ApplicationReadResponse) mock_app.application_id = "test-app-id" mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.side_effect = Exception( - "API error" + API_ERROR ) # Act & Assert - with pytest.raises(Exception, match="API error"): + with pytest.raises(Exception, match=API_ERROR): versions.list(for_application=mock_app) From 39140766aa469f7aa5ced50b71f5634ac4e0ed92 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 21:45:32 +0200 Subject: [PATCH 064/110] chore(test): fix double run --- noxfile.py | 1 - 1 file changed, 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index b7bf0f53..bbd672b7 100644 --- a/noxfile.py +++ b/noxfile.py @@ -469,7 +469,6 @@ def test(session: nox.Session) -> None: if _is_act_environment(): pytest_args.extend(["-k", NOT_SKIP_WITH_ACT]) session.run(*pytest_args) - session.run(*pytest_args) @nox.session(python=["3.13"], default=False) From d91d1e5c4db16437aefa4e073e64f36b4c156767 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 21:54:16 +0200 Subject: [PATCH 065/110] refactor(client): use named groups in regexp --- src/aignostics/client/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/aignostics/client/utils.py b/src/aignostics/client/utils.py index 386dc058..1237ecb9 100644 --- a/src/aignostics/client/utils.py +++ b/src/aignostics/client/utils.py @@ -99,8 +99,8 @@ def _generate_signed_url(fully_qualified_gs_path: str) -> str: if not m: msg = "Invalid google storage URI" raise ValueError(msg) - bucket_name = m.group(1) - path = m.group(2) + bucket_name = m.group("bucket_name") + path = m.group("path") storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) From 809a772ff08da9a9f223641c9b415138304f1473 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 21:59:47 +0200 Subject: [PATCH 066/110] test(cli): check all commands can be called --- tests/aignostics/cli/core_test.py | 96 ++++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/tests/aignostics/cli/core_test.py b/tests/aignostics/cli/core_test.py index 6fda8778..f2839c47 100644 --- a/tests/aignostics/cli/core_test.py +++ b/tests/aignostics/cli/core_test.py @@ -34,7 +34,7 @@ def test_cli_health(runner: CliRunner) -> None: def test_cli_info(runner: CliRunner) -> None: - """Check health is true.""" + """Check info command returns system information.""" result = runner.invoke(cli, ["platform", "info"]) assert result.exit_code == 0 assert "CPython" in result.output @@ -58,3 +58,97 @@ def test_cli_openapi_json(runner: CliRunner) -> None: assert '"openapi":' in result.output assert '"info":' in result.output assert '"paths":' in result.output + + +def test_cli_install(runner: CliRunner) -> None: + """Check install command runs successfully.""" + result = runner.invoke(cli, ["platform", "install"]) + assert result.exit_code == 0 + + +def test_cli_bucket_ls(runner: CliRunner) -> None: + """Check bucket ls command runs successfully.""" + result = runner.invoke(cli, ["platform", "bucket", "ls"]) + assert result.exit_code == 0 + assert "bucket ls" in result.output + + +def test_cli_bucket_purge(runner: CliRunner) -> None: + """Check bucket purge command runs successfully.""" + result = runner.invoke(cli, ["platform", "bucket", "purge"]) + assert result.exit_code == 0 + assert "bucket purged" in result.output + + +def test_cli_application_list(runner: CliRunner) -> None: + """Check application list command runs successfully.""" + result = runner.invoke(cli, ["application", "list"]) + assert result.exit_code == 0 + + +def test_cli_application_describe(runner: CliRunner) -> None: + """Check application describe command runs successfully.""" + result = runner.invoke(cli, ["application", "describe"]) + assert result.exit_code == 0 + + +def test_cli_dataset_download(runner: CliRunner) -> None: + """Check dataset download command runs successfully.""" + result = runner.invoke(cli, ["application", "dataset", "download"]) + assert result.exit_code == 0 + assert "dataset download" in result.output + + +def test_cli_metadata_generate(runner: CliRunner) -> None: + """Check metadata generate command runs successfully.""" + result = runner.invoke(cli, ["application", "metadata", "generate"]) + assert result.exit_code == 0 + assert "generate metadata" in result.output + + +def test_cli_run_submit(runner: CliRunner) -> None: + """Check run submit command runs successfully.""" + result = runner.invoke(cli, ["application", "run", "submit"]) + assert result.exit_code == 0 + assert "submit run" in result.output + + +def test_cli_run_list(runner: CliRunner) -> None: + """Check run list command runs successfully.""" + result = runner.invoke(cli, ["application", "run", "list"]) + assert result.exit_code == 0 + + +def test_cli_run_describe(runner: CliRunner) -> None: + """Check run describe command runs successfully.""" + result = runner.invoke(cli, ["application", "run", "describe"]) + assert result.exit_code == 0 + assert "The run" in result.output + + +def test_cli_run_cancel(runner: CliRunner) -> None: + """Check run cancel command runs successfully.""" + result = runner.invoke(cli, ["application", "run", "cancel"]) + assert result.exit_code == 0 + assert "canceled run" in result.output + + +def test_cli_run_result_describe(runner: CliRunner) -> None: + """Check run result describe command runs successfully.""" + result = runner.invoke(cli, ["application", "run", "result", "describe"]) + assert result.exit_code == 0 + assert "describe result" in result.output + + +def test_cli_run_result_download(runner: CliRunner) -> None: + """Check run result download command runs successfully.""" + result = runner.invoke(cli, ["application", "run", "result", "download"]) + assert result.exit_code == 0 + assert "download result" in result.output + + +def test_cli_run_result_delete(runner: CliRunner) -> None: + """Check run result delete command runs successfully.""" + result = runner.invoke(cli, ["application", "run", "result", "delete"]) + assert result.exit_code == 0 + assert "delete resuilt" in result.output From 1f9dcb6e25ff0eb620aaaf7c58f9d102e7f7cd79 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 22:07:17 +0200 Subject: [PATCH 067/110] test(settings): unit tests --- tests/aignostics/client/settings_test.py | 213 +++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 tests/aignostics/client/settings_test.py diff --git a/tests/aignostics/client/settings_test.py b/tests/aignostics/client/settings_test.py new file mode 100644 index 00000000..e054ee56 --- /dev/null +++ b/tests/aignostics/client/settings_test.py @@ -0,0 +1,213 @@ +"""Tests for authentication settings module.""" + +import os +from pathlib import Path +from unittest import mock + +import appdirs +import pytest +from pydantic import SecretStr + +from aignostics import ( + API_ROOT_DEV, + API_ROOT_PRODUCTION, + API_ROOT_STAGING, + AUDIENCE_DEV, + AUDIENCE_PRODUCTION, + AUDIENCE_STAGING, + AUTHORIZATION_BASE_URL_DEV, + AUTHORIZATION_BASE_URL_PRODUCTION, + AUTHORIZATION_BASE_URL_STAGING, + DEVICE_URL_DEV, + DEVICE_URL_PRODUCTION, + DEVICE_URL_STAGING, + JWS_JSON_URL_DEV, + JWS_JSON_URL_PRODUCTION, + JWS_JSON_URL_STAGING, + REDIRECT_URI_DEV, + REDIRECT_URI_PRODUCTION, + REDIRECT_URI_STAGING, + TOKEN_URL_DEV, + TOKEN_URL_PRODUCTION, + TOKEN_URL_STAGING, + __project_name__, +) +from aignostics.client._messages import UNKNOWN_ENDPOINT_URL +from aignostics.client._settings import AuthenticationSettings, authentication_settings + + +@pytest.fixture +def mock_env_vars(): + """Mock environment variables required for settings.""" + with mock.patch.dict( + os.environ, + { + f"{__project_name__.upper()}_CLIENT_ID_DEVICE": "test-client-id-device", + f"{__project_name__.upper()}_CLIENT_ID_INTERACTIVE": "test-client-id-interactive", + }, + ): + yield + + +@pytest.fixture +def reset_cached_settings(): + """Reset the cached authentication settings.""" + from aignostics.client._settings import __cached_authentication_settings + + # Store original + original = __cached_authentication_settings + + # Reset for test + from aignostics.client import _settings + + _settings.__cached_authentication_settings = None + + yield + + # Restore original + _settings.__cached_authentication_settings = original + + +def test_authentication_settings_production(mock_env_vars, reset_cached_settings): + """Test authentication settings with production API root.""" + # Create settings with production API root + settings = AuthenticationSettings( + client_id_device=SecretStr("test-client-id-device"), + client_id_interactive=SecretStr("test-client-id-interactive"), + api_root=API_ROOT_PRODUCTION, + ) + + # Validate production-specific settings + assert settings.api_root == API_ROOT_PRODUCTION + assert settings.audience == AUDIENCE_PRODUCTION + assert settings.authorization_base_url == AUTHORIZATION_BASE_URL_PRODUCTION + assert settings.token_url == TOKEN_URL_PRODUCTION + assert settings.redirect_uri == REDIRECT_URI_PRODUCTION + assert settings.device_url == DEVICE_URL_PRODUCTION + assert settings.jws_json_url == JWS_JSON_URL_PRODUCTION + + # Test other properties + assert settings.scope == "offline_access" + assert settings.scope_elements == ["offline_access"] + assert settings.cache_dir == appdirs.user_cache_dir(__project_name__) + assert settings.token_file == Path(settings.cache_dir) / ".token" + assert settings.request_timeout_seconds == 30 + assert settings.authorization_backoff_seconds == 3 + + +def test_authentication_settings_staging(mock_env_vars): + """Test authentication settings with staging API root.""" + settings = AuthenticationSettings( + client_id_device=SecretStr("test-client-id-device"), + client_id_interactive=SecretStr("test-client-id-interactive"), + api_root=API_ROOT_STAGING, + ) + + assert settings.api_root == API_ROOT_STAGING + assert settings.audience == AUDIENCE_STAGING + assert settings.authorization_base_url == AUTHORIZATION_BASE_URL_STAGING + assert settings.token_url == TOKEN_URL_STAGING + assert settings.redirect_uri == REDIRECT_URI_STAGING + assert settings.device_url == DEVICE_URL_STAGING + assert settings.jws_json_url == JWS_JSON_URL_STAGING + + +def test_authentication_settings_dev(mock_env_vars): + """Test authentication settings with dev API root.""" + settings = AuthenticationSettings( + client_id_device=SecretStr("test-client-id-device"), + client_id_interactive=SecretStr("test-client-id-interactive"), + api_root=API_ROOT_DEV, + ) + + assert settings.api_root == API_ROOT_DEV + assert settings.audience == AUDIENCE_DEV + assert settings.authorization_base_url == AUTHORIZATION_BASE_URL_DEV + assert settings.token_url == TOKEN_URL_DEV + assert settings.redirect_uri == REDIRECT_URI_DEV + assert settings.device_url == DEVICE_URL_DEV + assert settings.jws_json_url == JWS_JSON_URL_DEV + + +def test_authentication_settings_unknown_api_root(mock_env_vars): + """Test authentication settings with unknown API root raises ValueError.""" + with pytest.raises(ValueError, match=UNKNOWN_ENDPOINT_URL): + AuthenticationSettings( + client_id_device=SecretStr("test-client-id-device"), + client_id_interactive=SecretStr("test-client-id-interactive"), + api_root="https://unknown.example.com", + ) + + +def test_scope_elements_empty(): + """Test scope_elements property with empty scope.""" + settings = AuthenticationSettings( + client_id_device=SecretStr("test-client-id-device"), + client_id_interactive=SecretStr("test-client-id-interactive"), + scope="", + api_root=API_ROOT_PRODUCTION, + ) + assert settings.scope_elements == [] + + +def test_scope_elements_multiple(): + """Test scope_elements property with multiple scopes.""" + settings = AuthenticationSettings( + client_id_device=SecretStr("test-client-id-device"), + client_id_interactive=SecretStr("test-client-id-interactive"), + scope="offline_access, profile, email", + api_root=API_ROOT_PRODUCTION, + ) + assert settings.scope_elements == ["offline_access", "profile", "email"] + + +def test_authentication_settings_with_refresh_token(mock_env_vars): + """Test authentication settings with refresh token.""" + settings = AuthenticationSettings( + client_id_device=SecretStr("test-client-id-device"), + client_id_interactive=SecretStr("test-client-id-interactive"), + refresh_token=SecretStr("test-refresh-token"), + api_root=API_ROOT_PRODUCTION, + ) + assert settings.refresh_token == SecretStr("test-refresh-token") + + +def test_lazy_authentication_settings(mock_env_vars, reset_cached_settings): + """Test lazy loading of authentication settings.""" + # First call should create the settings + settings1 = authentication_settings() + assert settings1 is not None + + # Second call should return the same instance + settings2 = authentication_settings() + assert settings2 is settings1 + + +def test_authentication_settings_with_env_vars(mock_env_vars, reset_cached_settings): + """Test authentication settings from environment variables.""" + settings = authentication_settings() + assert settings.client_id_device.get_secret_value() == "test-client-id-device" + assert settings.client_id_interactive.get_secret_value() == "test-client-id-interactive" + + +# TODO(Helmut): fixme +@pytest.mark.skip +def test_custom_env_file_location(mock_env_vars): + """Test custom env file location.""" + custom_env_file = "/tmp/test_env_file" + with mock.patch.dict(os.environ, {f"{__project_name__.upper()}_ENV_FILE": custom_env_file}): + settings = AuthenticationSettings.model_config + assert custom_env_file in settings["env_file"] + + +def test_custom_cache_dir(mock_env_vars): + """Test custom cache directory.""" + custom_cache_dir = "/tmp/test_cache_dir" + settings = AuthenticationSettings( + client_id_device=SecretStr("test-client-id-device"), + client_id_interactive=SecretStr("test-client-id-interactive"), + cache_dir=custom_cache_dir, + api_root=API_ROOT_PRODUCTION, + ) + assert settings.cache_dir == custom_cache_dir + assert settings.token_file == Path(custom_cache_dir) / ".token" From a7d717ae3f49353924907a38095eec4d1c7ea953 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 22:16:43 +0200 Subject: [PATCH 068/110] fix(lint): in new tests --- src/aignostics/cli.py | 4 ++-- tests/aignostics/client/settings_test.py | 30 ++++++++++++------------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index a295aef3..c3579bf2 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -170,5 +170,5 @@ def result_delete() -> None: prepare_cli(cli, f"🔬 Aignostics Python SDK v{__version__} - built with love in Berlin 🐻") -if __name__ == "__main__": - cli() +if __name__ == "__main__": # pragma: no cover + cli() # pragma: no cover diff --git a/tests/aignostics/client/settings_test.py b/tests/aignostics/client/settings_test.py index e054ee56..1254ce7b 100644 --- a/tests/aignostics/client/settings_test.py +++ b/tests/aignostics/client/settings_test.py @@ -37,7 +37,7 @@ @pytest.fixture -def mock_env_vars(): +def mock_env_vars(): # noqa: ANN201 """Mock environment variables required for settings.""" with mock.patch.dict( os.environ, @@ -50,7 +50,7 @@ def mock_env_vars(): @pytest.fixture -def reset_cached_settings(): +def reset_cached_settings(): # noqa: ANN201 """Reset the cached authentication settings.""" from aignostics.client._settings import __cached_authentication_settings @@ -68,7 +68,7 @@ def reset_cached_settings(): _settings.__cached_authentication_settings = original -def test_authentication_settings_production(mock_env_vars, reset_cached_settings): +def test_authentication_settings_production(mock_env_vars, reset_cached_settings) -> None: """Test authentication settings with production API root.""" # Create settings with production API root settings = AuthenticationSettings( @@ -95,7 +95,7 @@ def test_authentication_settings_production(mock_env_vars, reset_cached_settings assert settings.authorization_backoff_seconds == 3 -def test_authentication_settings_staging(mock_env_vars): +def test_authentication_settings_staging(mock_env_vars) -> None: """Test authentication settings with staging API root.""" settings = AuthenticationSettings( client_id_device=SecretStr("test-client-id-device"), @@ -112,7 +112,7 @@ def test_authentication_settings_staging(mock_env_vars): assert settings.jws_json_url == JWS_JSON_URL_STAGING -def test_authentication_settings_dev(mock_env_vars): +def test_authentication_settings_dev(mock_env_vars) -> None: """Test authentication settings with dev API root.""" settings = AuthenticationSettings( client_id_device=SecretStr("test-client-id-device"), @@ -129,7 +129,7 @@ def test_authentication_settings_dev(mock_env_vars): assert settings.jws_json_url == JWS_JSON_URL_DEV -def test_authentication_settings_unknown_api_root(mock_env_vars): +def test_authentication_settings_unknown_api_root(mock_env_vars) -> None: """Test authentication settings with unknown API root raises ValueError.""" with pytest.raises(ValueError, match=UNKNOWN_ENDPOINT_URL): AuthenticationSettings( @@ -139,7 +139,7 @@ def test_authentication_settings_unknown_api_root(mock_env_vars): ) -def test_scope_elements_empty(): +def test_scope_elements_empty() -> None: """Test scope_elements property with empty scope.""" settings = AuthenticationSettings( client_id_device=SecretStr("test-client-id-device"), @@ -150,7 +150,7 @@ def test_scope_elements_empty(): assert settings.scope_elements == [] -def test_scope_elements_multiple(): +def test_scope_elements_multiple() -> None: """Test scope_elements property with multiple scopes.""" settings = AuthenticationSettings( client_id_device=SecretStr("test-client-id-device"), @@ -161,7 +161,7 @@ def test_scope_elements_multiple(): assert settings.scope_elements == ["offline_access", "profile", "email"] -def test_authentication_settings_with_refresh_token(mock_env_vars): +def test_authentication_settings_with_refresh_token(mock_env_vars) -> None: """Test authentication settings with refresh token.""" settings = AuthenticationSettings( client_id_device=SecretStr("test-client-id-device"), @@ -172,7 +172,7 @@ def test_authentication_settings_with_refresh_token(mock_env_vars): assert settings.refresh_token == SecretStr("test-refresh-token") -def test_lazy_authentication_settings(mock_env_vars, reset_cached_settings): +def test_lazy_authentication_settings(mock_env_vars, reset_cached_settings) -> None: """Test lazy loading of authentication settings.""" # First call should create the settings settings1 = authentication_settings() @@ -183,7 +183,7 @@ def test_lazy_authentication_settings(mock_env_vars, reset_cached_settings): assert settings2 is settings1 -def test_authentication_settings_with_env_vars(mock_env_vars, reset_cached_settings): +def test_authentication_settings_with_env_vars(mock_env_vars, reset_cached_settings) -> None: """Test authentication settings from environment variables.""" settings = authentication_settings() assert settings.client_id_device.get_secret_value() == "test-client-id-device" @@ -192,17 +192,17 @@ def test_authentication_settings_with_env_vars(mock_env_vars, reset_cached_setti # TODO(Helmut): fixme @pytest.mark.skip -def test_custom_env_file_location(mock_env_vars): +def test_custom_env_file_location(mock_env_vars) -> None: """Test custom env file location.""" - custom_env_file = "/tmp/test_env_file" + custom_env_file = "/tmp/test_env_file" # noqa: S108 with mock.patch.dict(os.environ, {f"{__project_name__.upper()}_ENV_FILE": custom_env_file}): settings = AuthenticationSettings.model_config assert custom_env_file in settings["env_file"] -def test_custom_cache_dir(mock_env_vars): +def test_custom_cache_dir(mock_env_vars) -> None: """Test custom cache directory.""" - custom_cache_dir = "/tmp/test_cache_dir" + custom_cache_dir = "/tmp/test_cache_dir" # noqa: S108 settings = AuthenticationSettings( client_id_device=SecretStr("test-client-id-device"), client_id_interactive=SecretStr("test-client-id-interactive"), From 67fd59221e35c203b60229b6ddfa18bf2f12fa9a Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 22:28:04 +0200 Subject: [PATCH 069/110] feat(cli): show process info as part of platform info --- src/aignostics/platform.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/aignostics/platform.py b/src/aignostics/platform.py index a2e4467c..df291cc8 100644 --- a/src/aignostics/platform.py +++ b/src/aignostics/platform.py @@ -21,6 +21,7 @@ ) from .settings import Settings from .types import JsonType +from .utils.process import get_process_info load_dotenv() @@ -73,6 +74,7 @@ def info(self, env: bool = True, filter_secrets: bool = True) -> dict[str, Any]: "interpreter_path": sys.executable, "command_line": " ".join(sys.argv), "entry_point": sys.argv[0] if sys.argv else None, + "process_info": json.loads(get_process_info().model_dump_json()), }, "platform": { "os": { From aad5902dcc747ad3a0274e3bceeb69583afb75c4 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 22:31:02 +0200 Subject: [PATCH 070/110] feat(cli): themed console --- src/aignostics/cli.py | 40 ++++++++++++++++++------------------- src/aignostics/utils/cli.py | 5 +++-- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index c3579bf2..8936a522 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -4,14 +4,12 @@ import typer import yaml -from rich.console import Console import aignostics.client from . import APIVersion, InfoOutputFormat, OpenAPIOutputFormat, Platform, __version__ -from .utils import prepare_cli +from .utils import console, prepare_cli -_console = Console() _platform = Platform() cli = typer.Typer(help="Command Line Interface of the aignostics platform") @@ -46,7 +44,7 @@ def install() -> None: @platform_app.command("health") def health() -> None: """Indicate if aignostics platform is healthy.""" - _console.print(_platform.healthy()) + console.print(_platform.healthy()) @platform_app.command("info") @@ -61,9 +59,9 @@ def info( info = _platform.info(env=env, filter_secrets=filter_secrets) match output_format: case InfoOutputFormat.JSON: - _console.print_json(data=info) + console.print_json(data=info) case InfoOutputFormat.YAML: - _console.print(yaml.dump(info, default_flow_style=False), end="") + console.print(yaml.dump(info, default_flow_style=False), end="") @platform_app.command("openapi") @@ -79,21 +77,21 @@ def openapi( schema = Platform.openapi_schema() match output_format: case OpenAPIOutputFormat.JSON: - _console.print_json(data=schema) + console.print_json(data=schema) case OpenAPIOutputFormat.YAML: - _console.print(yaml.dump(schema, default_flow_style=False), end="") + console.print(yaml.dump(schema, default_flow_style=False), end="") @bucket_app.command("ls") def bucket_ls() -> None: """List contents of tranfer bucket.""" - _console.print("bucket ls") + console.print("bucket ls") @bucket_app.command("purge") def bucket_purge() -> None: """Purge content of transfer bucket.""" - _console.print("bucket purged.") + console.print("bucket purged.") @application_app.command("list") @@ -101,7 +99,7 @@ def application_list() -> None: """List available applications.""" papi_client = aignostics.client.Client() applications = papi_client.applications.list() - _console.print(applications) + console.print(applications) @application_app.command("describe") @@ -109,25 +107,25 @@ def application_describe() -> None: """Describe application.""" papi_client = aignostics.client.Client() applications = papi_client.applications.list() - _console.print(applications) + console.print(applications) @datasset_app.command("download") def dataset_download() -> None: """Download dataset.""" - _console.print("dataset download") + console.print("dataset download") @metadata_app.command("generate") def metadata_generate() -> None: """Generate metadata.""" - _console.print("generate metadata") + console.print("generate metadata") @run_app.command("submit") def run_submit() -> None: """Create run.""" - _console.print("submit run") + console.print("submit run") @run_app.command("list") @@ -135,37 +133,37 @@ def run_list() -> None: """List runs.""" papi_client = aignostics.client.Client() runs = papi_client.runs.list() - _console.print(runs) + console.print(runs) @run_app.command("describe") def run_describe() -> None: """Describe run.""" - _console.print("The run") + console.print("The run") @run_app.command("cancel") def run_cancel() -> None: """Cancel run.""" - _console.print("canceled run") + console.print("canceled run") @result_app.command("describe") def result_describe() -> None: """Describe the result of an application run.""" - _console.print("describe result") + console.print("describe result") @result_app.command("download") def result_download() -> None: """Download the result of an application run.""" - _console.print("download result") + console.print("download result") @result_app.command("delete") def result_delete() -> None: """Delete the result of an application run.""" - _console.print("delete resuilt") + console.print("delete resuilt") prepare_cli(cli, f"🔬 Aignostics Python SDK v{__version__} - built with love in Berlin 🐻") diff --git a/src/aignostics/utils/cli.py b/src/aignostics/utils/cli.py index 91cefc3a..7824fe55 100644 --- a/src/aignostics/utils/cli.py +++ b/src/aignostics/utils/cli.py @@ -17,8 +17,9 @@ def prepare_cli(cli: typer.Typer, epilog: str) -> None: """ cli.info.epilog = epilog cli.info.no_args_is_help = True - for command in cli.registered_commands: - command.epilog = cli.info.epilog + if not any(arg.endswith("typer") for arg in Path(sys.argv[0]).parts): + for command in cli.registered_commands: + command.epilog = cli.info.epilog # add epilog for all subcommands if not any(arg.endswith("typer") for arg in Path(sys.argv[0]).parts): From d26940156a9c8cbcd77cf2cd2d8bc940dba786d2 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 22:34:51 +0200 Subject: [PATCH 071/110] test(cli): test full platform info --- tests/aignostics/cli/core_test.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/aignostics/cli/core_test.py b/tests/aignostics/cli/core_test.py index f2839c47..40aaac88 100644 --- a/tests/aignostics/cli/core_test.py +++ b/tests/aignostics/cli/core_test.py @@ -40,6 +40,13 @@ def test_cli_info(runner: CliRunner) -> None: assert "CPython" in result.output +def test_cli_info_full(runner: CliRunner) -> None: + """Check info command returns system information.""" + result = runner.invoke(cli, ["platform", "info", "--env", "--no-filter-secrets"]) + assert result.exit_code == 0 + assert "HOME" in result.output + + def test_cli_openapi_yaml(runner: CliRunner) -> None: """Check openapi command outputs YAML schema.""" result = runner.invoke(cli, ["platform", "openapi"]) From e79e01332824bb231786f3a631532327e4d60a43 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 22:43:49 +0200 Subject: [PATCH 072/110] test(cli): info with json output --- tests/aignostics/cli/core_test.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/aignostics/cli/core_test.py b/tests/aignostics/cli/core_test.py index 40aaac88..b91aeef4 100644 --- a/tests/aignostics/cli/core_test.py +++ b/tests/aignostics/cli/core_test.py @@ -40,6 +40,13 @@ def test_cli_info(runner: CliRunner) -> None: assert "CPython" in result.output +def test_cli_info_json(runner: CliRunner) -> None: + """Check info command returns system information.""" + result = runner.invoke(cli, ["platform", "info", "--output-format", "json"]) + assert result.exit_code == 0 + assert "CPython" in result.output + + def test_cli_info_full(runner: CliRunner) -> None: """Check info command returns system information.""" result = runner.invoke(cli, ["platform", "info", "--env", "--no-filter-secrets"]) From b4c145a73edbe1a4397c57915986fe8d70309ac7 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 22:47:01 +0200 Subject: [PATCH 073/110] test(client/utils): start to build unit tests --- tests/aignostics/client/utils_test.py | 38 +++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 tests/aignostics/client/utils_test.py diff --git a/tests/aignostics/client/utils_test.py b/tests/aignostics/client/utils_test.py new file mode 100644 index 00000000..1954034b --- /dev/null +++ b/tests/aignostics/client/utils_test.py @@ -0,0 +1,38 @@ +"""Tests for the client utility functions.""" + +import pytest + +from aignostics.client.utils import mime_type_to_file_ending + + +class TestMimeTypeToFileEnding: + """Tests for the mime_type_to_file_ending function.""" + + def test_png_mime_type(self) -> None: + """Test that image/png MIME type returns .png extension.""" + assert mime_type_to_file_ending("image/png") == ".png" + + def test_tiff_mime_type(self) -> None: + """Test that image/tiff MIME type returns .tiff extension.""" + assert mime_type_to_file_ending("image/tiff") == ".tiff" + + def test_parquet_mime_type(self) -> None: + """Test that application/vnd.apache.parquet MIME type returns .parquet extension.""" + assert mime_type_to_file_ending("application/vnd.apache.parquet") == ".parquet" + + def test_json_mime_type(self) -> None: + """Test that application/json MIME type returns .json extension.""" + assert mime_type_to_file_ending("application/json") == ".json" + + def test_geojson_mime_type(self) -> None: + """Test that application/geo+json MIME type returns .json extension.""" + assert mime_type_to_file_ending("application/geo+json") == ".json" + + def test_csv_mime_type(self) -> None: + """Test that text/csv MIME type returns .csv extension.""" + assert mime_type_to_file_ending("text/csv") == ".csv" + + def test_unknown_mime_type_raises_error(self) -> None: + """Test that an unknown MIME type raises a ValueError.""" + with pytest.raises(ValueError, match="Unknown mime type: application/unknown"): + mime_type_to_file_ending("application/unknown") \ No newline at end of file From ddd8422f26cf9dc83c04c37b0b82b4e345103497 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 22:49:38 +0200 Subject: [PATCH 074/110] fix(lint): of new tests --- tests/aignostics/client/utils_test.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/tests/aignostics/client/utils_test.py b/tests/aignostics/client/utils_test.py index 1954034b..a0456d6e 100644 --- a/tests/aignostics/client/utils_test.py +++ b/tests/aignostics/client/utils_test.py @@ -8,31 +8,38 @@ class TestMimeTypeToFileEnding: """Tests for the mime_type_to_file_ending function.""" - def test_png_mime_type(self) -> None: + @staticmethod + def test_png_mime_type() -> None: """Test that image/png MIME type returns .png extension.""" assert mime_type_to_file_ending("image/png") == ".png" - def test_tiff_mime_type(self) -> None: + @staticmethod + def test_tiff_mime_type() -> None: """Test that image/tiff MIME type returns .tiff extension.""" assert mime_type_to_file_ending("image/tiff") == ".tiff" - def test_parquet_mime_type(self) -> None: + @staticmethod + def test_parquet_mime_type() -> None: """Test that application/vnd.apache.parquet MIME type returns .parquet extension.""" assert mime_type_to_file_ending("application/vnd.apache.parquet") == ".parquet" - def test_json_mime_type(self) -> None: + @staticmethod + def test_json_mime_type() -> None: """Test that application/json MIME type returns .json extension.""" assert mime_type_to_file_ending("application/json") == ".json" - def test_geojson_mime_type(self) -> None: + @staticmethod + def test_geojson_mime_type() -> None: """Test that application/geo+json MIME type returns .json extension.""" assert mime_type_to_file_ending("application/geo+json") == ".json" - def test_csv_mime_type(self) -> None: + @staticmethod + def test_csv_mime_type() -> None: """Test that text/csv MIME type returns .csv extension.""" assert mime_type_to_file_ending("text/csv") == ".csv" - def test_unknown_mime_type_raises_error(self) -> None: + @staticmethod + def test_unknown_mime_type_raises_error() -> None: """Test that an unknown MIME type raises a ValueError.""" with pytest.raises(ValueError, match="Unknown mime type: application/unknown"): - mime_type_to_file_ending("application/unknown") \ No newline at end of file + mime_type_to_file_ending("application/unknown") From 9031c4427386f6092dbac278b7f9a918665b4b72 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 6 Apr 2025 22:51:18 +0200 Subject: [PATCH 075/110] test(settings): no tmp --- tests/aignostics/client/settings_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/aignostics/client/settings_test.py b/tests/aignostics/client/settings_test.py index 1254ce7b..928b4ec4 100644 --- a/tests/aignostics/client/settings_test.py +++ b/tests/aignostics/client/settings_test.py @@ -194,7 +194,7 @@ def test_authentication_settings_with_env_vars(mock_env_vars, reset_cached_setti @pytest.mark.skip def test_custom_env_file_location(mock_env_vars) -> None: """Test custom env file location.""" - custom_env_file = "/tmp/test_env_file" # noqa: S108 + custom_env_file = "/home/dummy/test_env_file" with mock.patch.dict(os.environ, {f"{__project_name__.upper()}_ENV_FILE": custom_env_file}): settings = AuthenticationSettings.model_config assert custom_env_file in settings["env_file"] @@ -202,7 +202,7 @@ def test_custom_env_file_location(mock_env_vars) -> None: def test_custom_cache_dir(mock_env_vars) -> None: """Test custom cache directory.""" - custom_cache_dir = "/tmp/test_cache_dir" # noqa: S108 + custom_cache_dir = "/home/dummy/test_cache_dir" settings = AuthenticationSettings( client_id_device=SecretStr("test-client-id-device"), client_id_interactive=SecretStr("test-client-id-interactive"), From 0d2b18b83a0859ea9ab9b7ae2e4f19951cb4a50a Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Sun, 6 Apr 2025 21:26:24 +0200 Subject: [PATCH 076/110] chore: Refined pkce & device flow --- src/aignostics/client/_authentication.py | 253 ++++++++++++----------- src/aignostics/client/_messages.py | 1 + 2 files changed, 133 insertions(+), 121 deletions(-) diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index c228ed18..d920f29e 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -5,14 +5,14 @@ from http.server import BaseHTTPRequestHandler, HTTPServer from pathlib import Path from urllib import parse -from urllib.parse import urlparse +from urllib.error import HTTPError import jwt import requests -from pydantic import SecretStr +from pydantic import BaseModel, SecretStr from requests_oauthlib import OAuth2Session -from ._messages import AUTHENTICATION_FAILED +from ._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI from ._settings import authentication_settings @@ -103,7 +103,6 @@ def verify_and_decode_token(token: str) -> dict[str, str]: algorithm = header_data["alg"] # Verify and decode the token using the public key return t.cast( - # TODO(Andreas): hhva: Are we missing error handilng in case jwt.decode fails given invalid token? "dict[str, str]", jwt.decode(binary_token, key=key, algorithms=[algorithm], audience=authentication_settings().audience), ) @@ -129,69 +128,6 @@ def _can_open_browser() -> bool: return launch_browser -class _OAuthHttpServer(HTTPServer): - """HTTP server for OAuth authorization code flow. - - Extends HTTPServer to store the authorization code received during OAuth flow. - """ - - # TODO(Andreas): hhva: HTTPServer.init expects particular args, guess you want to have them there - def __init__(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def] - """Initializes the server with storage for the authorization code. - - Args: - *args: Variable length argument list passed to parent. - **kwargs: Arbitrary keyword arguments passed to parent. - """ - HTTPServer.__init__(self, *args, **kwargs) - self.authorization_code = "" - - -class _OAuthHttpHandler(BaseHTTPRequestHandler): - """HTTP request handler for OAuth authorization code flow. - - Processes the OAuth callback redirect and extracts the authorization code. - """ - - def do_GET(self) -> None: # noqa: N802 - """Handles GET requests containing OAuth response parameters. - - Extracts authorization code or error from the URL and updates the server state. - """ - self.send_response(200) - self.send_header("Content-Type", "text/html") - self.end_headers() - - parsed = parse.urlparse(self.path) - qs = parse.parse_qs(parsed.query) - - # see if auth was successful - # TODO(Andreas): The base server does not have .error or .error_description. Was this tested? - if "error" in qs: - self.server.error = qs["error"][0] # type: ignore[attr-defined] - self.server.error_description = qs["error_description"][0] # type: ignore[attr-defined] - status = b"Authentication error" - else: - self.server.error = None # type: ignore[attr-defined] - self.server.authorization_code = qs["code"][0] # type: ignore[attr-defined] - status = b"Authentication successful" - - # display status in browser and close tab after 2 seconds - response = b""" - - """ - self.wfile.write(response + status) - - # TODO(Andreas): Implement and fix typing - def log_message(self, _format: str, *args) -> None: # type: ignore[no-untyped-def] - """Suppresses log messages from the HTTP server. - - Args: - _format: The log message format string. - *args: The arguments to be applied to the format string. - """ - - def _perform_authorization_code_with_pkce_flow() -> str: """Performs the OAuth 2.0 Authorization Code flow with PKCE. @@ -204,35 +140,94 @@ def _perform_authorization_code_with_pkce_flow() -> str: Raises: RuntimeError: If authentication fails. """ - parsed_redirect = urlparse(authentication_settings().redirect_uri) - with _OAuthHttpServer((parsed_redirect.hostname, parsed_redirect.port), _OAuthHttpHandler) as httpd: - # initialize flow (generate code_challenge and code_verifier) - session = OAuth2Session( - authentication_settings().client_id_interactive.get_secret_value(), - scope=authentication_settings().scope_elements, - redirect_uri=authentication_settings().redirect_uri, - pkce="S256", - ) - authorization_url, _ = session.authorization_url( - authentication_settings().authorization_base_url, - access_type="offline", - audience=authentication_settings().audience, - ) - - # Call Auth0 with challenge and redirect to localhost with code after successful authN + session = OAuth2Session( + authentication_settings().client_id_interactive.get_secret_value(), + scope=authentication_settings().scope_elements, + redirect_uri=authentication_settings().redirect_uri, + pkce="S256", + ) + authorization_url, _ = session.authorization_url( + authentication_settings().authorization_base_url, + access_type="offline", + audience=authentication_settings().audience, + ) + + class AuthenticationResult(BaseModel): + """Represents the result of an OAuth authentication flow.""" + + token: str | None = None + error: str | None = None + + authentication_result = AuthenticationResult() + + class OAuthCallbackHandler(BaseHTTPRequestHandler): + def do_GET(self) -> None: # noqa: N802 + parsed = parse.urlparse(self.path) + query = parse.parse_qs(parsed.query) + + if "code" not in query: + self.send_response(400) + self.send_header("Content-type", "text/html") + self.end_headers() + self.wfile.write(b"Error: No authorization code received") + AuthenticationResult.error = "No authorization code received" + return + + auth_code = query["code"][0] + + try: + # Exchange code for token + token = session.fetch_token(authentication_settings().token_url, code=auth_code, include_client_id=True) + + # Store the token + authentication_result.token = token["access_token"] + + # Send success response + self.send_response(200) + self.send_header("Content-type", "text/html") + self.end_headers() + self.wfile.write(b""" + + + +

Authentication Successful!

+

You can close this window now.

+ + + """) + + # we want to catch all exceptions here, so we can display them in the browser + except Exception as e: # noqa: BLE001 + # Display error message in browser + self.send_response(500) + self.send_header("Content-type", "text/html") + self.end_headers() + self.wfile.write(f"Error: {e!s}".encode()) + authentication_result.error = str(e) + + # Silence server logs + def log_message(self, _format: str, *_args) -> None: # type: ignore[no-untyped-def] # noqa: PLR6301 + return + + # Create and start the server + parsed_redirect = parse.urlparse(authentication_settings().redirect_uri) + host, port = parsed_redirect.hostname, parsed_redirect.port + if not host or not port: + raise RuntimeError(INVALID_REDIRECT_URI) + with HTTPServer((host, port), OAuthCallbackHandler) as server: + # Open browser for authentication webbrowser.open_new(authorization_url) + server.handle_request() - # extract authorization_code from redirected request - httpd.handle_request() - - auth_code = httpd.authorization_code + if authentication_result.error: + msg = f"{AUTHENTICATION_FAILED}: {authentication_result.error}" + raise RuntimeError(msg) + if not authentication_result.token: + raise RuntimeError(AUTHENTICATION_FAILED) - # exchange authorization_code against access token at Auth0 (prove identity with code_verifier) - token_response = session.fetch_token( - authentication_settings().token_url, code=auth_code, include_client_id=True - ) - # TODO(Andreas): hhva: Validate response - return t.cast("str", token_response["access_token"]) + return authentication_result.token def _perform_device_flow() -> str | None: @@ -247,8 +242,7 @@ def _perform_device_flow() -> str | None: Raises: RuntimeError: If authentication fails or is denied. """ - # TODO(Andreas): hhva: Validate response. How about using Pydantic here? - resp: dict[str, str] = requests.post( + response = requests.post( authentication_settings().device_url, data={ "client_id": authentication_settings().client_id_device.get_secret_value(), @@ -256,30 +250,52 @@ def _perform_device_flow() -> str | None: "audience": authentication_settings().audience, }, timeout=authentication_settings().request_timeout_seconds, - ).json() - device_code = resp["device_code"] - print(f"Please visit: {resp['verification_uri_complete']}") + ) + try: + response.raise_for_status() + json_response = response.json() + if "device_code" not in json_response or "verification_uri_complete" not in json_response: + raise RuntimeError(AUTHENTICATION_FAILED) + + device_code = json_response["device_code"] + verification_uri = json_response["verification_uri_complete"] + user_code = json_response["user_code"] + interval = int(json_response["interval"]) + print( + f"Your user code is: {user_code}.\nPlease visit: {verification_uri}, and verify the same code is displayed!" + ) + + except HTTPError as e: + raise RuntimeError(AUTHENTICATION_FAILED) from e # Polling for access token with received device code while True: - # TODO(Andreas): hhva: Validate response. How about using Pydantic here? - resp = requests.post( - authentication_settings().token_url, - headers={"Accept": "application/json"}, - data={ - "grant_type": "urn:ietf:params:oauth:grant-type:device_code", - "device_code": device_code, - "client_id": authentication_settings().client_id_device.get_secret_value(), - }, - timeout=authentication_settings().request_timeout_seconds, - ).json() - - if "error" in resp: - if resp["error"] in {"authorization_pending", "slow_down"}: - time.sleep(3) - continue - raise RuntimeError(resp["error"]) - return resp["access_token"] + try: + response = requests.post( + authentication_settings().token_url, + headers={"Accept": "application/json"}, + data={ + "grant_type": "urn:ietf:params:oauth:grant-type:device_code", + "device_code": device_code, + "client_id": authentication_settings().client_id_device.get_secret_value(), + }, + timeout=authentication_settings().request_timeout_seconds, + ) + json_response = response.json() + if "error" in json_response: + error_code = json_response["error"] + if error_code in {"authorization_pending", "slow_down"}: + time.sleep(interval) + continue + raise RuntimeError(AUTHENTICATION_FAILED) + + if not (token := json_response.get("access_token")): + raise RuntimeError(AUTHENTICATION_FAILED) + + return t.cast("str", token) + + except HTTPError as e: + raise RuntimeError(AUTHENTICATION_FAILED) from e def _token_from_refresh_token(refresh_token: SecretStr) -> str | None: @@ -311,8 +327,3 @@ def _token_from_refresh_token(refresh_token: SecretStr) -> str | None: continue raise RuntimeError(resp["error"]) return t.cast("str", resp["access_token"]) - - -# TODO(Andreas): hhva: Can we remove this? -if __name__ == "__main__": - print(get_token(use_cache=False)) diff --git a/src/aignostics/client/_messages.py b/src/aignostics/client/_messages.py index 087ca39d..bac83418 100644 --- a/src/aignostics/client/_messages.py +++ b/src/aignostics/client/_messages.py @@ -3,3 +3,4 @@ AUTHENTICATION_FAILED = "Authentication failed. Please check your credentials." NOT_YET_IMPLEMENTED = "Not yet implemented." UNKNOWN_ENDPOINT_URL = "Unknown endpoint URL. Please check the API documentation." +INVALID_REDIRECT_URI = "Invalid redirect URI. Please check the redirect URI in your application settings." From c15b9ac6ca1f62edada417bb60a858b9219f4b2d Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Sun, 6 Apr 2025 22:27:08 +0200 Subject: [PATCH 077/110] fix: Add openapi spec w/ safe mime type regex --- codegen/in/api.json | 2 +- codegen/out/aignx/codegen/models/input_artifact.py | 4 ++-- .../codegen/models/input_artifact_read_response.py | 4 ++-- codegen/out/aignx/codegen/models/output_artifact.py | 4 ++-- .../codegen/models/output_artifact_read_response.py | 4 ++-- .../models/output_artifact_result_read_response.py | 4 ++-- docs/source/_static/openapi_v1.json | 10 +++++----- docs/source/_static/openapi_v1.yaml | 10 +++++----- src/aignostics/client/_authentication.py | 5 +++-- 9 files changed, 24 insertions(+), 23 deletions(-) diff --git a/codegen/in/api.json b/codegen/in/api.json index 75818a93..f9212f0d 100644 --- a/codegen/in/api.json +++ b/codegen/in/api.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"PAPI API Reference","version":"1.0.0"},"servers":[{"url":""}],"paths":{"/v1/applications":{"get":{"tags":["Externals"],"summary":"List Applications","operationId":"list_applications_v1_applications_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationReadResponse"},"title":"Response List Applications V1 Applications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_slug}":{"get":{"tags":["Externals"],"summary":"Read Application By Slug","operationId":"read_application_by_slug_v1_applications__application_slug__get","parameters":[{"name":"application_slug","in":"path","required":true,"schema":{"type":"string","title":"Application Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs":{"get":{"tags":["Externals"],"summary":"List Application Runs","operationId":"list_application_runs_v1_runs_get","parameters":[{"name":"application_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Id"}},{"name":"application_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Version Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RunReadResponse"},"title":"Response List Application Runs V1 Runs Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Externals"],"summary":"Create Application Run","operationId":"create_application_run_v1_runs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}":{"get":{"tags":["Externals"],"summary":"Get Run","operationId":"get_run_v1_runs__application_run_id__get","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunReadResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/cancel":{"post":{"tags":["Externals"],"summary":"Cancel Run","operationId":"cancel_run_v1_runs__application_run_id__cancel_post","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/results":{"get":{"tags":["Externals"],"summary":"List Run Results","operationId":"list_run_results_v1_runs__application_run_id__results_get","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}},{"name":"item_id__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Item Id In"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"reference__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Reference In"}},{"name":"status__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ItemStatus"}},{"type":"null"}],"title":"Status In"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ItemResultReadResponse"},"title":"Response List Run Results V1 Runs Application Run Id Results Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Externals"],"summary":"Delete Run Results","operationId":"delete_run_results_v1_runs__application_run_id__results_delete","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}}],"responses":{"204":{"description":"Successful Response"},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/versions":{"post":{"tags":["Externals"],"summary":"Register Version","operationId":"register_version_v1_versions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreationRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_id}/versions":{"get":{"tags":["Externals"],"summary":"List Versions By Application Id","operationId":"list_versions_by_application_id_v1_applications__application_id__versions_get","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Id V1 Applications Application Id Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_slug}/versions":{"get":{"tags":["Externals"],"summary":"List Versions By Application Slug","operationId":"list_versions_by_application_slug_v1_applications__application_slug__versions_get","parameters":[{"name":"application_slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z](-?[a-z])*$","title":"Application Slug"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Slug V1 Applications Application Slug Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/versions/{application_version_id}":{"get":{"tags":["Externals"],"summary":"Get Version","operationId":"get_version_v1_versions__application_version_id__get","parameters":[{"name":"application_version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Version Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ApplicationReadResponse":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"},"name":{"type":"string","title":"Name","examples":["HETA"]},"slug":{"type":"string","title":"Slug","examples":["heta"]},"regulatory_classes":{"items":{"type":"string"},"type":"array","title":"Regulatory Classes","examples":[["RuO"]]},"description":{"type":"string","title":"Description","examples":["Aignostics H&E TME application"]}},"type":"object","required":["application_id","name","slug","regulatory_classes","description"],"title":"ApplicationReadResponse"},"ApplicationRunStatus":{"type":"string","enum":["canceled_system","canceled_user","completed","completed_with_error","received","rejected","running","scheduled"],"title":"ApplicationRunStatus"},"ApplicationVersionReadResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"application_version_slug":{"type":"string","pattern":"^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$","title":"Application Version Slug","examples":["tissue-segmentation-qc:v0.0.1"]},"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactReadResponse"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactReadResponse"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["application_version_id","application_version_slug","version","application_id","changelog","input_artifacts","output_artifacts"],"title":"ApplicationVersionReadResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InputArtifact":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+/\\w+(?:[-+.]|\\w)+\\w+$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifact"},"InputArtifactCreationRequest":{"properties":{"name":{"type":"string","title":"Name","examples":["slide"]},"download_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Download Url","examples":["https://example.com/case-no-1-slide.tiff"]},"metadata":{"type":"object","title":"Metadata","examples":[{"checksum_crc32c":"752f9554","height":2000,"height_mpp":0.5,"width":10000,"width_mpp":0.5}]}},"type":"object","required":["name","download_url","metadata"],"title":"InputArtifactCreationRequest"},"InputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+/\\w+(?:[-+.]|\\w)+\\w+$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactReadResponse"},"InputArtifactSchemaCreationRequest":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactSchemaCreationRequest"},"ItemCreationRequest":{"properties":{"reference":{"type":"string","title":"Reference","examples":["case-no-1"]},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactCreationRequest"},"type":"array","title":"Input Artifacts"}},"type":"object","required":["reference","input_artifacts"],"title":"ItemCreationRequest"},"ItemResultReadResponse":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"reference":{"type":"string","title":"Reference"},"status":{"$ref":"#/components/schemas/ItemStatus"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactResultReadResponse"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["item_id","application_run_id","reference","status","error","output_artifacts"],"title":"ItemResultReadResponse"},"ItemStatus":{"type":"string","enum":["pending","canceled_user","canceled_system","error_user","error_system","succeeded"],"title":"ItemStatus"},"OutputArtifact":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+/\\w+(?:[-+.]|\\w)+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"},"visibility":{"$ref":"#/components/schemas/OutputArtifactVisibility"}},"type":"object","required":["name","mime_type","metadata_schema","scope","visibility"],"title":"OutputArtifact"},"OutputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+/\\w+(?:[-+.]|\\w)+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"}},"type":"object","required":["name","mime_type","metadata_schema","scope"],"title":"OutputArtifactReadResponse"},"OutputArtifactResultReadResponse":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+/\\w+(?:[-+.]|\\w)+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata":{"type":"object","title":"Metadata"},"download_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Download Url"}},"type":"object","required":["output_artifact_id","name","mime_type","metadata","download_url"],"title":"OutputArtifactResultReadResponse"},"OutputArtifactSchemaCreationRequest":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"},"visibility":{"$ref":"#/components/schemas/OutputArtifactVisibility"},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","scope","visibility","metadata_schema"],"title":"OutputArtifactSchemaCreationRequest"},"OutputArtifactScope":{"type":"string","enum":["item","global"],"title":"OutputArtifactScope"},"OutputArtifactVisibility":{"type":"string","enum":["internal","external"],"title":"OutputArtifactVisibility"},"PayloadInputArtifact":{"properties":{"input_artifact_id":{"type":"string","format":"uuid","title":"Input Artifact Id"},"metadata":{"type":"object","title":"Metadata"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["metadata","download_url"],"title":"PayloadInputArtifact"},"PayloadItem":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"input_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadInputArtifact"},"type":"object","title":"Input Artifacts"},"output_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object","title":"Output Artifacts"}},"type":"object","required":["item_id","input_artifacts","output_artifacts"],"title":"PayloadItem"},"PayloadOutputArtifact":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"data":{"$ref":"#/components/schemas/TransferUrls"},"metadata":{"$ref":"#/components/schemas/TransferUrls"}},"type":"object","required":["output_artifact_id","data","metadata"],"title":"PayloadOutputArtifact"},"RunCreationRequest":{"properties":{"application_version":{"anyOf":[{"type":"string","format":"uuid"},{"$ref":"#/components/schemas/SlugVersionRequest"}],"title":"Application Version","examples":["efbf9822-a1e5-4045-a283-dbf26e8064a9"]},"items":{"items":{"$ref":"#/components/schemas/ItemCreationRequest"},"type":"array","title":"Items"}},"type":"object","required":["application_version","items"],"title":"RunCreationRequest"},"RunCreationResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"}},"type":"object","required":["application_run_id"],"title":"RunCreationResponse"},"RunReadResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"organization_id":{"type":"string","title":"Organization Id"},"user_payload":{"anyOf":[{"$ref":"#/components/schemas/UserPayload"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/ApplicationRunStatus"},"triggered_at":{"type":"string","format":"date-time","title":"Triggered At"},"triggered_by":{"type":"string","title":"Triggered By"}},"type":"object","required":["application_run_id","application_version_id","organization_id","status","triggered_at","triggered_by"],"title":"RunReadResponse"},"SlugVersionRequest":{"properties":{"application_slug":{"type":"string","pattern":"^[a-z](-?[a-z])*$","title":"Application Slug"},"version":{"type":"string","title":"Version"}},"type":"object","required":["application_slug","version"],"title":"SlugVersionRequest"},"TransferUrls":{"properties":{"upload_url":{"type":"string","minLength":1,"format":"uri","title":"Upload Url"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["upload_url","download_url"],"title":"TransferUrls"},"UserPayload":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"global_output_artifacts":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object"},{"type":"null"}],"title":"Global Output Artifacts"},"items":{"items":{"$ref":"#/components/schemas/PayloadItem"},"type":"array","title":"Items"}},"type":"object","required":["application_id","application_run_id","global_output_artifacts","items"],"title":"UserPayload"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionCreationRequest":{"properties":{"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"type":"string","format":"uuid","title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactSchemaCreationRequest"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactSchemaCreationRequest"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["version","application_id","flow_id","changelog","input_artifacts","output_artifacts"],"title":"VersionCreationRequest"},"VersionCreationResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"}},"type":"object","required":["application_version_id"],"title":"VersionCreationResponse"},"VersionReadResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifact"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifact"},"type":"array","title":"Output Artifacts"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["application_version_id","version","application_id","changelog","input_artifacts","output_artifacts","created_at"],"title":"VersionReadResponse"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"PAPI API Reference","version":"1.0.0"},"servers":[{"url":""}],"paths":{"/v1/applications":{"get":{"tags":["Externals"],"summary":"List Applications","operationId":"list_applications_v1_applications_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationReadResponse"},"title":"Response List Applications V1 Applications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_slug}":{"get":{"tags":["Externals"],"summary":"Read Application By Slug","operationId":"read_application_by_slug_v1_applications__application_slug__get","parameters":[{"name":"application_slug","in":"path","required":true,"schema":{"type":"string","title":"Application Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs":{"get":{"tags":["Externals"],"summary":"List Application Runs","operationId":"list_application_runs_v1_runs_get","parameters":[{"name":"application_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Id"}},{"name":"application_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Version Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RunReadResponse"},"title":"Response List Application Runs V1 Runs Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Externals"],"summary":"Create Application Run","operationId":"create_application_run_v1_runs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}":{"get":{"tags":["Externals"],"summary":"Get Run","operationId":"get_run_v1_runs__application_run_id__get","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunReadResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/cancel":{"post":{"tags":["Externals"],"summary":"Cancel Run","operationId":"cancel_run_v1_runs__application_run_id__cancel_post","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/results":{"get":{"tags":["Externals"],"summary":"List Run Results","operationId":"list_run_results_v1_runs__application_run_id__results_get","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}},{"name":"item_id__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Item Id In"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"reference__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Reference In"}},{"name":"status__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ItemStatus"}},{"type":"null"}],"title":"Status In"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ItemResultReadResponse"},"title":"Response List Run Results V1 Runs Application Run Id Results Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Externals"],"summary":"Delete Run Results","operationId":"delete_run_results_v1_runs__application_run_id__results_delete","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}}],"responses":{"204":{"description":"Successful Response"},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/versions":{"post":{"tags":["Externals"],"summary":"Register Version","operationId":"register_version_v1_versions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreationRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_id}/versions":{"get":{"tags":["Externals"],"summary":"List Versions By Application Id","operationId":"list_versions_by_application_id_v1_applications__application_id__versions_get","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Id V1 Applications Application Id Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_slug}/versions":{"get":{"tags":["Externals"],"summary":"List Versions By Application Slug","operationId":"list_versions_by_application_slug_v1_applications__application_slug__versions_get","parameters":[{"name":"application_slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z](-?[a-z])*$","title":"Application Slug"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Slug V1 Applications Application Slug Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/versions/{application_version_id}":{"get":{"tags":["Externals"],"summary":"Get Version","operationId":"get_version_v1_versions__application_version_id__get","parameters":[{"name":"application_version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Version Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ApplicationReadResponse":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"},"name":{"type":"string","title":"Name","examples":["HETA"]},"slug":{"type":"string","title":"Slug","examples":["heta"]},"regulatory_classes":{"items":{"type":"string"},"type":"array","title":"Regulatory Classes","examples":[["RuO"]]},"description":{"type":"string","title":"Description","examples":["Aignostics H&E TME application"]}},"type":"object","required":["application_id","name","slug","regulatory_classes","description"],"title":"ApplicationReadResponse"},"ApplicationRunStatus":{"type":"string","enum":["canceled_system","canceled_user","completed","completed_with_error","received","rejected","running","scheduled"],"title":"ApplicationRunStatus"},"ApplicationVersionReadResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"application_version_slug":{"type":"string","pattern":"^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$","title":"Application Version Slug","examples":["tissue-segmentation-qc:v0.0.1"]},"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactReadResponse"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactReadResponse"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["application_version_id","application_version_slug","version","application_id","changelog","input_artifacts","output_artifacts"],"title":"ApplicationVersionReadResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InputArtifact":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifact"},"InputArtifactCreationRequest":{"properties":{"name":{"type":"string","title":"Name","examples":["slide"]},"download_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Download Url","examples":["https://example.com/case-no-1-slide.tiff"]},"metadata":{"type":"object","title":"Metadata","examples":[{"checksum_crc32c":"752f9554","height":2000,"height_mpp":0.5,"width":10000,"width_mpp":0.5}]}},"type":"object","required":["name","download_url","metadata"],"title":"InputArtifactCreationRequest"},"InputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactReadResponse"},"InputArtifactSchemaCreationRequest":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactSchemaCreationRequest"},"ItemCreationRequest":{"properties":{"reference":{"type":"string","title":"Reference","examples":["case-no-1"]},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactCreationRequest"},"type":"array","title":"Input Artifacts"}},"type":"object","required":["reference","input_artifacts"],"title":"ItemCreationRequest"},"ItemResultReadResponse":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"reference":{"type":"string","title":"Reference"},"status":{"$ref":"#/components/schemas/ItemStatus"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactResultReadResponse"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["item_id","application_run_id","reference","status","error","output_artifacts"],"title":"ItemResultReadResponse"},"ItemStatus":{"type":"string","enum":["pending","canceled_user","canceled_system","error_user","error_system","succeeded"],"title":"ItemStatus"},"OutputArtifact":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"},"visibility":{"$ref":"#/components/schemas/OutputArtifactVisibility"}},"type":"object","required":["name","mime_type","metadata_schema","scope","visibility"],"title":"OutputArtifact"},"OutputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"}},"type":"object","required":["name","mime_type","metadata_schema","scope"],"title":"OutputArtifactReadResponse"},"OutputArtifactResultReadResponse":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata":{"type":"object","title":"Metadata"},"download_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Download Url"}},"type":"object","required":["output_artifact_id","name","mime_type","metadata","download_url"],"title":"OutputArtifactResultReadResponse"},"OutputArtifactSchemaCreationRequest":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"},"visibility":{"$ref":"#/components/schemas/OutputArtifactVisibility"},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","scope","visibility","metadata_schema"],"title":"OutputArtifactSchemaCreationRequest"},"OutputArtifactScope":{"type":"string","enum":["item","global"],"title":"OutputArtifactScope"},"OutputArtifactVisibility":{"type":"string","enum":["internal","external"],"title":"OutputArtifactVisibility"},"PayloadInputArtifact":{"properties":{"input_artifact_id":{"type":"string","format":"uuid","title":"Input Artifact Id"},"metadata":{"type":"object","title":"Metadata"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["metadata","download_url"],"title":"PayloadInputArtifact"},"PayloadItem":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"input_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadInputArtifact"},"type":"object","title":"Input Artifacts"},"output_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object","title":"Output Artifacts"}},"type":"object","required":["item_id","input_artifacts","output_artifacts"],"title":"PayloadItem"},"PayloadOutputArtifact":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"data":{"$ref":"#/components/schemas/TransferUrls"},"metadata":{"$ref":"#/components/schemas/TransferUrls"}},"type":"object","required":["output_artifact_id","data","metadata"],"title":"PayloadOutputArtifact"},"RunCreationRequest":{"properties":{"application_version":{"anyOf":[{"type":"string","format":"uuid"},{"$ref":"#/components/schemas/SlugVersionRequest"}],"title":"Application Version","examples":["efbf9822-a1e5-4045-a283-dbf26e8064a9"]},"items":{"items":{"$ref":"#/components/schemas/ItemCreationRequest"},"type":"array","title":"Items"}},"type":"object","required":["application_version","items"],"title":"RunCreationRequest"},"RunCreationResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"}},"type":"object","required":["application_run_id"],"title":"RunCreationResponse"},"RunReadResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"organization_id":{"type":"string","title":"Organization Id"},"user_payload":{"anyOf":[{"$ref":"#/components/schemas/UserPayload"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/ApplicationRunStatus"},"triggered_at":{"type":"string","format":"date-time","title":"Triggered At"},"triggered_by":{"type":"string","title":"Triggered By"}},"type":"object","required":["application_run_id","application_version_id","organization_id","status","triggered_at","triggered_by"],"title":"RunReadResponse"},"SlugVersionRequest":{"properties":{"application_slug":{"type":"string","pattern":"^[a-z](-?[a-z])*$","title":"Application Slug"},"version":{"type":"string","title":"Version"}},"type":"object","required":["application_slug","version"],"title":"SlugVersionRequest"},"TransferUrls":{"properties":{"upload_url":{"type":"string","minLength":1,"format":"uri","title":"Upload Url"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["upload_url","download_url"],"title":"TransferUrls"},"UserPayload":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"global_output_artifacts":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object"},{"type":"null"}],"title":"Global Output Artifacts"},"items":{"items":{"$ref":"#/components/schemas/PayloadItem"},"type":"array","title":"Items"}},"type":"object","required":["application_id","application_run_id","global_output_artifacts","items"],"title":"UserPayload"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionCreationRequest":{"properties":{"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"type":"string","format":"uuid","title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactSchemaCreationRequest"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactSchemaCreationRequest"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["version","application_id","flow_id","changelog","input_artifacts","output_artifacts"],"title":"VersionCreationRequest"},"VersionCreationResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"}},"type":"object","required":["application_version_id"],"title":"VersionCreationResponse"},"VersionReadResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifact"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifact"},"type":"array","title":"Output Artifacts"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["application_version_id","version","application_id","changelog","input_artifacts","output_artifacts","created_at"],"title":"VersionReadResponse"}}}} \ No newline at end of file diff --git a/codegen/out/aignx/codegen/models/input_artifact.py b/codegen/out/aignx/codegen/models/input_artifact.py index 7755f4e6..c9d22bf7 100644 --- a/codegen/out/aignx/codegen/models/input_artifact.py +++ b/codegen/out/aignx/codegen/models/input_artifact.py @@ -34,8 +34,8 @@ class InputArtifact(BaseModel): @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^\w+\/\w+(?:[-+.]|\w)+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+(?:[-+.]|\w)+\w+$/") + if not re.match(r"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$/") return value model_config = ConfigDict( diff --git a/codegen/out/aignx/codegen/models/input_artifact_read_response.py b/codegen/out/aignx/codegen/models/input_artifact_read_response.py index ec1c3329..7c16a4cd 100644 --- a/codegen/out/aignx/codegen/models/input_artifact_read_response.py +++ b/codegen/out/aignx/codegen/models/input_artifact_read_response.py @@ -34,8 +34,8 @@ class InputArtifactReadResponse(BaseModel): @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^\w+\/\w+(?:[-+.]|\w)+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+(?:[-+.]|\w)+\w+$/") + if not re.match(r"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$/") return value model_config = ConfigDict( diff --git a/codegen/out/aignx/codegen/models/output_artifact.py b/codegen/out/aignx/codegen/models/output_artifact.py index f19d227e..ee4a3ae0 100644 --- a/codegen/out/aignx/codegen/models/output_artifact.py +++ b/codegen/out/aignx/codegen/models/output_artifact.py @@ -38,8 +38,8 @@ class OutputArtifact(BaseModel): @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^\w+\/\w+(?:[-+.]|\w)+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+(?:[-+.]|\w)+\w+$/") + if not re.match(r"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$/") return value model_config = ConfigDict( diff --git a/codegen/out/aignx/codegen/models/output_artifact_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_read_response.py index 5b7d391a..4e296bb3 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_read_response.py +++ b/codegen/out/aignx/codegen/models/output_artifact_read_response.py @@ -36,8 +36,8 @@ class OutputArtifactReadResponse(BaseModel): @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^\w+\/\w+(?:[-+.]|\w)+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+(?:[-+.]|\w)+\w+$/") + if not re.match(r"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$/") return value model_config = ConfigDict( diff --git a/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py index ffbc6cbc..a1d9fa10 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +++ b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py @@ -36,8 +36,8 @@ class OutputArtifactResultReadResponse(BaseModel): @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^\w+\/\w+(?:[-+.]|\w)+\w+$", value): - raise ValueError(r"must validate the regular expression /^\w+\/\w+(?:[-+.]|\w)+\w+$/") + if not re.match(r"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$/") return value model_config = ConfigDict( diff --git a/docs/source/_static/openapi_v1.json b/docs/source/_static/openapi_v1.json index 3c3d8af2..5c30db4f 100644 --- a/docs/source/_static/openapi_v1.json +++ b/docs/source/_static/openapi_v1.json @@ -1131,7 +1131,7 @@ }, "mime_type": { "type": "string", - "pattern": "^\\w+/\\w+(?:[-+.]|\\w)+\\w+$", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", "title": "Mime Type", "examples": [ "image/tiff" @@ -1199,7 +1199,7 @@ }, "mime_type": { "type": "string", - "pattern": "^\\w+/\\w+(?:[-+.]|\\w)+\\w+$", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", "title": "Mime Type", "examples": [ "image/tiff" @@ -1337,7 +1337,7 @@ }, "mime_type": { "type": "string", - "pattern": "^\\w+/\\w+(?:[-+.]|\\w)+\\w+$", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", "title": "Mime Type", "examples": [ "application/vnd.apache.parquet" @@ -1372,7 +1372,7 @@ }, "mime_type": { "type": "string", - "pattern": "^\\w+/\\w+(?:[-+.]|\\w)+\\w+$", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", "title": "Mime Type", "examples": [ "application/vnd.apache.parquet" @@ -1408,7 +1408,7 @@ }, "mime_type": { "type": "string", - "pattern": "^\\w+/\\w+(?:[-+.]|\\w)+\\w+$", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", "title": "Mime Type", "examples": [ "application/vnd.apache.parquet" diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index ef48f11f..470f21a5 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -113,7 +113,7 @@ components: mime_type: examples: - image/tiff - pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ + pattern: ^{0,126}/{0,126}$ title: Mime Type type: string name: @@ -163,7 +163,7 @@ components: mime_type: examples: - image/tiff - pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ + pattern: ^{0,126}/{0,126}$ title: Mime Type type: string name: @@ -263,7 +263,7 @@ components: mime_type: examples: - application/vnd.apache.parquet - pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ + pattern: ^{0,126}/{0,126}$ title: Mime Type type: string name: @@ -289,7 +289,7 @@ components: mime_type: examples: - application/vnd.apache.parquet - pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ + pattern: ^{0,126}/{0,126}$ title: Mime Type type: string name: @@ -320,7 +320,7 @@ components: mime_type: examples: - application/vnd.apache.parquet - pattern: ^\w+/\w+(?:[-+.]|\w)+\w+$ + pattern: ^{0,126}/{0,126}$ title: Mime Type type: string name: diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index d920f29e..147056b0 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -217,8 +217,9 @@ def log_message(self, _format: str, *_args) -> None: # type: ignore[no-untyped- if not host or not port: raise RuntimeError(INVALID_REDIRECT_URI) with HTTPServer((host, port), OAuthCallbackHandler) as server: - # Open browser for authentication + # Call Auth0 with challenge and redirect to localhost with code after successful authN webbrowser.open_new(authorization_url) + # Extract authorization_code from redirected request, see: OAuthCallbackHandler server.handle_request() if authentication_result.error: @@ -262,7 +263,7 @@ def _perform_device_flow() -> str | None: user_code = json_response["user_code"] interval = int(json_response["interval"]) print( - f"Your user code is: {user_code}.\nPlease visit: {verification_uri}, and verify the same code is displayed!" + f"Your user code is: {user_code}.\nPlease visit: {verification_uri} and verify the same code is displayed!" ) except HTTPError as e: From 47344a19b747545db56c284c2491d2fa4e2118f4 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Mon, 7 Apr 2025 00:33:37 +0200 Subject: [PATCH 078/110] core: Cleanup auth module --- API_REFERENCE_v1.md | 4025 +++++++--------------- docs/source/_static/openapi_v1.yaml | 22 +- src/aignostics/client/_authentication.py | 48 +- 3 files changed, 1334 insertions(+), 2761 deletions(-) diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md index 42cc5470..93520550 100644 --- a/API_REFERENCE_v1.md +++ b/API_REFERENCE_v1.md @@ -1,2723 +1,1304 @@ # API v1 Reference -## PAPI API Reference v1.0.0 - -> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. - -Base URLs: - -* - -## Externals - -### list_applications_v1_applications_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/applications', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/applications', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications` - -*List Applications* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ], - "slug": "heta" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Applications V1 Applications Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Applications V1 Applications Get|[[ApplicationReadResponse](#schemaapplicationreadresponse)]|false|none|none| -|» ApplicationReadResponse|[ApplicationReadResponse](#schemaapplicationreadresponse)|false|none|none| -|»» application_id|string(uuid)|true|none|none| -|»» description|string|true|none|none| -|»» name|string|true|none|none| -|»» regulatory_classes|[string]|true|none|none| -|»» slug|string|true|none|none| - - -This operation does not require authentication - - -### list_versions_by_application_id_v1_applications__application_id__versions_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/applications/{application_id}/versions', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/applications/{application_id}/versions', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_id}/versions` - -*List Versions By Application Id* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_id|path|string(uuid)|true|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|version|query|any|false|none| -|include|query|any|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "application_version_slug": "tissue-segmentation-qc:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Versions By Application Id V1 Applications Application Id Versions Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| -|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| -|»» application_id|string(uuid)|true|none|none| -|»» application_version_id|string(uuid)|true|none|none| -|»» application_version_slug|string|true|none|none| -|»» changelog|string|true|none|none| -|»» flow_id|any|false|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string(uuid)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| -|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| -|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|»» version|string|true|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|scope|item| -|scope|global| - - -This operation does not require authentication - - -### read_application_by_slug_v1_applications__application_slug__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/applications/{application_slug}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/applications/{application_slug}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_slug}` - -*Read Application By Slug* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_slug|path|string|true|none| - -> Example responses - -> 200 Response - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ], - "slug": "heta" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[ApplicationReadResponse](#schemaapplicationreadresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -### list_versions_by_application_slug_v1_applications__application_slug__versions_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/applications/{application_slug}/versions', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/applications/{application_slug}/versions', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_slug}/versions` - -*List Versions By Application Slug* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_slug|path|string|true|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|version|query|any|false|none| -|include|query|any|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "application_version_slug": "tissue-segmentation-qc:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Versions By Application Slug V1 Applications Application Slug Versions Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Versions By Application Slug V1 Applications Application Slug Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| -|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| -|»» application_id|string(uuid)|true|none|none| -|»» application_version_id|string(uuid)|true|none|none| -|»» application_version_slug|string|true|none|none| -|»» changelog|string|true|none|none| -|»» flow_id|any|false|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string(uuid)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| -|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| -|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|»» version|string|true|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|scope|item| -|scope|global| - - -This operation does not require authentication - - -### list_application_runs_v1_runs_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/runs', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/runs', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs` - -*List Application Runs* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_id|query|any|false|none| -|application_version_id|query|any|false|none| -|include|query|any|false|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Application Runs V1 Runs Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Application Runs V1 Runs Get|[[RunReadResponse](#schemarunreadresponse)]|false|none|none| -|» RunReadResponse|[RunReadResponse](#schemarunreadresponse)|false|none|none| -|»» application_run_id|string(uuid)|true|none|none| -|»» application_version_id|string(uuid)|true|none|none| -|»» organization_id|string|true|none|none| -|»» status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| -|»» triggered_at|string(date-time)|true|none|none| -|»» triggered_by|string|true|none|none| -|»» user_payload|any|false|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| -|»»»» application_id|string(uuid)|true|none|none| -|»»»» application_run_id|string(uuid)|true|none|none| -|»»»» global_output_artifacts|any|true|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|object|false|none|none| -|»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| -|»»»»»»» data|[TransferUrls](#schematransferurls)|true|none|none| -|»»»»»»»» download_url|string(uri)|true|none|none| -|»»»»»»»» upload_url|string(uri)|true|none|none| -|»»»»»»» metadata|[TransferUrls](#schematransferurls)|true|none|none| -|»»»»»»» output_artifact_id|string(uuid)|true|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»» items|[[PayloadItem](#schemapayloaditem)]|true|none|none| -|»»»»» PayloadItem|[PayloadItem](#schemapayloaditem)|false|none|none| -|»»»»»» input_artifacts|object|true|none|none| -|»»»»»»» PayloadInputArtifact|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| -|»»»»»»»» download_url|string(uri)|true|none|none| -|»»»»»»»» input_artifact_id|string(uuid)|false|none|none| -|»»»»»»»» metadata|object|true|none|none| -|»»»»»» item_id|string(uuid)|true|none|none| -|»»»»»» output_artifacts|object|true|none|none| -|»»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|status|canceled_system| -|status|canceled_user| -|status|completed| -|status|completed_with_error| -|status|received| -|status|rejected| -|status|running| -|status|scheduled| - - -This operation does not require authentication - - -### create_application_run_v1_runs_post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json' -} - -r = requests.post('/v1/runs', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('/v1/runs', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/runs` - -*Create Application Run* - -> Body parameter - -```json -{ - "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[RunCreationRequest](#schemaruncreationrequest)|true|none| - -> Example responses - -> 201 Response - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[RunCreationResponse](#schemaruncreationresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -### get_run_v1_runs__application_run_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/runs/{application_run_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/runs/{application_run_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs/{application_run_id}` - -*Get Run* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| -|include|query|any|false|none| - -> Example responses - -> 200 Response - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[RunReadResponse](#schemarunreadresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -### cancel_run_v1_runs__application_run_id__cancel_post - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.post('/v1/runs/{application_run_id}/cancel', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/runs/{application_run_id}/cancel', -{ - method: 'POST', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/runs/{application_run_id}/cancel` - -*Cancel Run* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| - -> Example responses - -> 202 Response - -```json -null -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - - -This operation does not require authentication - - -### delete_run_results_v1_runs__application_run_id__results_delete - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.delete('/v1/runs/{application_run_id}/results', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/runs/{application_run_id}/results', -{ - method: 'DELETE', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`DELETE /v1/runs/{application_run_id}/results` - -*Delete Run Results* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| - -> Example responses - -> 422 Response - -```json -{ - "detail": [ - { - "loc": [ - "string" - ], - "msg": "string", - "type": "string" - } - ] -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|Successful Response|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -### list_run_results_v1_runs__application_run_id__results_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/runs/{application_run_id}/results', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/runs/{application_run_id}/results', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs/{application_run_id}/results` - -*List Run Results* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| -|item_id__in|query|any|false|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|reference__in|query|any|false|none| -|status__in|query|any|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "error": "string", - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": [ - { - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - ], - "reference": "string", - "status": "pending" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Run Results V1 Runs Application Run Id Results Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Run Results V1 Runs Application Run Id Results Get|[[ItemResultReadResponse](#schemaitemresultreadresponse)]|false|none|none| -|» ItemResultReadResponse|[ItemResultReadResponse](#schemaitemresultreadresponse)|false|none|none| -|»» application_run_id|string(uuid)|true|none|none| -|»» error|any|true|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» item_id|string(uuid)|true|none|none| -|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| -|»»» OutputArtifactResultReadResponse|[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)|false|none|none| -|»»»» download_url|any|true|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|string(uri)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»» metadata|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» output_artifact_id|string(uuid)|true|none|none| -|»» reference|string|true|none|none| -|»» status|[ItemStatus](#schemaitemstatus)|true|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|status|pending| -|status|canceled_user| -|status|canceled_system| -|status|error_user| -|status|error_system| -|status|succeeded| - - -This operation does not require authentication - - -### register_version_v1_versions_post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json' -} - -r = requests.post('/v1/versions', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('/v1/versions', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/versions` - -*Register Version* - -> Body parameter - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[VersionCreationRequest](#schemaversioncreationrequest)|true|none| - -> Example responses - -> 201 Response - -```json -{ - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[VersionCreationResponse](#schemaversioncreationresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -### get_version_v1_versions__application_version_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/versions/{application_version_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/versions/{application_version_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/versions/{application_version_id}` - -*Get Version* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_version_id|path|string(uuid)|true|none| -|include|query|any|false|none| - -> Example responses - -> 200 Response - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "changelog": "string", - "created_at": "2019-08-24T14:15:22Z", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[VersionReadResponse](#schemaversionreadresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -## Schemas - -### ApplicationReadResponse - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ], - "slug": "heta" -} - -``` - -ApplicationReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|description|string|true|none|none| -|name|string|true|none|none| -|regulatory_classes|[string]|true|none|none| -|slug|string|true|none|none| - -### ApplicationRunStatus - - - - - - -```json -"canceled_system" - -``` - -ApplicationRunStatus - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ApplicationRunStatus|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ApplicationRunStatus|canceled_system| -|ApplicationRunStatus|canceled_user| -|ApplicationRunStatus|completed| -|ApplicationRunStatus|completed_with_error| -|ApplicationRunStatus|received| -|ApplicationRunStatus|rejected| -|ApplicationRunStatus|running| -|ApplicationRunStatus|scheduled| - -### ApplicationVersionReadResponse - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "application_version_slug": "tissue-segmentation-qc:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" -} - -``` - -ApplicationVersionReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|application_version_id|string(uuid)|true|none|none| -|application_version_slug|string|true|none|none| -|changelog|string|true|none|none| -|flow_id|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| -|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| -|version|string|true|none|none| - -### HTTPValidationError - - - - - - -```json -{ - "detail": [ - { - "loc": [ - "string" - ], - "msg": "string", - "type": "string" - } - ] -} - -``` - -HTTPValidationError - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|detail|[[ValidationError](#schemavalidationerror)]|false|none|none| - -### InputArtifact - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" -} - -``` - -InputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - -### InputArtifactCreationRequest - - - - - - -```json -{ - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" -} - -``` - -InputArtifactCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|metadata|object|true|none|none| -|name|string|true|none|none| - -### InputArtifactReadResponse - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" -} - -``` - -InputArtifactReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - -### InputArtifactSchemaCreationRequest - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" -} - -``` - -InputArtifactSchemaCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - -### ItemCreationRequest - - - - - - -```json -{ - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" -} - -``` - -ItemCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|none| -|reference|string|true|none|none| - -### ItemResultReadResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "error": "string", - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": [ - { - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - ], - "reference": "string", - "status": "pending" -} - -``` - -ItemResultReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|none| -|error|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|item_id|string(uuid)|true|none|none| -|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| -|reference|string|true|none|none| -|status|[ItemStatus](#schemaitemstatus)|true|none|none| - -### ItemStatus - - - - - - -```json -"pending" - -``` - -ItemStatus - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ItemStatus|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ItemStatus|pending| -|ItemStatus|canceled_user| -|ItemStatus|canceled_system| -|ItemStatus|error_user| -|ItemStatus|error_system| -|ItemStatus|succeeded| - -### OutputArtifact - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" -} - -``` - -OutputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| - -### OutputArtifactReadResponse - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" -} - -``` - -OutputArtifactReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| - -### OutputArtifactResultReadResponse - - - - - - -```json -{ - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" -} - -``` - -OutputArtifactResultReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uri)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|output_artifact_id|string(uuid)|true|none|none| - -### OutputArtifactSchemaCreationRequest - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" -} - -``` - -OutputArtifactSchemaCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| - -### OutputArtifactScope - - - - - - -```json -"item" - -``` - -OutputArtifactScope - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|OutputArtifactScope|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|OutputArtifactScope|item| -|OutputArtifactScope|global| - -### OutputArtifactVisibility - - - - - - -```json -"internal" - -``` - -OutputArtifactVisibility - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|OutputArtifactVisibility|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|OutputArtifactVisibility|internal| -|OutputArtifactVisibility|external| - -### PayloadInputArtifact - - - - - - -```json -{ - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} -} - -``` - -PayloadInputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|input_artifact_id|string(uuid)|false|none|none| -|metadata|object|true|none|none| - -### PayloadItem - - - - - - -```json -{ - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } -} - -``` - -PayloadItem - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|object|true|none|none| -|» **additionalProperties**|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| -|item_id|string(uuid)|true|none|none| -|output_artifacts|object|true|none|none| -|» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -### PayloadOutputArtifact - - - - - - -```json -{ - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" -} - -``` - -PayloadOutputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|data|[TransferUrls](#schematransferurls)|true|none|none| -|metadata|[TransferUrls](#schematransferurls)|true|none|none| -|output_artifact_id|string(uuid)|true|none|none| - -### RunCreationRequest - - - - - - -```json -{ - "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -} - -``` - -RunCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_version|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[SlugVersionRequest](#schemaslugversionrequest)|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|none| - -### RunCreationResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" -} - -``` - -RunCreationResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|none| - -### RunReadResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } -} - -``` - -RunReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|none| -|application_version_id|string(uuid)|true|none|none| -|organization_id|string|true|none|none| -|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| -|triggered_at|string(date-time)|true|none|none| -|triggered_by|string|true|none|none| -|user_payload|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -### SlugVersionRequest - - - - - - -```json -{ - "application_slug": "string", - "version": "string" -} - -``` - -SlugVersionRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_slug|string|true|none|none| -|version|string|true|none|none| - -### TransferUrls - - - - - - -```json -{ - "download_url": "http://example.com", - "upload_url": "http://example.com" -} - -``` - -TransferUrls - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|upload_url|string(uri)|true|none|none| - -### UserPayload - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] -} - -``` - -UserPayload - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|application_run_id|string(uuid)|true|none|none| -|global_output_artifacts|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|object|false|none|none| -|»» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|items|[[PayloadItem](#schemapayloaditem)]|true|none|none| - -### ValidationError - - - - - - -```json -{ - "loc": [ - "string" - ], - "msg": "string", - "type": "string" -} - -``` - -ValidationError - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|loc|[anyOf]|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|integer|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|msg|string|true|none|none| -|type|string|true|none|none| - -### VersionCreationRequest - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} - -``` - -VersionCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|changelog|string|true|none|none| -|flow_id|string(uuid)|true|none|none| -|input_artifacts|[[InputArtifactSchemaCreationRequest](#schemainputartifactschemacreationrequest)]|true|none|none| -|output_artifacts|[[OutputArtifactSchemaCreationRequest](#schemaoutputartifactschemacreationrequest)]|true|none|none| -|version|string|true|none|none| - -### VersionCreationResponse - - - - - - -```json -{ - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" -} - -``` - -VersionCreationResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_version_id|string(uuid)|true|none|none| - -### VersionReadResponse - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "changelog": "string", - "created_at": "2019-08-24T14:15:22Z", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} - -``` - -VersionReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|application_version_id|string(uuid)|true|none|none| -|changelog|string|true|none|none| -|created_at|string(date-time)|true|none|none| -|flow_id|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifact](#schemainputartifact)]|true|none|none| -|output_artifacts|[[OutputArtifact](#schemaoutputartifact)]|true|none|none| -|version|string|true|none|none| +--- +title: - url: '' +language_tabs: +toc_footers: [] +includes: [] +search: true +highlight_theme: darkula +--- + + + + + + + + + + + + - Aignostics H&E TME application + title: Description + type: string + name: + examples: + - HETA + title: Name + type: string + regulatory_classes: + examples: + - - RuO + items: + type: string + title: Regulatory Classes + type: array + slug: + examples: + - heta + title: Slug + type: string + required: + - application_id + - name + - slug + - regulatory_classes + - description + title: ApplicationReadResponse + type: object + ApplicationRunStatus: + enum: + - canceled_system + - canceled_user + - completed + - completed_with_error + - received + - rejected + - running + - scheduled + title: ApplicationRunStatus + type: string + ApplicationVersionReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + application_version_slug: + examples: + - tissue-segmentation-qc:v0.0.1 + pattern: ^(?:|-)*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ + title: Application Version Slug + type: string + changelog: + title: Changelog + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Flow Id + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactReadResponse' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactReadResponse' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - application_version_id + - application_version_slug + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + title: ApplicationVersionReadResponse + type: object + HTTPValidationError: + properties: + detail: + items: + $ref: '#/components/schemas/ValidationError' + title: Detail + type: array + title: HTTPValidationError + type: object + InputArtifact: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^{0,126}/{0,126}$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifact + type: object + InputArtifactCreationRequest: + properties: + download_url: + examples: + - https://example.com/case-no-1-slide.tiff + format: uri + maxLength: 2083 + minLength: 1 + title: Download Url + type: string + metadata: + examples: + - checksum_crc32c: 752f9554 + height: 2000 + height_mpp: 0.5 + width: 10000 + width_mpp: 0.5 + title: Metadata + type: object + name: + examples: + - slide + title: Name + type: string + required: + - name + - download_url + - metadata + title: InputArtifactCreationRequest + type: object + InputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^{0,126}/{0,126}$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactReadResponse + type: object + InputArtifactSchemaCreationRequest: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactSchemaCreationRequest + type: object + ItemCreationRequest: + properties: + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactCreationRequest' + title: Input Artifacts + type: array + reference: + examples: + - case-no-1 + title: Reference + type: string + required: + - reference + - input_artifacts + title: ItemCreationRequest + type: object + ItemResultReadResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + error: + anyOf: + - type: string + - type: 'null' + title: Error + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactResultReadResponse' + title: Output Artifacts + type: array + reference: + title: Reference + type: string + status: + $ref: '#/components/schemas/ItemStatus' + required: + - item_id + - application_run_id + - reference + - status + - error + - output_artifacts + title: ItemResultReadResponse + type: object + ItemStatus: + enum: + - pending + - canceled_user + - canceled_system + - error_user + - error_system + - succeeded + title: ItemStatus + type: string + OutputArtifact: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^{0,126}/{0,126}$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + visibility: + $ref: '#/components/schemas/OutputArtifactVisibility' + required: + - name + - mime_type + - metadata_schema + - scope + - visibility + title: OutputArtifact + type: object + OutputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^{0,126}/{0,126}$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + required: + - name + - mime_type + - metadata_schema + - scope + title: OutputArtifactReadResponse + type: object + OutputArtifactResultReadResponse: + properties: + download_url: + anyOf: + - format: uri + maxLength: 2083 + minLength: 1 + type: string + - type: 'null' + title: Download Url + metadata: + title: Metadata + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^{0,126}/{0,126}$ + title: Mime Type + type: string + name: + title: Name + type: string + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - name + - mime_type + - metadata + - download_url + title: OutputArtifactResultReadResponse + type: object + OutputArtifactSchemaCreationRequest: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + visibility: + $ref: '#/components/schemas/OutputArtifactVisibility' + required: + - name + - mime_type + - scope + - visibility + - metadata_schema + title: OutputArtifactSchemaCreationRequest + type: object + OutputArtifactScope: + enum: + - item + - global + title: OutputArtifactScope + type: string + OutputArtifactVisibility: + enum: + - internal + - external + title: OutputArtifactVisibility + type: string + PayloadInputArtifact: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + input_artifact_id: + format: uuid + title: Input Artifact Id + type: string + metadata: + title: Metadata + type: object + required: + - metadata + - download_url + title: PayloadInputArtifact + type: object + PayloadItem: + properties: + input_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadInputArtifact' + title: Input Artifacts + type: object + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + title: Output Artifacts + type: object + required: + - item_id + - input_artifacts + - output_artifacts + title: PayloadItem + type: object + PayloadOutputArtifact: + properties: + data: + $ref: '#/components/schemas/TransferUrls' + metadata: + $ref: '#/components/schemas/TransferUrls' + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - data + - metadata + title: PayloadOutputArtifact + type: object + RunCreationRequest: + properties: + application_version: + anyOf: + - format: uuid + type: string + - $ref: '#/components/schemas/SlugVersionRequest' + examples: + - efbf9822-a1e5-4045-a283-dbf26e8064a9 + title: Application Version + items: + items: + $ref: '#/components/schemas/ItemCreationRequest' + title: Items + type: array + required: + - application_version + - items + title: RunCreationRequest + type: object + RunCreationResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + required: + - application_run_id + title: RunCreationResponse + type: object + RunReadResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + organization_id: + title: Organization Id + type: string + status: + $ref: '#/components/schemas/ApplicationRunStatus' + triggered_at: + format: date-time + title: Triggered At + type: string + triggered_by: + title: Triggered By + type: string + user_payload: + anyOf: + - $ref: '#/components/schemas/UserPayload' + - type: 'null' + required: + - application_run_id + - application_version_id + - organization_id + - status + - triggered_at + - triggered_by + title: RunReadResponse + type: object + SlugVersionRequest: + properties: + application_slug: + pattern: ^(-?)*$ + title: Application Slug + type: string + version: + title: Version + type: string + required: + - application_slug + - version + title: SlugVersionRequest + type: object + TransferUrls: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + upload_url: + format: uri + minLength: 1 + title: Upload Url + type: string + required: + - upload_url + - download_url + title: TransferUrls + type: object + UserPayload: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_run_id: + format: uuid + title: Application Run Id + type: string + global_output_artifacts: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + type: object + - type: 'null' + title: Global Output Artifacts + items: + items: + $ref: '#/components/schemas/PayloadItem' + title: Items + type: array + required: + - application_id + - application_run_id + - global_output_artifacts + - items + title: UserPayload + type: object + ValidationError: + properties: + loc: + items: + anyOf: + - type: string + - type: integer + title: Location + type: array + msg: + title: Message + type: string + type: + title: Error Type + type: string + required: + - loc + - msg + - type + title: ValidationError + type: object + VersionCreationRequest: + properties: + application_id: + format: uuid + title: Application Id + type: string + changelog: + title: Changelog + type: string + flow_id: + format: uuid + title: Flow Id + type: string + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactSchemaCreationRequest' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactSchemaCreationRequest' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - version + - application_id + - flow_id + - changelog + - input_artifacts + - output_artifacts + title: VersionCreationRequest + type: object + VersionCreationResponse: + properties: + application_version_id: + format: uuid + title: Application Version Id + type: string + required: + - application_version_id + title: VersionCreationResponse + type: object + VersionReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + changelog: + title: Changelog + type: string + created_at: + format: date-time + title: Created At + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Flow Id + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifact' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifact' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - application_version_id + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + - created_at + title: VersionReadResponse + type: object +info: + title: PAPI API Reference + version: 1.0.0 +openapi: 3.1.0 +paths: + /v1/applications: + get: + operationId: list_applications_v1_applications_get + parameters: + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationReadResponse' + title: Response List Applications V1 Applications Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Applications + tags: + - Externals + /v1/applications/{application_id}/versions: + get: + operationId: +list_versions_by_application_id_v1_applications__application_id__versions_get + parameters: + - in: path + name: application_id + required: true + schema: + format: uuid + title: Application Id + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Id V1 Applications +Application + Id Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Versions By Application Id + tags: + - Externals + /v1/applications/{application_slug}: + get: + operationId: +read_application_by_slug_v1_applications__application_slug__get + parameters: + - in: path + name: application_slug + required: true + schema: + title: Application Slug + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Read Application By Slug + tags: + - Externals + /v1/applications/{application_slug}/versions: + get: + operationId: +list_versions_by_application_slug_v1_applications__application_slug__versions_ge +t + parameters: + - in: path + name: application_slug + required: true + schema: + pattern: ^(-?)*$ + title: Application Slug + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Slug V1 +Applications Application + Slug Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Versions By Application Slug + tags: + - Externals + /v1/runs: + get: + operationId: list_application_runs_v1_runs_get + parameters: + - in: query + name: application_id + required: false + schema: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Id + - in: query + name: application_version_id + required: false + schema: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Version Id + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/RunReadResponse' + title: Response List Application Runs V1 Runs Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Application Runs + tags: + - Externals + post: + operationId: create_application_run_v1_runs_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Create Application Run + tags: + - Externals + /v1/runs/{application_run_id}: + get: + operationId: get_run_v1_runs__application_run_id__get + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RunReadResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Get Run + tags: + - Externals + /v1/runs/{application_run_id}/cancel: + post: + operationId: cancel_run_v1_runs__application_run_id__cancel_post + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + responses: + '202': + content: + application/json: + schema: {} + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Cancel Run + tags: + - Externals + /v1/runs/{application_run_id}/results: + delete: + operationId: +delete_run_results_v1_runs__application_run_id__results_delete + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + responses: + '204': + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Delete Run Results + tags: + - Externals + get: + operationId: list_run_results_v1_runs__application_run_id__results_get + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + - in: query + name: item_id__in + required: false + schema: + anyOf: + - items: + format: uuid + type: string + type: array + - type: 'null' + title: Item Id In + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: reference__in + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Reference In + - in: query + name: status__in + required: false + schema: + anyOf: + - items: + $ref: '#/components/schemas/ItemStatus' + type: array + - type: 'null' + title: Status In + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ItemResultReadResponse' + title: Response List Run Results V1 Runs Application Run Id +Results + Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Run Results + tags: + - Externals + /v1/versions: + post: + operationId: register_version_v1_versions_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VersionCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/VersionCreationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Register Version + tags: + - Externals + /v1/versions/{application_version_id}: + get: + operationId: get_version_v1_versions__application_version_id__get + parameters: + - in: path + name: application_version_id + required: true + schema: + format: uuid + title: Application Version Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VersionReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Get Version + tags: + - Externals +servers: +- url: '' + +> components: + +> schemas: + +> ApplicationReadResponse: + +> properties: + +> application_id: + +> format: uuid + +> title: Application Id + +> type: string + +> description: + +> examples: diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index 470f21a5..f2fa5837 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -726,7 +726,8 @@ paths: - Externals /v1/applications/{application_id}/versions: get: - operationId: list_versions_by_application_id_v1_applications__application_id__versions_get + operationId: +list_versions_by_application_id_v1_applications__application_id__versions_get parameters: - in: path name: application_id @@ -789,7 +790,8 @@ paths: schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications Application + title: Response List Versions By Application Id V1 Applications +Application Id Versions Get type: array description: Successful Response @@ -804,7 +806,8 @@ paths: - Externals /v1/applications/{application_slug}: get: - operationId: read_application_by_slug_v1_applications__application_slug__get + operationId: +read_application_by_slug_v1_applications__application_slug__get parameters: - in: path name: application_slug @@ -830,7 +833,9 @@ paths: - Externals /v1/applications/{application_slug}/versions: get: - operationId: list_versions_by_application_slug_v1_applications__application_slug__versions_get + operationId: +list_versions_by_application_slug_v1_applications__application_slug__versions_ge +t parameters: - in: path name: application_slug @@ -893,7 +898,8 @@ paths: schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 Applications Application + title: Response List Versions By Application Slug V1 +Applications Application Slug Versions Get type: array description: Successful Response @@ -1085,7 +1091,8 @@ paths: - Externals /v1/runs/{application_run_id}/results: delete: - operationId: delete_run_results_v1_runs__application_run_id__results_delete + operationId: +delete_run_results_v1_runs__application_run_id__results_delete parameters: - in: path name: application_run_id @@ -1183,7 +1190,8 @@ paths: schema: items: $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id Results + title: Response List Run Results V1 Runs Application Run Id +Results Get type: array description: Successful Response diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 147056b0..32b169fa 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -106,9 +106,7 @@ def verify_and_decode_token(token: str) -> dict[str, str]: "dict[str, str]", jwt.decode(binary_token, key=key, algorithms=[algorithm], audience=authentication_settings().audience), ) - except jwt.exceptions.PyJWKClientError as e: - raise RuntimeError(AUTHENTICATION_FAILED) from e - except jwt.exceptions.DecodeError as e: + except jwt.exceptions.PyJWTError as e: raise RuntimeError(AUTHENTICATION_FAILED) from e @@ -174,14 +172,11 @@ def do_GET(self) -> None: # noqa: N802 return auth_code = query["code"][0] - try: # Exchange code for token token = session.fetch_token(authentication_settings().token_url, code=auth_code, include_client_id=True) - # Store the token authentication_result.token = token["access_token"] - # Send success response self.send_response(200) self.send_header("Content-type", "text/html") @@ -222,10 +217,7 @@ def log_message(self, _format: str, *_args) -> None: # type: ignore[no-untyped- # Extract authorization_code from redirected request, see: OAuthCallbackHandler server.handle_request() - if authentication_result.error: - msg = f"{AUTHENTICATION_FAILED}: {authentication_result.error}" - raise RuntimeError(msg) - if not authentication_result.token: + if authentication_result.error or not authentication_result.token: raise RuntimeError(AUTHENTICATION_FAILED) return authentication_result.token @@ -255,9 +247,6 @@ def _perform_device_flow() -> str | None: try: response.raise_for_status() json_response = response.json() - if "device_code" not in json_response or "verification_uri_complete" not in json_response: - raise RuntimeError(AUTHENTICATION_FAILED) - device_code = json_response["device_code"] verification_uri = json_response["verification_uri_complete"] user_code = json_response["user_code"] @@ -272,7 +261,7 @@ def _perform_device_flow() -> str | None: # Polling for access token with received device code while True: try: - response = requests.post( + json_response = requests.post( authentication_settings().token_url, headers={"Accept": "application/json"}, data={ @@ -281,20 +270,17 @@ def _perform_device_flow() -> str | None: "client_id": authentication_settings().client_id_device.get_secret_value(), }, timeout=authentication_settings().request_timeout_seconds, - ) - json_response = response.json() + ).json() if "error" in json_response: - error_code = json_response["error"] - if error_code in {"authorization_pending", "slow_down"}: + if json_response["error"] in {"authorization_pending", "slow_down"}: time.sleep(interval) continue raise RuntimeError(AUTHENTICATION_FAILED) - if not (token := json_response.get("access_token")): - raise RuntimeError(AUTHENTICATION_FAILED) - - return t.cast("str", token) - + return t.cast("str", json_response["access_token"]) + except requests.exceptions.JSONDecodeError as e: + # Handle case where response is not JSON + raise RuntimeError(AUTHENTICATION_FAILED) from e except HTTPError as e: raise RuntimeError(AUTHENTICATION_FAILED) from e @@ -311,8 +297,8 @@ def _token_from_refresh_token(refresh_token: SecretStr) -> str | None: Raises: RuntimeError: If token refresh fails. """ - while True: - resp = requests.post( + try: + response = requests.post( authentication_settings().token_url, headers={"Accept": "application/json"}, data={ @@ -321,10 +307,8 @@ def _token_from_refresh_token(refresh_token: SecretStr) -> str | None: "refresh_token": refresh_token.get_secret_value(), }, timeout=authentication_settings().request_timeout_seconds, - ).json() - if "error" in resp: - if resp["error"] in {"authorization_pending", "slow_down"}: - time.sleep(authentication_settings().authorization_backoff_seconds) - continue - raise RuntimeError(resp["error"]) - return t.cast("str", resp["access_token"]) + ) + response.raise_for_status() + return t.cast("str", response.json()["access_token"]) + except HTTPError as e: + raise RuntimeError(AUTHENTICATION_FAILED) from e From b75a2605ba6c00ad957182e0b59e275c42966e10 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Mon, 7 Apr 2025 08:58:15 +0200 Subject: [PATCH 079/110] chore: docker intermediate --- compose.yaml | 22 ++-------------------- pyproject.toml | 2 +- tests/aignostics/cli/docker_test.py | 14 ++++++++++++++ tests/conftest.py | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 21 deletions(-) create mode 100644 tests/aignostics/cli/docker_test.py create mode 100644 tests/conftest.py diff --git a/compose.yaml b/compose.yaml index d6da2c79..3b3a4c2d 100644 --- a/compose.yaml +++ b/compose.yaml @@ -8,28 +8,10 @@ services: watch: - path: src action: rebuild + - path: codegen + action: rebuild restart: no profiles: - manual tty: true stdin_open: true - aignostics-api: - build: . - env_file: - - path: .env - required: true - develop: - watch: - - path: src - action: rebuild - command: serve --host=0.0.0.0 --port=8000 --no-watch - restart: always - ports: - - "8000:8000" - healthcheck: - test: [ "CMD", "curl", "-f", "http://127.0.0.1:8000/healthz" ] - interval: 5s - timeout: 2s - retries: 3 - start_period: 5s - start_interval: 1s diff --git a/pyproject.toml b/pyproject.toml index 88a61ca6..95136880 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -266,9 +266,9 @@ markers = [ "no_extras: tests that do require no extras installed", "scheduled: tests to run on a schedule", "sequential: exclude from parallel test execution", + "skip_with_act: skip test if act is used", # Custom # Nothing yet - "scheduled", "description: textual description what the test does, goes in `description` field in the Jira ticket - optional", "labels: mark test with labels that are attached to the test tickets in Jira - optional; comma-separated", "requirements: mark tests with ids (e.g., PAPI-123, HETA-123) of requirements in Jira. The test will be linked to them - optional; comma-separated", diff --git a/tests/aignostics/cli/docker_test.py b/tests/aignostics/cli/docker_test.py new file mode 100644 index 00000000..6b3171ee --- /dev/null +++ b/tests/aignostics/cli/docker_test.py @@ -0,0 +1,14 @@ +"""Tests to verify the CLI functionality of Aignostics Python SDK.""" + +import pytest + +BUILT_WITH_LOVE = "built with love in Berlin" + + +@pytest.mark.xdist_group(name="docker") +@pytest.mark.skip_with_act +def test_core_docker_cli_help_with_love(docker_services) -> None: + """Test the CLI help command with docker services returns expected output.""" + out = docker_services._docker_compose.execute("run aignostics --help ") + out_str = out.decode("utf-8") + assert "built with love in Berlin" in out_str diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..d9500480 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,15 @@ +"""Common test fixtures and configuration.""" + +from pathlib import Path + +import pytest + + +@pytest.fixture(scope="session") +def docker_compose_file(pytestconfig) -> str: + """Get the path to the docker compose file. + + Returns: + str: The path to the docker compose file. + """ + return str(Path(pytestconfig.rootdir) / "compose.yaml") From 96e0fea574d8a522dcc227d800020a7a423f9848 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Mon, 7 Apr 2025 08:59:19 +0200 Subject: [PATCH 080/110] chore: merge for docs --- API_REFERENCE_v1.md | 4025 ++++++++++++++++++--------- docs/source/_static/openapi_v1.yaml | 22 +- 2 files changed, 2729 insertions(+), 1318 deletions(-) diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md index 93520550..42cc5470 100644 --- a/API_REFERENCE_v1.md +++ b/API_REFERENCE_v1.md @@ -1,1304 +1,2723 @@ # API v1 Reference ---- -title: - url: '' -language_tabs: -toc_footers: [] -includes: [] -search: true -highlight_theme: darkula ---- - - - - - - - - - - - - - Aignostics H&E TME application - title: Description - type: string - name: - examples: - - HETA - title: Name - type: string - regulatory_classes: - examples: - - - RuO - items: - type: string - title: Regulatory Classes - type: array - slug: - examples: - - heta - title: Slug - type: string - required: - - application_id - - name - - slug - - regulatory_classes - - description - title: ApplicationReadResponse - type: object - ApplicationRunStatus: - enum: - - canceled_system - - canceled_user - - completed - - completed_with_error - - received - - rejected - - running - - scheduled - title: ApplicationRunStatus - type: string - ApplicationVersionReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - application_version_slug: - examples: - - tissue-segmentation-qc:v0.0.1 - pattern: ^(?:|-)*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ - title: Application Version Slug - type: string - changelog: - title: Changelog - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Flow Id - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactReadResponse' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactReadResponse' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - application_version_id - - application_version_slug - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - title: ApplicationVersionReadResponse - type: object - HTTPValidationError: - properties: - detail: - items: - $ref: '#/components/schemas/ValidationError' - title: Detail - type: array - title: HTTPValidationError - type: object - InputArtifact: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^{0,126}/{0,126}$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifact - type: object - InputArtifactCreationRequest: - properties: - download_url: - examples: - - https://example.com/case-no-1-slide.tiff - format: uri - maxLength: 2083 - minLength: 1 - title: Download Url - type: string - metadata: - examples: - - checksum_crc32c: 752f9554 - height: 2000 - height_mpp: 0.5 - width: 10000 - width_mpp: 0.5 - title: Metadata - type: object - name: - examples: - - slide - title: Name - type: string - required: - - name - - download_url - - metadata - title: InputArtifactCreationRequest - type: object - InputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^{0,126}/{0,126}$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactReadResponse - type: object - InputArtifactSchemaCreationRequest: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactSchemaCreationRequest - type: object - ItemCreationRequest: - properties: - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactCreationRequest' - title: Input Artifacts - type: array - reference: - examples: - - case-no-1 - title: Reference - type: string - required: - - reference - - input_artifacts - title: ItemCreationRequest - type: object - ItemResultReadResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - error: - anyOf: - - type: string - - type: 'null' - title: Error - item_id: - format: uuid - title: Item Id - type: string - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactResultReadResponse' - title: Output Artifacts - type: array - reference: - title: Reference - type: string - status: - $ref: '#/components/schemas/ItemStatus' - required: - - item_id - - application_run_id - - reference - - status - - error - - output_artifacts - title: ItemResultReadResponse - type: object - ItemStatus: - enum: - - pending - - canceled_user - - canceled_system - - error_user - - error_system - - succeeded - title: ItemStatus - type: string - OutputArtifact: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^{0,126}/{0,126}$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - visibility: - $ref: '#/components/schemas/OutputArtifactVisibility' - required: - - name - - mime_type - - metadata_schema - - scope - - visibility - title: OutputArtifact - type: object - OutputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^{0,126}/{0,126}$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - required: - - name - - mime_type - - metadata_schema - - scope - title: OutputArtifactReadResponse - type: object - OutputArtifactResultReadResponse: - properties: - download_url: - anyOf: - - format: uri - maxLength: 2083 - minLength: 1 - type: string - - type: 'null' - title: Download Url - metadata: - title: Metadata - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^{0,126}/{0,126}$ - title: Mime Type - type: string - name: - title: Name - type: string - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - name - - mime_type - - metadata - - download_url - title: OutputArtifactResultReadResponse - type: object - OutputArtifactSchemaCreationRequest: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - visibility: - $ref: '#/components/schemas/OutputArtifactVisibility' - required: - - name - - mime_type - - scope - - visibility - - metadata_schema - title: OutputArtifactSchemaCreationRequest - type: object - OutputArtifactScope: - enum: - - item - - global - title: OutputArtifactScope - type: string - OutputArtifactVisibility: - enum: - - internal - - external - title: OutputArtifactVisibility - type: string - PayloadInputArtifact: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - input_artifact_id: - format: uuid - title: Input Artifact Id - type: string - metadata: - title: Metadata - type: object - required: - - metadata - - download_url - title: PayloadInputArtifact - type: object - PayloadItem: - properties: - input_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadInputArtifact' - title: Input Artifacts - type: object - item_id: - format: uuid - title: Item Id - type: string - output_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - title: Output Artifacts - type: object - required: - - item_id - - input_artifacts - - output_artifacts - title: PayloadItem - type: object - PayloadOutputArtifact: - properties: - data: - $ref: '#/components/schemas/TransferUrls' - metadata: - $ref: '#/components/schemas/TransferUrls' - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - data - - metadata - title: PayloadOutputArtifact - type: object - RunCreationRequest: - properties: - application_version: - anyOf: - - format: uuid - type: string - - $ref: '#/components/schemas/SlugVersionRequest' - examples: - - efbf9822-a1e5-4045-a283-dbf26e8064a9 - title: Application Version - items: - items: - $ref: '#/components/schemas/ItemCreationRequest' - title: Items - type: array - required: - - application_version - - items - title: RunCreationRequest - type: object - RunCreationResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - required: - - application_run_id - title: RunCreationResponse - type: object - RunReadResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - organization_id: - title: Organization Id - type: string - status: - $ref: '#/components/schemas/ApplicationRunStatus' - triggered_at: - format: date-time - title: Triggered At - type: string - triggered_by: - title: Triggered By - type: string - user_payload: - anyOf: - - $ref: '#/components/schemas/UserPayload' - - type: 'null' - required: - - application_run_id - - application_version_id - - organization_id - - status - - triggered_at - - triggered_by - title: RunReadResponse - type: object - SlugVersionRequest: - properties: - application_slug: - pattern: ^(-?)*$ - title: Application Slug - type: string - version: - title: Version - type: string - required: - - application_slug - - version - title: SlugVersionRequest - type: object - TransferUrls: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - upload_url: - format: uri - minLength: 1 - title: Upload Url - type: string - required: - - upload_url - - download_url - title: TransferUrls - type: object - UserPayload: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_run_id: - format: uuid - title: Application Run Id - type: string - global_output_artifacts: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - type: object - - type: 'null' - title: Global Output Artifacts - items: - items: - $ref: '#/components/schemas/PayloadItem' - title: Items - type: array - required: - - application_id - - application_run_id - - global_output_artifacts - - items - title: UserPayload - type: object - ValidationError: - properties: - loc: - items: - anyOf: - - type: string - - type: integer - title: Location - type: array - msg: - title: Message - type: string - type: - title: Error Type - type: string - required: - - loc - - msg - - type - title: ValidationError - type: object - VersionCreationRequest: - properties: - application_id: - format: uuid - title: Application Id - type: string - changelog: - title: Changelog - type: string - flow_id: - format: uuid - title: Flow Id - type: string - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactSchemaCreationRequest' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactSchemaCreationRequest' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - version - - application_id - - flow_id - - changelog - - input_artifacts - - output_artifacts - title: VersionCreationRequest - type: object - VersionCreationResponse: - properties: - application_version_id: - format: uuid - title: Application Version Id - type: string - required: - - application_version_id - title: VersionCreationResponse - type: object - VersionReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - changelog: - title: Changelog - type: string - created_at: - format: date-time - title: Created At - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Flow Id - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifact' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifact' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - application_version_id - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - - created_at - title: VersionReadResponse - type: object -info: - title: PAPI API Reference - version: 1.0.0 -openapi: 3.1.0 -paths: - /v1/applications: - get: - operationId: list_applications_v1_applications_get - parameters: - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationReadResponse' - title: Response List Applications V1 Applications Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Applications - tags: - - Externals - /v1/applications/{application_id}/versions: - get: - operationId: -list_versions_by_application_id_v1_applications__application_id__versions_get - parameters: - - in: path - name: application_id - required: true - schema: - format: uuid - title: Application Id - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications -Application - Id Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Versions By Application Id - tags: - - Externals - /v1/applications/{application_slug}: - get: - operationId: -read_application_by_slug_v1_applications__application_slug__get - parameters: - - in: path - name: application_slug - required: true - schema: - title: Application Slug - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Read Application By Slug - tags: - - Externals - /v1/applications/{application_slug}/versions: - get: - operationId: -list_versions_by_application_slug_v1_applications__application_slug__versions_ge -t - parameters: - - in: path - name: application_slug - required: true - schema: - pattern: ^(-?)*$ - title: Application Slug - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 -Applications Application - Slug Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Versions By Application Slug - tags: - - Externals - /v1/runs: - get: - operationId: list_application_runs_v1_runs_get - parameters: - - in: query - name: application_id - required: false - schema: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Id - - in: query - name: application_version_id - required: false - schema: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Version Id - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/RunReadResponse' - title: Response List Application Runs V1 Runs Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Application Runs - tags: - - Externals - post: - operationId: create_application_run_v1_runs_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Create Application Run - tags: - - Externals - /v1/runs/{application_run_id}: - get: - operationId: get_run_v1_runs__application_run_id__get - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/RunReadResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Get Run - tags: - - Externals - /v1/runs/{application_run_id}/cancel: - post: - operationId: cancel_run_v1_runs__application_run_id__cancel_post - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - responses: - '202': - content: - application/json: - schema: {} - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Cancel Run - tags: - - Externals - /v1/runs/{application_run_id}/results: - delete: - operationId: -delete_run_results_v1_runs__application_run_id__results_delete - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - responses: - '204': - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Delete Run Results - tags: - - Externals - get: - operationId: list_run_results_v1_runs__application_run_id__results_get - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - - in: query - name: item_id__in - required: false - schema: - anyOf: - - items: - format: uuid - type: string - type: array - - type: 'null' - title: Item Id In - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: reference__in - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Reference In - - in: query - name: status__in - required: false - schema: - anyOf: - - items: - $ref: '#/components/schemas/ItemStatus' - type: array - - type: 'null' - title: Status In - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id -Results - Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Run Results - tags: - - Externals - /v1/versions: - post: - operationId: register_version_v1_versions_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Register Version - tags: - - Externals - /v1/versions/{application_version_id}: - get: - operationId: get_version_v1_versions__application_version_id__get - parameters: - - in: path - name: application_version_id - required: true - schema: - format: uuid - title: Application Version Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/VersionReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Get Version - tags: - - Externals -servers: -- url: '' - -> components: - -> schemas: - -> ApplicationReadResponse: - -> properties: - -> application_id: - -> format: uuid - -> title: Application Id - -> type: string - -> description: - -> examples: +## PAPI API Reference v1.0.0 + +> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. + +Base URLs: + +* + +## Externals + +### list_applications_v1_applications_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/applications', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/applications', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications` + +*List Applications* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Applications V1 Applications Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Applications V1 Applications Get|[[ApplicationReadResponse](#schemaapplicationreadresponse)]|false|none|none| +|» ApplicationReadResponse|[ApplicationReadResponse](#schemaapplicationreadresponse)|false|none|none| +|»» application_id|string(uuid)|true|none|none| +|»» description|string|true|none|none| +|»» name|string|true|none|none| +|»» regulatory_classes|[string]|true|none|none| +|»» slug|string|true|none|none| + + +This operation does not require authentication + + +### list_versions_by_application_id_v1_applications__application_id__versions_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/applications/{application_id}/versions', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/applications/{application_id}/versions', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_id}/versions` + +*List Versions By Application Id* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|path|string(uuid)|true|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|version|query|any|false|none| +|include|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Versions By Application Id V1 Applications Application Id Versions Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| +|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| +|»» application_id|string(uuid)|true|none|none| +|»» application_version_id|string(uuid)|true|none|none| +|»» application_version_slug|string|true|none|none| +|»» changelog|string|true|none|none| +|»» flow_id|any|false|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string(uuid)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|»» version|string|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|scope|item| +|scope|global| + + +This operation does not require authentication + + +### read_application_by_slug_v1_applications__application_slug__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/applications/{application_slug}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/applications/{application_slug}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_slug}` + +*Read Application By Slug* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_slug|path|string|true|none| + +> Example responses + +> 200 Response + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[ApplicationReadResponse](#schemaapplicationreadresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### list_versions_by_application_slug_v1_applications__application_slug__versions_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/applications/{application_slug}/versions', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/applications/{application_slug}/versions', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_slug}/versions` + +*List Versions By Application Slug* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_slug|path|string|true|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|version|query|any|false|none| +|include|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Versions By Application Slug V1 Applications Application Slug Versions Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Versions By Application Slug V1 Applications Application Slug Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| +|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| +|»» application_id|string(uuid)|true|none|none| +|»» application_version_id|string(uuid)|true|none|none| +|»» application_version_slug|string|true|none|none| +|»» changelog|string|true|none|none| +|»» flow_id|any|false|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string(uuid)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|»» version|string|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|scope|item| +|scope|global| + + +This operation does not require authentication + + +### list_application_runs_v1_runs_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/runs', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs` + +*List Application Runs* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|query|any|false|none| +|application_version_id|query|any|false|none| +|include|query|any|false|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Application Runs V1 Runs Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Application Runs V1 Runs Get|[[RunReadResponse](#schemarunreadresponse)]|false|none|none| +|» RunReadResponse|[RunReadResponse](#schemarunreadresponse)|false|none|none| +|»» application_run_id|string(uuid)|true|none|none| +|»» application_version_id|string(uuid)|true|none|none| +|»» organization_id|string|true|none|none| +|»» status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| +|»» triggered_at|string(date-time)|true|none|none| +|»» triggered_by|string|true|none|none| +|»» user_payload|any|false|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| +|»»»» application_id|string(uuid)|true|none|none| +|»»»» application_run_id|string(uuid)|true|none|none| +|»»»» global_output_artifacts|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|object|false|none|none| +|»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| +|»»»»»»» data|[TransferUrls](#schematransferurls)|true|none|none| +|»»»»»»»» download_url|string(uri)|true|none|none| +|»»»»»»»» upload_url|string(uri)|true|none|none| +|»»»»»»» metadata|[TransferUrls](#schematransferurls)|true|none|none| +|»»»»»»» output_artifact_id|string(uuid)|true|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»» items|[[PayloadItem](#schemapayloaditem)]|true|none|none| +|»»»»» PayloadItem|[PayloadItem](#schemapayloaditem)|false|none|none| +|»»»»»» input_artifacts|object|true|none|none| +|»»»»»»» PayloadInputArtifact|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| +|»»»»»»»» download_url|string(uri)|true|none|none| +|»»»»»»»» input_artifact_id|string(uuid)|false|none|none| +|»»»»»»»» metadata|object|true|none|none| +|»»»»»» item_id|string(uuid)|true|none|none| +|»»»»»» output_artifacts|object|true|none|none| +|»»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|status|canceled_system| +|status|canceled_user| +|status|completed| +|status|completed_with_error| +|status|received| +|status|rejected| +|status|running| +|status|scheduled| + + +This operation does not require authentication + + +### create_application_run_v1_runs_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json' +} + +r = requests.post('/v1/runs', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json' +}; + +fetch('/v1/runs', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/runs` + +*Create Application Run* + +> Body parameter + +```json +{ + "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[RunCreationRequest](#schemaruncreationrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[RunCreationResponse](#schemaruncreationresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### get_run_v1_runs__application_run_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/runs/{application_run_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs/{application_run_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs/{application_run_id}` + +*Get Run* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| +|include|query|any|false|none| + +> Example responses + +> 200 Response + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[RunReadResponse](#schemarunreadresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### cancel_run_v1_runs__application_run_id__cancel_post + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.post('/v1/runs/{application_run_id}/cancel', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs/{application_run_id}/cancel', +{ + method: 'POST', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/runs/{application_run_id}/cancel` + +*Cancel Run* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| + +> Example responses + +> 202 Response + +```json +null +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + + +This operation does not require authentication + + +### delete_run_results_v1_runs__application_run_id__results_delete + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.delete('/v1/runs/{application_run_id}/results', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs/{application_run_id}/results', +{ + method: 'DELETE', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`DELETE /v1/runs/{application_run_id}/results` + +*Delete Run Results* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| + +> Example responses + +> 422 Response + +```json +{ + "detail": [ + { + "loc": [ + "string" + ], + "msg": "string", + "type": "string" + } + ] +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|Successful Response|None| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### list_run_results_v1_runs__application_run_id__results_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/runs/{application_run_id}/results', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs/{application_run_id}/results', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs/{application_run_id}/results` + +*List Run Results* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| +|item_id__in|query|any|false|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|reference__in|query|any|false|none| +|status__in|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": [ + { + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + ], + "reference": "string", + "status": "pending" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Run Results V1 Runs Application Run Id Results Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Run Results V1 Runs Application Run Id Results Get|[[ItemResultReadResponse](#schemaitemresultreadresponse)]|false|none|none| +|» ItemResultReadResponse|[ItemResultReadResponse](#schemaitemresultreadresponse)|false|none|none| +|»» application_run_id|string(uuid)|true|none|none| +|»» error|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» item_id|string(uuid)|true|none|none| +|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| +|»»» OutputArtifactResultReadResponse|[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)|false|none|none| +|»»»» download_url|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|string(uri)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»» metadata|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» output_artifact_id|string(uuid)|true|none|none| +|»» reference|string|true|none|none| +|»» status|[ItemStatus](#schemaitemstatus)|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|status|pending| +|status|canceled_user| +|status|canceled_system| +|status|error_user| +|status|error_system| +|status|succeeded| + + +This operation does not require authentication + + +### register_version_v1_versions_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json' +} + +r = requests.post('/v1/versions', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json' +}; + +fetch('/v1/versions', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/versions` + +*Register Version* + +> Body parameter + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[VersionCreationRequest](#schemaversioncreationrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[VersionCreationResponse](#schemaversioncreationresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### get_version_v1_versions__application_version_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/versions/{application_version_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/versions/{application_version_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/versions/{application_version_id}` + +*Get Version* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_version_id|path|string(uuid)|true|none| +|include|query|any|false|none| + +> Example responses + +> 200 Response + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "changelog": "string", + "created_at": "2019-08-24T14:15:22Z", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[VersionReadResponse](#schemaversionreadresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +## Schemas + +### ApplicationReadResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" +} + +``` + +ApplicationReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|description|string|true|none|none| +|name|string|true|none|none| +|regulatory_classes|[string]|true|none|none| +|slug|string|true|none|none| + +### ApplicationRunStatus + + + + + + +```json +"canceled_system" + +``` + +ApplicationRunStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ApplicationRunStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ApplicationRunStatus|canceled_system| +|ApplicationRunStatus|canceled_user| +|ApplicationRunStatus|completed| +|ApplicationRunStatus|completed_with_error| +|ApplicationRunStatus|received| +|ApplicationRunStatus|rejected| +|ApplicationRunStatus|running| +|ApplicationRunStatus|scheduled| + +### ApplicationVersionReadResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" +} + +``` + +ApplicationVersionReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|application_version_id|string(uuid)|true|none|none| +|application_version_slug|string|true|none|none| +|changelog|string|true|none|none| +|flow_id|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|version|string|true|none|none| + +### HTTPValidationError + + + + + + +```json +{ + "detail": [ + { + "loc": [ + "string" + ], + "msg": "string", + "type": "string" + } + ] +} + +``` + +HTTPValidationError + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|detail|[[ValidationError](#schemavalidationerror)]|false|none|none| + +### InputArtifact + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" +} + +``` + +InputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### InputArtifactCreationRequest + + + + + + +```json +{ + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" +} + +``` + +InputArtifactCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|metadata|object|true|none|none| +|name|string|true|none|none| + +### InputArtifactReadResponse + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" +} + +``` + +InputArtifactReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### InputArtifactSchemaCreationRequest + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" +} + +``` + +InputArtifactSchemaCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### ItemCreationRequest + + + + + + +```json +{ + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" +} + +``` + +ItemCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|none| +|reference|string|true|none|none| + +### ItemResultReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": [ + { + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + ], + "reference": "string", + "status": "pending" +} + +``` + +ItemResultReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|none| +|error|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|item_id|string(uuid)|true|none|none| +|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| +|reference|string|true|none|none| +|status|[ItemStatus](#schemaitemstatus)|true|none|none| + +### ItemStatus + + + + + + +```json +"pending" + +``` + +ItemStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ItemStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ItemStatus|pending| +|ItemStatus|canceled_user| +|ItemStatus|canceled_system| +|ItemStatus|error_user| +|ItemStatus|error_system| +|ItemStatus|succeeded| + +### OutputArtifact + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" +} + +``` + +OutputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| + +### OutputArtifactReadResponse + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" +} + +``` + +OutputArtifactReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| + +### OutputArtifactResultReadResponse + + + + + + +```json +{ + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" +} + +``` + +OutputArtifactResultReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uri)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|output_artifact_id|string(uuid)|true|none|none| + +### OutputArtifactSchemaCreationRequest + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" +} + +``` + +OutputArtifactSchemaCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| + +### OutputArtifactScope + + + + + + +```json +"item" + +``` + +OutputArtifactScope + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|OutputArtifactScope|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|OutputArtifactScope|item| +|OutputArtifactScope|global| + +### OutputArtifactVisibility + + + + + + +```json +"internal" + +``` + +OutputArtifactVisibility + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|OutputArtifactVisibility|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|OutputArtifactVisibility|internal| +|OutputArtifactVisibility|external| + +### PayloadInputArtifact + + + + + + +```json +{ + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} +} + +``` + +PayloadInputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|input_artifact_id|string(uuid)|false|none|none| +|metadata|object|true|none|none| + +### PayloadItem + + + + + + +```json +{ + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } +} + +``` + +PayloadItem + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|object|true|none|none| +|» **additionalProperties**|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| +|item_id|string(uuid)|true|none|none| +|output_artifacts|object|true|none|none| +|» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +### PayloadOutputArtifact + + + + + + +```json +{ + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" +} + +``` + +PayloadOutputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|data|[TransferUrls](#schematransferurls)|true|none|none| +|metadata|[TransferUrls](#schematransferurls)|true|none|none| +|output_artifact_id|string(uuid)|true|none|none| + +### RunCreationRequest + + + + + + +```json +{ + "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +} + +``` + +RunCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_version|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|[SlugVersionRequest](#schemaslugversionrequest)|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|none| + +### RunCreationResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" +} + +``` + +RunCreationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|none| + +### RunReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } +} + +``` + +RunReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|none| +|application_version_id|string(uuid)|true|none|none| +|organization_id|string|true|none|none| +|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| +|triggered_at|string(date-time)|true|none|none| +|triggered_by|string|true|none|none| +|user_payload|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +### SlugVersionRequest + + + + + + +```json +{ + "application_slug": "string", + "version": "string" +} + +``` + +SlugVersionRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_slug|string|true|none|none| +|version|string|true|none|none| + +### TransferUrls + + + + + + +```json +{ + "download_url": "http://example.com", + "upload_url": "http://example.com" +} + +``` + +TransferUrls + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|upload_url|string(uri)|true|none|none| + +### UserPayload + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] +} + +``` + +UserPayload + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|application_run_id|string(uuid)|true|none|none| +|global_output_artifacts|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|object|false|none|none| +|»» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|items|[[PayloadItem](#schemapayloaditem)]|true|none|none| + +### ValidationError + + + + + + +```json +{ + "loc": [ + "string" + ], + "msg": "string", + "type": "string" +} + +``` + +ValidationError + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|loc|[anyOf]|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|integer|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|msg|string|true|none|none| +|type|string|true|none|none| + +### VersionCreationRequest + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} + +``` + +VersionCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|changelog|string|true|none|none| +|flow_id|string(uuid)|true|none|none| +|input_artifacts|[[InputArtifactSchemaCreationRequest](#schemainputartifactschemacreationrequest)]|true|none|none| +|output_artifacts|[[OutputArtifactSchemaCreationRequest](#schemaoutputartifactschemacreationrequest)]|true|none|none| +|version|string|true|none|none| + +### VersionCreationResponse + + + + + + +```json +{ + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" +} + +``` + +VersionCreationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_version_id|string(uuid)|true|none|none| + +### VersionReadResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "changelog": "string", + "created_at": "2019-08-24T14:15:22Z", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} + +``` + +VersionReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|application_version_id|string(uuid)|true|none|none| +|changelog|string|true|none|none| +|created_at|string(date-time)|true|none|none| +|flow_id|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifact](#schemainputartifact)]|true|none|none| +|output_artifacts|[[OutputArtifact](#schemaoutputartifact)]|true|none|none| +|version|string|true|none|none| diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index f2fa5837..470f21a5 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -726,8 +726,7 @@ paths: - Externals /v1/applications/{application_id}/versions: get: - operationId: -list_versions_by_application_id_v1_applications__application_id__versions_get + operationId: list_versions_by_application_id_v1_applications__application_id__versions_get parameters: - in: path name: application_id @@ -790,8 +789,7 @@ list_versions_by_application_id_v1_applications__application_id__versions_get schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications -Application + title: Response List Versions By Application Id V1 Applications Application Id Versions Get type: array description: Successful Response @@ -806,8 +804,7 @@ Application - Externals /v1/applications/{application_slug}: get: - operationId: -read_application_by_slug_v1_applications__application_slug__get + operationId: read_application_by_slug_v1_applications__application_slug__get parameters: - in: path name: application_slug @@ -833,9 +830,7 @@ read_application_by_slug_v1_applications__application_slug__get - Externals /v1/applications/{application_slug}/versions: get: - operationId: -list_versions_by_application_slug_v1_applications__application_slug__versions_ge -t + operationId: list_versions_by_application_slug_v1_applications__application_slug__versions_get parameters: - in: path name: application_slug @@ -898,8 +893,7 @@ t schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 -Applications Application + title: Response List Versions By Application Slug V1 Applications Application Slug Versions Get type: array description: Successful Response @@ -1091,8 +1085,7 @@ Applications Application - Externals /v1/runs/{application_run_id}/results: delete: - operationId: -delete_run_results_v1_runs__application_run_id__results_delete + operationId: delete_run_results_v1_runs__application_run_id__results_delete parameters: - in: path name: application_run_id @@ -1190,8 +1183,7 @@ delete_run_results_v1_runs__application_run_id__results_delete schema: items: $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id -Results + title: Response List Run Results V1 Runs Application Run Id Results Get type: array description: Successful Response From 12f98067df1f7934a742a6677fb3abda12c8cb87 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Mon, 7 Apr 2025 09:03:35 +0200 Subject: [PATCH 081/110] docs: some --- .copier-answers.yml | 2 +- .../package-build-publish-release.yml | 1 - .github/workflows/test-scheduled.yml | 18 +++++---------- Makefile | 22 +++++++++---------- README.md | 2 +- docs/partials/README_footer.md | 2 +- docs/source/_static/openapi_v2.yaml | 5 +++++ docs/source/index.rst | 11 +++++----- noxfile.py | 4 ++-- pyproject.toml | 6 +---- 10 files changed, 34 insertions(+), 39 deletions(-) create mode 100644 docs/source/_static/openapi_v2.yaml diff --git a/.copier-answers.yml b/.copier-answers.yml index ba03dfcb..ab93ded5 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.8.33 +_commit: v0.9.4 _src_path: gh:helmut-hoffer-von-ankershoffen/oe-python-template attestations_enabled: false author_email: helmut@aignostics.com diff --git a/.github/workflows/package-build-publish-release.yml b/.github/workflows/package-build-publish-release.yml index eab2bf74..d54cacd1 100644 --- a/.github/workflows/package-build-publish-release.yml +++ b/.github/workflows/package-build-publish-release.yml @@ -5,7 +5,6 @@ on: tags: - "v*.*.*" - jobs: package_build_publish_release: environment: release diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index 117329ab..be292c44 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -26,17 +26,11 @@ jobs: - name: Install Python, venv and dependencies run: uv sync --all-extras --frozen --link-mode=copy - - name: Set up cloud credentials & environment file - env: - CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} - run: | - echo "$CREDENTIALS" | base64 -d > credentials.json - echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV + - name: Create .env file + uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 + with: + envkey_ENV_KEY: "ENV_VALUE" + fail_on_empty: true - - name: Run tests marked as scheduled - env: - AIGNOSTICS_API_ROOT: https://platform-dev.aignostics.com - AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_DEVICE_ID }} - AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} - AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} + - name: Run scheduled tests run: make test_scheduled diff --git a/Makefile b/Makefile index 02a757da..2061d87f 100644 --- a/Makefile +++ b/Makefile @@ -76,19 +76,19 @@ codegen: help: @echo "🔬 Available targets for Aignostics Python SDK (v$(shell test -f VERSION && cat VERSION || echo 'unknown version'))" @echo "" - @echo " act - Run GitHub actions locally via act" - @echo " all - Run all default nox sessions, i.e. lint, test, docs, audit" - @echo " audit - Run security and license compliance audit" + @echo " act - Run GitHub actions locally via act" + @echo " all - Run all default nox sessions, i.e. lint, test, docs, audit" + @echo " audit - Run security and license compliance audit" @echo " bump patch|minor|major|x.y.z - Bump version" - @echo " clean - Clean build artifacts and caches" - @echo " dist - Build wheel and sdist into dist/" + @echo " clean - Clean build artifacts and caches" + @echo " dist - Build wheel and sdist into dist/" - @echo " docs [pdf] - Build documentation (add pdf for PDF format)" - @echo " docker_build - Build Docker image aignostics" - @echo " lint - Run linting and formatting checks" - @echo " setup - Setup development environment" + @echo " docs [pdf] - Build documentation (add pdf for PDF format)" + @echo " docker_build - Build Docker image aignostics" + @echo " lint - Run linting and formatting checks" + @echo " setup - Setup development environment" @echo " test [3.11|3.12|3.13] - Run tests (for specific Python version)" - @echo " test_scheduled - Run tests marked as scheduled with Python 3.11 - @echo " update_from_template - Update from template using copier" + @echo " test_scheduled - Run tests marked as scheduled with Python 3.11" + @echo " update_from_template - Update from template using copier" @echo "" @echo "Built with love in Berlin 🐻" diff --git a/README.md b/README.md index f5a356eb..90dede95 100644 --- a/README.md +++ b/README.md @@ -239,7 +239,7 @@ TODO (Andreas): Explain API concepts, such as authentication, resources etc.. * Check out the [API Reference](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) with detailed documentation of all API operations and parameters. * Our [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) provide a complete log of recent improvements and changes. * In case you want to help us improve 🔬 Aignostics Python SDK: The [contribution guidelines](https://aignostics.readthedocs.io/en/latest/contributing.html) explain how to setup your development environment and create pull requests. -* We gratefully acknowledge the [open source projects](ATTRIBUTIONS.md) that this project builds upon. Thank you to all these wonderful contributors! +* We gratefully acknowledge the [open source projects](https://aignostics.readthedocs.io/en/latest/attributions.html) that this project builds upon. Thank you to all these wonderful contributors! ## Star History diff --git a/docs/partials/README_footer.md b/docs/partials/README_footer.md index 09426467..5fed0be7 100644 --- a/docs/partials/README_footer.md +++ b/docs/partials/README_footer.md @@ -6,7 +6,7 @@ * Check out the [API Reference](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) with detailed documentation of all API operations and parameters. * Our [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) provide a complete log of recent improvements and changes. * In case you want to help us improve 🔬 Aignostics Python SDK: The [contribution guidelines](https://aignostics.readthedocs.io/en/latest/contributing.html) explain how to setup your development environment and create pull requests. -* We gratefully acknowledge the [open source projects](ATTRIBUTIONS.md) that this project builds upon. Thank you to all these wonderful contributors! +* We gratefully acknowledge the [open source projects](https://aignostics.readthedocs.io/en/latest/attributions.html) that this project builds upon. Thank you to all these wonderful contributors! ## Star History diff --git a/docs/source/_static/openapi_v2.yaml b/docs/source/_static/openapi_v2.yaml new file mode 100644 index 00000000..fe71addc --- /dev/null +++ b/docs/source/_static/openapi_v2.yaml @@ -0,0 +1,5 @@ +Usage: aignostics platform openapi [OPTIONS] +Try 'aignostics platform openapi --help' for help. +╭─ Error ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Invalid value for '--api-version': 'v2' is not 'v1'. │ +╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/docs/source/index.rst b/docs/source/index.rst index a05428d7..e0f863f1 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -25,11 +25,12 @@ .. sidebar-links:: :caption: Links :github: - :pypi: {{ pypi_distribution_name }} - Docker - ghcr.io <{{ github_repository_url_https }}/pkgs/container/{{ github_repository_name }}> - SonarQube - Codecov + :pypi: aignostics + + Docker + ghcr.io + SonarQube + Codecov .. only:: html diff --git a/noxfile.py b/noxfile.py index bbd672b7..a30f5dfc 100644 --- a/noxfile.py +++ b/noxfile.py @@ -17,7 +17,7 @@ LICENSES_JSON_PATH = "reports/licenses.json" SBOM_CYCLONEDX_PATH = "reports/sbom.json" SBOM_SPDX_PATH = "reports/sbom.spdx" - +JUNIT_XML = "--junitxml=reports/junit.xml" CLI_MODULE = "cli" API_VERSIONS = ["v1"] @@ -465,7 +465,7 @@ def docs_pdf(session: nox.Session) -> None: def test(session: nox.Session) -> None: """Run tests with pytest.""" _setup_venv(session, True) - pytest_args = ["pytest", "--disable-warnings", "--junitxml=reports/junit.xml", "-n", "auto", "--dist", "loadgroup"] + pytest_args = ["pytest", "--disable-warnings", JUNIT_XML, "-n", "auto", "--dist", "loadgroup"] if _is_act_environment(): pytest_args.extend(["-k", NOT_SKIP_WITH_ACT]) session.run(*pytest_args) diff --git a/pyproject.toml b/pyproject.toml index 95136880..47810641 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -266,13 +266,9 @@ markers = [ "no_extras: tests that do require no extras installed", "scheduled: tests to run on a schedule", "sequential: exclude from parallel test execution", - "skip_with_act: skip test if act is used", + "skip_with_act: don't run with act", # Custom # Nothing yet - "description: textual description what the test does, goes in `description` field in the Jira ticket - optional", - "labels: mark test with labels that are attached to the test tickets in Jira - optional; comma-separated", - "requirements: mark tests with ids (e.g., PAPI-123, HETA-123) of requirements in Jira. The test will be linked to them - optional; comma-separated", - "specifications: mark test with ids (e.g., PAPI-123, HETA-123) of specifications in Jira. The test will be linked to them - optional; comma-separated", ] [tool.coverage.run] From 51d462c12f37f77b6000af343ba6e3f469d9bc6b Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Mon, 7 Apr 2025 09:08:21 +0200 Subject: [PATCH 082/110] test(docker): skip for now --- tests/aignostics/cli/docker_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/aignostics/cli/docker_test.py b/tests/aignostics/cli/docker_test.py index 6b3171ee..f2ce767f 100644 --- a/tests/aignostics/cli/docker_test.py +++ b/tests/aignostics/cli/docker_test.py @@ -7,6 +7,7 @@ @pytest.mark.xdist_group(name="docker") @pytest.mark.skip_with_act +@pytest.mark.skip def test_core_docker_cli_help_with_love(docker_services) -> None: """Test the CLI help command with docker services returns expected output.""" out = docker_services._docker_compose.execute("run aignostics --help ") From 5fcdd8a68a3221e6884518501977cf6ed78dd2c6 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Mon, 7 Apr 2025 10:28:48 +0200 Subject: [PATCH 083/110] docs: provide some content --- QUALITY.md | 20 +++++ README.md | 153 ++++++++++++++++++++--------------- docs/partials/README_api.md | 10 +++ docs/partials/README_main.md | 147 +++++++++++++++++---------------- docs/source/code-style.rst | 1 - docs/source/contributing.rst | 1 - docs/source/index.rst | 7 +- docs/source/main.rst | 1 + docs/source/quality.rst | 1 + noxfile.py | 3 +- 10 files changed, 202 insertions(+), 142 deletions(-) create mode 100644 QUALITY.md create mode 100644 docs/partials/README_api.md delete mode 100644 docs/source/code-style.rst delete mode 100644 docs/source/contributing.rst create mode 100644 docs/source/quality.rst diff --git a/QUALITY.md b/QUALITY.md new file mode 100644 index 00000000..a18d0c75 --- /dev/null +++ b/QUALITY.md @@ -0,0 +1,20 @@ +# Quality Management + +TODO (Helmut): Provide more details on OE: + +1. [Transparent test coverage](https://app.codecov.io/gh/aignostics/python-sdk) + including unit and E2E tests (reported on Codecov) +2. Matrix tested with + [multiple python versions](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) + to ensure compatibility (powered by [Nox](https://nox.thea.codes/en/stable/)) +3. Compliant with modern linting and formatting standards (powered by + [Ruff](https://github.com/astral-sh/ruff)) +4. Up-to-date dependencies (monitored by + [Renovate](https://github.com/renovatebot/renovate) and + [Dependabot](https://github.com/aignostics/python-sdk/security/dependabot)) +5. [A-grade code quality](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) + in security, maintainability, and reliability with low technical debt and + codesmell (verified by SonarQube) +6. Additional code security checks using + [CodeQL](https://github.com/aignostics/python-sdk/security/code-scanning) +7. Documented [Security Policy](SECURITY.md) diff --git a/README.md b/README.md index 90dede95..9d730386 100644 --- a/README.md +++ b/README.md @@ -43,71 +43,78 @@ --- -Python SDK enabling access to aignostics platform. - ## Introduction -TODO (Helmut): Functionality and features. - -### Operational Excellence - -TODO (Helmut): Simplify. Focus on earning trust of customers. - -The aignostics Python SDK is built with operational excellence, using modern -Python tooling and practices. This includes: - -1. Various examples demonstrating usage: a. - [Simple Python script](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) - b. [Streamlit web application](https://aignostics.streamlit.app/) deployed on - [Streamlit Community Cloud](https://streamlit.io/cloud) c. - [Jupyter](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) - and - [Marimo](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) - notebook -2. [Complete reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html) - on Read the Docs -3. [Transparent test coverage](https://app.codecov.io/gh/aignostics/python-sdk) - including unit and E2E tests (reported on Codecov) -4. Matrix tested with - [multiple python versions](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) - to ensure compatibility (powered by [Nox](https://nox.thea.codes/en/stable/)) -5. Compliant with modern linting and formatting standards (powered by - [Ruff](https://github.com/astral-sh/ruff)) -6. Up-to-date dependencies (monitored by - [Renovate](https://github.com/renovatebot/renovate) and - [Dependabot](https://github.com/aignostics/python-sdk/security/dependabot)) -7. [A-grade code quality](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) - in security, maintainability, and reliability with low technical debt and - codesmell (verified by SonarQube) -8. Additional code security checks using - [CodeQL](https://github.com/aignostics/python-sdk/security/code-scanning) -9. [Security Policy](SECURITY.md) -10. [License](LICENSE) compliant with the Open Source Initiative (OSI) -11. 1-liner for installation and execution of command line interface (CLI) via - [uv(x)](https://github.com/astral-sh/uv) or - [Docker](https://hub.docker.com/r/helmuthva/aignostics-python-sdk/tags) -12. Setup for developing inside a - [devcontainer](https://code.visualstudio.com/docs/devcontainers/containers) - included (supports VSCode and GitHub Codespaces) - -## Setup - -TODO (Helmut): Explain, starting with copy of script on -https://platform.aignostics.com +The aignostics Python SDK opens multiple pathways to interact with the +aignostics platform: + +1. **Run AI applications** such as + [Atlas H&E-TME](https://www.aignostics.com/products/he-tme-profiling-product) + directly from your terminal using the **Command Line Interface (CLI)** + included in the SDK. +2. Call applications directly from **Python Noebooks** following the provided + examples. +3. Deeply integrate the platform in your **enterprise systems and workflows** + using the Python client provided via the SDK. + +### We take quality and security seriously + +We know you take **quality** and **security** as seriously as we do. That's why +the aignostics Python SDK is built following best practices and with full +transparency. This includes (1) making the complete +[source code of the SDK +available on GitHub](https://github.com/aignostics/python-sdk/), maintaining a +(2) +[A-grade code quality](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) +with [high test coverage](https://app.codecov.io/gh/aignostics/python-sdk) in +all releases, (3) achieving +[A-grade security](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) +with +[active scanning of dependencies](https://github.com/aignostics/python-sdk/issues/4), +and (4) providing +[extensive documentation](hhttps://aignostics.readthedocs.io/en/latest/). Read +more about how we achieve +[quality](https://aignostics.readthedocs.io/en/latest/quality.html) and +[security](https://aignostics.readthedocs.io/en/latest/security.html). + +### Run your first AI workflow in 30 minutes + +Go to +[your personal dashboard on the aignostics platform](https://platform.aignostics.com) +and scroll to the "Python SDK" section. Copy the personalized install script +shown in that section, and execute it in your terminal - we support MacOS and +Linux. This will update or install the [uv package manager](...) and install the +aignostics Python SDK. + +You can now ready to run your first AI workflow directly from your terminal. See +as follows for a simple example where we download a sample dataset for the Atlas +H&E-TME application, submit an application run, and download the results. + +```shell +uvx aignostics application dataset download —-app atlas_he_tme —-destination ./my-data/in —-dataset example_1 +uvx aignostics application run submit —-app atlas_he_tme —-source ./my-data/in +uvx aignostics application run result download –app atlas_he_tme —-run 4711 —-destination ./my-data/out +``` + +You will find the output in the `./my-data/out` folder on your local disk, Use +tools such as [https://qupath.github.io/](https://qupath.github.io/) to inspect +the analysis results: + +1. Open QuPath +2. TODO (Helmut): Explanation of next steps to come ## CLI Usage -Executing the command line interface (CLI) in an isolated Python environment is -just as easy: +The CLI is installed as part of the SDK. You can run it from your terminal using +the `uvx` command. See as follows for the primary commands: ```shell uvx aignostics platform health # checks if CLI and Platform are health uvx aignostics platform info # shows information about the platform uvx aignostics application list # lists AI applications available for the user +# TODO (Helmut): Explain a bit more. ``` -Notes: - The CLI provides extensive help: ```shell @@ -117,24 +124,23 @@ uvx aignostics application list --help # help for specific topic uvx aignostics serve --help ``` +Check out our +[CLI reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html#cli) +to learn about all commands and options available. + ### Run with Docker -You can as well run the CLI within Docker. +We recommend to run the CLI natively on your notebook, as explained above. If +required you can run the CLI as a Docker container: ```shell +# TODO (Helmut): Explain about the environment docker run helmuthva/aignostics-python-sdk --help docker run helmuthva/aignostics-python-sdk platform health ``` -Execute command: - -```shell -docker run --env THE_VAR=MY_VALUE helmuthva/aignostics-python-sdk platform health -``` - -Or use docker compose - -The .env is passed through from the host to the Docker container. +Running via docker compose is supported as well. The .env is passed through from +the host to the Docker container automatically. ```shell docker compose run aignostics --help @@ -143,7 +149,7 @@ docker compose run aignostics platform health ## Library Concepts -Adding Aignostics Python SDK to your project as a dependency is easy. See below +Adding Aignostics Python SDK to your codebase as a dependency is easy. See below for usage examples. ```shell @@ -164,6 +170,8 @@ The following examples run from source - clone this repository using ### Minimal Python Script: +TODO(Andreas): Update the content below, which comes from oe-python-template: + ```python """Example script demonstrating the usage of the service provided by Aignostics Python SDK.""" @@ -181,10 +189,15 @@ console.print(f"[blue]{message}[/blue]") ``` [Show script code](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) - -[Read the reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html) + +Read the +[client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) +to learn about all classes and methods. ## Use in Notebooks +TODO(Andreas): Update the content below, which comes from oe-python-template: + ### Jupyter [Show the Jupyter code](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) @@ -226,9 +239,17 @@ Install the Click on `examples/notebook.py` in VSCode and click on the caret next to the Run icon above the code (looks like a pencil) > "Start in marimo editor" (edit). + ## API Concepts -TODO (Andreas): Explain API concepts, such as authentication, resources etc.. +If you use other languages then Python in your codebase you can natively +integrate with the webservice API of the aignostics platform + +TODO (Andreas): Copy Dzima's doc into docs/partials/README_api.md, assets into +docs/source/_static + +[Read the API reference documentation](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) +to learn about all operations and parameters. ## Further Reading diff --git a/docs/partials/README_api.md b/docs/partials/README_api.md new file mode 100644 index 00000000..85725aad --- /dev/null +++ b/docs/partials/README_api.md @@ -0,0 +1,10 @@ +## API Concepts + +If you use other languages then Python in your codebase you can natively +integrate with the webservice API of the aignostics platform + +TODO (Andreas): Copy Dzima's doc into docs/partials/README_api.md, assets into +docs/source/_static + +[Read the API reference documentation](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) +to learn about all operations and parameters. diff --git a/docs/partials/README_main.md b/docs/partials/README_main.md index 086073a9..c0f3cd1f 100644 --- a/docs/partials/README_main.md +++ b/docs/partials/README_main.md @@ -1,68 +1,75 @@ -Python SDK enabling access to aignostics platform. - ## Introduction -TODO (Helmut): Functionality and features. - -### Operational Excellence - -TODO (Helmut): Simplify. Focus on earning trust of customers. - -The aignostics Python SDK is built with operational excellence, using modern -Python tooling and practices. This includes: - -1. Various examples demonstrating usage: a. - [Simple Python script](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) - b. [Streamlit web application](https://aignostics.streamlit.app/) deployed on - [Streamlit Community Cloud](https://streamlit.io/cloud) c. - [Jupyter](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) - and - [Marimo](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) - notebook -2. [Complete reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html) - on Read the Docs -3. [Transparent test coverage](https://app.codecov.io/gh/aignostics/python-sdk) - including unit and E2E tests (reported on Codecov) -4. Matrix tested with - [multiple python versions](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) - to ensure compatibility (powered by [Nox](https://nox.thea.codes/en/stable/)) -5. Compliant with modern linting and formatting standards (powered by - [Ruff](https://github.com/astral-sh/ruff)) -6. Up-to-date dependencies (monitored by - [Renovate](https://github.com/renovatebot/renovate) and - [Dependabot](https://github.com/aignostics/python-sdk/security/dependabot)) -7. [A-grade code quality](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) - in security, maintainability, and reliability with low technical debt and - codesmell (verified by SonarQube) -8. Additional code security checks using - [CodeQL](https://github.com/aignostics/python-sdk/security/code-scanning) -9. [Security Policy](SECURITY.md) -10. [License](LICENSE) compliant with the Open Source Initiative (OSI) -11. 1-liner for installation and execution of command line interface (CLI) via - [uv(x)](https://github.com/astral-sh/uv) or - [Docker](https://hub.docker.com/r/helmuthva/aignostics-python-sdk/tags) -12. Setup for developing inside a - [devcontainer](https://code.visualstudio.com/docs/devcontainers/containers) - included (supports VSCode and GitHub Codespaces) - -## Setup - -TODO (Helmut): Explain, starting with copy of script on -https://platform.aignostics.com +The aignostics Python SDK opens multiple pathways to interact with the +aignostics platform: + +1. **Run AI applications** such as + [Atlas H&E-TME](https://www.aignostics.com/products/he-tme-profiling-product) + directly from your terminal using the **Command Line Interface (CLI)** + included in the SDK. +2. Call applications directly from **Python Noebooks** following the provided + examples. +3. Deeply integrate the platform in your **enterprise systems and workflows** + using the Python client provided via the SDK. + +### We take quality and security seriously + +We know you take **quality** and **security** as seriously as we do. That's why +the aignostics Python SDK is built following best practices and with full +transparency. This includes (1) making the complete +[source code of the SDK +available on GitHub](https://github.com/aignostics/python-sdk/), maintaining a +(2) +[A-grade code quality](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) +with [high test coverage](https://app.codecov.io/gh/aignostics/python-sdk) in +all releases, (3) achieving +[A-grade security](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) +with +[active scanning of dependencies](https://github.com/aignostics/python-sdk/issues/4), +and (4) providing +[extensive documentation](hhttps://aignostics.readthedocs.io/en/latest/). Read +more about how we achieve +[quality](https://aignostics.readthedocs.io/en/latest/quality.html) and +[security](https://aignostics.readthedocs.io/en/latest/security.html). + +### Run your first AI workflow in 30 minutes + +Go to +[your personal dashboard on the aignostics platform](https://platform.aignostics.com) +and scroll to the "Python SDK" section. Copy the personalized install script +shown in that section, and execute it in your terminal - we support MacOS and +Linux. This will update or install the [uv package manager](...) and install the +aignostics Python SDK. + +You can now ready to run your first AI workflow directly from your terminal. See +as follows for a simple example where we download a sample dataset for the Atlas +H&E-TME application, submit an application run, and download the results. + +```shell +uvx aignostics application dataset download —-app atlas_he_tme —-destination ./my-data/in —-dataset example_1 +uvx aignostics application run submit —-app atlas_he_tme —-source ./my-data/in +uvx aignostics application run result download –app atlas_he_tme —-run 4711 —-destination ./my-data/out +``` + +You will find the output in the `./my-data/out` folder on your local disk, Use +tools such as [https://qupath.github.io/](https://qupath.github.io/) to inspect +the analysis results: + +1. Open QuPath +2. TODO (Helmut): Explanation of next steps to come ## CLI Usage -Executing the command line interface (CLI) in an isolated Python environment is -just as easy: +The CLI is installed as part of the SDK. You can run it from your terminal using +the `uvx` command. See as follows for the primary commands: ```shell uvx aignostics platform health # checks if CLI and Platform are health uvx aignostics platform info # shows information about the platform uvx aignostics application list # lists AI applications available for the user +# TODO (Helmut): Explain a bit more. ``` -Notes: - The CLI provides extensive help: ```shell @@ -72,24 +79,23 @@ uvx aignostics application list --help # help for specific topic uvx aignostics serve --help ``` +Check out our +[CLI reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html#cli) +to learn about all commands and options available. + ### Run with Docker -You can as well run the CLI within Docker. +We recommend to run the CLI natively on your notebook, as explained above. If +required you can run the CLI as a Docker container: ```shell +# TODO (Helmut): Explain about the environment docker run helmuthva/aignostics-python-sdk --help docker run helmuthva/aignostics-python-sdk platform health ``` -Execute command: - -```shell -docker run --env THE_VAR=MY_VALUE helmuthva/aignostics-python-sdk platform health -``` - -Or use docker compose - -The .env is passed through from the host to the Docker container. +Running via docker compose is supported as well. The .env is passed through from +the host to the Docker container automatically. ```shell docker compose run aignostics --help @@ -98,7 +104,7 @@ docker compose run aignostics platform health ## Library Concepts -Adding Aignostics Python SDK to your project as a dependency is easy. See below +Adding Aignostics Python SDK to your codebase as a dependency is easy. See below for usage examples. ```shell @@ -119,6 +125,8 @@ The following examples run from source - clone this repository using ### Minimal Python Script: +TODO(Andreas): Update the content below, which comes from oe-python-template: + ```python """Example script demonstrating the usage of the service provided by Aignostics Python SDK.""" @@ -136,10 +144,15 @@ console.print(f"[blue]{message}[/blue]") ``` [Show script code](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) - -[Read the reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html) + +Read the +[client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) +to learn about all classes and methods. ## Use in Notebooks +TODO(Andreas): Update the content below, which comes from oe-python-template: + ### Jupyter [Show the Jupyter code](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) @@ -180,7 +193,3 @@ Install the Click on `examples/notebook.py` in VSCode and click on the caret next to the Run icon above the code (looks like a pencil) > "Start in marimo editor" (edit). - -## API Concepts - -TODO (Andreas): Explain API concepts, such as authentication, resources etc.. diff --git a/docs/source/code-style.rst b/docs/source/code-style.rst deleted file mode 100644 index eda7e077..00000000 --- a/docs/source/code-style.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../../CODE_STYLE.md diff --git a/docs/source/contributing.rst b/docs/source/contributing.rst deleted file mode 100644 index 36431a6a..00000000 --- a/docs/source/contributing.rst +++ /dev/null @@ -1 +0,0 @@ -.. mdinclude:: ../../CONTRIBUTING.md \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index e0f863f1..6d009593 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -11,16 +11,15 @@ :maxdepth: 2 main - api_explorer_v1 cli_reference lib_reference + api_explorer_v1 api_reference_v1 - contributing - code-style - release-notes + quality security license attributions + release-notes .. sidebar-links:: :caption: Links diff --git a/docs/source/main.rst b/docs/source/main.rst index 7290d56f..0822c9ad 100644 --- a/docs/source/main.rst +++ b/docs/source/main.rst @@ -1 +1,2 @@ .. mdinclude:: ../partials/README_main.md +.. mdinclude:: ../partials/README_api.md diff --git a/docs/source/quality.rst b/docs/source/quality.rst new file mode 100644 index 00000000..52ea84ae --- /dev/null +++ b/docs/source/quality.rst @@ -0,0 +1 @@ +.. mdinclude:: ../../QUALITY.md diff --git a/noxfile.py b/noxfile.py index a30f5dfc..32edf5b7 100644 --- a/noxfile.py +++ b/noxfile.py @@ -245,8 +245,9 @@ def _generate_readme(session: nox.Session) -> None: preamble = "\n[//]: # (README.md generated from docs/partials/README_*.md)\n\n" header = Path("docs/partials/README_header.md").read_text(encoding="utf-8") main = Path("docs/partials/README_main.md").read_text(encoding="utf-8") + api = Path("docs/partials/README_api.md").read_text(encoding="utf-8") footer = Path("docs/partials/README_footer.md").read_text(encoding="utf-8") - readme_content = f"{preamble}{header}\n\n{main}\n\n{footer}" + readme_content = f"{preamble}{header}\n\n{main}\n\n{api}\n\n{footer}" Path("README.md").write_text(readme_content, encoding="utf-8") session.log("Generated README.md file from partials") From 6d80d9179d8c5f3a76be90e61825ee3f4a535da1 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Mon, 7 Apr 2025 11:06:16 +0200 Subject: [PATCH 084/110] docs: fix typo --- README.md | 2 +- docs/partials/README_main.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9d730386..869a8b91 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ aignostics platform: [Atlas H&E-TME](https://www.aignostics.com/products/he-tme-profiling-product) directly from your terminal using the **Command Line Interface (CLI)** included in the SDK. -2. Call applications directly from **Python Noebooks** following the provided +2. Call applications directly from **Python Notebooks** following the provided examples. 3. Deeply integrate the platform in your **enterprise systems and workflows** using the Python client provided via the SDK. diff --git a/docs/partials/README_main.md b/docs/partials/README_main.md index c0f3cd1f..31f7b042 100644 --- a/docs/partials/README_main.md +++ b/docs/partials/README_main.md @@ -7,7 +7,7 @@ aignostics platform: [Atlas H&E-TME](https://www.aignostics.com/products/he-tme-profiling-product) directly from your terminal using the **Command Line Interface (CLI)** included in the SDK. -2. Call applications directly from **Python Noebooks** following the provided +2. Call applications directly from **Python Notebooks** following the provided examples. 3. Deeply integrate the platform in your **enterprise systems and workflows** using the Python client provided via the SDK. From d6c303a175af79eec70eee7d8d2213003e2cfb56 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Mon, 7 Apr 2025 13:48:47 +0200 Subject: [PATCH 085/110] chore: Add tests for _authentication module --- src/aignostics/client/_authentication.py | 26 +- .../aignostics/client/authentication_test.py | 432 ++++++++++++++++++ 2 files changed, 445 insertions(+), 13 deletions(-) create mode 100644 tests/aignostics/client/authentication_test.py diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 32b169fa..1c572c64 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -12,8 +12,15 @@ from pydantic import BaseModel, SecretStr from requests_oauthlib import OAuth2Session -from ._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI -from ._settings import authentication_settings +from aignostics.client._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI +from aignostics.client._settings import authentication_settings + + +class AuthenticationResult(BaseModel): + """Represents the result of an OAuth authentication flow.""" + + token: str | None = None + error: str | None = None def get_token(use_cache: bool = True) -> str: @@ -98,13 +105,12 @@ def verify_and_decode_token(token: str) -> dict[str, str]: # Get the public key from the JWK client key = jwk_client.get_signing_key_from_jwt(token).key # Get the algorithm from the token header - binary_token = token.encode("ascii") - header_data = jwt.get_unverified_header(binary_token) + header_data = jwt.get_unverified_header(token) algorithm = header_data["alg"] # Verify and decode the token using the public key return t.cast( "dict[str, str]", - jwt.decode(binary_token, key=key, algorithms=[algorithm], audience=authentication_settings().audience), + jwt.decode(token, key=key, algorithms=[algorithm], audience=authentication_settings().audience), ) except jwt.exceptions.PyJWTError as e: raise RuntimeError(AUTHENTICATION_FAILED) from e @@ -150,12 +156,6 @@ def _perform_authorization_code_with_pkce_flow() -> str: audience=authentication_settings().audience, ) - class AuthenticationResult(BaseModel): - """Represents the result of an OAuth authentication flow.""" - - token: str | None = None - error: str | None = None - authentication_result = AuthenticationResult() class OAuthCallbackHandler(BaseHTTPRequestHandler): @@ -168,7 +168,7 @@ def do_GET(self) -> None: # noqa: N802 self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write(b"Error: No authorization code received") - AuthenticationResult.error = "No authorization code received" + authentication_result.error = "No authorization code received" return auth_code = query["code"][0] @@ -310,5 +310,5 @@ def _token_from_refresh_token(refresh_token: SecretStr) -> str | None: ) response.raise_for_status() return t.cast("str", response.json()["access_token"]) - except HTTPError as e: + except (HTTPError, requests.exceptions.RequestException) as e: raise RuntimeError(AUTHENTICATION_FAILED) from e diff --git a/tests/aignostics/client/authentication_test.py b/tests/aignostics/client/authentication_test.py new file mode 100644 index 00000000..8ad3af4f --- /dev/null +++ b/tests/aignostics/client/authentication_test.py @@ -0,0 +1,432 @@ +"""Tests for the authentication module of the Aignostics Python SDK.""" + +import time +import webbrowser +from datetime import UTC, datetime, timedelta +from pathlib import Path +from unittest.mock import MagicMock, patch + +import jwt +import pytest +from pydantic import SecretStr +from requests_oauthlib import OAuth2Session + +from aignostics.client._authentication import ( + _authenticate, + _can_open_browser, + _perform_authorization_code_with_pkce_flow, + _perform_device_flow, + get_token, + verify_and_decode_token, +) +from aignostics.client._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI + + +@pytest.fixture +def mock_settings() -> MagicMock: + """Provide a mock of authentication settings for testing. + + Yields: + MagicMock: A mock of the authentication settings. + """ + with patch("aignostics.client._authentication.authentication_settings") as mock_settings: + settings = MagicMock() + # Using tmp_path in a controlled test environment is acceptable for testing + settings.token_file = Path("mock_token_path") # Avoid hardcoded /tmp path + settings.client_id_interactive = SecretStr("test-interactive-client-id") + settings.client_id_device = SecretStr("test-device-client-id") + settings.scope_elements = "openid profile" + settings.redirect_uri = "http://localhost:8000/callback" + settings.authorization_base_url = "https://test.auth/authorize" + settings.token_url = "https://test.auth/token" # noqa: S105 - Test credential + settings.device_url = "https://test.auth/device" + settings.audience = "test-audience" + settings.jws_json_url = "https://test.auth/.well-known/jwks.json" + settings.request_timeout_seconds = 10 + settings.refresh_token = None + mock_settings.return_value = settings + yield mock_settings + + +@pytest.fixture +def mock_token_file(tmp_path) -> Path: + """Create a temporary token file for testing.""" + return tmp_path / "token" # Return directly, no need for assignment + + +@pytest.fixture +def valid_token() -> str: + """Return a dummy valid token for testing.""" + return "valid.jwt.token" + + +@pytest.fixture +def expired_token() -> str: + """Return a dummy expired token for testing.""" + # Token that is expired + expired_time = int((datetime.now(tz=UTC) - timedelta(hours=1)).timestamp()) + return f"expired.jwt.token:{expired_time}" + + +@pytest.fixture +def valid_token_with_expiry() -> str: + """Return a dummy valid token with future expiry for testing.""" + # Token that is still valid with future expiry + future_time = int((datetime.now(tz=UTC) + timedelta(hours=1)).timestamp()) + return f"valid.jwt.token:{future_time}" + + +# Always force _can_open_browser to return False in tests to prevent browser opening +@pytest.fixture(autouse=True) +def mock_can_open_browser() -> None: + """Mock browser capability to always return False to prevent actual browser opening. + + Yields: + None: This fixture doesn't yield a value. + """ + with patch("aignostics.client._authentication._can_open_browser", return_value=False): + yield + + +# Prevent real webbrowser from opening in any test +@pytest.fixture(autouse=True) +def mock_webbrowser() -> MagicMock: + """Mock webbrowser.open_new to prevent actual browser from opening during tests. + + Yields: + MagicMock: The mocked webbrowser.open_new function. + """ + with patch("webbrowser.open_new") as mock_open: + yield mock_open + + +class TestGetToken: + """Test cases for the get_token function.""" + + @staticmethod + def test_get_token_from_cache_valid(mock_settings, valid_token_with_expiry) -> None: + """Test retrieving a valid token from cache.""" + # Create a mock for Path that can be properly asserted on + mock_write_text = MagicMock() + + with ( + patch.object(Path, "exists", return_value=True), + patch.object(Path, "read_text", return_value=valid_token_with_expiry), + patch.object(Path, "write_text", mock_write_text), + ): + token = get_token(use_cache=True) + assert token == "valid.jwt.token" # noqa: S105 - Test credential + # Ensure we didn't need to authenticate + mock_write_text.assert_not_called() + + @staticmethod + def test_get_token_from_cache_expired(mock_settings, expired_token) -> None: + """Test retrieving an expired token from cache, which should trigger re-authentication.""" + # Create a mock for Path that can be properly asserted on + mock_write_text = MagicMock() + + with ( + patch.object(Path, "exists", return_value=True), + patch.object(Path, "read_text", return_value=expired_token), + patch("aignostics.client._authentication._authenticate", return_value="new.token"), + patch( + "aignostics.client._authentication.verify_and_decode_token", + return_value={"exp": int(time.time()) + 3600}, + ), + patch.object(Path, "write_text", mock_write_text), + ): + token = get_token(use_cache=True) + assert token == "new.token" # noqa: S105 - Test credential + # Ensure we wrote the new token + assert mock_write_text.call_count == 1 + + @staticmethod + def test_get_token_no_cache(mock_settings) -> None: + """Test retrieving a token without using cache.""" + # Create a mock for Path that can be properly asserted on + mock_write_text = MagicMock() + + with ( + patch("aignostics.client._authentication._authenticate", return_value="new.token"), + patch( + "aignostics.client._authentication.verify_and_decode_token", + return_value={"exp": int(time.time()) + 3600}, + ), + patch.object(Path, "write_text", mock_write_text), + ): + token = get_token(use_cache=False) + assert token == "new.token" # noqa: S105 - Test credential + # Ensure we didn't write to cache + mock_write_text.assert_not_called() + + @staticmethod + def test_authenticate_uses_refresh_token_when_available(mock_settings) -> None: + """Test that _authenticate uses refresh token flow when refresh token is available.""" + # Set up refresh token in settings + mock_settings.return_value.refresh_token = SecretStr("test-refresh-token") + + with patch( + "aignostics.client._authentication._token_from_refresh_token", return_value="refreshed.token" + ) as mock_refresh: + token = _authenticate() + assert token == "refreshed.token" # noqa: S105 - Test credential + mock_refresh.assert_called_once_with(mock_settings.return_value.refresh_token) + + @staticmethod + def test_authenticate_uses_browser_flow_when_available(mock_settings) -> None: + """Test that _authenticate uses browser flow when browser is available.""" + mock_settings.return_value.refresh_token = None + + with ( + patch("aignostics.client._authentication._can_open_browser", return_value=True), + patch( + "aignostics.client._authentication._perform_authorization_code_with_pkce_flow", + return_value="browser.token", + ) as mock_browser, + ): + token = _authenticate() + assert token == "browser.token" # noqa: S105 - Test credential + mock_browser.assert_called_once() + + @staticmethod + def test_authenticate_falls_back_to_device_flow(mock_settings) -> None: + """Test that _authenticate falls back to device flow when browser and refresh token are unavailable.""" + mock_settings.return_value.refresh_token = None + + with ( + patch("aignostics.client._authentication._can_open_browser", return_value=False), + patch("aignostics.client._authentication._perform_device_flow", return_value="device.token") as mock_device, + ): + token = _authenticate() + assert token == "device.token" # noqa: S105 - Test credential + mock_device.assert_called_once() + + @staticmethod + def test_authenticate_raises_error_on_failure(mock_settings) -> None: + """Test that _authenticate raises an error when all authentication methods fail.""" + mock_settings.return_value.refresh_token = None + + with ( + patch("aignostics.client._authentication._can_open_browser", return_value=False), + patch("aignostics.client._authentication._perform_device_flow", return_value=None), + pytest.raises(RuntimeError, match=AUTHENTICATION_FAILED), + ): + _authenticate() + + +class TestVerifyAndDecodeToken: + """Test cases for the verify_and_decode_token function.""" + + @staticmethod + def test_verify_and_decode_valid_token() -> None: + """Test that a valid token is properly verified and decoded.""" + mock_jwt_client = MagicMock() + mock_signing_key = MagicMock() + mock_signing_key.key = "test-key" + mock_jwt_client.get_signing_key_from_jwt.return_value = mock_signing_key + + with ( + patch("jwt.PyJWKClient", return_value=mock_jwt_client), + patch("jwt.get_unverified_header", return_value={"alg": "RS256"}), + patch("jwt.decode", return_value={"sub": "user-id", "exp": int(time.time()) + 3600}), + ): + result = verify_and_decode_token("valid.token") + assert "sub" in result + assert "exp" in result + + @staticmethod + def test_verify_and_decode_invalid_token() -> None: + """Test that an invalid token raises an appropriate error.""" + with ( + patch("jwt.PyJWKClient"), + patch("jwt.get_unverified_header"), + patch("jwt.decode", side_effect=jwt.exceptions.PyJWTError("Invalid token")), + pytest.raises(RuntimeError, match=AUTHENTICATION_FAILED), + ): + verify_and_decode_token("invalid.token") + + +class TestBrowserCapabilityCheck: + """Test cases for the browser capability check functionality.""" + + @staticmethod + def test_can_open_browser_true() -> None: + """Test that _can_open_browser returns True when a browser is available.""" + # We need to override the autouse fixture here + with ( + patch("webbrowser.get", return_value=MagicMock()), + patch("aignostics.client._authentication._can_open_browser", wraps=_can_open_browser), + ): + assert _can_open_browser() is True + + @staticmethod + def test_can_open_browser_false() -> None: + """Test that _can_open_browser returns False when no browser is available.""" + with patch("webbrowser.get", side_effect=webbrowser.Error): + assert _can_open_browser() is False + + +class TestAuthorizationCodeFlow: + """Test cases for the authorization code flow with PKCE.""" + + @staticmethod + def test_perform_authorization_code_flow_success(mock_settings) -> None: + """Test successful authorization code flow with PKCE.""" + # Mock OAuth session + mock_session = MagicMock(spec=OAuth2Session) + mock_session.authorization_url.return_value = ("https://test.auth/authorize?code_challenge=abc", None) + mock_session.fetch_token.return_value = {"access_token": "pkce.token"} + + # Mock HTTP server + mock_server = MagicMock() + + # Setup mocks for the redirect URI parsing + mock_redirect_parsed = MagicMock() + mock_redirect_parsed.hostname = "localhost" + mock_redirect_parsed.port = 8000 + + # Create a custom HTTPServer mock implementation that simulates a callback + class MockHTTPServer: + def __init__(self, *args, **kwargs) -> None: + pass + + def __enter__(self) -> MagicMock: + return mock_server + + def __exit__(self, *args) -> None: + pass + + # Create a mock for the auth result + mock_auth_result = MagicMock() + mock_auth_result.token = "pkce.token" # noqa: S105 - Test credential + mock_auth_result.error = None + + with ( + patch("aignostics.client._authentication.OAuth2Session", return_value=mock_session), + patch("aignostics.client._authentication.HTTPServer", MockHTTPServer), + patch("urllib.parse.urlparse", return_value=mock_redirect_parsed), + patch("aignostics.client._authentication.AuthenticationResult", return_value=mock_auth_result), + ): + # Simulate a successful server response by making handle_request set the token + def handle_request_side_effect(): + # This simulates what the HTTP handler would do on success + mock_auth_result.token = "pkce.token" # noqa: S105 - Test credential + + mock_server.handle_request.side_effect = handle_request_side_effect + + # Call the function under test + token = _perform_authorization_code_with_pkce_flow() + + # Assertions + assert token == "pkce.token" # noqa: S105 - Test credential + mock_server.handle_request.assert_called_once() + mock_session.authorization_url.assert_called_once() + + @staticmethod + def test_perform_authorization_code_flow_invalid_redirect(mock_settings) -> None: + """Test authorization code flow fails with invalid redirect URI.""" + # Mock OAuth session to prevent it from being created + mock_session = MagicMock(spec=OAuth2Session) + mock_session.authorization_url.return_value = ("https://test.auth/authorize?code_challenge=abc", None) + + with patch("aignostics.client._authentication.OAuth2Session", return_value=mock_session): + # Create a mock redirect URI with invalid hostname/port + mock_redirect_parsed = MagicMock() + mock_redirect_parsed.hostname = None # Invalid hostname + mock_redirect_parsed.port = None # Invalid port + + with ( + patch("urllib.parse.urlparse", return_value=mock_redirect_parsed), + pytest.raises(RuntimeError, match=INVALID_REDIRECT_URI), + ): + _perform_authorization_code_with_pkce_flow() + + @staticmethod + def test_perform_authorization_code_flow_failure(mock_settings) -> None: + """Test authorization code flow when authentication fails.""" + # Mock OAuth session + mock_session = MagicMock(spec=OAuth2Session) + mock_session.authorization_url.return_value = ("https://test.auth/authorize?code_challenge=abc", None) + + # Mock HTTP server + mock_server = MagicMock() + + # Setup mocks for the redirect URI parsing + mock_redirect_parsed = MagicMock() + mock_redirect_parsed.hostname = "localhost" + mock_redirect_parsed.port = 8000 + + # Create a custom HTTPServer mock implementation + class MockHTTPServer: + def __init__(self, *args, **kwargs) -> None: + pass + + def __enter__(self) -> MagicMock: + return mock_server + + def __exit__(self, *args) -> None: + pass + + # Create a mock for the auth result + mock_auth_result = MagicMock() + mock_auth_result.token = None + mock_auth_result.error = "Authentication failed" + + with ( + patch("aignostics.client._authentication.OAuth2Session", return_value=mock_session), + patch("aignostics.client._authentication.HTTPServer", MockHTTPServer), + patch("urllib.parse.urlparse", return_value=mock_redirect_parsed), + patch("aignostics.client._authentication.AuthenticationResult", return_value=mock_auth_result), + ): + # Simulate a failed server response + def handle_request_side_effect(): + # This simulates what the HTTP handler would do on failure + mock_auth_result.error = "Authentication failed" + mock_auth_result.token = None + + mock_server.handle_request.side_effect = handle_request_side_effect + + # Expect RuntimeError with AUTHENTICATION_FAILED message + with pytest.raises(RuntimeError, match=AUTHENTICATION_FAILED): + _perform_authorization_code_with_pkce_flow() + + +class TestDeviceFlow: + """Test cases for the device flow authentication.""" + + @staticmethod + def test_perform_device_flow_success(mock_settings) -> None: + """Test successful device flow authentication.""" + device_response = { + "device_code": "device-code-123", + "verification_uri_complete": "https://test.auth/device/activate", + "user_code": "USER123", + "interval": 5, + } + + token_response = {"access_token": "device.token"} + + # Create mock responses + mock_device_response = MagicMock() + mock_device_response.json.return_value = device_response + mock_device_response.raise_for_status = MagicMock() + + mock_token_response = MagicMock() + mock_token_response.json.return_value = token_response + + with ( + patch("requests.post") as mock_post, + patch("time.sleep") as mock_sleep, + patch("builtins.print") as mock_print, + ): + # Configure mock_post to return different responses for different calls + mock_post.side_effect = [mock_device_response, mock_token_response] + + # Call the function + token = _perform_device_flow() + + # Assertions + assert token == "device.token" # noqa: S105 - Test credential + assert mock_post.call_count == 2 + mock_print.assert_called_once() # Verify we printed instructions + mock_sleep.assert_not_called() # We didn't have to poll in our test From 9735cffded33f66534b0a755f570607241c79a47 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Mon, 7 Apr 2025 13:49:54 +0200 Subject: [PATCH 086/110] chore: Remove empty openapi tests --- API_REFERENCE_v1.md | 4025 ++++++++---------------- codegen/config.json | 2 +- codegen/out/test/test_externals_api.py | 114 - docs/source/_static/openapi_v1.yaml | 22 +- pyproject.toml | 2 +- 5 files changed, 1320 insertions(+), 2845 deletions(-) delete mode 100644 codegen/out/test/test_externals_api.py diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md index 42cc5470..93520550 100644 --- a/API_REFERENCE_v1.md +++ b/API_REFERENCE_v1.md @@ -1,2723 +1,1304 @@ # API v1 Reference -## PAPI API Reference v1.0.0 - -> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. - -Base URLs: - -* - -## Externals - -### list_applications_v1_applications_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/applications', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/applications', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications` - -*List Applications* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ], - "slug": "heta" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Applications V1 Applications Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Applications V1 Applications Get|[[ApplicationReadResponse](#schemaapplicationreadresponse)]|false|none|none| -|» ApplicationReadResponse|[ApplicationReadResponse](#schemaapplicationreadresponse)|false|none|none| -|»» application_id|string(uuid)|true|none|none| -|»» description|string|true|none|none| -|»» name|string|true|none|none| -|»» regulatory_classes|[string]|true|none|none| -|»» slug|string|true|none|none| - - -This operation does not require authentication - - -### list_versions_by_application_id_v1_applications__application_id__versions_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/applications/{application_id}/versions', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/applications/{application_id}/versions', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_id}/versions` - -*List Versions By Application Id* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_id|path|string(uuid)|true|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|version|query|any|false|none| -|include|query|any|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "application_version_slug": "tissue-segmentation-qc:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Versions By Application Id V1 Applications Application Id Versions Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| -|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| -|»» application_id|string(uuid)|true|none|none| -|»» application_version_id|string(uuid)|true|none|none| -|»» application_version_slug|string|true|none|none| -|»» changelog|string|true|none|none| -|»» flow_id|any|false|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string(uuid)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| -|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| -|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|»» version|string|true|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|scope|item| -|scope|global| - - -This operation does not require authentication - - -### read_application_by_slug_v1_applications__application_slug__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/applications/{application_slug}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/applications/{application_slug}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_slug}` - -*Read Application By Slug* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_slug|path|string|true|none| - -> Example responses - -> 200 Response - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ], - "slug": "heta" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[ApplicationReadResponse](#schemaapplicationreadresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -### list_versions_by_application_slug_v1_applications__application_slug__versions_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/applications/{application_slug}/versions', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/applications/{application_slug}/versions', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_slug}/versions` - -*List Versions By Application Slug* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_slug|path|string|true|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|version|query|any|false|none| -|include|query|any|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "application_version_slug": "tissue-segmentation-qc:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Versions By Application Slug V1 Applications Application Slug Versions Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Versions By Application Slug V1 Applications Application Slug Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| -|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| -|»» application_id|string(uuid)|true|none|none| -|»» application_version_id|string(uuid)|true|none|none| -|»» application_version_slug|string|true|none|none| -|»» changelog|string|true|none|none| -|»» flow_id|any|false|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string(uuid)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| -|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| -|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|»» version|string|true|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|scope|item| -|scope|global| - - -This operation does not require authentication - - -### list_application_runs_v1_runs_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/runs', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/runs', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs` - -*List Application Runs* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_id|query|any|false|none| -|application_version_id|query|any|false|none| -|include|query|any|false|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Application Runs V1 Runs Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Application Runs V1 Runs Get|[[RunReadResponse](#schemarunreadresponse)]|false|none|none| -|» RunReadResponse|[RunReadResponse](#schemarunreadresponse)|false|none|none| -|»» application_run_id|string(uuid)|true|none|none| -|»» application_version_id|string(uuid)|true|none|none| -|»» organization_id|string|true|none|none| -|»» status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| -|»» triggered_at|string(date-time)|true|none|none| -|»» triggered_by|string|true|none|none| -|»» user_payload|any|false|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| -|»»»» application_id|string(uuid)|true|none|none| -|»»»» application_run_id|string(uuid)|true|none|none| -|»»»» global_output_artifacts|any|true|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|object|false|none|none| -|»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| -|»»»»»»» data|[TransferUrls](#schematransferurls)|true|none|none| -|»»»»»»»» download_url|string(uri)|true|none|none| -|»»»»»»»» upload_url|string(uri)|true|none|none| -|»»»»»»» metadata|[TransferUrls](#schematransferurls)|true|none|none| -|»»»»»»» output_artifact_id|string(uuid)|true|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»» items|[[PayloadItem](#schemapayloaditem)]|true|none|none| -|»»»»» PayloadItem|[PayloadItem](#schemapayloaditem)|false|none|none| -|»»»»»» input_artifacts|object|true|none|none| -|»»»»»»» PayloadInputArtifact|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| -|»»»»»»»» download_url|string(uri)|true|none|none| -|»»»»»»»» input_artifact_id|string(uuid)|false|none|none| -|»»»»»»»» metadata|object|true|none|none| -|»»»»»» item_id|string(uuid)|true|none|none| -|»»»»»» output_artifacts|object|true|none|none| -|»»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|status|canceled_system| -|status|canceled_user| -|status|completed| -|status|completed_with_error| -|status|received| -|status|rejected| -|status|running| -|status|scheduled| - - -This operation does not require authentication - - -### create_application_run_v1_runs_post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json' -} - -r = requests.post('/v1/runs', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('/v1/runs', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/runs` - -*Create Application Run* - -> Body parameter - -```json -{ - "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[RunCreationRequest](#schemaruncreationrequest)|true|none| - -> Example responses - -> 201 Response - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[RunCreationResponse](#schemaruncreationresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -### get_run_v1_runs__application_run_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/runs/{application_run_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/runs/{application_run_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs/{application_run_id}` - -*Get Run* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| -|include|query|any|false|none| - -> Example responses - -> 200 Response - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[RunReadResponse](#schemarunreadresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -### cancel_run_v1_runs__application_run_id__cancel_post - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.post('/v1/runs/{application_run_id}/cancel', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/runs/{application_run_id}/cancel', -{ - method: 'POST', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/runs/{application_run_id}/cancel` - -*Cancel Run* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| - -> Example responses - -> 202 Response - -```json -null -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - - -This operation does not require authentication - - -### delete_run_results_v1_runs__application_run_id__results_delete - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.delete('/v1/runs/{application_run_id}/results', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/runs/{application_run_id}/results', -{ - method: 'DELETE', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`DELETE /v1/runs/{application_run_id}/results` - -*Delete Run Results* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| - -> Example responses - -> 422 Response - -```json -{ - "detail": [ - { - "loc": [ - "string" - ], - "msg": "string", - "type": "string" - } - ] -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|Successful Response|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -### list_run_results_v1_runs__application_run_id__results_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/runs/{application_run_id}/results', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/runs/{application_run_id}/results', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs/{application_run_id}/results` - -*List Run Results* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| -|item_id__in|query|any|false|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|reference__in|query|any|false|none| -|status__in|query|any|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "error": "string", - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": [ - { - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - ], - "reference": "string", - "status": "pending" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Run Results V1 Runs Application Run Id Results Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Run Results V1 Runs Application Run Id Results Get|[[ItemResultReadResponse](#schemaitemresultreadresponse)]|false|none|none| -|» ItemResultReadResponse|[ItemResultReadResponse](#schemaitemresultreadresponse)|false|none|none| -|»» application_run_id|string(uuid)|true|none|none| -|»» error|any|true|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» item_id|string(uuid)|true|none|none| -|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| -|»»» OutputArtifactResultReadResponse|[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)|false|none|none| -|»»»» download_url|any|true|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|string(uri)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»» metadata|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» output_artifact_id|string(uuid)|true|none|none| -|»» reference|string|true|none|none| -|»» status|[ItemStatus](#schemaitemstatus)|true|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|status|pending| -|status|canceled_user| -|status|canceled_system| -|status|error_user| -|status|error_system| -|status|succeeded| - - -This operation does not require authentication - - -### register_version_v1_versions_post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json' -} - -r = requests.post('/v1/versions', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('/v1/versions', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/versions` - -*Register Version* - -> Body parameter - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[VersionCreationRequest](#schemaversioncreationrequest)|true|none| - -> Example responses - -> 201 Response - -```json -{ - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[VersionCreationResponse](#schemaversioncreationresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -### get_version_v1_versions__application_version_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/versions/{application_version_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/versions/{application_version_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/versions/{application_version_id}` - -*Get Version* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_version_id|path|string(uuid)|true|none| -|include|query|any|false|none| - -> Example responses - -> 200 Response - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "changelog": "string", - "created_at": "2019-08-24T14:15:22Z", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[VersionReadResponse](#schemaversionreadresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -## Schemas - -### ApplicationReadResponse - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ], - "slug": "heta" -} - -``` - -ApplicationReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|description|string|true|none|none| -|name|string|true|none|none| -|regulatory_classes|[string]|true|none|none| -|slug|string|true|none|none| - -### ApplicationRunStatus - - - - - - -```json -"canceled_system" - -``` - -ApplicationRunStatus - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ApplicationRunStatus|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ApplicationRunStatus|canceled_system| -|ApplicationRunStatus|canceled_user| -|ApplicationRunStatus|completed| -|ApplicationRunStatus|completed_with_error| -|ApplicationRunStatus|received| -|ApplicationRunStatus|rejected| -|ApplicationRunStatus|running| -|ApplicationRunStatus|scheduled| - -### ApplicationVersionReadResponse - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "application_version_slug": "tissue-segmentation-qc:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" -} - -``` - -ApplicationVersionReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|application_version_id|string(uuid)|true|none|none| -|application_version_slug|string|true|none|none| -|changelog|string|true|none|none| -|flow_id|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| -|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| -|version|string|true|none|none| - -### HTTPValidationError - - - - - - -```json -{ - "detail": [ - { - "loc": [ - "string" - ], - "msg": "string", - "type": "string" - } - ] -} - -``` - -HTTPValidationError - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|detail|[[ValidationError](#schemavalidationerror)]|false|none|none| - -### InputArtifact - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" -} - -``` - -InputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - -### InputArtifactCreationRequest - - - - - - -```json -{ - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" -} - -``` - -InputArtifactCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|metadata|object|true|none|none| -|name|string|true|none|none| - -### InputArtifactReadResponse - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" -} - -``` - -InputArtifactReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - -### InputArtifactSchemaCreationRequest - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" -} - -``` - -InputArtifactSchemaCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - -### ItemCreationRequest - - - - - - -```json -{ - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" -} - -``` - -ItemCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|none| -|reference|string|true|none|none| - -### ItemResultReadResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "error": "string", - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": [ - { - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - ], - "reference": "string", - "status": "pending" -} - -``` - -ItemResultReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|none| -|error|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|item_id|string(uuid)|true|none|none| -|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| -|reference|string|true|none|none| -|status|[ItemStatus](#schemaitemstatus)|true|none|none| - -### ItemStatus - - - - - - -```json -"pending" - -``` - -ItemStatus - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ItemStatus|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ItemStatus|pending| -|ItemStatus|canceled_user| -|ItemStatus|canceled_system| -|ItemStatus|error_user| -|ItemStatus|error_system| -|ItemStatus|succeeded| - -### OutputArtifact - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" -} - -``` - -OutputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| - -### OutputArtifactReadResponse - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" -} - -``` - -OutputArtifactReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| - -### OutputArtifactResultReadResponse - - - - - - -```json -{ - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" -} - -``` - -OutputArtifactResultReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uri)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|output_artifact_id|string(uuid)|true|none|none| - -### OutputArtifactSchemaCreationRequest - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" -} - -``` - -OutputArtifactSchemaCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| - -### OutputArtifactScope - - - - - - -```json -"item" - -``` - -OutputArtifactScope - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|OutputArtifactScope|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|OutputArtifactScope|item| -|OutputArtifactScope|global| - -### OutputArtifactVisibility - - - - - - -```json -"internal" - -``` - -OutputArtifactVisibility - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|OutputArtifactVisibility|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|OutputArtifactVisibility|internal| -|OutputArtifactVisibility|external| - -### PayloadInputArtifact - - - - - - -```json -{ - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} -} - -``` - -PayloadInputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|input_artifact_id|string(uuid)|false|none|none| -|metadata|object|true|none|none| - -### PayloadItem - - - - - - -```json -{ - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } -} - -``` - -PayloadItem - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|object|true|none|none| -|» **additionalProperties**|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| -|item_id|string(uuid)|true|none|none| -|output_artifacts|object|true|none|none| -|» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -### PayloadOutputArtifact - - - - - - -```json -{ - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" -} - -``` - -PayloadOutputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|data|[TransferUrls](#schematransferurls)|true|none|none| -|metadata|[TransferUrls](#schematransferurls)|true|none|none| -|output_artifact_id|string(uuid)|true|none|none| - -### RunCreationRequest - - - - - - -```json -{ - "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -} - -``` - -RunCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_version|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[SlugVersionRequest](#schemaslugversionrequest)|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|none| - -### RunCreationResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" -} - -``` - -RunCreationResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|none| - -### RunReadResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } -} - -``` - -RunReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|none| -|application_version_id|string(uuid)|true|none|none| -|organization_id|string|true|none|none| -|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| -|triggered_at|string(date-time)|true|none|none| -|triggered_by|string|true|none|none| -|user_payload|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -### SlugVersionRequest - - - - - - -```json -{ - "application_slug": "string", - "version": "string" -} - -``` - -SlugVersionRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_slug|string|true|none|none| -|version|string|true|none|none| - -### TransferUrls - - - - - - -```json -{ - "download_url": "http://example.com", - "upload_url": "http://example.com" -} - -``` - -TransferUrls - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|upload_url|string(uri)|true|none|none| - -### UserPayload - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] -} - -``` - -UserPayload - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|application_run_id|string(uuid)|true|none|none| -|global_output_artifacts|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|object|false|none|none| -|»» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|items|[[PayloadItem](#schemapayloaditem)]|true|none|none| - -### ValidationError - - - - - - -```json -{ - "loc": [ - "string" - ], - "msg": "string", - "type": "string" -} - -``` - -ValidationError - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|loc|[anyOf]|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|integer|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|msg|string|true|none|none| -|type|string|true|none|none| - -### VersionCreationRequest - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} - -``` - -VersionCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|changelog|string|true|none|none| -|flow_id|string(uuid)|true|none|none| -|input_artifacts|[[InputArtifactSchemaCreationRequest](#schemainputartifactschemacreationrequest)]|true|none|none| -|output_artifacts|[[OutputArtifactSchemaCreationRequest](#schemaoutputartifactschemacreationrequest)]|true|none|none| -|version|string|true|none|none| - -### VersionCreationResponse - - - - - - -```json -{ - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" -} - -``` - -VersionCreationResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_version_id|string(uuid)|true|none|none| - -### VersionReadResponse - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "changelog": "string", - "created_at": "2019-08-24T14:15:22Z", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} - -``` - -VersionReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|application_version_id|string(uuid)|true|none|none| -|changelog|string|true|none|none| -|created_at|string(date-time)|true|none|none| -|flow_id|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifact](#schemainputartifact)]|true|none|none| -|output_artifacts|[[OutputArtifact](#schemaoutputartifact)]|true|none|none| -|version|string|true|none|none| +--- +title: - url: '' +language_tabs: +toc_footers: [] +includes: [] +search: true +highlight_theme: darkula +--- + + + + + + + + + + + + - Aignostics H&E TME application + title: Description + type: string + name: + examples: + - HETA + title: Name + type: string + regulatory_classes: + examples: + - - RuO + items: + type: string + title: Regulatory Classes + type: array + slug: + examples: + - heta + title: Slug + type: string + required: + - application_id + - name + - slug + - regulatory_classes + - description + title: ApplicationReadResponse + type: object + ApplicationRunStatus: + enum: + - canceled_system + - canceled_user + - completed + - completed_with_error + - received + - rejected + - running + - scheduled + title: ApplicationRunStatus + type: string + ApplicationVersionReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + application_version_slug: + examples: + - tissue-segmentation-qc:v0.0.1 + pattern: ^(?:|-)*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ + title: Application Version Slug + type: string + changelog: + title: Changelog + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Flow Id + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactReadResponse' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactReadResponse' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - application_version_id + - application_version_slug + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + title: ApplicationVersionReadResponse + type: object + HTTPValidationError: + properties: + detail: + items: + $ref: '#/components/schemas/ValidationError' + title: Detail + type: array + title: HTTPValidationError + type: object + InputArtifact: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^{0,126}/{0,126}$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifact + type: object + InputArtifactCreationRequest: + properties: + download_url: + examples: + - https://example.com/case-no-1-slide.tiff + format: uri + maxLength: 2083 + minLength: 1 + title: Download Url + type: string + metadata: + examples: + - checksum_crc32c: 752f9554 + height: 2000 + height_mpp: 0.5 + width: 10000 + width_mpp: 0.5 + title: Metadata + type: object + name: + examples: + - slide + title: Name + type: string + required: + - name + - download_url + - metadata + title: InputArtifactCreationRequest + type: object + InputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^{0,126}/{0,126}$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactReadResponse + type: object + InputArtifactSchemaCreationRequest: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactSchemaCreationRequest + type: object + ItemCreationRequest: + properties: + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactCreationRequest' + title: Input Artifacts + type: array + reference: + examples: + - case-no-1 + title: Reference + type: string + required: + - reference + - input_artifacts + title: ItemCreationRequest + type: object + ItemResultReadResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + error: + anyOf: + - type: string + - type: 'null' + title: Error + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactResultReadResponse' + title: Output Artifacts + type: array + reference: + title: Reference + type: string + status: + $ref: '#/components/schemas/ItemStatus' + required: + - item_id + - application_run_id + - reference + - status + - error + - output_artifacts + title: ItemResultReadResponse + type: object + ItemStatus: + enum: + - pending + - canceled_user + - canceled_system + - error_user + - error_system + - succeeded + title: ItemStatus + type: string + OutputArtifact: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^{0,126}/{0,126}$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + visibility: + $ref: '#/components/schemas/OutputArtifactVisibility' + required: + - name + - mime_type + - metadata_schema + - scope + - visibility + title: OutputArtifact + type: object + OutputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^{0,126}/{0,126}$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + required: + - name + - mime_type + - metadata_schema + - scope + title: OutputArtifactReadResponse + type: object + OutputArtifactResultReadResponse: + properties: + download_url: + anyOf: + - format: uri + maxLength: 2083 + minLength: 1 + type: string + - type: 'null' + title: Download Url + metadata: + title: Metadata + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^{0,126}/{0,126}$ + title: Mime Type + type: string + name: + title: Name + type: string + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - name + - mime_type + - metadata + - download_url + title: OutputArtifactResultReadResponse + type: object + OutputArtifactSchemaCreationRequest: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + visibility: + $ref: '#/components/schemas/OutputArtifactVisibility' + required: + - name + - mime_type + - scope + - visibility + - metadata_schema + title: OutputArtifactSchemaCreationRequest + type: object + OutputArtifactScope: + enum: + - item + - global + title: OutputArtifactScope + type: string + OutputArtifactVisibility: + enum: + - internal + - external + title: OutputArtifactVisibility + type: string + PayloadInputArtifact: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + input_artifact_id: + format: uuid + title: Input Artifact Id + type: string + metadata: + title: Metadata + type: object + required: + - metadata + - download_url + title: PayloadInputArtifact + type: object + PayloadItem: + properties: + input_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadInputArtifact' + title: Input Artifacts + type: object + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + title: Output Artifacts + type: object + required: + - item_id + - input_artifacts + - output_artifacts + title: PayloadItem + type: object + PayloadOutputArtifact: + properties: + data: + $ref: '#/components/schemas/TransferUrls' + metadata: + $ref: '#/components/schemas/TransferUrls' + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - data + - metadata + title: PayloadOutputArtifact + type: object + RunCreationRequest: + properties: + application_version: + anyOf: + - format: uuid + type: string + - $ref: '#/components/schemas/SlugVersionRequest' + examples: + - efbf9822-a1e5-4045-a283-dbf26e8064a9 + title: Application Version + items: + items: + $ref: '#/components/schemas/ItemCreationRequest' + title: Items + type: array + required: + - application_version + - items + title: RunCreationRequest + type: object + RunCreationResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + required: + - application_run_id + title: RunCreationResponse + type: object + RunReadResponse: + properties: + application_run_id: + format: uuid + title: Application Run Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + organization_id: + title: Organization Id + type: string + status: + $ref: '#/components/schemas/ApplicationRunStatus' + triggered_at: + format: date-time + title: Triggered At + type: string + triggered_by: + title: Triggered By + type: string + user_payload: + anyOf: + - $ref: '#/components/schemas/UserPayload' + - type: 'null' + required: + - application_run_id + - application_version_id + - organization_id + - status + - triggered_at + - triggered_by + title: RunReadResponse + type: object + SlugVersionRequest: + properties: + application_slug: + pattern: ^(-?)*$ + title: Application Slug + type: string + version: + title: Version + type: string + required: + - application_slug + - version + title: SlugVersionRequest + type: object + TransferUrls: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + upload_url: + format: uri + minLength: 1 + title: Upload Url + type: string + required: + - upload_url + - download_url + title: TransferUrls + type: object + UserPayload: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_run_id: + format: uuid + title: Application Run Id + type: string + global_output_artifacts: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + type: object + - type: 'null' + title: Global Output Artifacts + items: + items: + $ref: '#/components/schemas/PayloadItem' + title: Items + type: array + required: + - application_id + - application_run_id + - global_output_artifacts + - items + title: UserPayload + type: object + ValidationError: + properties: + loc: + items: + anyOf: + - type: string + - type: integer + title: Location + type: array + msg: + title: Message + type: string + type: + title: Error Type + type: string + required: + - loc + - msg + - type + title: ValidationError + type: object + VersionCreationRequest: + properties: + application_id: + format: uuid + title: Application Id + type: string + changelog: + title: Changelog + type: string + flow_id: + format: uuid + title: Flow Id + type: string + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifactSchemaCreationRequest' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifactSchemaCreationRequest' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - version + - application_id + - flow_id + - changelog + - input_artifacts + - output_artifacts + title: VersionCreationRequest + type: object + VersionCreationResponse: + properties: + application_version_id: + format: uuid + title: Application Version Id + type: string + required: + - application_version_id + title: VersionCreationResponse + type: object + VersionReadResponse: + properties: + application_id: + format: uuid + title: Application Id + type: string + application_version_id: + format: uuid + title: Application Version Id + type: string + changelog: + title: Changelog + type: string + created_at: + format: date-time + title: Created At + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Flow Id + input_artifacts: + items: + $ref: '#/components/schemas/InputArtifact' + title: Input Artifacts + type: array + output_artifacts: + items: + $ref: '#/components/schemas/OutputArtifact' + title: Output Artifacts + type: array + version: + title: Version + type: string + required: + - application_version_id + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + - created_at + title: VersionReadResponse + type: object +info: + title: PAPI API Reference + version: 1.0.0 +openapi: 3.1.0 +paths: + /v1/applications: + get: + operationId: list_applications_v1_applications_get + parameters: + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationReadResponse' + title: Response List Applications V1 Applications Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Applications + tags: + - Externals + /v1/applications/{application_id}/versions: + get: + operationId: +list_versions_by_application_id_v1_applications__application_id__versions_get + parameters: + - in: path + name: application_id + required: true + schema: + format: uuid + title: Application Id + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Id V1 Applications +Application + Id Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Versions By Application Id + tags: + - Externals + /v1/applications/{application_slug}: + get: + operationId: +read_application_by_slug_v1_applications__application_slug__get + parameters: + - in: path + name: application_slug + required: true + schema: + title: Application Slug + type: string + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/ApplicationReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Read Application By Slug + tags: + - Externals + /v1/applications/{application_slug}/versions: + get: + operationId: +list_versions_by_application_slug_v1_applications__application_slug__versions_ge +t + parameters: + - in: path + name: application_slug + required: true + schema: + pattern: ^(-?)*$ + title: Application Slug + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Slug V1 +Applications Application + Slug Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Versions By Application Slug + tags: + - Externals + /v1/runs: + get: + operationId: list_application_runs_v1_runs_get + parameters: + - in: query + name: application_id + required: false + schema: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Id + - in: query + name: application_version_id + required: false + schema: + anyOf: + - format: uuid + type: string + - type: 'null' + title: Application Version Id + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/RunReadResponse' + title: Response List Application Runs V1 Runs Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Application Runs + tags: + - Externals + post: + operationId: create_application_run_v1_runs_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Create Application Run + tags: + - Externals + /v1/runs/{application_run_id}: + get: + operationId: get_run_v1_runs__application_run_id__get + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RunReadResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Get Run + tags: + - Externals + /v1/runs/{application_run_id}/cancel: + post: + operationId: cancel_run_v1_runs__application_run_id__cancel_post + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + responses: + '202': + content: + application/json: + schema: {} + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Cancel Run + tags: + - Externals + /v1/runs/{application_run_id}/results: + delete: + operationId: +delete_run_results_v1_runs__application_run_id__results_delete + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + responses: + '204': + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Delete Run Results + tags: + - Externals + get: + operationId: list_run_results_v1_runs__application_run_id__results_get + parameters: + - in: path + name: application_run_id + required: true + schema: + format: uuid + title: Application Run Id + type: string + - in: query + name: item_id__in + required: false + schema: + anyOf: + - items: + format: uuid + type: string + type: array + - type: 'null' + title: Item Id In + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: reference__in + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Reference In + - in: query + name: status__in + required: false + schema: + anyOf: + - items: + $ref: '#/components/schemas/ItemStatus' + type: array + - type: 'null' + title: Status In + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ItemResultReadResponse' + title: Response List Run Results V1 Runs Application Run Id +Results + Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: List Run Results + tags: + - Externals + /v1/versions: + post: + operationId: register_version_v1_versions_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VersionCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/VersionCreationResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Register Version + tags: + - Externals + /v1/versions/{application_version_id}: + get: + operationId: get_version_v1_versions__application_version_id__get + parameters: + - in: path + name: application_version_id + required: true + schema: + format: uuid + title: Application Version Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/VersionReadResponse' + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + summary: Get Version + tags: + - Externals +servers: +- url: '' + +> components: + +> schemas: + +> ApplicationReadResponse: + +> properties: + +> application_id: + +> format: uuid + +> title: Application Id + +> type: string + +> description: + +> examples: diff --git a/codegen/config.json b/codegen/config.json index 91c9d8b4..b3cc9010 100644 --- a/codegen/config.json +++ b/codegen/config.json @@ -4,7 +4,7 @@ "modelTests": false, "modelDocs": false, "apis": "Externals", - "apiTests": true, + "apiTests": false, "apiDocs": true, "supportingFiles": "configuration.py,rest.py,api_client.py,exceptions.py,api_response.py" }, diff --git a/codegen/out/test/test_externals_api.py b/codegen/out/test/test_externals_api.py deleted file mode 100644 index 1d20906e..00000000 --- a/codegen/out/test/test_externals_api.py +++ /dev/null @@ -1,114 +0,0 @@ - -""" - PAPI API Reference - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 1.0.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -import unittest - -from aignx.codegen.api.externals_api import ExternalsApi - - -class TestExternalsApi(unittest.TestCase): - """ExternalsApi unit test stubs""" - - def setUp(self) -> None: - self.api = ExternalsApi() - - def tearDown(self) -> None: - pass - - def test_cancel_run_v1_runs_application_run_id_cancel_post(self) -> None: - """Test case for cancel_run_v1_runs_application_run_id_cancel_post - - Cancel Run - """ - pass - - def test_create_application_run_v1_runs_post(self) -> None: - """Test case for create_application_run_v1_runs_post - - Create Application Run - """ - pass - - def test_delete_run_results_v1_runs_application_run_id_results_delete(self) -> None: - """Test case for delete_run_results_v1_runs_application_run_id_results_delete - - Delete Run Results - """ - pass - - def test_get_run_v1_runs_application_run_id_get(self) -> None: - """Test case for get_run_v1_runs_application_run_id_get - - Get Run - """ - pass - - def test_get_version_v1_versions_application_version_id_get(self) -> None: - """Test case for get_version_v1_versions_application_version_id_get - - Get Version - """ - pass - - def test_list_application_runs_v1_runs_get(self) -> None: - """Test case for list_application_runs_v1_runs_get - - List Application Runs - """ - pass - - def test_list_applications_v1_applications_get(self) -> None: - """Test case for list_applications_v1_applications_get - - List Applications - """ - pass - - def test_list_run_results_v1_runs_application_run_id_results_get(self) -> None: - """Test case for list_run_results_v1_runs_application_run_id_results_get - - List Run Results - """ - pass - - def test_list_versions_by_application_id_v1_applications_application_id_versions_get(self) -> None: - """Test case for list_versions_by_application_id_v1_applications_application_id_versions_get - - List Versions By Application Id - """ - pass - - def test_list_versions_by_application_slug_v1_applications_application_slug_versions_get(self) -> None: - """Test case for list_versions_by_application_slug_v1_applications_application_slug_versions_get - - List Versions By Application Slug - """ - pass - - def test_read_application_by_slug_v1_applications_application_slug_get(self) -> None: - """Test case for read_application_by_slug_v1_applications_application_slug_get - - Read Application By Slug - """ - pass - - def test_register_version_v1_versions_post(self) -> None: - """Test case for register_version_v1_versions_post - - Register Version - """ - pass - - -if __name__ == '__main__': - unittest.main() diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index 470f21a5..f2fa5837 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -726,7 +726,8 @@ paths: - Externals /v1/applications/{application_id}/versions: get: - operationId: list_versions_by_application_id_v1_applications__application_id__versions_get + operationId: +list_versions_by_application_id_v1_applications__application_id__versions_get parameters: - in: path name: application_id @@ -789,7 +790,8 @@ paths: schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications Application + title: Response List Versions By Application Id V1 Applications +Application Id Versions Get type: array description: Successful Response @@ -804,7 +806,8 @@ paths: - Externals /v1/applications/{application_slug}: get: - operationId: read_application_by_slug_v1_applications__application_slug__get + operationId: +read_application_by_slug_v1_applications__application_slug__get parameters: - in: path name: application_slug @@ -830,7 +833,9 @@ paths: - Externals /v1/applications/{application_slug}/versions: get: - operationId: list_versions_by_application_slug_v1_applications__application_slug__versions_get + operationId: +list_versions_by_application_slug_v1_applications__application_slug__versions_ge +t parameters: - in: path name: application_slug @@ -893,7 +898,8 @@ paths: schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 Applications Application + title: Response List Versions By Application Slug V1 +Applications Application Slug Versions Get type: array description: Successful Response @@ -1085,7 +1091,8 @@ paths: - Externals /v1/runs/{application_run_id}/results: delete: - operationId: delete_run_results_v1_runs__application_run_id__results_delete + operationId: +delete_run_results_v1_runs__application_run_id__results_delete parameters: - in: path name: application_run_id @@ -1183,7 +1190,8 @@ paths: schema: items: $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id Results + title: Response List Run Results V1 Runs Application Run Id +Results Get type: array description: Successful Response diff --git a/pyproject.toml b/pyproject.toml index 47810641..053d5659 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -254,7 +254,7 @@ warn_required_dynamic_aliases = true warn_untyped_fields = true [tool.pytest.ini_options] -testpaths = ["tests", "codegen/out/test"] +testpaths = ["tests"] # openapi code generate creates tests with test_*.py python_files = ["*_test.py", "test_*.py"] addopts = "-v --strict-markers --cov=aignostics --cov-report=term-missing --cov-report=xml:reports/coverage.xml --cov-report=html:reports/coverage_html" From c1bbf5aca35694e7afc757cedde9e400d560505d Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Mon, 7 Apr 2025 14:48:15 +0200 Subject: [PATCH 087/110] fix: Fix token validation algorithm --- src/aignostics/client/_authentication.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 1c572c64..f4c290b9 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -12,8 +12,8 @@ from pydantic import BaseModel, SecretStr from requests_oauthlib import OAuth2Session -from aignostics.client._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI -from aignostics.client._settings import authentication_settings +from ._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI +from ._settings import authentication_settings class AuthenticationResult(BaseModel): @@ -104,13 +104,10 @@ def verify_and_decode_token(token: str) -> dict[str, str]: try: # Get the public key from the JWK client key = jwk_client.get_signing_key_from_jwt(token).key - # Get the algorithm from the token header - header_data = jwt.get_unverified_header(token) - algorithm = header_data["alg"] # Verify and decode the token using the public key return t.cast( "dict[str, str]", - jwt.decode(token, key=key, algorithms=[algorithm], audience=authentication_settings().audience), + jwt.decode(token, key=key, algorithms=["RS256"], audience=authentication_settings().audience), ) except jwt.exceptions.PyJWTError as e: raise RuntimeError(AUTHENTICATION_FAILED) from e From 9167774d33b95f664699c46da625b83be3bf0244 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Mon, 7 Apr 2025 21:57:58 +0200 Subject: [PATCH 088/110] chore: Add production environment constants --- src/aignostics/constants.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/aignostics/constants.py b/src/aignostics/constants.py index 86848ad0..cbcd9d86 100644 --- a/src/aignostics/constants.py +++ b/src/aignostics/constants.py @@ -9,13 +9,12 @@ TODO_URL = "https://todo" API_ROOT_PRODUCTION = "https://platform.aignostics.com" -# TODO (Andreas): hhva: please fill in -AUDIENCE_PRODUCTION = TODO_URL -AUTHORIZATION_BASE_URL_PRODUCTION = TODO_URL -TOKEN_URL_PRODUCTION = TODO_URL -REDIRECT_URI_PRODUCTION = TODO_URL -DEVICE_URL_PRODUCTION = TODO_URL -JWS_JSON_URL_PRODUCTION = TODO_URL +AUDIENCE_PRODUCTION = "https://aignostics-platform-samia" +AUTHORIZATION_BASE_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/authorize" +TOKEN_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/oauth/token" # noqa: S105 +REDIRECT_URI_PRODUCTION = "http://localhost:8080/" +DEVICE_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/oauth/device/code" +JWS_JSON_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/.well-known/jwks.json" API_ROOT_STAGING = "https://platform-staging.aignostics.com" # TODO (Andreas): hhva: please fill in From 85bcf729eb3e3c319bfd0bd1117427400b9c7229 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Mon, 7 Apr 2025 22:16:46 +0200 Subject: [PATCH 089/110] chore: Move to prod environment --- .github/workflows/test-and-report.yml | 4 ++-- .github/workflows/test-scheduled.yml | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index a1a7d324..eb93a226 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -68,7 +68,7 @@ jobs: - name: Smoke tests env: - AIGNOSTICS_API_ROOT: https://platform-dev.aignostics.com + AIGNOSTICS_API_ROOT: https://platform.aignostics.com AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_DEVICE_ID }} AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} @@ -84,7 +84,7 @@ jobs: - name: Test env: - AIGNOSTICS_API_ROOT: https://platform-dev.aignostics.com + AIGNOSTICS_API_ROOT: https://platform.aignostics.com AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_DEVICE_ID }} AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index be292c44..394be9be 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -26,11 +26,10 @@ jobs: - name: Install Python, venv and dependencies run: uv sync --all-extras --frozen --link-mode=copy - - name: Create .env file - uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 - with: - envkey_ENV_KEY: "ENV_VALUE" - fail_on_empty: true - - name: Run scheduled tests + env: + AIGNOSTICS_API_ROOT: https://platform.aignostics.com + AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_DEVICE_ID }} + AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} + AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} run: make test_scheduled From 116b146c8e26456217c2998076c0a5b6519811d8 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Sat, 12 Apr 2025 17:46:50 +0200 Subject: [PATCH 090/110] fix: Reintroduce credentials setup for scheduled tests --- .github/workflows/test-scheduled.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index 394be9be..427ddad7 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -26,6 +26,13 @@ jobs: - name: Install Python, venv and dependencies run: uv sync --all-extras --frozen --link-mode=copy + - name: Set up cloud credentials & environment file + env: + CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} + run: | + echo "$CREDENTIALS" | base64 -d > credentials.json + echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV + - name: Run scheduled tests env: AIGNOSTICS_API_ROOT: https://platform.aignostics.com From fb1f64bc697969108235bf7133536f7e4c5a3225 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Fri, 11 Apr 2025 15:05:03 +0200 Subject: [PATCH 091/110] chore: Adjust docs for lib & api --- README.md | 187 +++++---- docs/partials/README_api.md | 91 ++++- docs/partials/README_main.md | 128 +++--- examples/notebook.ipynb | 459 +++++++++++++++++++--- examples/notebook.py | 249 +++++++++++- examples/playbook.py | 148 ------- examples/script.py | 50 ++- examples/streamlit.py | 30 -- src/aignostics/client/_client.py | 3 +- src/aignostics/client/utils.py | 2 +- tests/aignostics/client/scheduled_test.py | 8 +- 11 files changed, 949 insertions(+), 406 deletions(-) delete mode 100644 examples/playbook.py delete mode 100644 examples/streamlit.py diff --git a/README.md b/README.md index 869a8b91..e861a061 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,58 @@ Check out our [CLI reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html#cli) to learn about all commands and options available. +## Using the Python SDK in your Codebase + +The following sections showcase how you can integrate the Python SDK in your codebase. + +### Installation + +Adding Aignostics Python SDK to your codebase as a dependency is easy. +You can directly import add the dependency via your favourite package manager, +e.g., [pip](https://pip.pypa.io/en/stable/) or [uv](https://docs.astral.sh/uv/). + +**Install via uv** -- If you don't have uv installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). +```shell +uv add aignostics # add SDK as dependency to your project +``` + +**Install via pip** +```shell +pip install aignostics # add SDK as dependency to your project +``` + +### Usage + +Read the [client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) to learn about all classes and methods. + +The following snippets showcase the basic code to run an application with the Python SDK. +A more detailed example - including comments - is available in the `examples` folder as Python notebooks: +[examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) (IPython) +[examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) (Marimo). + +```python +import aignostics.client +from aignx.codegen.models import ( + ApplicationVersion, + RunCreationRequest, + ItemCreationRequest +) + +# initialize the client +client = aignostics.client.Client() +# trigger an application run +application_run = client.runs.create( + RunCreationRequest( + application_version=ApplicationVersion("..."), + items=[ + ItemCreationRequest(...) + ], + ) +) +# wait for the results and download incrementally as they become available +application_run.download_to_folder("path/to/download/folder") +``` + ### Run with Docker We recommend to run the CLI natively on your notebook, as explained above. If @@ -147,109 +199,98 @@ docker compose run aignostics --help docker compose run aignostics platform health ``` -## Library Concepts - -Adding Aignostics Python SDK to your codebase as a dependency is easy. See below -for usage examples. -```shell -uv add aignostics # add SDK as dependency to your project -``` - -If you don't have uv installed follow -[these instructions](https://docs.astral.sh/uv/getting-started/installation/). -If you still prefer pip over the modern and fast package manager -[uv](https://github.com/astral-sh/uv), you can install the library like this: - -```shell -pip install aignostics # add SDK as dependency to your project -``` - -The following examples run from source - clone this repository using -`git clone git@github.com:aignostics/python-sdk.git`. - -### Minimal Python Script: - -TODO(Andreas): Update the content below, which comes from oe-python-template: - -```python -"""Example script demonstrating the usage of the service provided by Aignostics Python SDK.""" +## API Concepts -from dotenv import load_dotenv -from rich.console import Console +If you use other languages then Python in your codebase you can natively +integrate with the webservice API of the aignostics platform. +The following sections outline the main concepts of the API and how to use it. -from aignostics import Service +### Overview +The Aignostics Platform is a comprehensive cloud-based service that allows organizations to leverage advanced computational pathology applications without the need for specialized on-premises infrastructure. With its API (described in details below) it provides a standardized, secure interface for accessing Aignostics' portfolio of computational pathology applications. These applications perform advanced tissue and cell analysis on histopathology slides, delivering quantitative measurements, visual representations, and detailed statistical data. -console = Console() +### Key Features +Aignostics Platform offers key features designed to maximize value for its users: -load_dotenv() +* **High-throughput processing:** You can submit 500 whole slide images (WSI) in one request +* **Multi-format support:** Support for commonly used pathology image formats (TIF, DICOM, SVS) +* **Access to Aignostics applications:** Integration with Aignostics computational pathology application like Atlas H&E TME +* **Secure Data Handling:** Maintain control of your slide data through secure self-signed URLswithout needing to transfer files into foreign organization infrastructure +* **Incremental Results Delivery:** Access results for individual slides as they complete processing, without waiting for the entire batch to finish +* **Flexible Integration:** Integrate access to Aignostics applications with your existing systems through our API -message = Service.get_hello_world() -console.print(f"[blue]{message}[/blue]") -``` +### Registration and Access +To begin using the Aignostics Platform and its applications, your organization must first be registered by our team. Currently, account creation is not self-service. Please contact us to initiate the registration process. -[Show script code](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) - +1. Access to the Aignostics Platform requires a formal business agreement. Once an agreement is in place between your organization and Aignostics, we will proceed with your organization's registration. If your organization does not yet have an account, please contact your dedicated account manager or email us at support@aignostics.com to express your interest. +2. To register your organization, we require the name and email address of at least one employee, who will be assigned the Organization Admin role. This user will act as the primary administrator for your organization on the platform. +3. The Organization Admin can invite and manage additional users within the same organization though a dedicated Platform Dashboard. Please note: + 1. All user accounts must be associated with your organization's official domain. + 2. We do not support the registration of private or personal email addresses. + 3. For security, Two-Factor Authentication (2FA) is mandatory for all user accounts. -Read the -[client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) -to learn about all classes and methods. +The entire process typically takes 2 business days depending on the complexity of the business agreement and specific requirements. -## Use in Notebooks +### User management +AIgnostics Platform is available to users registered in the platform. The client organization is created by the Aignostics business support team (super admin). The customer becomes the member of the organization. -TODO(Andreas): Update the content below, which comes from oe-python-template: +Admin of the organization can add more users, admins or members. Both roles can trigger application runs, but additionally to that admins can manage users of the organization. -### Jupyter +### Applications +An application is a fully automated end-to-end workflow composed of one or more specific tasks (Tissue Quality Control, Tissue Segmentation, Cell Detection and Classification…). Each application is designed for a particular analysis purpose (e.g. TME analysis, biomarker scoring). For each application we define input requirements, processing tasks and output formats. -[Show the Jupyter code](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) +Each application can have multiple versions. Applications and its versions are assigned to your organization by Aignostics based on business agreement. Please make sure you read dedicated application documentation to understand its specific constraints regarding acceptable formats, staining method, tissue types and diseases. -... or run within VSCode +Once registered to the Platform, your organization will automatically gain access to the test application for free. This application can be used to configure the workflow and to make sure that the integration works correctly, without any extra cost. -```shell -uv sync --all-extras # Install dependencies required for examples such as Juypyter kernel, see pyproject.toml -``` +### Application run +To trigger the application run, users can use the Python client, or the REST API. The platform expects the user payload, containing the metadata of the slides and the signed URLs to the WSIs. The detailed description of the payload is different for every application and described via the /v1/applications endpoint. -Install the -[Jupyter extension for VSCode](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter) +When the application run is created, it can be in one of the following states: -Click on `examples/notebook.ipynb` in VSCode and run it. +* **received** - the application run received from the client +* **scheduled** - the application run request is valid and is scheduled for execution +* **running** - the application run execution started +* **completed** - the application run execution is done and all outputs are available for download +* **completed** with error - the application run execution is done, but some items end up in the failed state +* **rejected** - the application run request is rejected before it is scheduled +* **cancelled by the system** - the application run failed during the execution with the number of errors higher than the threshold +* **cancelled by the user** - the application run is cancelled by the user before it is finished -### Marimo +Only the user who created the application run can check its status, retrieve results or cancel its execution. -[Show the marimo code](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) +### Results +When the processing of an image is successfully completed, the resulting outputs become available for the download. To assess specifics of application outputs please consult application specific documentation, which you can find available in Aignostics Platform Dashboard. You will receive access to application documentations only for those applications that are available to your organization. -Execute the notebook as a WASM based web app +Application run outputs are automatically deleted 30 days after the application run has completed. However, the owner of the application run (the user who initiated it) can use the API to manually delete outputs earlier, once the run has reached a final state - completed, cancelled by the system or cancelled by the user. -```shell -uv sync --all-extras # Install ipykernel dependency part of the examples extra, see pyproject.toml -uv run marimo run examples/notebook.py --watch # Serve on localhost:2718, opens browser -``` +### Quotas +Every organization has a limit on how many WSIs it can process in a calendar month. The following quotas exist: -or edit interactively in your browser +* **For an organization** - assigned by the Aignostics based on defined business agreement with the organization +* **For a user** - assigned by the organization Admin to the user -```shell -uv sync --all-extras # Install ipykernel dependency part of the examples extra, see pyproject.toml -uv run marimo edit examples/notebook.py --watch # Edit on localhost:2718, opens browser -``` +When the per month quota is reached, the application run request is denied. -... or edit interactively within VSCode +Other limitations may apply to your organization: -Install the -[Marimo extension for VSCode](https://marketplace.visualstudio.com/items?itemName=marimo-team.vscode-marimo) +* Allowed number of users an organization can register +* Allowed number of images user can submit in one application run +* Allowed number of parallel application runs for the whole organization -Click on `examples/notebook.py` in VSCode and click on the caret next to the Run -icon above the code (looks like a pencil) > "Start in marimo editor" (edit). +Additionally, we allow organization Admin to define following limitations for its users: +* Maximum number of images the user can process per calendar month. +* Maximum number of parallel application runs for a user -## API Concepts +To view the quota and the quota usage, please access Platform Dashboard. -If you use other languages then Python in your codebase you can natively -integrate with the webservice API of the aignostics platform +### Cost +Every WSI processed by the Platform generates a cost. Usage of test application doesn't generate any cost and is free for any registered user. -TODO (Andreas): Copy Dzima's doc into docs/partials/README_api.md, assets into -docs/source/_static +When the application run is cancelled, either by the system or by the user, only the processed images are added to the cost for your organization. -[Read the API reference documentation](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) -to learn about all operations and parameters. +**[Read the API reference documentation](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) to learn about all operations and parameters.** ## Further Reading diff --git a/docs/partials/README_api.md b/docs/partials/README_api.md index 85725aad..05242fd2 100644 --- a/docs/partials/README_api.md +++ b/docs/partials/README_api.md @@ -1,10 +1,91 @@ ## API Concepts If you use other languages then Python in your codebase you can natively -integrate with the webservice API of the aignostics platform +integrate with the webservice API of the aignostics platform. +The following sections outline the main concepts of the API and how to use it. -TODO (Andreas): Copy Dzima's doc into docs/partials/README_api.md, assets into -docs/source/_static +### Overview +The Aignostics Platform is a comprehensive cloud-based service that allows organizations to leverage advanced computational pathology applications without the need for specialized on-premises infrastructure. With its API (described in details below) it provides a standardized, secure interface for accessing Aignostics' portfolio of computational pathology applications. These applications perform advanced tissue and cell analysis on histopathology slides, delivering quantitative measurements, visual representations, and detailed statistical data. -[Read the API reference documentation](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) -to learn about all operations and parameters. +### Key Features +Aignostics Platform offers key features designed to maximize value for its users: + +* **High-throughput processing:** You can submit 500 whole slide images (WSI) in one request +* **Multi-format support:** Support for commonly used pathology image formats (TIF, DICOM, SVS) +* **Access to Aignostics applications:** Integration with Aignostics computational pathology application like Atlas H&E TME +* **Secure Data Handling:** Maintain control of your slide data through secure self-signed URLswithout needing to transfer files into foreign organization infrastructure +* **Incremental Results Delivery:** Access results for individual slides as they complete processing, without waiting for the entire batch to finish +* **Flexible Integration:** Integrate access to Aignostics applications with your existing systems through our API + +### Registration and Access +To begin using the Aignostics Platform and its applications, your organization must first be registered by our team. Currently, account creation is not self-service. Please contact us to initiate the registration process. + +1. Access to the Aignostics Platform requires a formal business agreement. Once an agreement is in place between your organization and Aignostics, we will proceed with your organization's registration. If your organization does not yet have an account, please contact your dedicated account manager or email us at support@aignostics.com to express your interest. +2. To register your organization, we require the name and email address of at least one employee, who will be assigned the Organization Admin role. This user will act as the primary administrator for your organization on the platform. +3. The Organization Admin can invite and manage additional users within the same organization though a dedicated Platform Dashboard. Please note: + 1. All user accounts must be associated with your organization's official domain. + 2. We do not support the registration of private or personal email addresses. + 3. For security, Two-Factor Authentication (2FA) is mandatory for all user accounts. + +The entire process typically takes 2 business days depending on the complexity of the business agreement and specific requirements. + +### User management +AIgnostics Platform is available to users registered in the platform. The client organization is created by the Aignostics business support team (super admin). The customer becomes the member of the organization. + +Admin of the organization can add more users, admins or members. Both roles can trigger application runs, but additionally to that admins can manage users of the organization. + +### Applications +An application is a fully automated end-to-end workflow composed of one or more specific tasks (Tissue Quality Control, Tissue Segmentation, Cell Detection and Classification…). Each application is designed for a particular analysis purpose (e.g. TME analysis, biomarker scoring). For each application we define input requirements, processing tasks and output formats. + +Each application can have multiple versions. Applications and its versions are assigned to your organization by Aignostics based on business agreement. Please make sure you read dedicated application documentation to understand its specific constraints regarding acceptable formats, staining method, tissue types and diseases. + +Once registered to the Platform, your organization will automatically gain access to the test application for free. This application can be used to configure the workflow and to make sure that the integration works correctly, without any extra cost. + +### Application run +To trigger the application run, users can use the Python client, or the REST API. The platform expects the user payload, containing the metadata of the slides and the signed URLs to the WSIs. The detailed description of the payload is different for every application and described via the /v1/applications endpoint. + +When the application run is created, it can be in one of the following states: + +* **received** - the application run received from the client +* **scheduled** - the application run request is valid and is scheduled for execution +* **running** - the application run execution started +* **completed** - the application run execution is done and all outputs are available for download +* **completed** with error - the application run execution is done, but some items end up in the failed state +* **rejected** - the application run request is rejected before it is scheduled +* **cancelled by the system** - the application run failed during the execution with the number of errors higher than the threshold +* **cancelled by the user** - the application run is cancelled by the user before it is finished + +Only the user who created the application run can check its status, retrieve results or cancel its execution. + +### Results +When the processing of an image is successfully completed, the resulting outputs become available for the download. To assess specifics of application outputs please consult application specific documentation, which you can find available in Aignostics Platform Dashboard. You will receive access to application documentations only for those applications that are available to your organization. + +Application run outputs are automatically deleted 30 days after the application run has completed. However, the owner of the application run (the user who initiated it) can use the API to manually delete outputs earlier, once the run has reached a final state - completed, cancelled by the system or cancelled by the user. + +### Quotas +Every organization has a limit on how many WSIs it can process in a calendar month. The following quotas exist: + +* **For an organization** - assigned by the Aignostics based on defined business agreement with the organization +* **For a user** - assigned by the organization Admin to the user + +When the per month quota is reached, the application run request is denied. + +Other limitations may apply to your organization: + +* Allowed number of users an organization can register +* Allowed number of images user can submit in one application run +* Allowed number of parallel application runs for the whole organization + +Additionally, we allow organization Admin to define following limitations for its users: + +* Maximum number of images the user can process per calendar month. +* Maximum number of parallel application runs for a user + +To view the quota and the quota usage, please access Platform Dashboard. + +### Cost +Every WSI processed by the Platform generates a cost. Usage of test application doesn't generate any cost and is free for any registered user. + +When the application run is cancelled, either by the system or by the user, only the processed images are added to the cost for your organization. + +**[Read the API reference documentation](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) to learn about all operations and parameters.** diff --git a/docs/partials/README_main.md b/docs/partials/README_main.md index 31f7b042..6b8df502 100644 --- a/docs/partials/README_main.md +++ b/docs/partials/README_main.md @@ -83,113 +83,73 @@ Check out our [CLI reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html#cli) to learn about all commands and options available. -### Run with Docker +## Using the Python SDK in your Codebase -We recommend to run the CLI natively on your notebook, as explained above. If -required you can run the CLI as a Docker container: +The following sections showcase how you can integrate the Python SDK in your codebase. -```shell -# TODO (Helmut): Explain about the environment -docker run helmuthva/aignostics-python-sdk --help -docker run helmuthva/aignostics-python-sdk platform health -``` +### Installation -Running via docker compose is supported as well. The .env is passed through from -the host to the Docker container automatically. - -```shell -docker compose run aignostics --help -docker compose run aignostics platform health -``` - -## Library Concepts - -Adding Aignostics Python SDK to your codebase as a dependency is easy. See below -for usage examples. +Adding Aignostics Python SDK to your codebase as a dependency is easy. +You can directly import add the dependency via your favourite package manager, +e.g., [pip](https://pip.pypa.io/en/stable/) or [uv](https://docs.astral.sh/uv/). +**Install via uv** -- If you don't have uv installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). ```shell uv add aignostics # add SDK as dependency to your project ``` -If you don't have uv installed follow -[these instructions](https://docs.astral.sh/uv/getting-started/installation/). -If you still prefer pip over the modern and fast package manager -[uv](https://github.com/astral-sh/uv), you can install the library like this: - +**Install via pip** ```shell pip install aignostics # add SDK as dependency to your project ``` -The following examples run from source - clone this repository using -`git clone git@github.com:aignostics/python-sdk.git`. +### Usage -### Minimal Python Script: +Read the [client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) to learn about all classes and methods. -TODO(Andreas): Update the content below, which comes from oe-python-template: +The following snippets showcase the basic code to run an application with the Python SDK. +A more detailed example - including comments - is available in the `examples` folder as Python notebooks: +[examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) (IPython) +[examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) (Marimo). ```python -"""Example script demonstrating the usage of the service provided by Aignostics Python SDK.""" - -from dotenv import load_dotenv -from rich.console import Console - -from aignostics import Service - -console = Console() - -load_dotenv() - -message = Service.get_hello_world() -console.print(f"[blue]{message}[/blue]") +import aignostics.client +from aignx.codegen.models import ( + ApplicationVersion, + RunCreationRequest, + ItemCreationRequest +) + +# initialize the client +client = aignostics.client.Client() +# trigger an application run +application_run = client.runs.create( + RunCreationRequest( + application_version=ApplicationVersion("..."), + items=[ + ItemCreationRequest(...) + ], + ) +) +# wait for the results and download incrementally as they become available +application_run.download_to_folder("path/to/download/folder") ``` -[Show script code](https://github.com/aignostics/python-sdk/blob/main/examples/script.py) - - -Read the -[client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) -to learn about all classes and methods. - -## Use in Notebooks - -TODO(Andreas): Update the content below, which comes from oe-python-template: - -### Jupyter - -[Show the Jupyter code](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) - -... or run within VSCode - -```shell -uv sync --all-extras # Install dependencies required for examples such as Juypyter kernel, see pyproject.toml -``` - -Install the -[Jupyter extension for VSCode](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter) - -Click on `examples/notebook.ipynb` in VSCode and run it. - -### Marimo - -[Show the marimo code](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) +### Run with Docker -Execute the notebook as a WASM based web app +We recommend to run the CLI natively on your notebook, as explained above. If +required you can run the CLI as a Docker container: ```shell -uv sync --all-extras # Install ipykernel dependency part of the examples extra, see pyproject.toml -uv run marimo run examples/notebook.py --watch # Serve on localhost:2718, opens browser +# TODO (Helmut): Explain about the environment +docker run helmuthva/aignostics-python-sdk --help +docker run helmuthva/aignostics-python-sdk platform health ``` -or edit interactively in your browser +Running via docker compose is supported as well. The .env is passed through from +the host to the Docker container automatically. ```shell -uv sync --all-extras # Install ipykernel dependency part of the examples extra, see pyproject.toml -uv run marimo edit examples/notebook.py --watch # Edit on localhost:2718, opens browser +docker compose run aignostics --help +docker compose run aignostics platform health ``` - -... or edit interactively within VSCode - -Install the -[Marimo extension for VSCode](https://marketplace.visualstudio.com/items?itemName=marimo-team.vscode-marimo) - -Click on `examples/notebook.py` in VSCode and click on the caret next to the Run -icon above the code (looks like a pencil) > "Start in marimo editor" (edit). diff --git a/examples/notebook.ipynb b/examples/notebook.ipynb index 73b14a37..b5ef10d9 100644 --- a/examples/notebook.ipynb +++ b/examples/notebook.ipynb @@ -1,46 +1,417 @@ { -"cells": [ -{ -"cell_type": "code", -"execution_count": 1, -"metadata": {}, -"outputs": [ -{ -"name": "stdout", -"output_type": "stream", -"text": [ -"Hello, world! The value of THE_VAR is not defined\n" -] -} -], -"source": [ -"from aignostics import Service\n", -"\n", -"service = Service()\n", -"message = service.get_hello_world()\n", -"message" -] -} -], -"metadata": { -"kernelspec": { -"display_name": ".venv", -"language": "python", -"name": "python3" -}, -"language_info": { -"codemirror_mode": { -"name": "ipython", -"version": 3 -}, -"file_extension": ".py", -"mimetype": "text/x-python", -"name": "python", -"nbconvert_exporter": "python", -"pygments_lexer": "ipython3", -"version": "3.11.6" -} -}, -"nbformat": 4, -"nbformat_minor": 2 + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Initialize the Client\n", + "\n", + "As a first step, you need to initialize the client to interact with the Aignostics Platform. This will execute an OAuth flow depending on the environment you run:\n", + "- In case you have a browser available, an interactive login flow in your browser is started.\n", + "- In case there is no browser available, a device flow is started.\n", + "\n", + "**NOTE:** By default, the client caches the access token in your operation systems application cache folder. If you do not want to store the access token, please initialize the client like this:\n", + "\n", + "```python\n", + "client = aignostics.client.Client(cache_token=False)\n", + "```\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from pydantic import BaseModel\n", + "\n", + "import aignostics.client\n", + "\n", + "\n", + "# the following function is used for visualizing the results nicely in this notebook\n", + "def show(models: BaseModel | list[BaseModel]) -> pd.DataFrame:\n", + " \"\"\"Visualize the results in a pandas DataFrame.\n", + "\n", + " Returns:\n", + " pd.DataFrame: A DataFrame containing the results.\n", + " \"\"\"\n", + " items = [models.model_dump()] if isinstance(models, BaseModel) else (a.model_dump() for a in models)\n", + " return pd.DataFrame(items)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# initialize the client\n", + "client = aignostics.client.Client()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# List our available applications\n", + "\n", + "Next, let us list the applications that are available in your organization:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-12T14:50:55.210948Z", + "start_time": "2025-04-12T14:50:54.774401Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
application_idnameslugregulatory_classesdescription
0ee5566d2-d3cb-4303-9e23-8a5ab3e5b8edTwoTaskDummytwo-task-dummy[demo, RuO]This is just a dummy application with two algo...
1f7aa7f53-3b4c-476a-bc25-561ef9cfbf6dH&E TMEh-e-tme[]This is the H&E TME Application.
\n", + "
" + ], + "text/plain": [ + " application_id name slug \\\n", + "0 ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed TwoTaskDummy two-task-dummy \n", + "1 f7aa7f53-3b4c-476a-bc25-561ef9cfbf6d H&E TME h-e-tme \n", + "\n", + " regulatory_classes description \n", + "0 [demo, RuO] This is just a dummy application with two algo... \n", + "1 [] This is the H&E TME Application. " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "applications = client.applications.list()\n", + "# visualize\n", + "show(applications)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# List all available versions of an application\n", + "\n", + "Now that we know the applications that are available, we can list all the versions of a specific application. In this case, we will use the `TwoTask Dummy Application` as an example, which has the `application_id`: `ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed`. Using the `application_id`, we can list all the versions of the application:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-12T14:54:09.592991Z", + "start_time": "2025-04-12T14:54:09.322720Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
application_version_idapplication_version_slugversionapplication_idflow_idchangeloginput_artifactsoutput_artifacts
060e7b441-307a-4b41-8a97-5b02e7bc73a4two-task-dummy:v0.0.30.0.3ee5566d2-d3cb-4303-9e23-8a5ab3e5b8edNone<some_changelog>[{'name': 'user_slide', 'mime_type': 'image/ti...[{'name': 'tissue_segmentation:geojson_polygon...
\n", + "
" + ], + "text/plain": [ + " application_version_id application_version_slug version \\\n", + "0 60e7b441-307a-4b41-8a97-5b02e7bc73a4 two-task-dummy:v0.0.3 0.0.3 \n", + "\n", + " application_id flow_id changelog \\\n", + "0 ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed None \n", + "\n", + " input_artifacts \\\n", + "0 [{'name': 'user_slide', 'mime_type': 'image/ti... \n", + "\n", + " output_artifacts \n", + "0 [{'name': 'tissue_segmentation:geojson_polygon... " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "application_versions = client.applications.versions.list(for_application=\"ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed\")\n", + "# visualize\n", + "show(application_versions)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Inspect the application version details\n", + "\n", + "Now that we have the list of versions, we can inspect the details of a specific version. While we could directly use the list of application version returned by the `list` method, we want to directly query details for a specific application version. In this case, we will use version `0.0.3`, which has the `application_version_id`: `60e7b441-307a-4b41-8a97-5b02e7bc73a4`. We use the `application_version_id` to retrieve further details about the application version:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import JSON\n", + "\n", + "# get the application version details\n", + "two_task_app = client.applications.versions.details(for_application_version_id=\"60e7b441-307a-4b41-8a97-5b02e7bc73a4\")\n", + "\n", + "# view the `input_artifacts` to get insights in the required fields of the application version payload\n", + "JSON(two_task_app.input_artifacts[0].to_json())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Trigger an application run\n", + "\n", + "Now, let's trigger an application run for the `TwoTask Dummy Application`. We will use the `application_version_id` that we retrieved in the previous step. To create an application run, we need to provide a payload that consists of 1 or more `Items`. We provide the Pydantic model `ItemCreationRequest` an item and the data that comes with it:\n", + "```python\n", + "ItemCreationRequest(\n", + " reference=\"\",\n", + " input_artifacts=[InputArtifactCreationRequest]\n", + ")\n", + "```\n", + "The `InputArtifactCreationRequest` defines the actual data that you provide aka. in this case the image that you want to be processed. The expected values are defined by the application version and have to align with the `input_artifacts` schema of the application version. In the case of the two task dummy application, we only require a single artifact per item, which is the image to process on. The artifact name is defined as `user_slide`. The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. In addition to the image data itself, you have to provide the metadata defined in the input artifact schema, i.e., `checksum_crc32c`, `base_mpp`, `width`, and `height`. The metadata is used to validate the input data and is required for the processing of the image. The following example shows how to create an item with a single input artifact:\n", + "\n", + "```python\n", + "InputArtifactCreationRequest(\n", + " name=\"user_slide\", # as defined by the application version input_artifact schema\n", + " download_url=\"\",\n", + " metadata={\n", + " \"checksum_crc32c\": \"\",\n", + " \"base_mpp\": \"\",\n", + " \"width\": \"\",\n", + " \"height\": \"\"\n", + " }\n", + ")\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aignx.codegen.models import (\n", + " ApplicationVersion,\n", + " InputArtifactCreationRequest,\n", + " ItemCreationRequest,\n", + " RunCreationRequest,\n", + ")\n", + "\n", + "from aignostics.client.utils import generate_signed_url\n", + "\n", + "payload = [\n", + " ItemCreationRequest(\n", + " reference=\"1\",\n", + " input_artifacts=[\n", + " InputArtifactCreationRequest(\n", + " name=\"user_slide\",\n", + " download_url=generate_signed_url(\n", + " \"gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff\"\n", + " ),\n", + " metadata={\n", + " \"checksum_crc32c\": \"N+LWCg==\",\n", + " \"base_mpp\": 0.46499982,\n", + " \"width\": 3728,\n", + " \"height\": 3640,\n", + " },\n", + " )\n", + " ],\n", + " ),\n", + "]\n", + "\n", + "application_run = client.runs.create(\n", + " RunCreationRequest(\n", + " application_version=ApplicationVersion(\"60e7b441-307a-4b41-8a97-5b02e7bc73a4\"),\n", + " items=payload,\n", + " )\n", + ")\n", + "print(application_run)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Observe the status of the application run and download\n", + "\n", + "While you can observe the status of an application run directly via the `status()` method and also retrieve the results via the `results()` method, you can also download the results directly to a folder of your choice. The `download_to_folder()` method will download all the results to the specified folder. The method will automatically create a sub-folder in the specified folder with the name of the application run. The results for each individual input item will be stored in a separate folder named after the `reference` you defined in the `ItemCreationRequest`.\n", + "\n", + "The method downloads the results for a slide as soon as they are available. There is no need to keep the method running until all results are available. The method will automatically check for the status of the application run and download the results as soon as they are available. If you invoke the method on a run you already downloaded some results before, it will only download the missing artifacts." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import tempfile\n", + "\n", + "download_folder = tempfile.gettempdir()\n", + "application_run.download_to_folder(download_folder)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Continue to retrieve results for an application run\n", + "\n", + "In case you just triggered an application run and want to check on the results later or you had a connection loss, you can simply initialize an applicaiton run object via it's `application_run_id`. If you do not have the `application_run_id` anymore, you can simple list all currently running application version via the `client.runs.list()` method. The `application_run_id` is part of the `ApplicationRun` object returned by the `list()` method. You can then use the `download_to_folder()` method to continue downloading the results." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# list currently running applications\n", + "application_runs = client.runs.list()\n", + "for run in application_runs:\n", + " print(run)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-12T15:30:21.854543Z", + "start_time": "2025-04-12T15:30:20.100152Z" + } + }, + "outputs": [], + "source": [ + "from aignostics.client.resources.runs import ApplicationRun\n", + "\n", + "application_run = ApplicationRun.for_application_run_id(\"\")\n", + "# download\n", + "\n", + "download_folder = tempfile.gettempdir()\n", + "application_run.download_to_folder(download_folder)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 } diff --git a/examples/notebook.py b/examples/notebook.py index a0445b2b..a7de0c1f 100644 --- a/examples/notebook.py +++ b/examples/notebook.py @@ -1,17 +1,252 @@ import marimo -__generated_with = "0.11.13" -app = marimo.App() +__generated_with = "0.12.4" +app = marimo.App(width="medium") @app.cell def _(): - from aignostics import Service + import marimo as mo + return (mo,) - service = Service() - message = service.get_hello_world() - print(message) - return Service, message, service + +@app.cell +def _(mo): + mo.md( + r""" + # Initialize the Client + + As a first step, you need to initialize the client to interact with the Aignostics Platform. This will execute an OAuth flow depending on the environment you run: + - In case you have a browser available, an interactive login flow in your browser is started. + - In case there is no browser available, a device flow is started. + + **NOTE:** By default, the client caches the access token in your operation systems application cache folder. If you do not want to store the access token, please initialize the client like this: + + ```python + client = aignostics.client.Client(cache_token=False) + ``` + """ + ) + return + + +@app.cell +def _(): + import aignostics.client + import pandas as pd + from pydantic import BaseModel + + # the following function is used for visualizing the results nicely in this notebook + def show(models: BaseModel | list[BaseModel]) -> pd.DataFrame: + if isinstance(models, BaseModel): + items = [models.model_dump()] + else: + items = (a.model_dump() for a in models) + return pd.DataFrame(items) + return BaseModel, aignostics, pd, show + + +@app.cell +def _(aignostics): + # initialize the client + client = aignostics.client.Client() + return (client,) + + +@app.cell +def _(mo): + mo.md( + r""" + # List our available applications + + Next, let us list the applications that are available in your organization: + """ + ) + return + + +@app.cell +def _(client, show): + applications = client.applications.list() + # visualize + show(applications) + return (applications,) + + +@app.cell +def _(mo): + mo.md( + r""" + # List all available versions of an application + + Now that we know the applications that are available, we can list all the versions of a specific application. In this case, we will use the `TwoTask Dummy Application` as an example, which has the `application_id`: `ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed`. Using the `application_id`, we can list all the versions of the application: + """ + ) + return + + +@app.cell +def _(client, show): + application_versions = client.applications.versions.list(for_application="ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed") + # visualize + show(application_versions) + return (application_versions,) + + +@app.cell +def _(mo): + mo.md( + r""" + # Inspect the application version details + + Now that we have the list of versions, we can inspect the details of a specific version. While we could directly use the list of application version returned by the `list` method, we want to directly query details for a specific application version. In this case, we will use version `0.0.3`, which has the `application_version_id`: `60e7b441-307a-4b41-8a97-5b02e7bc73a4`. We use the `application_version_id` to retrieve further details about the application version: + """ + ) + return + + +@app.cell +def _(client): + two_task_app = client.applications.versions.details(for_application_version_id="60e7b441-307a-4b41-8a97-5b02e7bc73a4") + + # view the `input_artifacts` to get insights in the required fields of the application version payload + two_task_app.input_artifacts[0].to_json() + return (two_task_app,) + + +@app.cell +def _(mo): + mo.md( + r""" + # Trigger an application run + + Now, let's trigger an application run for the `TwoTask Dummy Application`. We will use the `application_version_id` that we retrieved in the previous step. To create an application run, we need to provide a payload that consists of 1 or more `Items`. We provide the Pydantic model `ItemCreationRequest` an item and the data that comes with it: + ```python + ItemCreationRequest( + reference="", + input_artifacts=[InputArtifactCreationRequest] + ) + ``` + The `InputArtifactCreationRequest` defines the actual data that you provide aka. in this case the image that you want to be processed. The expected values are defined by the application version and have to align with the `input_artifacts` schema of the application version. In the case of the two task dummy application, we only require a single artifact per item, which is the image to process on. The artifact name is defined as `user_slide`. The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. In addition to the image data itself, you have to provide the metadata defined in the input artifact schema, i.e., `checksum_crc32c`, `base_mpp`, `width`, and `height`. The metadata is used to validate the input data and is required for the processing of the image. The following example shows how to create an item with a single input artifact: + + ```python + InputArtifactCreationRequest( + name="user_slide", # as defined by the application version input_artifact schema + download_url="", + metadata={ + "checksum_crc32c": "", + "base_mpp": "", + "width": "", + "height": "" + } + ) + ``` + """ + ) + return + + +@app.cell +def _(client): + from aignostics.client.utils import generate_signed_url + from aignx.codegen.models import ( + ApplicationVersion, + RunCreationRequest, + ItemCreationRequest, + InputArtifactCreationRequest + ) + + payload = [ + ItemCreationRequest( + reference="1", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", + download_url=generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" + ), + metadata={ + "checksum_crc32c": "N+LWCg==", + "base_mpp": 0.46499982, + "width": 3728, + "height": 3640, + }, + ) + ], + ), + ] + + application_run = client.runs.create( + RunCreationRequest( + application_version=ApplicationVersion("60e7b441-307a-4b41-8a97-5b02e7bc73a4"), + items=payload, + ) + ) + print(application_run) + return ( + ApplicationVersion, + InputArtifactCreationRequest, + ItemCreationRequest, + RunCreationRequest, + application_run, + payload, + ) + + +@app.cell +def _(mo): + mo.md( + r""" + # Observe the status of the application run and download + + While you can observe the status of an application run directly via the `status()` method and also retrieve the results via the `results()` method, you can also download the results directly to a folder of your choice. The `download_to_folder()` method will download all the results to the specified folder. The method will automatically create a sub-folder in the specified folder with the name of the application run. The results for each individual input item will be stored in a separate folder named after the `reference` you defined in the `ItemCreationRequest`. + + The method downloads the results for a slide as soon as they are available. There is no need to keep the method running until all results are available. The method will automatically check for the status of the application run and download the results as soon as they are available. If you invoke the method on a run you already downloaded some results before, it will only download the missing artifacts. + """ + ) + return + + +@app.cell +def _(application_run): + download_folder = "/tmp/" + application_run.download_to_folder(download_folder) + return (download_folder,) + + +@app.cell +def _(mo): + mo.md( + r""" + # Continue to retrieve results for an application run + + In case you just triggered an application run and want to check on the results later or you had a connection loss, you can simply initialize an applicaiton run object via it's `application_run_id`. If you do not have the `application_run_id` anymore, you can simple list all currently running application version via the `client.runs.list()` method. The `application_run_id` is part of the `ApplicationRun` object returned by the `list()` method. You can then use the `download_to_folder()` method to continue downloading the results. + """ + ) + return + + +@app.cell +def _(client): + # list currently running applications + application_runs = client.runs.list() + for run in application_runs: + print(run) + return application_runs, run + + +@app.cell +def _(mo): + mo.md( + r""" + from aignostics.client.resources.runs import ApplicationRun + application_run = ApplicationRun.for_application_run_id("") + # download + download_folder = "/tmp/" + application_run.download_to_folder(download_folder) + """ + ) + return if __name__ == "__main__": diff --git a/examples/playbook.py b/examples/playbook.py deleted file mode 100644 index e8916702..00000000 --- a/examples/playbook.py +++ /dev/null @@ -1,148 +0,0 @@ -import marimo - -__generated_with = "0.12.2" -app = marimo.App(width="medium") - - -@app.cell -def _(): - import marimo as mo - - return (mo,) - - -@app.cell -def _(mo): - mo.md( - r""" - # Login - - As a first step, you need to initialize the client to interact with the Aignostics Platform. This will execute an OAuth flow depending on the environment you run: - - In case you have a browser available, an interactive login flow in your browser is started. - - In case there is no browser available, a device flow is started. - - **NOTE:** By default, the client caches the access token in your operation systems application cache folder. If you do not want to store the access token, please initialize the client like this: - - ```python - client = aignostics.client.Client(cache_token=False) - ``` - """ - ) - - -@app.cell -def _(): - import aignostics.client - - client = aignostics.client.Client() - - # the following functions is just used to visualize the results nicely in this notebook - import pandas as pd - from pydantic import BaseModel - - def show(models: BaseModel | list[BaseModel]) -> pd.DataFrame: - if isinstance(models, BaseModel): - items = [models.model_dump()] - else: - items = (a.model_dump() for a in models) - return pd.DataFrame(items) - - return BaseModel, aignostics, client, pd, show - - -@app.cell -def _(mo): - mo.md(r"""# List our available applications""") - - -@app.cell -def _(client, show): - show(client.applications.list()) - - -@app.cell -def _(mo): - mo.md(r"""# List all available versions of an application""") - - -@app.cell -def _(client, show): - # let's show the available version for the `TwoTaskDummy` application - show(client.applications.versions.list(for_application="ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed")) - - -@app.cell -def _(mo): - mo.md(r"""# Inspect the input payload for an application version""") - - -@app.cell -def _(client): - # get a reference to the application version you are interested in - # in our case, let us inspect the latest version `0.0.4` - application_version = client.versions.details(for_application_version_id="212470c6-103e-429e-a9a0-0f662166faf5") - - # view the `input_artifacts` to get insights in the required fields of the application version payload - for artifact in application_version.input_artifacts: - print(artifact.to_json()) - return application_version, artifact - - -@app.cell -def _(mo): - mo.md(r"""# Trigger an run for an application version""") - - -@app.cell -def _(client): - import os - - from aignx.codegen.models import ApplicationVersion, RunCreationRequest - - from aignostics.samples import input_samples - - os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = ( - "/Users/akunft/Downloads/aignx-platform-api-shsodcule-9086ce65109a.json" - ) - - application_run = client.runs.create( - RunCreationRequest( - application_version=ApplicationVersion("212470c6-103e-429e-a9a0-0f662166faf5"), - items=input_samples.three_spots_payload(), - ) - ) - print(application_run) - return ( - ApplicationVersion, - RunCreationRequest, - application_run, - input_samples, - os, - ) - - -@app.cell -def _(mo): - mo.md(r"""# Download application run results""") - - -@app.cell -def _(application_run): - from aignostics.resources.runs import ApplicationRun - - # if you have a reference to an application run - download_folder = "/tmp/" - application_run.download_to_folder(download_folder) - - # if you want to check on the status when you do not have a reference to the application run anymore - # ApplicationRun.for_application_run_id("").download_to_folder(download_folder) - return ApplicationRun, download_folder - - -@app.cell -def _(): - return - - -if __name__ == "__main__": - app.run() diff --git a/examples/script.py b/examples/script.py index bcfb5744..a1388036 100644 --- a/examples/script.py +++ b/examples/script.py @@ -1,13 +1,47 @@ -"""Example script demonstrating the usage of the service provided by Aignostics Python SDK.""" +"""Example script to run the test application with one example image.""" -from dotenv import load_dotenv -from rich.console import Console +import tempfile -from aignostics import Service +from aignx.codegen.models import ( + ApplicationVersion, + InputArtifactCreationRequest, + ItemCreationRequest, + RunCreationRequest, +) -console = Console() +import aignostics.client +from aignostics.client.utils import generate_signed_url -load_dotenv() +# please look at the IPython or Marimo notebooks for a detailed explanation of the payload +payload = [ + ItemCreationRequest( + reference="1", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", + download_url=generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" + ), + metadata={ + "checksum_crc32c": "N+LWCg==", + "base_mpp": 0.46499982, + "width": 3728, + "height": 3640, + }, + ) + ], + ), +] -message = Service.get_hello_world() -console.print(f"[blue]{message}[/blue]") +# initialize the client +client = aignostics.client.Client() +# create application run +application_run = client.runs.create( + RunCreationRequest( + application_version=ApplicationVersion("60e7b441-307a-4b41-8a97-5b02e7bc73a4"), + items=payload, + ) +) +# wait for the results and download incrementally as they become available +tmp_folder = tempfile.gettempdir() +application_run.download_to_folder(tmp_folder) diff --git a/examples/streamlit.py b/examples/streamlit.py deleted file mode 100644 index b2e48d41..00000000 --- a/examples/streamlit.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -Streamlit web application that demonstrates a simple interface for Aignostics Python SDK. - -This module creates a web interface using Streamlit to demonstrate the usage of the service provided by -Aignostics Python SDK. -""" - -import streamlit as st - -from aignostics import ( - Service, - __version__, -) - -sidebar = st.sidebar -sidebar.write( - f" [Aignostics Python SDK v{__version__}](https://aignostics.readthedocs.io/en/latest/)", -) -sidebar.write("Built with love in Berlin 🐻") - -st.title("🔬 Aignostics Python SDK ") - -# Initialize the service -service = Service() - -# Get the message -message = service.get_hello_world() - -# Print the message -st.write(f"{message}") diff --git a/src/aignostics/client/_client.py b/src/aignostics/client/_client.py index a23ddfea..5f4ec466 100644 --- a/src/aignostics/client/_client.py +++ b/src/aignostics/client/_client.py @@ -3,7 +3,7 @@ from aignx.codegen.configuration import Configuration from aignostics.client._authentication import get_token -from aignostics.client.resources.applications import Applications, Versions +from aignostics.client.resources.applications import Applications from aignostics.client.resources.runs import Runs from ._settings import authentication_settings @@ -27,7 +27,6 @@ def __init__(self, cache_token: bool = True) -> None: """ self._api = Client.get_api_client(cache_token=cache_token) self.applications: Applications = Applications(self._api) - self.versions: Versions = Versions(self._api) self.runs: Runs = Runs(self._api) @staticmethod diff --git a/src/aignostics/client/utils.py b/src/aignostics/client/utils.py index 1237ecb9..c7daddc2 100644 --- a/src/aignostics/client/utils.py +++ b/src/aignostics/client/utils.py @@ -82,7 +82,7 @@ def download_file(signed_url: str, file_path: str, verify_checksum: str) -> None raise ValueError(msg) -def _generate_signed_url(fully_qualified_gs_path: str) -> str: +def generate_signed_url(fully_qualified_gs_path: str) -> str: """Generates a signed URL for a Google Cloud Storage object. Args: diff --git a/tests/aignostics/client/scheduled_test.py b/tests/aignostics/client/scheduled_test.py index 3d46c58a..2020bd8c 100644 --- a/tests/aignostics/client/scheduled_test.py +++ b/tests/aignostics/client/scheduled_test.py @@ -19,7 +19,7 @@ ) import aignostics.client -from aignostics.client.utils import _generate_signed_url, calculate_file_crc32c, mime_type_to_file_ending +from aignostics.client.utils import calculate_file_crc32c, generate_signed_url, mime_type_to_file_ending def three_spots_payload() -> list[ItemCreationRequest]: @@ -30,7 +30,7 @@ def three_spots_payload() -> list[ItemCreationRequest]: input_artifacts=[ InputArtifactCreationRequest( name="user_slide", - download_url=_generate_signed_url( + download_url=generate_signed_url( "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" ), metadata={ @@ -47,7 +47,7 @@ def three_spots_payload() -> list[ItemCreationRequest]: input_artifacts=[ InputArtifactCreationRequest( name="user_slide", - download_url=_generate_signed_url( + download_url=generate_signed_url( "gs://aignx-storage-service-dev/sample_data_formatted/8c7b079e-8b8a-4036-bfde-5818352b503a.tiff" ), metadata={ @@ -64,7 +64,7 @@ def three_spots_payload() -> list[ItemCreationRequest]: input_artifacts=[ InputArtifactCreationRequest( name="user_slide", - download_url=_generate_signed_url( + download_url=generate_signed_url( "gs://aignx-storage-service-dev/sample_data_formatted/1f4f366f-a2c5-4407-9f5e-23400b22d50e.tiff" ), metadata={ From f3025bd1d2dc135990e1b41a8f4fa40a404e6c4e Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Sun, 13 Apr 2025 18:16:07 +0200 Subject: [PATCH 092/110] chore: Harden port logic for interactive flow --- src/aignostics/client/_authentication.py | 67 ++++++++++++++++--- .../aignostics/client/authentication_test.py | 36 ++++++++-- 2 files changed, 88 insertions(+), 15 deletions(-) diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index f4c290b9..45ee06c9 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -1,3 +1,5 @@ +import errno +import socket import time import typing as t import webbrowser @@ -12,8 +14,10 @@ from pydantic import BaseModel, SecretStr from requests_oauthlib import OAuth2Session -from ._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI -from ._settings import authentication_settings +from aignostics.client._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI +from aignostics.client._settings import authentication_settings + +CALLBACK_PORT_RETRY_COUNT = 5 class AuthenticationResult(BaseModel): @@ -23,12 +27,13 @@ class AuthenticationResult(BaseModel): error: str | None = None -def get_token(use_cache: bool = True) -> str: +def get_token(use_cache: bool = True, use_device_flow: bool = False) -> str: """Retrieves an authentication token, either from cache or via login. Args: use_cache: Boolean indicating whether to store & use the token from disk cache. Defaults to True. + use_device_flow: Boolean indicating whether to force the usage of the device flow for authentication. Returns: str: The JWT access token. @@ -51,7 +56,7 @@ def get_token(use_cache: bool = True) -> str: # 1. Do not want to use the cached token # 2. The cached token is expired # 3. No token was cached yet - new_token = _authenticate() + new_token = _authenticate(use_device_flow) claims = verify_and_decode_token(new_token) # Store new token with expiry @@ -63,12 +68,15 @@ def get_token(use_cache: bool = True) -> str: return new_token -def _authenticate() -> str: +def _authenticate(use_device_flow: bool) -> str: """Allows the user to authenticate and obtain an access token. Determines the appropriate authentication flow based on whether a browser can be opened, then executes that flow. + Args: + use_device_flow: Boolean indicating whether to force the usage of the device flow for authentication. + Returns: str: The JWT access token. @@ -78,7 +86,7 @@ def _authenticate() -> str: """ if refresh_token := authentication_settings().refresh_token: token = _token_from_refresh_token(refresh_token) - elif _can_open_browser(): + elif _can_open_browser() and not use_device_flow: token = _perform_authorization_code_with_pkce_flow() else: token = _perform_device_flow() @@ -208,11 +216,21 @@ def log_message(self, _format: str, *_args) -> None: # type: ignore[no-untyped- host, port = parsed_redirect.hostname, parsed_redirect.port if not host or not port: raise RuntimeError(INVALID_REDIRECT_URI) - with HTTPServer((host, port), OAuthCallbackHandler) as server: - # Call Auth0 with challenge and redirect to localhost with code after successful authN - webbrowser.open_new(authorization_url) - # Extract authorization_code from redirected request, see: OAuthCallbackHandler - server.handle_request() + # check if port is callback port is available + port_unavailable_msg = f"Port {port} is already in use. Free the port, or use the device flow." + if not _ensure_local_port_is_available(port): + raise RuntimeError(port_unavailable_msg) + # start the server + try: + with HTTPServer((host, port), OAuthCallbackHandler) as server: + # Call Auth0 with challenge and redirect to localhost with code after successful authN + webbrowser.open_new(authorization_url) + # Extract authorization_code from redirected request, see: OAuthCallbackHandler + server.handle_request() + except OSError as e: + if e.errno == errno.EADDRINUSE: + raise RuntimeError(port_unavailable_msg) from e + raise RuntimeError(AUTHENTICATION_FAILED) from e if authentication_result.error or not authentication_result.token: raise RuntimeError(AUTHENTICATION_FAILED) @@ -309,3 +327,30 @@ def _token_from_refresh_token(refresh_token: SecretStr) -> str | None: return t.cast("str", response.json()["access_token"]) except (HTTPError, requests.exceptions.RequestException) as e: raise RuntimeError(AUTHENTICATION_FAILED) from e + + +def _ensure_local_port_is_available(port: int, max_retries: int = CALLBACK_PORT_RETRY_COUNT) -> bool: + """Check if a port is already in use. + + Args: + port: int The port number to check. + max_retries: int The maximum number of retries to check the port. + + Returns: + bool: True if the port is not in use, False otherwise. + """ + + def is_port_available() -> bool: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + try: + s.bind(("localhost", port)) + return True + except OSError: + return False + + retry_count = 0 + while not is_port_available() and retry_count < max_retries: + time.sleep(1) + print("try") + retry_count += 1 + return retry_count < max_retries diff --git a/tests/aignostics/client/authentication_test.py b/tests/aignostics/client/authentication_test.py index 8ad3af4f..bbc17f21 100644 --- a/tests/aignostics/client/authentication_test.py +++ b/tests/aignostics/client/authentication_test.py @@ -1,5 +1,6 @@ """Tests for the authentication module of the Aignostics Python SDK.""" +import socket import time import webbrowser from datetime import UTC, datetime, timedelta @@ -14,6 +15,7 @@ from aignostics.client._authentication import ( _authenticate, _can_open_browser, + _ensure_local_port_is_available, _perform_authorization_code_with_pkce_flow, _perform_device_flow, get_token, @@ -168,7 +170,7 @@ def test_authenticate_uses_refresh_token_when_available(mock_settings) -> None: with patch( "aignostics.client._authentication._token_from_refresh_token", return_value="refreshed.token" ) as mock_refresh: - token = _authenticate() + token = _authenticate(use_device_flow=False) assert token == "refreshed.token" # noqa: S105 - Test credential mock_refresh.assert_called_once_with(mock_settings.return_value.refresh_token) @@ -184,7 +186,7 @@ def test_authenticate_uses_browser_flow_when_available(mock_settings) -> None: return_value="browser.token", ) as mock_browser, ): - token = _authenticate() + token = _authenticate(use_device_flow=False) assert token == "browser.token" # noqa: S105 - Test credential mock_browser.assert_called_once() @@ -197,7 +199,7 @@ def test_authenticate_falls_back_to_device_flow(mock_settings) -> None: patch("aignostics.client._authentication._can_open_browser", return_value=False), patch("aignostics.client._authentication._perform_device_flow", return_value="device.token") as mock_device, ): - token = _authenticate() + token = _authenticate(use_device_flow=True) assert token == "device.token" # noqa: S105 - Test credential mock_device.assert_called_once() @@ -211,7 +213,7 @@ def test_authenticate_raises_error_on_failure(mock_settings) -> None: patch("aignostics.client._authentication._perform_device_flow", return_value=None), pytest.raises(RuntimeError, match=AUTHENTICATION_FAILED), ): - _authenticate() + _authenticate(use_device_flow=True) class TestVerifyAndDecodeToken: @@ -430,3 +432,29 @@ def test_perform_device_flow_success(mock_settings) -> None: assert mock_post.call_count == 2 mock_print.assert_called_once() # Verify we printed instructions mock_sleep.assert_not_called() # We didn't have to poll in our test + + +class TestPortAvailability: + """Test cases for checking port availability.""" + + @staticmethod + def test_port_available() -> None: + """Test that _ensure_local_port_is_available returns True when the port is available.""" + with patch("socket.socket.bind", return_value=None) as mock_bind: + assert _ensure_local_port_is_available(8000) is True + mock_bind.assert_called_once() + + @staticmethod + def test_port_unavailable() -> None: + """Test that _ensure_local_port_is_available returns False when the port is unavailable.""" + with patch("socket.socket.bind", side_effect=socket.error) as mock_bind: + assert _ensure_local_port_is_available(8000) is False + mock_bind.assert_called() + + @staticmethod + def test_port_retries() -> None: + """Test that _ensure_local_port_is_available retries the specified number of times.""" + with patch("socket.socket.bind", side_effect=socket.error) as mock_bind, patch("time.sleep") as mock_sleep: + assert _ensure_local_port_is_available(8000, max_retries=3) is False + assert mock_bind.call_count == 4 # Initial attempt + 3 retries + assert mock_sleep.call_count == 3 From de4aec4a1bf253be61427830e3e81dca44910ec2 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Sun, 13 Apr 2025 18:16:31 +0200 Subject: [PATCH 093/110] chore: Change default callback port to 8989 --- src/aignostics/constants.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/aignostics/constants.py b/src/aignostics/constants.py index cbcd9d86..34194444 100644 --- a/src/aignostics/constants.py +++ b/src/aignostics/constants.py @@ -12,7 +12,7 @@ AUDIENCE_PRODUCTION = "https://aignostics-platform-samia" AUTHORIZATION_BASE_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/authorize" TOKEN_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/oauth/token" # noqa: S105 -REDIRECT_URI_PRODUCTION = "http://localhost:8080/" +REDIRECT_URI_PRODUCTION = "http://localhost:8989/" DEVICE_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/oauth/device/code" JWS_JSON_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/.well-known/jwks.json" @@ -29,6 +29,6 @@ AUDIENCE_DEV = "https://dev-8ouohmmrbuh2h4vu-samia" AUTHORIZATION_BASE_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize" TOKEN_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" # noqa: S105 -REDIRECT_URI_DEV = "http://localhost:8080/" +REDIRECT_URI_DEV = "http://localhost:8989/" DEVICE_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/device/code" JWS_JSON_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/.well-known/jwks.json" From 407e74f7ae89289b70efd86cbda59ec7414050d5 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Sun, 13 Apr 2025 21:46:30 +0200 Subject: [PATCH 094/110] chore: Add pagination to list API calls --- examples/notebook.ipynb | 353 ++++++++++++++++-- src/aignostics/client/_authentication.py | 1 - .../client/resources/applications.py | 20 +- src/aignostics/client/resources/runs.py | 19 +- src/aignostics/client/resources/utils.py | 35 ++ .../aignostics/client/authentication_test.py | 2 +- .../{ => resources}/applications_test.py | 109 +++++- .../client/resources/resource_utils_test.py | 99 +++++ .../aignostics/client/resources/runs_test.py | 174 +++++++++ tests/aignostics/client/utils_test.py | 42 ++- 10 files changed, 780 insertions(+), 74 deletions(-) create mode 100644 src/aignostics/client/resources/utils.py rename tests/aignostics/client/{ => resources}/applications_test.py (57%) create mode 100644 tests/aignostics/client/resources/resource_utils_test.py create mode 100644 tests/aignostics/client/resources/runs_test.py diff --git a/examples/notebook.ipynb b/examples/notebook.ipynb index b5ef10d9..330d73dc 100644 --- a/examples/notebook.ipynb +++ b/examples/notebook.ipynb @@ -20,18 +20,23 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-13T19:35:07.002519Z", + "start_time": "2025-04-13T19:35:06.725532Z" + } + }, "outputs": [], "source": [ + "from collections.abc import Iterator\n", + "\n", "import pandas as pd\n", "from pydantic import BaseModel\n", "\n", - "import aignostics.client\n", - "\n", "\n", "# the following function is used for visualizing the results nicely in this notebook\n", - "def show(models: BaseModel | list[BaseModel]) -> pd.DataFrame:\n", + "def show(models: BaseModel | list[BaseModel] | Iterator[BaseModel]) -> pd.DataFrame:\n", " \"\"\"Visualize the results in a pandas DataFrame.\n", "\n", " Returns:\n", @@ -43,10 +48,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-13T19:40:23.461659Z", + "start_time": "2025-04-13T19:40:22.940324Z" + } + }, "outputs": [], "source": [ + "import aignostics.client\n", + "\n", "# initialize the client\n", "client = aignostics.client.Client()" ] @@ -62,11 +74,11 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2025-04-12T14:50:55.210948Z", - "start_time": "2025-04-12T14:50:54.774401Z" + "end_time": "2025-04-13T19:35:12.466054Z", + "start_time": "2025-04-13T19:35:12.339753Z" } }, "outputs": [ @@ -129,7 +141,7 @@ "1 [] This is the H&E TME Application. " ] }, - "execution_count": 5, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -151,11 +163,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": { "ExecuteTime": { - "end_time": "2025-04-12T14:54:09.592991Z", - "start_time": "2025-04-12T14:54:09.322720Z" + "end_time": "2025-04-13T19:35:17.204173Z", + "start_time": "2025-04-13T19:35:17.160585Z" } }, "outputs": [ @@ -220,7 +232,7 @@ "0 [{'name': 'tissue_segmentation:geojson_polygon... " ] }, - "execution_count": 6, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -242,9 +254,82 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-13T19:35:21.235134Z", + "start_time": "2025-04-13T19:35:21.171620Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/akunft/dev/python-sdk/.venv/lib/python3.11/site-packages/IPython/core/display.py:636: UserWarning: JSON expects JSONable dict or list, not JSON strings\n", + " warnings.warn(\"JSON expects JSONable dict or list, not JSON strings\")\n" + ] + }, + { + "data": { + "application/json": { + "metadata_schema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "description": "Metadata corresponding to an RGB image.", + "properties": { + "base_mpp": { + "maximum": 0.5, + "minimum": 0.125, + "title": "Base Mpp", + "type": "number" + }, + "checksum_crc32c": { + "title": "Checksum Crc32C", + "type": "string" + }, + "height": { + "title": "Height", + "type": "integer" + }, + "mime_type": { + "default": "image/tiff", + "enum": [ + "image/tiff" + ], + "title": "Mime Type", + "type": "string" + }, + "width": { + "title": "Width", + "type": "integer" + } + }, + "required": [ + "checksum_crc32c", + "width", + "height" + ], + "title": "RGBImageMetadata", + "type": "object" + }, + "mime_type": "image/tiff", + "name": "user_slide" + }, + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": { + "application/json": { + "expanded": false, + "root": "root" + } + }, + "output_type": "execute_result" + } + ], "source": [ "from IPython.display import JSON\n", "\n", @@ -286,10 +371,27 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-13T19:41:34.397794Z", + "start_time": "2025-04-13T19:41:32.578439Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Application run `d51def04-326b-4138-a411-47bc073bc5ac`: running, 1 items - (1/0/0) [pending/succeeded/error]\n" + ] + } + ], "source": [ + "import os\n", + "\n", + "os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"] = \"/Users/akunft/Downloads/aignx-platform-api-shsodcule-9086ce65109a.json\"\n", + "\n", "from aignx.codegen.models import (\n", " ApplicationVersion,\n", " InputArtifactCreationRequest,\n", @@ -362,9 +464,59 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-13T19:41:55.544603Z", + "start_time": "2025-04-13T19:41:46.365776Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Application run `01a5cb5b-1c34-48fb-be83-c6fa886f8c20`: completed, 3 items - (0/3/0) [pending/succeeded/error]\n", + "Application run `026a1c42-537b-455c-9459-abb0ee9970eb`: completed, 3 items - (0/3/0) [pending/succeeded/error]\n", + "Application run `029ec139-46b7-49d6-ae70-29aea43dc757`: completed, 3 items - (0/3/0) [pending/succeeded/error]\n", + "Application run `02f85458-76ca-4400-863a-8b7cd55bc7e5`: completed, 3 items - (0/3/0) [pending/succeeded/error]\n", + "Application run `04c915b8-3b2a-4b7a-be76-7766190ca60d`: completed, 3 items - (0/3/0) [pending/succeeded/error]\n", + "Application run `06434c6c-eb57-436b-bdf7-82bede577d8b`: running, 3 items - (1/0/2) [pending/succeeded/error]\n", + "Application run `0a543af7-3b72-4ff0-80bd-6aab58571969`: completed, 3 items - (0/3/0) [pending/succeeded/error]\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 4\u001b[39m\n\u001b[32m 2\u001b[39m application_runs = client.runs.list()\n\u001b[32m 3\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m run \u001b[38;5;129;01min\u001b[39;00m application_runs:\n\u001b[32m----> \u001b[39m\u001b[32m4\u001b[39m \u001b[38;5;28mprint\u001b[39m(run)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/src/aignostics/client/resources/runs.py:200\u001b[39m, in \u001b[36mApplicationRun.__str__\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 192\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"Returns a string representation of the application run.\u001b[39;00m\n\u001b[32m 193\u001b[39m \n\u001b[32m 194\u001b[39m \u001b[33;03mThe string includes run ID, status, and item statistics.\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 197\u001b[39m \u001b[33;03m str: String representation of the application run.\u001b[39;00m\n\u001b[32m 198\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 199\u001b[39m app_status = \u001b[38;5;28mself\u001b[39m.status().status.value\n\u001b[32m--> \u001b[39m\u001b[32m200\u001b[39m item_status = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mitem_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 201\u001b[39m pending, succeeded, error = \u001b[32m0\u001b[39m, \u001b[32m0\u001b[39m, \u001b[32m0\u001b[39m\n\u001b[32m 202\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m item_status.values():\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/src/aignostics/client/resources/runs.py:82\u001b[39m, in \u001b[36mApplicationRun.item_status\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 80\u001b[39m results = \u001b[38;5;28mself\u001b[39m.results()\n\u001b[32m 81\u001b[39m item_status = {}\n\u001b[32m---> \u001b[39m\u001b[32m82\u001b[39m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mitem\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mresults\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m 83\u001b[39m \u001b[43m \u001b[49m\u001b[43mitem_status\u001b[49m\u001b[43m[\u001b[49m\u001b[43mitem\u001b[49m\u001b[43m.\u001b[49m\u001b[43mreference\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mitem\u001b[49m\u001b[43m.\u001b[49m\u001b[43mstatus\u001b[49m\n\u001b[32m 84\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_status\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/src/aignostics/client/resources/utils.py:31\u001b[39m, in \u001b[36mpaginate\u001b[39m\u001b[34m(func, *args, **kwargs)\u001b[39m\n\u001b[32m 29\u001b[39m page = \u001b[32m1\u001b[39m\n\u001b[32m 30\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m---> \u001b[39m\u001b[32m31\u001b[39m results = \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpage\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpage\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpage_size\u001b[49m\u001b[43m=\u001b[49m\u001b[43mPAGE_SIZE\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 32\u001b[39m \u001b[38;5;28;01myield from\u001b[39;00m results\n\u001b[32m 33\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(results) < PAGE_SIZE:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:39\u001b[39m, in \u001b[36mupdate_wrapper_attributes..wrapper_function\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 37\u001b[39m \u001b[38;5;129m@functools\u001b[39m.wraps(wrapped)\n\u001b[32m 38\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mwrapper_function\u001b[39m(*args, **kwargs):\n\u001b[32m---> \u001b[39m\u001b[32m39\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mwrapper\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:136\u001b[39m, in \u001b[36mValidateCallWrapper.__call__\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m\n\u001b[32m 133\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m.__pydantic_complete__:\n\u001b[32m 134\u001b[39m \u001b[38;5;28mself\u001b[39m._create_validators()\n\u001b[32m--> \u001b[39m\u001b[32m136\u001b[39m res = \u001b[38;5;28mself\u001b[39m.__pydantic_validator__.validate_python(pydantic_core.ArgsKwargs(args, kwargs))\n\u001b[32m 137\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.__return_pydantic_validator__:\n\u001b[32m 138\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.__return_pydantic_validator__(res)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/codegen/out/aignx/codegen/api/externals_api.py:2141\u001b[39m, in \u001b[36mExternalsApi.list_run_results_v1_runs_application_run_id_results_get\u001b[39m\u001b[34m(self, application_run_id, item_id__in, page, page_size, reference__in, status__in, sort, _request_timeout, _request_auth, _content_type, _headers, _host_index)\u001b[39m\n\u001b[32m 2122\u001b[39m _param = \u001b[38;5;28mself\u001b[39m._list_run_results_v1_runs_application_run_id_results_get_serialize(\n\u001b[32m 2123\u001b[39m application_run_id=application_run_id,\n\u001b[32m 2124\u001b[39m item_id__in=item_id__in,\n\u001b[32m (...)\u001b[39m\u001b[32m 2133\u001b[39m _host_index=_host_index\n\u001b[32m 2134\u001b[39m )\n\u001b[32m 2136\u001b[39m _response_types_map: Dict[\u001b[38;5;28mstr\u001b[39m, Optional[\u001b[38;5;28mstr\u001b[39m]] = {\n\u001b[32m 2137\u001b[39m \u001b[33m'\u001b[39m\u001b[33m200\u001b[39m\u001b[33m'\u001b[39m: \u001b[33m\"\u001b[39m\u001b[33mList[ItemResultReadResponse]\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 2138\u001b[39m \u001b[33m'\u001b[39m\u001b[33m404\u001b[39m\u001b[33m'\u001b[39m: \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 2139\u001b[39m \u001b[33m'\u001b[39m\u001b[33m422\u001b[39m\u001b[33m'\u001b[39m: \u001b[33m\"\u001b[39m\u001b[33mHTTPValidationError\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 2140\u001b[39m }\n\u001b[32m-> \u001b[39m\u001b[32m2141\u001b[39m response_data = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mapi_client\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcall_api\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 2142\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m_param\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2143\u001b[39m \u001b[43m \u001b[49m\u001b[43m_request_timeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43m_request_timeout\u001b[49m\n\u001b[32m 2144\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 2145\u001b[39m response_data.read()\n\u001b[32m 2146\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.api_client.response_deserialize(\n\u001b[32m 2147\u001b[39m response_data=response_data,\n\u001b[32m 2148\u001b[39m response_types_map=_response_types_map,\n\u001b[32m 2149\u001b[39m ).data\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/codegen/out/aignx/codegen/api_client.py:272\u001b[39m, in \u001b[36mApiClient.call_api\u001b[39m\u001b[34m(self, method, url, header_params, body, post_params, _request_timeout)\u001b[39m\n\u001b[32m 258\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"Makes the HTTP request (synchronous)\u001b[39;00m\n\u001b[32m 259\u001b[39m \u001b[33;03m:param method: Method to call.\u001b[39;00m\n\u001b[32m 260\u001b[39m \u001b[33;03m:param url: Path to method endpoint.\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 267\u001b[39m \u001b[33;03m:return: RESTResponse\u001b[39;00m\n\u001b[32m 268\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 270\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 271\u001b[39m \u001b[38;5;66;03m# perform request and return response\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m272\u001b[39m response_data = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mrest_client\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 273\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 274\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheader_params\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 275\u001b[39m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[43m=\u001b[49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpost_params\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpost_params\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 276\u001b[39m \u001b[43m \u001b[49m\u001b[43m_request_timeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43m_request_timeout\u001b[49m\n\u001b[32m 277\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 279\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m ApiException \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 280\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m e\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/codegen/out/aignx/codegen/rest.py:244\u001b[39m, in \u001b[36mRESTClientObject.request\u001b[39m\u001b[34m(self, method, url, headers, body, post_params, _request_timeout)\u001b[39m\n\u001b[32m 241\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m ApiException(status=\u001b[32m0\u001b[39m, reason=msg)\n\u001b[32m 242\u001b[39m \u001b[38;5;66;03m# For `GET`, `HEAD`\u001b[39;00m\n\u001b[32m 243\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m244\u001b[39m r = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mpool_manager\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 245\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 246\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 247\u001b[39m \u001b[43m \u001b[49m\u001b[43mfields\u001b[49m\u001b[43m=\u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 248\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 249\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 250\u001b[39m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\n\u001b[32m 251\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 252\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m urllib3.exceptions.SSLError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 253\u001b[39m msg = \u001b[33m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m.join([\u001b[38;5;28mtype\u001b[39m(e).\u001b[34m__name__\u001b[39m, \u001b[38;5;28mstr\u001b[39m(e)])\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/urllib3/_request_methods.py:135\u001b[39m, in \u001b[36mRequestMethods.request\u001b[39m\u001b[34m(self, method, url, body, fields, headers, json, **urlopen_kw)\u001b[39m\n\u001b[32m 132\u001b[39m urlopen_kw[\u001b[33m\"\u001b[39m\u001b[33mbody\u001b[39m\u001b[33m\"\u001b[39m] = body\n\u001b[32m 134\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m._encode_url_methods:\n\u001b[32m--> \u001b[39m\u001b[32m135\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mrequest_encode_url\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 136\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 137\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 138\u001b[39m \u001b[43m \u001b[49m\u001b[43mfields\u001b[49m\u001b[43m=\u001b[49m\u001b[43mfields\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[32m 139\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 140\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43murlopen_kw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 141\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 142\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 143\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.request_encode_body(\n\u001b[32m 144\u001b[39m method, url, fields=fields, headers=headers, **urlopen_kw\n\u001b[32m 145\u001b[39m )\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/urllib3/_request_methods.py:182\u001b[39m, in \u001b[36mRequestMethods.request_encode_url\u001b[39m\u001b[34m(self, method, url, fields, headers, **urlopen_kw)\u001b[39m\n\u001b[32m 179\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m fields:\n\u001b[32m 180\u001b[39m url += \u001b[33m\"\u001b[39m\u001b[33m?\u001b[39m\u001b[33m\"\u001b[39m + urlencode(fields)\n\u001b[32m--> \u001b[39m\u001b[32m182\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mextra_kw\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/urllib3/poolmanager.py:443\u001b[39m, in \u001b[36mPoolManager.urlopen\u001b[39m\u001b[34m(self, method, url, redirect, **kw)\u001b[39m\n\u001b[32m 441\u001b[39m response = conn.urlopen(method, url, **kw)\n\u001b[32m 442\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m443\u001b[39m response = \u001b[43mconn\u001b[49m\u001b[43m.\u001b[49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mu\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrequest_uri\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkw\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 445\u001b[39m redirect_location = redirect \u001b[38;5;129;01mand\u001b[39;00m response.get_redirect_location()\n\u001b[32m 446\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m redirect_location:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/urllib3/connectionpool.py:787\u001b[39m, in \u001b[36mHTTPConnectionPool.urlopen\u001b[39m\u001b[34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[39m\n\u001b[32m 784\u001b[39m response_conn = conn \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m release_conn \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 786\u001b[39m \u001b[38;5;66;03m# Make the request on the HTTPConnection object\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m787\u001b[39m response = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 788\u001b[39m \u001b[43m \u001b[49m\u001b[43mconn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 789\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 790\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 791\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 792\u001b[39m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[43m=\u001b[49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 793\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 794\u001b[39m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m=\u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 795\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[43m=\u001b[49m\u001b[43mretries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 796\u001b[39m \u001b[43m \u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[43m=\u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 797\u001b[39m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 798\u001b[39m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 799\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mresponse_kw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 800\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 802\u001b[39m \u001b[38;5;66;03m# Everything went great!\u001b[39;00m\n\u001b[32m 803\u001b[39m clean_exit = \u001b[38;5;28;01mTrue\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/urllib3/connectionpool.py:534\u001b[39m, in \u001b[36mHTTPConnectionPool._make_request\u001b[39m\u001b[34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[39m\n\u001b[32m 532\u001b[39m \u001b[38;5;66;03m# Receive the response from the server\u001b[39;00m\n\u001b[32m 533\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m534\u001b[39m response = \u001b[43mconn\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 535\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m (BaseSSLError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 536\u001b[39m \u001b[38;5;28mself\u001b[39m._raise_timeout(err=e, url=url, timeout_value=read_timeout)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/urllib3/connection.py:516\u001b[39m, in \u001b[36mHTTPConnection.getresponse\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 513\u001b[39m _shutdown = \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m.sock, \u001b[33m\"\u001b[39m\u001b[33mshutdown\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 515\u001b[39m \u001b[38;5;66;03m# Get the response from http.client.HTTPConnection\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m516\u001b[39m httplib_response = \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 518\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 519\u001b[39m assert_header_parsing(httplib_response.msg)\n", + "\u001b[36mFile \u001b[39m\u001b[32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/http/client.py:1395\u001b[39m, in \u001b[36mHTTPConnection.getresponse\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 1393\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 1394\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1395\u001b[39m \u001b[43mresponse\u001b[49m\u001b[43m.\u001b[49m\u001b[43mbegin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1396\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m:\n\u001b[32m 1397\u001b[39m \u001b[38;5;28mself\u001b[39m.close()\n", + "\u001b[36mFile \u001b[39m\u001b[32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/http/client.py:325\u001b[39m, in \u001b[36mHTTPResponse.begin\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 323\u001b[39m \u001b[38;5;66;03m# read until we get a non-100 response\u001b[39;00m\n\u001b[32m 324\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m325\u001b[39m version, status, reason = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_read_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 326\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m status != CONTINUE:\n\u001b[32m 327\u001b[39m \u001b[38;5;28;01mbreak\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/http/client.py:286\u001b[39m, in \u001b[36mHTTPResponse._read_status\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 285\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_read_status\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[32m--> \u001b[39m\u001b[32m286\u001b[39m line = \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28mself\u001b[39m.fp.readline(_MAXLINE + \u001b[32m1\u001b[39m), \u001b[33m\"\u001b[39m\u001b[33miso-8859-1\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 287\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(line) > _MAXLINE:\n\u001b[32m 288\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m LineTooLong(\u001b[33m\"\u001b[39m\u001b[33mstatus line\u001b[39m\u001b[33m\"\u001b[39m)\n", + "\u001b[36mFile \u001b[39m\u001b[32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/socket.py:706\u001b[39m, in \u001b[36mSocketIO.readinto\u001b[39m\u001b[34m(self, b)\u001b[39m\n\u001b[32m 704\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m 705\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m706\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_sock\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrecv_into\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 707\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m timeout:\n\u001b[32m 708\u001b[39m \u001b[38;5;28mself\u001b[39m._timeout_occurred = \u001b[38;5;28;01mTrue\u001b[39;00m\n", + "\u001b[36mFile \u001b[39m\u001b[32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ssl.py:1314\u001b[39m, in \u001b[36mSSLSocket.recv_into\u001b[39m\u001b[34m(self, buffer, nbytes, flags)\u001b[39m\n\u001b[32m 1310\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m flags != \u001b[32m0\u001b[39m:\n\u001b[32m 1311\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 1312\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mnon-zero flags not allowed in calls to recv_into() on \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m\"\u001b[39m %\n\u001b[32m 1313\u001b[39m \u001b[38;5;28mself\u001b[39m.\u001b[34m__class__\u001b[39m)\n\u001b[32m-> \u001b[39m\u001b[32m1314\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnbytes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuffer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1315\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1316\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m().recv_into(buffer, nbytes, flags)\n", + "\u001b[36mFile \u001b[39m\u001b[32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ssl.py:1166\u001b[39m, in \u001b[36mSSLSocket.read\u001b[39m\u001b[34m(self, len, buffer)\u001b[39m\n\u001b[32m 1164\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 1165\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m buffer \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1166\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_sslobj\u001b[49m\u001b[43m.\u001b[49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuffer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1167\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1168\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._sslobj.read(\u001b[38;5;28mlen\u001b[39m)\n", + "\u001b[31mKeyboardInterrupt\u001b[39m: " + ] + } + ], "source": [ "# list currently running applications\n", "application_runs = client.runs.list()\n", @@ -374,23 +526,166 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2025-04-12T15:30:21.854543Z", - "start_time": "2025-04-12T15:30:20.100152Z" + "end_time": "2025-04-13T19:42:51.785683Z", + "start_time": "2025-04-13T19:42:47.947385Z" } }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "> Download for tissue_segmentation:geojson_polygons to /var/folders/65/t33k_dcn45s6545hgkwg9y3m0000gn/T/d51def04-326b-4138-a411-47bc073bc5ac/1/tissue_segmentation:geojson_polygons.json\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "445d60b97449400da8780eff0e3ed87d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/2.00 [00:00 Download for tissue_segmentation:tiff_heatmap to /var/folders/65/t33k_dcn45s6545hgkwg9y3m0000gn/T/d51def04-326b-4138-a411-47bc073bc5ac/1/tissue_segmentation:tiff_heatmap.tiff\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b6bd7f16afb04991ac4975eaee8f42cc", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/4.02M [00:00 Download for tissue_qc:tiff_heatmap to /var/folders/65/t33k_dcn45s6545hgkwg9y3m0000gn/T/d51def04-326b-4138-a411-47bc073bc5ac/1/tissue_qc:tiff_heatmap.tiff\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "74c8410e8c5f4747bd74bba81c1ce7c4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/4.02M [00:00 Download for tissue_qc:csv_class_information to /var/folders/65/t33k_dcn45s6545hgkwg9y3m0000gn/T/d51def04-326b-4138-a411-47bc073bc5ac/1/tissue_qc:csv_class_information.csv\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a29e7543417f4d64a790164072f2eb5b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/103 [00:00 Download for tissue_qc:geojson_polygons to /var/folders/65/t33k_dcn45s6545hgkwg9y3m0000gn/T/d51def04-326b-4138-a411-47bc073bc5ac/1/tissue_qc:geojson_polygons.json\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1c4ec47207334e818f0e2a69f19eef3d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/2.00 [00:00 Download for tissue_segmentation:csv_class_information to /var/folders/65/t33k_dcn45s6545hgkwg9y3m0000gn/T/d51def04-326b-4138-a411-47bc073bc5ac/1/tissue_segmentation:csv_class_information.csv\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8b3947bd1c9242eb892ffc3df089279c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0.00/103 [00:00\")\n", + "application_run = ApplicationRun.for_application_run_id(\"d51def04-326b-4138-a411-47bc073bc5ac\")\n", "# download\n", "\n", "download_folder = tempfile.gettempdir()\n", "application_run.download_to_folder(download_folder)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 45ee06c9..93c4fbfd 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -351,6 +351,5 @@ def is_port_available() -> bool: retry_count = 0 while not is_port_available() and retry_count < max_retries: time.sleep(1) - print("try") retry_count += 1 return retry_count < max_retries diff --git a/src/aignostics/client/resources/applications.py b/src/aignostics/client/resources/applications.py index 040ff580..fa4562d6 100644 --- a/src/aignostics/client/resources/applications.py +++ b/src/aignostics/client/resources/applications.py @@ -9,6 +9,8 @@ from aignx.codegen.api.externals_api import ExternalsApi from aignx.codegen.models import ApplicationReadResponse, ApplicationVersionReadResponse, VersionReadResponse +from aignostics.client.resources.utils import paginate + class Versions: """Resource class for managing application versions. @@ -24,7 +26,7 @@ def __init__(self, api: ExternalsApi) -> None: """ self._api = api - def list(self, for_application: ApplicationReadResponse | str) -> list[ApplicationVersionReadResponse]: + def list(self, for_application: ApplicationReadResponse | str) -> t.Iterator[ApplicationVersionReadResponse]: """Lists all versions for a specific application. Args: @@ -32,7 +34,7 @@ def list(self, for_application: ApplicationReadResponse | str) -> list[Applicati an application ID string. Returns: - list[ApplicationVersionReadResponse]: A list of application versions. + Iterator[ApplicationVersionReadResponse]: A Iterator over the available application versions. Raises: Exception: If the API request fails. @@ -42,11 +44,9 @@ def list(self, for_application: ApplicationReadResponse | str) -> list[Applicati else: application_id = for_application - return t.cast( - "list[ApplicationVersionReadResponse]", - self._api.list_versions_by_application_id_v1_applications_application_id_versions_get( - application_id=application_id - ), + return paginate( + self._api.list_versions_by_application_id_v1_applications_application_id_versions_get, + application_id=application_id, ) def details(self, for_application_version_id: str) -> VersionReadResponse: @@ -81,13 +81,13 @@ def __init__(self, api: ExternalsApi) -> None: self._api = api self.versions: Versions = Versions(self._api) - def list(self) -> list[ApplicationReadResponse]: + def list(self) -> t.Iterator[ApplicationReadResponse]: """Lists all available applications. Returns: - list[ApplicationReadResponse]: A list of applications. + Iterator[ApplicationReadResponse]: A Iterator over the available applications. Raises: Exception: If the API request fails. """ - return t.cast("list[ApplicationReadResponse]", self._api.list_applications_v1_applications_get()) + return paginate(self._api.list_applications_v1_applications_get) diff --git a/src/aignostics/client/resources/runs.py b/src/aignostics/client/resources/runs.py index db1e1d09..c444e4ee 100644 --- a/src/aignostics/client/resources/runs.py +++ b/src/aignostics/client/resources/runs.py @@ -23,6 +23,7 @@ from jsonschema.validators import validate from aignostics.client.resources.applications import Versions +from aignostics.client.resources.utils import paginate from aignostics.client.utils import calculate_file_crc32c, download_file, mime_type_to_file_ending @@ -90,7 +91,7 @@ def cancel(self) -> None: """ self._api.cancel_run_v1_runs_application_run_id_cancel_post(self.application_run_id) - def results(self) -> list[ItemResultReadResponse]: + def results(self) -> t.Iterator[ItemResultReadResponse]: """Retrieves the results of all items in the run. Returns: @@ -99,10 +100,9 @@ def results(self) -> list[ItemResultReadResponse]: Raises: Exception: If the API request fails. """ - # TODO(andreas): paging, sorting - return t.cast( - "list[ItemResultReadResponse]", - self._api.list_run_results_v1_runs_application_run_id_results_get(self.application_run_id), + return paginate( + self._api.list_run_results_v1_runs_application_run_id_results_get, + application_run_id=self.application_run_id, ) def download_to_folder(self, download_base: Path | str) -> None: @@ -265,7 +265,7 @@ def generate_example_payload(_application_version_id: str) -> None: example = faker.generate() print(json.dumps(example, indent=2)) - def list(self, for_application_version: str | None = None) -> list[ApplicationRun]: + def list(self, for_application_version: str | None = None) -> t.Generator[ApplicationRun, t.Any, None]: """Lists application runs, optionally filtered by application version. Args: @@ -277,12 +277,11 @@ def list(self, for_application_version: str | None = None) -> list[ApplicationRu Raises: Exception: If the API request fails. """ - # TODO(andreas): pagination if not for_application_version: - res = self._api.list_application_runs_v1_runs_get() + res = paginate(self._api.list_application_runs_v1_runs_get) else: - res = self._api.list_application_runs_v1_runs_get_with_http_info(for_application_version) - return [ApplicationRun(self._api, response.application_run_id) for response in res] + res = paginate(self._api.list_application_runs_v1_runs_get, application_version_id=for_application_version) + return (ApplicationRun(self._api, response.application_run_id) for response in res) def _validate_input_items(self, payload: RunCreationRequest) -> None: """Validates the input items in a run creation request. diff --git a/src/aignostics/client/resources/utils.py b/src/aignostics/client/resources/utils.py new file mode 100644 index 00000000..227f5302 --- /dev/null +++ b/src/aignostics/client/resources/utils.py @@ -0,0 +1,35 @@ +""" +Utility functions for the Aignostics client resources. + +This module provides helper functions for working with the Aignostics API, including +pagination utilities to handle API responses that span multiple pages. These utility +functions are designed to be used internally by the SDK's resource classes. +""" + +from collections.abc import Callable, Iterator +from typing import TypeVar + +T = TypeVar("T") + +PAGE_SIZE = 20 + + +def paginate(func: Callable[..., list[T]], *args, **kwargs) -> Iterator[T]: # type: ignore[no-untyped-def] + """ + A decorator to paginate a function that returns a list of items. + + Args: + func: The function to paginate. + *args: Positional arguments to pass to the function. + **kwargs: Keyword arguments to pass to the function. + + Yields: + T: The items from the paginated function. + """ + page = 1 + while True: + results = func(*args, page=page, page_size=PAGE_SIZE, **kwargs) + yield from results + if len(results) < PAGE_SIZE: + break + page += 1 diff --git a/tests/aignostics/client/authentication_test.py b/tests/aignostics/client/authentication_test.py index bbc17f21..4a3974cb 100644 --- a/tests/aignostics/client/authentication_test.py +++ b/tests/aignostics/client/authentication_test.py @@ -38,7 +38,7 @@ def mock_settings() -> MagicMock: settings.client_id_interactive = SecretStr("test-interactive-client-id") settings.client_id_device = SecretStr("test-device-client-id") settings.scope_elements = "openid profile" - settings.redirect_uri = "http://localhost:8000/callback" + settings.redirect_uri = "http://localhost:8989/callback" settings.authorization_base_url = "https://test.auth/authorize" settings.token_url = "https://test.auth/token" # noqa: S105 - Test credential settings.device_url = "https://test.auth/device" diff --git a/tests/aignostics/client/applications_test.py b/tests/aignostics/client/resources/applications_test.py similarity index 57% rename from tests/aignostics/client/applications_test.py rename to tests/aignostics/client/resources/applications_test.py index 9242a6e2..0dcd8541 100644 --- a/tests/aignostics/client/applications_test.py +++ b/tests/aignostics/client/resources/applications_test.py @@ -4,7 +4,7 @@ verifying their functionality for listing applications and application versions. """ -from unittest.mock import Mock +from unittest.mock import Mock, call import pytest from aignx.codegen.api.externals_api import ExternalsApi @@ -12,6 +12,7 @@ from aignx.codegen.models.application_read_response import ApplicationReadResponse from aignostics.client.resources.applications import Applications, Versions +from aignostics.client.resources.utils import PAGE_SIZE API_ERROR = "API error" @@ -39,9 +40,71 @@ def applications(mock_api) -> Applications: return Applications(mock_api) +def test_applications_list_with_pagination(applications, mock_api) -> None: + """Test that Applications.list() correctly handles pagination. + + This test verifies that the list method properly aggregates results + from multiple paginated API responses. + + Args: + applications: Applications instance with mock API. + mock_api: Mock ExternalsApi instance. + """ + # Arrange + # Create two pages of results + page1 = [Mock(spec=ApplicationReadResponse) for _ in range(PAGE_SIZE)] + page2 = [Mock(spec=ApplicationReadResponse) for _ in range(5)] # Partial page + mock_api.list_applications_v1_applications_get.side_effect = [page1, page2] + + # Act + result = list(applications.list()) + + # Assert + assert len(result) == PAGE_SIZE + 5 + assert mock_api.list_applications_v1_applications_get.call_count == 2 + mock_api.list_applications_v1_applications_get.assert_has_calls([ + call(page=1, page_size=PAGE_SIZE), + call(page=2, page_size=PAGE_SIZE), + ]) + + +def test_versions_list_with_pagination(mock_api) -> None: + """Test that Versions.list() correctly handles pagination. + + This test verifies that the list method for application versions properly + aggregates results from multiple paginated API responses. + + Args: + mock_api: Mock ExternalsApi instance. + """ + # Arrange + versions = Versions(mock_api) + mock_app = Mock(spec=ApplicationReadResponse) + mock_app.application_id = "test-app-id" + + # Create two pages of results + page1 = [Mock(spec=ApplicationVersionReadResponse) for _ in range(PAGE_SIZE)] + page2 = [Mock(spec=ApplicationVersionReadResponse) for _ in range(5)] # Partial page + + mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.side_effect = [page1, page2] + + # Act + result = list(versions.list(for_application=mock_app)) + + # Assert + assert len(result) == PAGE_SIZE + 5 + assert mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.call_count == 2 + mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.assert_has_calls([ + call(application_id=mock_app.application_id, page=1, page_size=PAGE_SIZE), + call(application_id=mock_app.application_id, page=2, page_size=PAGE_SIZE), + ]) + + def test_applications_list_returns_empty_list_when_no_applications(applications, mock_api) -> None: """Test that Applications.list() returns an empty list when no applications are available. + This test verifies that the list method handles empty API responses correctly. + Args: applications: Applications instance with mock API. mock_api: Mock ExternalsApi instance. @@ -50,17 +113,19 @@ def test_applications_list_returns_empty_list_when_no_applications(applications, mock_api.list_applications_v1_applications_get.return_value = [] # Act - result = applications.list() + result = list(applications.list()) # Assert - assert isinstance(result, list) assert len(result) == 0 - mock_api.list_applications_v1_applications_get.assert_called_once() + mock_api.list_applications_v1_applications_get.assert_called_once_with(page=1, page_size=PAGE_SIZE) def test_applications_list_returns_applications_when_available(applications, mock_api) -> None: """Test that Applications.list() returns a list of applications when available. + This test verifies that the list method correctly returns application objects + from the API response. + Args: applications: Applications instance with mock API. mock_api: Mock ExternalsApi instance. @@ -71,19 +136,21 @@ def test_applications_list_returns_applications_when_available(applications, moc mock_api.list_applications_v1_applications_get.return_value = [mock_app1, mock_app2] # Act - result = applications.list() + result = list(applications.list()) # Assert - assert isinstance(result, list) assert len(result) == 2 assert result[0] == mock_app1 assert result[1] == mock_app2 - mock_api.list_applications_v1_applications_get.assert_called_once() + mock_api.list_applications_v1_applications_get.assert_called_once_with(page=1, page_size=PAGE_SIZE) def test_applications_list_passes_through_api_exception(applications, mock_api) -> None: """Test that Applications.list() passes through exceptions from the API. + This test verifies that exceptions raised by the API client are propagated + to the caller without being caught or modified. + Args: applications: Applications instance with mock API. mock_api: Mock ExternalsApi instance. @@ -93,13 +160,16 @@ def test_applications_list_passes_through_api_exception(applications, mock_api) # Act & Assert with pytest.raises(Exception, match=API_ERROR): - applications.list() - mock_api.list_applications_v1_applications_get.assert_called_once() + list(applications.list()) + mock_api.list_applications_v1_applications_get.assert_called_once_with(page=1, page_size=PAGE_SIZE) def test_versions_property_returns_versions_instance(applications) -> None: """Test that the versions property returns a Versions instance. + This test verifies that the versions property correctly initializes + and returns a Versions instance with the same API client. + Args: applications: Applications instance with mock API. """ @@ -114,6 +184,9 @@ def test_versions_property_returns_versions_instance(applications) -> None: def test_versions_list_returns_versions_for_application(mock_api) -> None: """Test that Versions.list() returns versions for a specified application. + This test verifies that the list method correctly returns version objects + for a given application from the API response. + Args: mock_api: Mock ExternalsApi instance. """ @@ -125,20 +198,22 @@ def test_versions_list_returns_versions_for_application(mock_api) -> None: mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.return_value = [mock_version] # Act - result = versions.list(for_application=mock_app) + result = list(versions.list(for_application=mock_app)) # Assert - assert isinstance(result, list) assert len(result) == 1 assert result[0] == mock_version mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.assert_called_once_with( - application_id=mock_app.application_id + application_id=mock_app.application_id, page=1, page_size=PAGE_SIZE ) def test_versions_list_returns_empty_list_when_no_versions(mock_api) -> None: """Test that Versions.list() returns an empty list when no versions are available. + This test verifies that the list method handles empty API responses correctly + when requesting application versions. + Args: mock_api: Mock ExternalsApi instance. """ @@ -149,19 +224,21 @@ def test_versions_list_returns_empty_list_when_no_versions(mock_api) -> None: mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.return_value = [] # Act - result = versions.list(for_application=mock_app) + result = list(versions.list(for_application=mock_app)) # Assert - assert isinstance(result, list) assert len(result) == 0 mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.assert_called_once_with( - application_id=mock_app.application_id + application_id=mock_app.application_id, page=1, page_size=PAGE_SIZE ) def test_versions_list_passes_through_api_exception(mock_api) -> None: """Test that Versions.list() passes through exceptions from the API. + This test verifies that exceptions raised by the API client when requesting + application versions are propagated to the caller without being caught or modified. + Args: mock_api: Mock ExternalsApi instance. """ @@ -175,4 +252,4 @@ def test_versions_list_passes_through_api_exception(mock_api) -> None: # Act & Assert with pytest.raises(Exception, match=API_ERROR): - versions.list(for_application=mock_app) + list(versions.list(for_application=mock_app)) diff --git a/tests/aignostics/client/resources/resource_utils_test.py b/tests/aignostics/client/resources/resource_utils_test.py new file mode 100644 index 00000000..a509bcc3 --- /dev/null +++ b/tests/aignostics/client/resources/resource_utils_test.py @@ -0,0 +1,99 @@ +"""Tests for the utility functions used in the client resources modules. + +This module contains unit tests for the utility functions, particularly focusing +on pagination functionality that is used across resource modules. +""" + +from unittest.mock import Mock + +from aignostics.client.resources.utils import PAGE_SIZE, paginate + + +def test_paginate_stops_when_results_less_than_page_size() -> None: + """Test that paginate stops yielding when a page has fewer items than the page size. + + This test verifies that the paginate function correctly stops requesting new pages + when a response contains fewer items than the page size, indicating it's the last page. + """ + # Arrange + mock_func = Mock() + # First call returns full page, second call returns partial page + mock_func.side_effect = [ + [f"item_{i}" for i in range(PAGE_SIZE)], # Full page + [f"item_{i + PAGE_SIZE}" for i in range(5)], # Partial page (5 items) + ] + + # Act + results = list(paginate(mock_func)) + + # Assert + assert len(results) == PAGE_SIZE + 5 + assert mock_func.call_count == 2 + # Check first call + mock_func.assert_any_call(page=1, page_size=PAGE_SIZE) + # Check second call + mock_func.assert_any_call(page=2, page_size=PAGE_SIZE) + + +def test_paginate_handles_empty_first_page() -> None: + """Test that paginate handles an empty first page correctly. + + This test verifies that the paginate function correctly handles the case where + the first page of results is empty, and doesn't make additional API requests. + """ + # Arrange + mock_func = Mock(return_value=[]) + + # Act + results = list(paginate(mock_func)) + + # Assert + assert len(results) == 0 + mock_func.assert_called_once_with(page=1, page_size=PAGE_SIZE) + + +def test_paginate_passes_additional_arguments() -> None: + """Test that paginate correctly passes additional arguments to the function. + + This test verifies that the paginate function correctly forwards both positional + and keyword arguments to the paginated function. + """ + # Arrange + mock_func = Mock(return_value=[]) + additional_arg = "test" + additional_kwarg = {"key": "value"} + + # Act + list(paginate(mock_func, additional_arg, keyword=additional_kwarg)) + + # Assert + mock_func.assert_called_once_with(additional_arg, keyword=additional_kwarg, page=1, page_size=PAGE_SIZE) + + +def test_paginate_multiple_pages() -> None: + """Test that paginate correctly iterates through multiple pages. + + This test verifies that the paginate function correctly requests and yields + items from multiple pages in sequence, until reaching a page with fewer items + than the page size. + """ + # Arrange + mock_func = Mock() + # Three pages of results, each with PAGE_SIZE items + mock_func.side_effect = [ + [f"page1_item_{i}" for i in range(PAGE_SIZE)], + [f"page2_item_{i}" for i in range(PAGE_SIZE)], + [f"page3_item_{i}" for i in range(5)], # Last page with fewer items + ] + + # Act + results = list(paginate(mock_func)) + + # Assert + assert len(results) == 2 * PAGE_SIZE + 5 + assert mock_func.call_count == 3 + + # Verify items are yielded in correct order + assert results[0] == "page1_item_0" + assert results[PAGE_SIZE] == "page2_item_0" + assert results[2 * PAGE_SIZE] == "page3_item_0" diff --git a/tests/aignostics/client/resources/runs_test.py b/tests/aignostics/client/resources/runs_test.py new file mode 100644 index 00000000..f703c691 --- /dev/null +++ b/tests/aignostics/client/resources/runs_test.py @@ -0,0 +1,174 @@ +"""Tests for the runs resource module. + +This module contains unit tests for the Runs class and ApplicationRun class, +verifying their functionality for listing, creating, and managing application runs. +""" + +from unittest.mock import Mock, call + +import pytest +from aignx.codegen.api.externals_api import ExternalsApi +from aignx.codegen.models import ItemResultReadResponse, RunCreationResponse, RunReadResponse + +from aignostics.client.resources.runs import ApplicationRun, Runs +from aignostics.client.resources.utils import PAGE_SIZE + + +@pytest.fixture +def mock_api() -> Mock: + """Create a mock ExternalsApi object for testing. + + Returns: + Mock: A mock instance of ExternalsApi. + """ + return Mock(spec=ExternalsApi) + + +@pytest.fixture +def runs(mock_api) -> Runs: + """Create a Runs instance with a mock API for testing. + + Args: + mock_api: A mock instance of ExternalsApi. + + Returns: + Runs: A Runs instance using the mock API. + """ + return Runs(mock_api) + + +@pytest.fixture +def app_run(mock_api) -> ApplicationRun: + """Create an ApplicationRun instance with a mock API for testing. + + Args: + mock_api: A mock instance of ExternalsApi. + + Returns: + ApplicationRun: An ApplicationRun instance using the mock API. + """ + return ApplicationRun(mock_api, "test-run-id") + + +def test_runs_list_with_pagination(runs, mock_api) -> None: + """Test that Runs.list() correctly handles pagination. + + This test verifies that the list method properly aggregates results from + multiple paginated API responses and converts them to ApplicationRun instances. + + Args: + runs: Runs instance with mock API. + mock_api: Mock ExternalsApi instance. + """ + # Arrange + page1 = [Mock(spec=RunReadResponse, application_run_id=f"run-{i}") for i in range(PAGE_SIZE)] + page2 = [Mock(spec=RunReadResponse, application_run_id=f"run-{i + PAGE_SIZE}") for i in range(5)] + mock_api.list_application_runs_v1_runs_get.side_effect = [page1, page2] + + # Act + result = list(runs.list()) + + # Assert + assert len(result) == PAGE_SIZE + 5 + assert all(isinstance(run, ApplicationRun) for run in result) + assert mock_api.list_application_runs_v1_runs_get.call_count == 2 + mock_api.list_application_runs_v1_runs_get.assert_has_calls([ + call(page=1, page_size=PAGE_SIZE), + call(page=2, page_size=PAGE_SIZE), + ]) + + +def test_runs_list_with_application_version_filter(runs, mock_api) -> None: + """Test that Runs.list() correctly filters by application version. + + This test verifies that the application version filter parameter is + correctly passed to the API client. + + Args: + runs: Runs instance with mock API. + mock_api: Mock ExternalsApi instance. + """ + # Arrange + app_version_id = "test-app-version" + mock_api.list_application_runs_v1_runs_get.return_value = [] + + # Act + list(runs.list(for_application_version=app_version_id)) + + # Assert + mock_api.list_application_runs_v1_runs_get.assert_called_once_with( + application_version_id=app_version_id, page=1, page_size=PAGE_SIZE + ) + + +def test_application_run_results_with_pagination(app_run, mock_api) -> None: + """Test that ApplicationRun.results() correctly handles pagination. + + This test verifies that the results method properly aggregates results + from multiple paginated API responses when requesting run results. + + Args: + app_run: ApplicationRun instance with mock API. + mock_api: Mock ExternalsApi instance. + """ + # Arrange + page1 = [Mock(spec=ItemResultReadResponse) for _ in range(PAGE_SIZE)] + page2 = [Mock(spec=ItemResultReadResponse) for _ in range(5)] + mock_api.list_run_results_v1_runs_application_run_id_results_get.side_effect = [page1, page2] + + # Act + result = list(app_run.results()) + + # Assert + assert len(result) == PAGE_SIZE + 5 + assert mock_api.list_run_results_v1_runs_application_run_id_results_get.call_count == 2 + mock_api.list_run_results_v1_runs_application_run_id_results_get.assert_has_calls([ + call(application_run_id=app_run.application_run_id, page=1, page_size=PAGE_SIZE), + call(application_run_id=app_run.application_run_id, page=2, page_size=PAGE_SIZE), + ]) + + +def test_runs_call_returns_application_run(runs) -> None: + """Test that Runs.__call__() returns an ApplicationRun instance. + + This test verifies that calling the Runs instance as a function correctly + initializes and returns an ApplicationRun instance with the specified run ID. + + Args: + runs: Runs instance with mock API. + """ + # Act + run_id = "test-run-id" + app_run = runs(run_id) + + # Assert + assert isinstance(app_run, ApplicationRun) + assert app_run.application_run_id == run_id + assert app_run._api == runs._api + + +def test_runs_create_returns_application_run(runs, mock_api) -> None: + """Test that Runs.create() returns an ApplicationRun instance. + + This test verifies that the create method correctly calls the API client + to create a new run and returns an ApplicationRun instance for the created run. + + Args: + runs: Runs instance with mock API. + mock_api: Mock ExternalsApi instance. + """ + # Arrange + run_id = "new-run-id" + mock_payload = Mock() + mock_api.create_application_run_v1_runs_post.return_value = RunCreationResponse(application_run_id=run_id) + + # Mock the validation method to prevent it from making actual API calls + runs._validate_input_items = Mock() + + # Act + app_run = runs.create(mock_payload) + + # Assert + assert isinstance(app_run, ApplicationRun) + assert app_run.application_run_id == run_id + mock_api.create_application_run_v1_runs_post.assert_called_once_with(mock_payload) diff --git a/tests/aignostics/client/utils_test.py b/tests/aignostics/client/utils_test.py index a0456d6e..327db71b 100644 --- a/tests/aignostics/client/utils_test.py +++ b/tests/aignostics/client/utils_test.py @@ -10,36 +10,64 @@ class TestMimeTypeToFileEnding: @staticmethod def test_png_mime_type() -> None: - """Test that image/png MIME type returns .png extension.""" + """Test that image/png MIME type returns .png extension. + + This test verifies that the mime_type_to_file_ending function correctly + maps the image/png MIME type to the .png file extension. + """ assert mime_type_to_file_ending("image/png") == ".png" @staticmethod def test_tiff_mime_type() -> None: - """Test that image/tiff MIME type returns .tiff extension.""" + """Test that image/tiff MIME type returns .tiff extension. + + This test verifies that the mime_type_to_file_ending function correctly + maps the image/tiff MIME type to the .tiff file extension. + """ assert mime_type_to_file_ending("image/tiff") == ".tiff" @staticmethod def test_parquet_mime_type() -> None: - """Test that application/vnd.apache.parquet MIME type returns .parquet extension.""" + """Test that application/vnd.apache.parquet MIME type returns .parquet extension. + + This test verifies that the mime_type_to_file_ending function correctly + maps the application/vnd.apache.parquet MIME type to the .parquet file extension. + """ assert mime_type_to_file_ending("application/vnd.apache.parquet") == ".parquet" @staticmethod def test_json_mime_type() -> None: - """Test that application/json MIME type returns .json extension.""" + """Test that application/json MIME type returns .json extension. + + This test verifies that the mime_type_to_file_ending function correctly + maps the application/json MIME type to the .json file extension. + """ assert mime_type_to_file_ending("application/json") == ".json" @staticmethod def test_geojson_mime_type() -> None: - """Test that application/geo+json MIME type returns .json extension.""" + """Test that application/geo+json MIME type returns .json extension. + + This test verifies that the mime_type_to_file_ending function correctly + maps the application/geo+json MIME type to the .json file extension. + """ assert mime_type_to_file_ending("application/geo+json") == ".json" @staticmethod def test_csv_mime_type() -> None: - """Test that text/csv MIME type returns .csv extension.""" + """Test that text/csv MIME type returns .csv extension. + + This test verifies that the mime_type_to_file_ending function correctly + maps the text/csv MIME type to the .csv file extension. + """ assert mime_type_to_file_ending("text/csv") == ".csv" @staticmethod def test_unknown_mime_type_raises_error() -> None: - """Test that an unknown MIME type raises a ValueError.""" + """Test that an unknown MIME type raises a ValueError. + + This test verifies that the mime_type_to_file_ending function correctly + raises a ValueError when given an unrecognized MIME type. + """ with pytest.raises(ValueError, match="Unknown mime type: application/unknown"): mime_type_to_file_ending("application/unknown") From e646ee8dbcae4d49fc036dddadcd0fcfff8785ab Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Sun, 13 Apr 2025 23:01:43 +0200 Subject: [PATCH 095/110] chore: Extend library documentation --- API_REFERENCE_v1.md | 4025 ++++++++++++++++++--------- README.md | 59 +- docs/partials/README_main.md | 59 +- docs/source/_static/openapi_v1.yaml | 22 +- 4 files changed, 2841 insertions(+), 1324 deletions(-) diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md index 93520550..42cc5470 100644 --- a/API_REFERENCE_v1.md +++ b/API_REFERENCE_v1.md @@ -1,1304 +1,2723 @@ # API v1 Reference ---- -title: - url: '' -language_tabs: -toc_footers: [] -includes: [] -search: true -highlight_theme: darkula ---- - - - - - - - - - - - - - Aignostics H&E TME application - title: Description - type: string - name: - examples: - - HETA - title: Name - type: string - regulatory_classes: - examples: - - - RuO - items: - type: string - title: Regulatory Classes - type: array - slug: - examples: - - heta - title: Slug - type: string - required: - - application_id - - name - - slug - - regulatory_classes - - description - title: ApplicationReadResponse - type: object - ApplicationRunStatus: - enum: - - canceled_system - - canceled_user - - completed - - completed_with_error - - received - - rejected - - running - - scheduled - title: ApplicationRunStatus - type: string - ApplicationVersionReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - application_version_slug: - examples: - - tissue-segmentation-qc:v0.0.1 - pattern: ^(?:|-)*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ - title: Application Version Slug - type: string - changelog: - title: Changelog - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Flow Id - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactReadResponse' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactReadResponse' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - application_version_id - - application_version_slug - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - title: ApplicationVersionReadResponse - type: object - HTTPValidationError: - properties: - detail: - items: - $ref: '#/components/schemas/ValidationError' - title: Detail - type: array - title: HTTPValidationError - type: object - InputArtifact: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^{0,126}/{0,126}$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifact - type: object - InputArtifactCreationRequest: - properties: - download_url: - examples: - - https://example.com/case-no-1-slide.tiff - format: uri - maxLength: 2083 - minLength: 1 - title: Download Url - type: string - metadata: - examples: - - checksum_crc32c: 752f9554 - height: 2000 - height_mpp: 0.5 - width: 10000 - width_mpp: 0.5 - title: Metadata - type: object - name: - examples: - - slide - title: Name - type: string - required: - - name - - download_url - - metadata - title: InputArtifactCreationRequest - type: object - InputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^{0,126}/{0,126}$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactReadResponse - type: object - InputArtifactSchemaCreationRequest: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactSchemaCreationRequest - type: object - ItemCreationRequest: - properties: - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactCreationRequest' - title: Input Artifacts - type: array - reference: - examples: - - case-no-1 - title: Reference - type: string - required: - - reference - - input_artifacts - title: ItemCreationRequest - type: object - ItemResultReadResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - error: - anyOf: - - type: string - - type: 'null' - title: Error - item_id: - format: uuid - title: Item Id - type: string - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactResultReadResponse' - title: Output Artifacts - type: array - reference: - title: Reference - type: string - status: - $ref: '#/components/schemas/ItemStatus' - required: - - item_id - - application_run_id - - reference - - status - - error - - output_artifacts - title: ItemResultReadResponse - type: object - ItemStatus: - enum: - - pending - - canceled_user - - canceled_system - - error_user - - error_system - - succeeded - title: ItemStatus - type: string - OutputArtifact: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^{0,126}/{0,126}$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - visibility: - $ref: '#/components/schemas/OutputArtifactVisibility' - required: - - name - - mime_type - - metadata_schema - - scope - - visibility - title: OutputArtifact - type: object - OutputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^{0,126}/{0,126}$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - required: - - name - - mime_type - - metadata_schema - - scope - title: OutputArtifactReadResponse - type: object - OutputArtifactResultReadResponse: - properties: - download_url: - anyOf: - - format: uri - maxLength: 2083 - minLength: 1 - type: string - - type: 'null' - title: Download Url - metadata: - title: Metadata - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^{0,126}/{0,126}$ - title: Mime Type - type: string - name: - title: Name - type: string - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - name - - mime_type - - metadata - - download_url - title: OutputArtifactResultReadResponse - type: object - OutputArtifactSchemaCreationRequest: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - visibility: - $ref: '#/components/schemas/OutputArtifactVisibility' - required: - - name - - mime_type - - scope - - visibility - - metadata_schema - title: OutputArtifactSchemaCreationRequest - type: object - OutputArtifactScope: - enum: - - item - - global - title: OutputArtifactScope - type: string - OutputArtifactVisibility: - enum: - - internal - - external - title: OutputArtifactVisibility - type: string - PayloadInputArtifact: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - input_artifact_id: - format: uuid - title: Input Artifact Id - type: string - metadata: - title: Metadata - type: object - required: - - metadata - - download_url - title: PayloadInputArtifact - type: object - PayloadItem: - properties: - input_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadInputArtifact' - title: Input Artifacts - type: object - item_id: - format: uuid - title: Item Id - type: string - output_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - title: Output Artifacts - type: object - required: - - item_id - - input_artifacts - - output_artifacts - title: PayloadItem - type: object - PayloadOutputArtifact: - properties: - data: - $ref: '#/components/schemas/TransferUrls' - metadata: - $ref: '#/components/schemas/TransferUrls' - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - data - - metadata - title: PayloadOutputArtifact - type: object - RunCreationRequest: - properties: - application_version: - anyOf: - - format: uuid - type: string - - $ref: '#/components/schemas/SlugVersionRequest' - examples: - - efbf9822-a1e5-4045-a283-dbf26e8064a9 - title: Application Version - items: - items: - $ref: '#/components/schemas/ItemCreationRequest' - title: Items - type: array - required: - - application_version - - items - title: RunCreationRequest - type: object - RunCreationResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - required: - - application_run_id - title: RunCreationResponse - type: object - RunReadResponse: - properties: - application_run_id: - format: uuid - title: Application Run Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - organization_id: - title: Organization Id - type: string - status: - $ref: '#/components/schemas/ApplicationRunStatus' - triggered_at: - format: date-time - title: Triggered At - type: string - triggered_by: - title: Triggered By - type: string - user_payload: - anyOf: - - $ref: '#/components/schemas/UserPayload' - - type: 'null' - required: - - application_run_id - - application_version_id - - organization_id - - status - - triggered_at - - triggered_by - title: RunReadResponse - type: object - SlugVersionRequest: - properties: - application_slug: - pattern: ^(-?)*$ - title: Application Slug - type: string - version: - title: Version - type: string - required: - - application_slug - - version - title: SlugVersionRequest - type: object - TransferUrls: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - upload_url: - format: uri - minLength: 1 - title: Upload Url - type: string - required: - - upload_url - - download_url - title: TransferUrls - type: object - UserPayload: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_run_id: - format: uuid - title: Application Run Id - type: string - global_output_artifacts: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - type: object - - type: 'null' - title: Global Output Artifacts - items: - items: - $ref: '#/components/schemas/PayloadItem' - title: Items - type: array - required: - - application_id - - application_run_id - - global_output_artifacts - - items - title: UserPayload - type: object - ValidationError: - properties: - loc: - items: - anyOf: - - type: string - - type: integer - title: Location - type: array - msg: - title: Message - type: string - type: - title: Error Type - type: string - required: - - loc - - msg - - type - title: ValidationError - type: object - VersionCreationRequest: - properties: - application_id: - format: uuid - title: Application Id - type: string - changelog: - title: Changelog - type: string - flow_id: - format: uuid - title: Flow Id - type: string - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactSchemaCreationRequest' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactSchemaCreationRequest' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - version - - application_id - - flow_id - - changelog - - input_artifacts - - output_artifacts - title: VersionCreationRequest - type: object - VersionCreationResponse: - properties: - application_version_id: - format: uuid - title: Application Version Id - type: string - required: - - application_version_id - title: VersionCreationResponse - type: object - VersionReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - changelog: - title: Changelog - type: string - created_at: - format: date-time - title: Created At - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Flow Id - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifact' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifact' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - application_version_id - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - - created_at - title: VersionReadResponse - type: object -info: - title: PAPI API Reference - version: 1.0.0 -openapi: 3.1.0 -paths: - /v1/applications: - get: - operationId: list_applications_v1_applications_get - parameters: - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationReadResponse' - title: Response List Applications V1 Applications Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Applications - tags: - - Externals - /v1/applications/{application_id}/versions: - get: - operationId: -list_versions_by_application_id_v1_applications__application_id__versions_get - parameters: - - in: path - name: application_id - required: true - schema: - format: uuid - title: Application Id - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications -Application - Id Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Versions By Application Id - tags: - - Externals - /v1/applications/{application_slug}: - get: - operationId: -read_application_by_slug_v1_applications__application_slug__get - parameters: - - in: path - name: application_slug - required: true - schema: - title: Application Slug - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Read Application By Slug - tags: - - Externals - /v1/applications/{application_slug}/versions: - get: - operationId: -list_versions_by_application_slug_v1_applications__application_slug__versions_ge -t - parameters: - - in: path - name: application_slug - required: true - schema: - pattern: ^(-?)*$ - title: Application Slug - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 -Applications Application - Slug Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Versions By Application Slug - tags: - - Externals - /v1/runs: - get: - operationId: list_application_runs_v1_runs_get - parameters: - - in: query - name: application_id - required: false - schema: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Id - - in: query - name: application_version_id - required: false - schema: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Application Version Id - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/RunReadResponse' - title: Response List Application Runs V1 Runs Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Application Runs - tags: - - Externals - post: - operationId: create_application_run_v1_runs_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Create Application Run - tags: - - Externals - /v1/runs/{application_run_id}: - get: - operationId: get_run_v1_runs__application_run_id__get - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/RunReadResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Get Run - tags: - - Externals - /v1/runs/{application_run_id}/cancel: - post: - operationId: cancel_run_v1_runs__application_run_id__cancel_post - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - responses: - '202': - content: - application/json: - schema: {} - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Cancel Run - tags: - - Externals - /v1/runs/{application_run_id}/results: - delete: - operationId: -delete_run_results_v1_runs__application_run_id__results_delete - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - responses: - '204': - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Delete Run Results - tags: - - Externals - get: - operationId: list_run_results_v1_runs__application_run_id__results_get - parameters: - - in: path - name: application_run_id - required: true - schema: - format: uuid - title: Application Run Id - type: string - - in: query - name: item_id__in - required: false - schema: - anyOf: - - items: - format: uuid - type: string - type: array - - type: 'null' - title: Item Id In - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: reference__in - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Reference In - - in: query - name: status__in - required: false - schema: - anyOf: - - items: - $ref: '#/components/schemas/ItemStatus' - type: array - - type: 'null' - title: Status In - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id -Results - Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Run Results - tags: - - Externals - /v1/versions: - post: - operationId: register_version_v1_versions_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Register Version - tags: - - Externals - /v1/versions/{application_version_id}: - get: - operationId: get_version_v1_versions__application_version_id__get - parameters: - - in: path - name: application_version_id - required: true - schema: - format: uuid - title: Application Version Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/VersionReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Get Version - tags: - - Externals -servers: -- url: '' - -> components: - -> schemas: - -> ApplicationReadResponse: - -> properties: - -> application_id: - -> format: uuid - -> title: Application Id - -> type: string - -> description: - -> examples: +## PAPI API Reference v1.0.0 + +> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. + +Base URLs: + +* + +## Externals + +### list_applications_v1_applications_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/applications', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/applications', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications` + +*List Applications* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Applications V1 Applications Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Applications V1 Applications Get|[[ApplicationReadResponse](#schemaapplicationreadresponse)]|false|none|none| +|» ApplicationReadResponse|[ApplicationReadResponse](#schemaapplicationreadresponse)|false|none|none| +|»» application_id|string(uuid)|true|none|none| +|»» description|string|true|none|none| +|»» name|string|true|none|none| +|»» regulatory_classes|[string]|true|none|none| +|»» slug|string|true|none|none| + + +This operation does not require authentication + + +### list_versions_by_application_id_v1_applications__application_id__versions_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/applications/{application_id}/versions', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/applications/{application_id}/versions', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_id}/versions` + +*List Versions By Application Id* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|path|string(uuid)|true|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|version|query|any|false|none| +|include|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Versions By Application Id V1 Applications Application Id Versions Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| +|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| +|»» application_id|string(uuid)|true|none|none| +|»» application_version_id|string(uuid)|true|none|none| +|»» application_version_slug|string|true|none|none| +|»» changelog|string|true|none|none| +|»» flow_id|any|false|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string(uuid)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|»» version|string|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|scope|item| +|scope|global| + + +This operation does not require authentication + + +### read_application_by_slug_v1_applications__application_slug__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/applications/{application_slug}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/applications/{application_slug}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_slug}` + +*Read Application By Slug* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_slug|path|string|true|none| + +> Example responses + +> 200 Response + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[ApplicationReadResponse](#schemaapplicationreadresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### list_versions_by_application_slug_v1_applications__application_slug__versions_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/applications/{application_slug}/versions', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/applications/{application_slug}/versions', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_slug}/versions` + +*List Versions By Application Slug* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_slug|path|string|true|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|version|query|any|false|none| +|include|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Versions By Application Slug V1 Applications Application Slug Versions Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Versions By Application Slug V1 Applications Application Slug Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| +|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| +|»» application_id|string(uuid)|true|none|none| +|»» application_version_id|string(uuid)|true|none|none| +|»» application_version_slug|string|true|none|none| +|»» changelog|string|true|none|none| +|»» flow_id|any|false|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string(uuid)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|»» version|string|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|scope|item| +|scope|global| + + +This operation does not require authentication + + +### list_application_runs_v1_runs_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/runs', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs` + +*List Application Runs* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|query|any|false|none| +|application_version_id|query|any|false|none| +|include|query|any|false|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Application Runs V1 Runs Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Application Runs V1 Runs Get|[[RunReadResponse](#schemarunreadresponse)]|false|none|none| +|» RunReadResponse|[RunReadResponse](#schemarunreadresponse)|false|none|none| +|»» application_run_id|string(uuid)|true|none|none| +|»» application_version_id|string(uuid)|true|none|none| +|»» organization_id|string|true|none|none| +|»» status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| +|»» triggered_at|string(date-time)|true|none|none| +|»» triggered_by|string|true|none|none| +|»» user_payload|any|false|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| +|»»»» application_id|string(uuid)|true|none|none| +|»»»» application_run_id|string(uuid)|true|none|none| +|»»»» global_output_artifacts|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|object|false|none|none| +|»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| +|»»»»»»» data|[TransferUrls](#schematransferurls)|true|none|none| +|»»»»»»»» download_url|string(uri)|true|none|none| +|»»»»»»»» upload_url|string(uri)|true|none|none| +|»»»»»»» metadata|[TransferUrls](#schematransferurls)|true|none|none| +|»»»»»»» output_artifact_id|string(uuid)|true|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»» items|[[PayloadItem](#schemapayloaditem)]|true|none|none| +|»»»»» PayloadItem|[PayloadItem](#schemapayloaditem)|false|none|none| +|»»»»»» input_artifacts|object|true|none|none| +|»»»»»»» PayloadInputArtifact|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| +|»»»»»»»» download_url|string(uri)|true|none|none| +|»»»»»»»» input_artifact_id|string(uuid)|false|none|none| +|»»»»»»»» metadata|object|true|none|none| +|»»»»»» item_id|string(uuid)|true|none|none| +|»»»»»» output_artifacts|object|true|none|none| +|»»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|status|canceled_system| +|status|canceled_user| +|status|completed| +|status|completed_with_error| +|status|received| +|status|rejected| +|status|running| +|status|scheduled| + + +This operation does not require authentication + + +### create_application_run_v1_runs_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json' +} + +r = requests.post('/v1/runs', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json' +}; + +fetch('/v1/runs', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/runs` + +*Create Application Run* + +> Body parameter + +```json +{ + "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[RunCreationRequest](#schemaruncreationrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[RunCreationResponse](#schemaruncreationresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### get_run_v1_runs__application_run_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/runs/{application_run_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs/{application_run_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs/{application_run_id}` + +*Get Run* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| +|include|query|any|false|none| + +> Example responses + +> 200 Response + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[RunReadResponse](#schemarunreadresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### cancel_run_v1_runs__application_run_id__cancel_post + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.post('/v1/runs/{application_run_id}/cancel', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs/{application_run_id}/cancel', +{ + method: 'POST', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/runs/{application_run_id}/cancel` + +*Cancel Run* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| + +> Example responses + +> 202 Response + +```json +null +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + + +This operation does not require authentication + + +### delete_run_results_v1_runs__application_run_id__results_delete + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.delete('/v1/runs/{application_run_id}/results', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs/{application_run_id}/results', +{ + method: 'DELETE', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`DELETE /v1/runs/{application_run_id}/results` + +*Delete Run Results* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| + +> Example responses + +> 422 Response + +```json +{ + "detail": [ + { + "loc": [ + "string" + ], + "msg": "string", + "type": "string" + } + ] +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|Successful Response|None| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### list_run_results_v1_runs__application_run_id__results_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/runs/{application_run_id}/results', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/runs/{application_run_id}/results', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs/{application_run_id}/results` + +*List Run Results* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|none| +|item_id__in|query|any|false|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|reference__in|query|any|false|none| +|status__in|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": [ + { + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + ], + "reference": "string", + "status": "pending" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Run Results V1 Runs Application Run Id Results Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Run Results V1 Runs Application Run Id Results Get|[[ItemResultReadResponse](#schemaitemresultreadresponse)]|false|none|none| +|» ItemResultReadResponse|[ItemResultReadResponse](#schemaitemresultreadresponse)|false|none|none| +|»» application_run_id|string(uuid)|true|none|none| +|»» error|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» item_id|string(uuid)|true|none|none| +|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| +|»»» OutputArtifactResultReadResponse|[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)|false|none|none| +|»»»» download_url|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|string(uri)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»» metadata|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» output_artifact_id|string(uuid)|true|none|none| +|»» reference|string|true|none|none| +|»» status|[ItemStatus](#schemaitemstatus)|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|status|pending| +|status|canceled_user| +|status|canceled_system| +|status|error_user| +|status|error_system| +|status|succeeded| + + +This operation does not require authentication + + +### register_version_v1_versions_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json' +} + +r = requests.post('/v1/versions', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json' +}; + +fetch('/v1/versions', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/versions` + +*Register Version* + +> Body parameter + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[VersionCreationRequest](#schemaversioncreationrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[VersionCreationResponse](#schemaversioncreationresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +### get_version_v1_versions__application_version_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json' +} + +r = requests.get('/v1/versions/{application_version_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json' +}; + +fetch('/v1/versions/{application_version_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/versions/{application_version_id}` + +*Get Version* + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_version_id|path|string(uuid)|true|none| +|include|query|any|false|none| + +> Example responses + +> 200 Response + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "changelog": "string", + "created_at": "2019-08-24T14:15:22Z", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[VersionReadResponse](#schemaversionreadresponse)| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +This operation does not require authentication + + +## Schemas + +### ApplicationReadResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "description": "Aignostics H&E TME application", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ], + "slug": "heta" +} + +``` + +ApplicationReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|description|string|true|none|none| +|name|string|true|none|none| +|regulatory_classes|[string]|true|none|none| +|slug|string|true|none|none| + +### ApplicationRunStatus + + + + + + +```json +"canceled_system" + +``` + +ApplicationRunStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ApplicationRunStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ApplicationRunStatus|canceled_system| +|ApplicationRunStatus|canceled_user| +|ApplicationRunStatus|completed| +|ApplicationRunStatus|completed_with_error| +|ApplicationRunStatus|received| +|ApplicationRunStatus|rejected| +|ApplicationRunStatus|running| +|ApplicationRunStatus|scheduled| + +### ApplicationVersionReadResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" +} + +``` + +ApplicationVersionReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|application_version_id|string(uuid)|true|none|none| +|application_version_slug|string|true|none|none| +|changelog|string|true|none|none| +|flow_id|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|version|string|true|none|none| + +### HTTPValidationError + + + + + + +```json +{ + "detail": [ + { + "loc": [ + "string" + ], + "msg": "string", + "type": "string" + } + ] +} + +``` + +HTTPValidationError + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|detail|[[ValidationError](#schemavalidationerror)]|false|none|none| + +### InputArtifact + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" +} + +``` + +InputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### InputArtifactCreationRequest + + + + + + +```json +{ + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" +} + +``` + +InputArtifactCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|metadata|object|true|none|none| +|name|string|true|none|none| + +### InputArtifactReadResponse + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" +} + +``` + +InputArtifactReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### InputArtifactSchemaCreationRequest + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" +} + +``` + +InputArtifactSchemaCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### ItemCreationRequest + + + + + + +```json +{ + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" +} + +``` + +ItemCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|none| +|reference|string|true|none|none| + +### ItemResultReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": [ + { + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + ], + "reference": "string", + "status": "pending" +} + +``` + +ItemResultReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|none| +|error|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|item_id|string(uuid)|true|none|none| +|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| +|reference|string|true|none|none| +|status|[ItemStatus](#schemaitemstatus)|true|none|none| + +### ItemStatus + + + + + + +```json +"pending" + +``` + +ItemStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ItemStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ItemStatus|pending| +|ItemStatus|canceled_user| +|ItemStatus|canceled_system| +|ItemStatus|error_user| +|ItemStatus|error_system| +|ItemStatus|succeeded| + +### OutputArtifact + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" +} + +``` + +OutputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| + +### OutputArtifactReadResponse + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" +} + +``` + +OutputArtifactReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| + +### OutputArtifactResultReadResponse + + + + + + +```json +{ + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" +} + +``` + +OutputArtifactResultReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uri)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|output_artifact_id|string(uuid)|true|none|none| + +### OutputArtifactSchemaCreationRequest + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" +} + +``` + +OutputArtifactSchemaCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| + +### OutputArtifactScope + + + + + + +```json +"item" + +``` + +OutputArtifactScope + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|OutputArtifactScope|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|OutputArtifactScope|item| +|OutputArtifactScope|global| + +### OutputArtifactVisibility + + + + + + +```json +"internal" + +``` + +OutputArtifactVisibility + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|OutputArtifactVisibility|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|OutputArtifactVisibility|internal| +|OutputArtifactVisibility|external| + +### PayloadInputArtifact + + + + + + +```json +{ + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} +} + +``` + +PayloadInputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|input_artifact_id|string(uuid)|false|none|none| +|metadata|object|true|none|none| + +### PayloadItem + + + + + + +```json +{ + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } +} + +``` + +PayloadItem + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|object|true|none|none| +|» **additionalProperties**|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| +|item_id|string(uuid)|true|none|none| +|output_artifacts|object|true|none|none| +|» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +### PayloadOutputArtifact + + + + + + +```json +{ + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" +} + +``` + +PayloadOutputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|data|[TransferUrls](#schematransferurls)|true|none|none| +|metadata|[TransferUrls](#schematransferurls)|true|none|none| +|output_artifact_id|string(uuid)|true|none|none| + +### RunCreationRequest + + + + + + +```json +{ + "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +} + +``` + +RunCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_version|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|[SlugVersionRequest](#schemaslugversionrequest)|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|none| + +### RunCreationResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" +} + +``` + +RunCreationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|none| + +### RunReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } +} + +``` + +RunReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|none| +|application_version_id|string(uuid)|true|none|none| +|organization_id|string|true|none|none| +|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| +|triggered_at|string(date-time)|true|none|none| +|triggered_by|string|true|none|none| +|user_payload|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +### SlugVersionRequest + + + + + + +```json +{ + "application_slug": "string", + "version": "string" +} + +``` + +SlugVersionRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_slug|string|true|none|none| +|version|string|true|none|none| + +### TransferUrls + + + + + + +```json +{ + "download_url": "http://example.com", + "upload_url": "http://example.com" +} + +``` + +TransferUrls + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|upload_url|string(uri)|true|none|none| + +### UserPayload + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] +} + +``` + +UserPayload + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|application_run_id|string(uuid)|true|none|none| +|global_output_artifacts|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|object|false|none|none| +|»» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|items|[[PayloadItem](#schemapayloaditem)]|true|none|none| + +### ValidationError + + + + + + +```json +{ + "loc": [ + "string" + ], + "msg": "string", + "type": "string" +} + +``` + +ValidationError + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|loc|[anyOf]|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|integer|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|msg|string|true|none|none| +|type|string|true|none|none| + +### VersionCreationRequest + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} + +``` + +VersionCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|changelog|string|true|none|none| +|flow_id|string(uuid)|true|none|none| +|input_artifacts|[[InputArtifactSchemaCreationRequest](#schemainputartifactschemacreationrequest)]|true|none|none| +|output_artifacts|[[OutputArtifactSchemaCreationRequest](#schemaoutputartifactschemacreationrequest)]|true|none|none| +|version|string|true|none|none| + +### VersionCreationResponse + + + + + + +```json +{ + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" +} + +``` + +VersionCreationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_version_id|string(uuid)|true|none|none| + +### VersionReadResponse + + + + + + +```json +{ + "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "changelog": "string", + "created_at": "2019-08-24T14:15:22Z", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item", + "visibility": "internal" + } + ], + "version": "string" +} + +``` + +VersionReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string(uuid)|true|none|none| +|application_version_id|string(uuid)|true|none|none| +|changelog|string|true|none|none| +|created_at|string(date-time)|true|none|none| +|flow_id|any|false|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifact](#schemainputartifact)]|true|none|none| +|output_artifacts|[[OutputArtifact](#schemaoutputartifact)]|true|none|none| +|version|string|true|none|none| diff --git a/README.md b/README.md index e861a061..02ec54b3 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,8 @@ --- +from aignx.codegen.models import ItemCreationRequestfrom aignx.codegen.models import ItemCreationRequestfrom aignx.codegen.models import RunCreationRequest + ## Introduction The aignostics Python SDK opens multiple pathways to interact with the @@ -138,12 +140,12 @@ Adding Aignostics Python SDK to your codebase as a dependency is easy. You can directly import add the dependency via your favourite package manager, e.g., [pip](https://pip.pypa.io/en/stable/) or [uv](https://docs.astral.sh/uv/). -**Install via uv** -- If you don't have uv installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). +**Install with uv** -- If you don't have uv installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). ```shell uv add aignostics # add SDK as dependency to your project ``` -**Install via pip** +**Install with pip** ```shell pip install aignostics # add SDK as dependency to your project ``` @@ -180,7 +182,58 @@ application_run = client.runs.create( application_run.download_to_folder("path/to/download/folder") ``` -### Run with Docker +### Authentication Setup +The SDK uses the [OAuth2](https://oauth.net/2/) protocol for authentication. +Please visit [your personal dashboard on the aignostics platform](https://platform.aignostics.com) and scroll to the "Python SDK" section +to find your personalized setup instructions. + +### Application Run Payloads + +The payload expected to trigger an application run is specified by the `RunCreationRequest` pydantic model: +```python +RunCreationRequest( + application_version=..., + items=[ + ItemCreationRequest(...), + ItemCreationRequest(...) + ] +) +``` +Next to the application version of the application you want to run, +it defines the items you want to be processed as `ItemCreationRequest` objects: +```python +ItemCreationRequest( + reference="1", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", # defined by the application version input_artifact schema + download_url="", + metadata={ # defined by the application version input_artifact schema + "checksum_crc32c": "N+LWCg==", + "base_mpp": 0.46499982, + "width": 3728, + "height": 3640, + }, + ) + ], +), +``` +For each item you want to process, you need to provide a unique `reference` string. +This is used to identify the item in the results later on. +The `input_artifacts` field is a list of `InputArtifactCreationRequest` objects, which defines what data & metadata you need to provide for each item. +The required artifacts depend on the application version you want to run - in the case of test application, there is only one artifact required, which is the image to process on. +The artifact name is defined as `user_slide`. + +The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. + +#### Self-signed URLs for large files + +To make the images you want to process available to the Aignostics Platform, you need to provide a signed URL that allows the platform to download the data. +Self-signed URLs for files in google storage buckets can be generated using the `generate_signed_url` ([code](https://github.com/aignostics/python-sdk/blob/407e74f7ae89289b70efd86cbda59ec7414050d5/src/aignostics/client/utils.py#L85)). + +**We expect that you provide the [required credentials](https://cloud.google.com/docs/authentication/application-default-credentials) for the Google Storage Bucket** + +## Run with Docker We recommend to run the CLI natively on your notebook, as explained above. If required you can run the CLI as a Docker container: diff --git a/docs/partials/README_main.md b/docs/partials/README_main.md index 6b8df502..6872c866 100644 --- a/docs/partials/README_main.md +++ b/docs/partials/README_main.md @@ -1,3 +1,5 @@ +from aignx.codegen.models import ItemCreationRequestfrom aignx.codegen.models import ItemCreationRequestfrom aignx.codegen.models import RunCreationRequest + ## Introduction The aignostics Python SDK opens multiple pathways to interact with the @@ -93,12 +95,12 @@ Adding Aignostics Python SDK to your codebase as a dependency is easy. You can directly import add the dependency via your favourite package manager, e.g., [pip](https://pip.pypa.io/en/stable/) or [uv](https://docs.astral.sh/uv/). -**Install via uv** -- If you don't have uv installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). +**Install with uv** -- If you don't have uv installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). ```shell uv add aignostics # add SDK as dependency to your project ``` -**Install via pip** +**Install with pip** ```shell pip install aignostics # add SDK as dependency to your project ``` @@ -135,7 +137,58 @@ application_run = client.runs.create( application_run.download_to_folder("path/to/download/folder") ``` -### Run with Docker +### Authentication Setup +The SDK uses the [OAuth2](https://oauth.net/2/) protocol for authentication. +Please visit [your personal dashboard on the aignostics platform](https://platform.aignostics.com) and scroll to the "Python SDK" section +to find your personalized setup instructions. + +### Application Run Payloads + +The payload expected to trigger an application run is specified by the `RunCreationRequest` pydantic model: +```python +RunCreationRequest( + application_version=..., + items=[ + ItemCreationRequest(...), + ItemCreationRequest(...) + ] +) +``` +Next to the application version of the application you want to run, +it defines the items you want to be processed as `ItemCreationRequest` objects: +```python +ItemCreationRequest( + reference="1", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", # defined by the application version input_artifact schema + download_url="", + metadata={ # defined by the application version input_artifact schema + "checksum_crc32c": "N+LWCg==", + "base_mpp": 0.46499982, + "width": 3728, + "height": 3640, + }, + ) + ], +), +``` +For each item you want to process, you need to provide a unique `reference` string. +This is used to identify the item in the results later on. +The `input_artifacts` field is a list of `InputArtifactCreationRequest` objects, which defines what data & metadata you need to provide for each item. +The required artifacts depend on the application version you want to run - in the case of test application, there is only one artifact required, which is the image to process on. +The artifact name is defined as `user_slide`. + +The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. + +#### Self-signed URLs for large files + +To make the images you want to process available to the Aignostics Platform, you need to provide a signed URL that allows the platform to download the data. +Self-signed URLs for files in google storage buckets can be generated using the `generate_signed_url` ([code](https://github.com/aignostics/python-sdk/blob/407e74f7ae89289b70efd86cbda59ec7414050d5/src/aignostics/client/utils.py#L85)). + +**We expect that you provide the [required credentials](https://cloud.google.com/docs/authentication/application-default-credentials) for the Google Storage Bucket** + +## Run with Docker We recommend to run the CLI natively on your notebook, as explained above. If required you can run the CLI as a Docker container: diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index f2fa5837..470f21a5 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -726,8 +726,7 @@ paths: - Externals /v1/applications/{application_id}/versions: get: - operationId: -list_versions_by_application_id_v1_applications__application_id__versions_get + operationId: list_versions_by_application_id_v1_applications__application_id__versions_get parameters: - in: path name: application_id @@ -790,8 +789,7 @@ list_versions_by_application_id_v1_applications__application_id__versions_get schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications -Application + title: Response List Versions By Application Id V1 Applications Application Id Versions Get type: array description: Successful Response @@ -806,8 +804,7 @@ Application - Externals /v1/applications/{application_slug}: get: - operationId: -read_application_by_slug_v1_applications__application_slug__get + operationId: read_application_by_slug_v1_applications__application_slug__get parameters: - in: path name: application_slug @@ -833,9 +830,7 @@ read_application_by_slug_v1_applications__application_slug__get - Externals /v1/applications/{application_slug}/versions: get: - operationId: -list_versions_by_application_slug_v1_applications__application_slug__versions_ge -t + operationId: list_versions_by_application_slug_v1_applications__application_slug__versions_get parameters: - in: path name: application_slug @@ -898,8 +893,7 @@ t schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 -Applications Application + title: Response List Versions By Application Slug V1 Applications Application Slug Versions Get type: array description: Successful Response @@ -1091,8 +1085,7 @@ Applications Application - Externals /v1/runs/{application_run_id}/results: delete: - operationId: -delete_run_results_v1_runs__application_run_id__results_delete + operationId: delete_run_results_v1_runs__application_run_id__results_delete parameters: - in: path name: application_run_id @@ -1190,8 +1183,7 @@ delete_run_results_v1_runs__application_run_id__results_delete schema: items: $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id -Results + title: Response List Run Results V1 Runs Application Run Id Results Get type: array description: Successful Response From bc712764fce2180855b971beba40fc6a4a51fbb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Helmut=20Hoffer=20von=20Ankershoffen=20n=C3=A9=20Oertel?= Date: Mon, 14 Apr 2025 12:58:00 +0200 Subject: [PATCH 096/110] Modularization, Settings and Info (#13) * chore(deps): update from template * chore: gcp for scheduled * merge: polish * chore(workflow): simplify GCP credentials injection * chore: env --- .copier-answers.yml | 4 +- .env.example | 28 +- .github/workflows/test-and-report.yml | 39 +- .github/workflows/test-scheduled.yml | 27 +- .gitignore | 4 +- .readthedocs.yml | 2 +- ATTRIBUTIONS.md | 5231 ++++++++++++++++- CLI_REFERENCE.md | 243 +- CONTRIBUTING.md | 29 +- Dockerfile | 19 +- Makefile | 8 +- README.md | 136 +- SERVICE_CONNECTIONS.md | 76 + codegen/out/.openapi-generator/FILES | 1 - .../out/aignx/codegen/api/externals_api.py | 3 + codegen/out/aignx/codegen/api_client.py | 1 + codegen/out/aignx/codegen/configuration.py | 1 + codegen/out/aignx/codegen/exceptions.py | 1 + .../models/application_read_response.py | 3 + .../codegen/models/application_run_status.py | 3 + .../codegen/models/application_version.py | 3 + .../application_version_read_response.py | 3 + .../codegen/models/http_validation_error.py | 3 + .../aignx/codegen/models/input_artifact.py | 3 + .../models/input_artifact_creation_request.py | 3 + .../models/input_artifact_read_response.py | 3 + .../input_artifact_schema_creation_request.py | 3 + .../codegen/models/item_creation_request.py | 3 + .../models/item_result_read_response.py | 3 + .../out/aignx/codegen/models/item_status.py | 3 + .../aignx/codegen/models/output_artifact.py | 3 + .../models/output_artifact_read_response.py | 3 + .../output_artifact_result_read_response.py | 3 + ...output_artifact_schema_creation_request.py | 3 + .../codegen/models/output_artifact_scope.py | 3 + .../models/output_artifact_visibility.py | 3 + .../codegen/models/payload_input_artifact.py | 3 + .../out/aignx/codegen/models/payload_item.py | 3 + .../codegen/models/payload_output_artifact.py | 3 + .../codegen/models/run_creation_request.py | 3 + .../codegen/models/run_creation_response.py | 3 + .../aignx/codegen/models/run_read_response.py | 3 + .../codegen/models/slug_version_request.py | 3 + .../out/aignx/codegen/models/transfer_urls.py | 3 + .../out/aignx/codegen/models/user_payload.py | 3 + .../aignx/codegen/models/validation_error.py | 3 + .../models/validation_error_loc_inner.py | 3 + .../models/version_creation_request.py | 3 + .../models/version_creation_response.py | 3 + .../codegen/models/version_read_response.py | 3 + codegen/out/aignx/codegen/rest.py | 1 + codegen/out/docs/ExternalsApi.md | 1 + compose.yaml | 24 +- docs/Makefile | 2 +- docs/make.bat | 70 +- docs/partials/README_footer.md | 28 +- docs/partials/README_header.md | 12 +- docs/partials/README_main.md | 96 +- docs/source/conf.py | 1 - docs/source/lib_reference.rst | 18 +- docs/source/release-notes.rst | 2 +- noxfile.py | 40 +- pyproject.toml | 49 +- sitecustomize.py | 5 + sonar-project.properties | 5 +- src/aignostics/__init__.py | 70 +- src/aignostics/application/__init__.py | 7 + src/aignostics/application/_cli.py | 107 + src/aignostics/cli.py | 176 +- src/aignostics/client/__init__.py | 59 +- src/aignostics/client/_authentication.py | 77 +- src/aignostics/client/_client.py | 26 +- src/aignostics/client/_constants.py | 27 + src/aignostics/client/_settings.py | 106 +- src/aignostics/client/{utils.py => _utils.py} | 0 src/aignostics/client/resources/__init__.py | 1 + src/aignostics/client/resources/runs.py | 2 +- src/aignostics/constants.py | 36 +- src/aignostics/models.py | 19 - src/aignostics/platform.py | 151 - src/aignostics/settings.py | 35 - src/aignostics/system/__init__.py | 11 + src/aignostics/system/_cli.py | 125 + .../{exceptions.py => system/_exceptions.py} | 2 +- src/aignostics/system/_service.py | 188 + src/aignostics/system/_settings.py | 31 + src/aignostics/types.py | 57 - src/aignostics/utils/__init__.py | 57 +- src/aignostics/utils/{cli.py => _cli.py} | 11 +- .../utils/{console.py => _console.py} | 2 +- src/aignostics/utils/_constants.py | 59 + src/aignostics/utils/_di.py | 70 + src/aignostics/utils/_health.py | 107 + src/aignostics/utils/_log.py | 122 + src/aignostics/utils/_logfire.py | 69 + .../utils/{process.py => _process.py} | 1 - src/aignostics/utils/_sentry.py | 102 + src/aignostics/utils/_service.py | 39 + src/aignostics/utils/_settings.py | 89 + src/aignostics/utils/boot.py | 86 + tests/__init__.py | 2 +- tests/aignostics/__init__.py | 1 + tests/aignostics/application/__init__.py | 1 + .../core_test.py => application/cli_test.py} | 74 +- tests/aignostics/cli_test.py | 91 + tests/aignostics/client/__init__.py | 1 + .../aignostics/client/authentication_test.py | 2 +- tests/aignostics/client/scheduled_test.py | 2 +- tests/aignostics/client/settings_test.py | 49 +- tests/aignostics/client/utils_test.py | 2 +- tests/aignostics/{cli => }/docker_test.py | 8 +- tests/aignostics/system/__init__.py | 1 + tests/aignostics/system/cli_test.py | 88 + tests/aignostics/system/service_test.py | 36 + tests/conftest.py | 59 + tests/fixtures/.keep | 0 tests/fixtures/__init__.py | 1 + uv.lock | 742 ++- 118 files changed, 8451 insertions(+), 1139 deletions(-) create mode 100644 sitecustomize.py create mode 100644 src/aignostics/application/__init__.py create mode 100644 src/aignostics/application/_cli.py create mode 100644 src/aignostics/client/_constants.py rename src/aignostics/client/{utils.py => _utils.py} (100%) create mode 100644 src/aignostics/client/resources/__init__.py delete mode 100644 src/aignostics/models.py delete mode 100644 src/aignostics/platform.py delete mode 100644 src/aignostics/settings.py create mode 100644 src/aignostics/system/__init__.py create mode 100644 src/aignostics/system/_cli.py rename src/aignostics/{exceptions.py => system/_exceptions.py} (86%) create mode 100644 src/aignostics/system/_service.py create mode 100644 src/aignostics/system/_settings.py delete mode 100644 src/aignostics/types.py rename src/aignostics/utils/{cli.py => _cli.py} (90%) rename src/aignostics/utils/{console.py => _console.py} (83%) create mode 100644 src/aignostics/utils/_constants.py create mode 100644 src/aignostics/utils/_di.py create mode 100644 src/aignostics/utils/_health.py create mode 100644 src/aignostics/utils/_log.py create mode 100644 src/aignostics/utils/_logfire.py rename src/aignostics/utils/{process.py => _process.py} (99%) create mode 100644 src/aignostics/utils/_sentry.py create mode 100644 src/aignostics/utils/_service.py create mode 100644 src/aignostics/utils/_settings.py create mode 100644 src/aignostics/utils/boot.py create mode 100644 tests/aignostics/__init__.py create mode 100644 tests/aignostics/application/__init__.py rename tests/aignostics/{cli/core_test.py => application/cli_test.py} (58%) create mode 100644 tests/aignostics/cli_test.py create mode 100644 tests/aignostics/client/__init__.py rename tests/aignostics/{cli => }/docker_test.py (72%) create mode 100644 tests/aignostics/system/__init__.py create mode 100644 tests/aignostics/system/cli_test.py create mode 100644 tests/aignostics/system/service_test.py delete mode 100644 tests/fixtures/.keep create mode 100644 tests/fixtures/__init__.py diff --git a/.copier-answers.yml b/.copier-answers.yml index ab93ded5..cf5319c1 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.9.4 +_commit: v0.11.0 _src_path: gh:helmut-hoffer-von-ankershoffen/oe-python-template attestations_enabled: false author_email: helmut@aignostics.com @@ -24,4 +24,6 @@ readthedocs_domain: readthedocs.org readthedocs_project_key: aignostics sonarqube_key: aignostics_python-sdk streamlit_project_key: aignostics +uptime_badge_snippet: "[![Better Stack Badge](https://uptime.betterstack.com/status-badges/v1/monitor/1vtu1.svg)](https://aignostics.betteruptime.com/)" +vercel_badge_snippet: "" vercel_function_enabled: false diff --git a/.env.example b/.env.example index 1549c242..fdb19557 100644 --- a/.env.example +++ b/.env.example @@ -1,9 +1,19 @@ - CLIENT_ID_DEVICE=YOUR_CLIENT_ID_DEVICE - CLIENT_ID_INTERACTIVE=YOUR_CLIENT_ID_INTERACTIVE - SCOPE=YOUR_SCOPE_ELEMENT,YOUR_SCOPE_ELEMENT - REDIRECT_URI=YOUR_REDIRECT_URI - AUDIENCE=YOUR_AUDIENCE - AUTHORIZATION_BASE_URL=YOUR_AUTHORIZATION_BASE_URL - TOKEN_URL=YOUR_TOKEN_URL - DEVICE_URL=YOUR_DEVICE_URL - JWS_JSON_URL=YOUR_JWS_JSON_URL +ENV=local +AIGNOSTICS_SYSTEM_TOKEN=YOUR_SECRET_TOKEN +AIGNOSTICS_LOG_LEVEL=INFO +AIGNOSTICS_LOG_FILE_ENABLED=false +AIGNOSTICS_LOG_FILE_NAME=aignostics.log +AIGNOSTICS_LOG_CONSOLE_ENABLED=false +AIGNOSTICS_LOGFIRE_TOKEN=YOUR_LOGFIRE_TOKEN +AIGNOSTICS_LOGFIRE_INSTRUMENT_SYSTEM_METRICS=true +AIGNOSTICS_SENTRY_DSN=YOUR_SENTRY_DSN +AIGNOSTICS_SENTRY_DEBUG=false +AIGNOSTICS_SENTRY_SEND_DEFAULT_PII=false +AIGNOSTICS_SENTRY_MAX_BREADCRUMBS=5 +AIGNOSTICS_SENTRY_SAMPLE_RATE=1.0 +AIGNOSTICS_SENTRY_TRACES_SAMPLE_RATE=1.0 +AIGNOSTICS_SENTRY_PROFILES_SAMPLE_RATE=1.0 +AIGNOSTICS_API_ROOT=https://platform.aignostics.com +AIGNOSTICS_CLIENT_ID_DEVICE=YOUR_CLIENT_ID_DEVICE_RETRIEVED_FROM_DASHBOARD +AIGNOSTICS_CLIENT_ID_INTERACTIVE=YOUR_CLIENT_ID_INTERACTIVE_RETRIEVED_FROM_DASHBOARD +GOOGLE_APPLICATION_CREDENTIALS=..../gcp-credentials.json \ No newline at end of file diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index eb93a226..c5a2fe98 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -49,8 +49,22 @@ jobs: if: ${{ !startsWith(github.ref, 'refs/tags/v') }} run: | TOML_VERSION=$(uv run python -c "import tomli; print(tomli.load(open('pyproject.toml', 'rb'))['project']['version'])") - echo "Development build - Current version in pyproject.toml: $TOML_VERSION" - + echo "Development build - Current version in pyproject.toml: $TOML_VERSION" + + - name: Create .env file + uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 + with: + envkey_ENV: "TEST" + envkey_AIGNOSTICS_LOGFIRE_TOKEN: "${{ secrets.AIGNOSTICS_LOGFIRE_TOKEN }}" + envkey_AIGNOSTICS_SENTRY_DSN: "${{ secrets.AIGNOSTICS_SENTRY_DSN }}" + envkey_AIGNOSTICS_LOG_LEVEL: "DEBUG" + envkey_AIGNOSTICS_LOG_FILE_ENABLED: 1 + envkey_AIGNOSTICS_API_ROOT: https://platform.aignostics.com + envkey_AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_ID_DEVICE }} + envkey_AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} + envkey_AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} + fail_on_empty: false + - name: Validate installation run: | OUTPUT=$(uv run --no-dev aignostics --help) @@ -59,22 +73,15 @@ jobs: exit 1 fi - - name: Set up cloud credentials - env: - CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} + - name: Set up GCP credentials for bucket access run: | - echo "$CREDENTIALS" | base64 -d > credentials.json + echo "${{ secrets.GCP_CREDENTIALS }}" | base64 -d > credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV - name: Smoke tests - env: - AIGNOSTICS_API_ROOT: https://platform.aignostics.com - AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_DEVICE_ID }} - AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} - AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} run: | - uv run --no-dev aignostics platform health - uv run --no-dev aignostics platform info + uv run --no-dev aignostics system health + uv run --no-dev aignostics system info - name: Lint run: make lint @@ -83,11 +90,6 @@ jobs: run: make audit - name: Test - env: - AIGNOSTICS_API_ROOT: https://platform.aignostics.com - AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_DEVICE_ID }} - AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} - AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} run: make test - name: Upload test results @@ -106,6 +108,7 @@ jobs: reports/junit.xml reports/coverage.xml reports/coverage_html + aignostics.log retention-days: 30 - name: Upload coverage reports to Codecov diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index 427ddad7..098291ce 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -2,7 +2,7 @@ name: "CI Scheduled" on: schedule: - - cron: '0 6 * * *' + - cron: '0 * * * *' jobs: test-scheduled: @@ -26,17 +26,24 @@ jobs: - name: Install Python, venv and dependencies run: uv sync --all-extras --frozen --link-mode=copy - - name: Set up cloud credentials & environment file - env: - CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }} + - name: Create .env file + uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 + with: + envkey_ENV: "TEST" + envkey_AIGNOSTICS_LOGFIRE_TOKEN: "${{ secrets.AIGNOSTICS_LOGFIRE_TOKEN }}" + envkey_AIGNOSTICS_SENTRY_DSN: "${{ secrets.AIGNOSTICS_SENTRY_DSN }}" + envkey_AIGNOSTICS_LOG_LEVEL: "DEBUG" + envkey_AIGNOSTICS_LOG_FILE_ENABLED: 1 + envkey_AIGNOSTICS_API_ROOT: https://platform.aignostics.com + envkey_AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_ID_DEVICE }} + envkey_AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} + envkey_AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} + fail_on_empty: false + + - name: Set up GCP credentials for bucket access run: | - echo "$CREDENTIALS" | base64 -d > credentials.json + echo "${{ secrets.GCP_CREDENTIALS }}" | base64 -d > credentials.json echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV - name: Run scheduled tests - env: - AIGNOSTICS_API_ROOT: https://platform.aignostics.com - AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_DEVICE_ID }} - AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} - AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} run: make test_scheduled diff --git a/.gitignore b/.gitignore index 0cd702bd..36d6a6d6 100644 --- a/.gitignore +++ b/.gitignore @@ -2,11 +2,11 @@ # Environment .env -.env.backup -.env.bak +.env.* ENV/ env/ .envrc +!.env.example ## secrets .secret diff --git a/.readthedocs.yml b/.readthedocs.yml index df9cfb08..6a35f743 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,4 +1,4 @@ -# Read the Docs configuration file for Aignostics Python SDK +# Read the Docs configuration file for {{ project_name }} # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index b6d783f5..9c820085 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -30,6 +30,39 @@ limitations under the License. ``` +## Deprecated (1.2.18) - MIT License + +Python @deprecated decorator to deprecate old python classes, functions or methods. + +* URL: https://github.com/laurent-laporte-pro/deprecated +* Author(s): Laurent LAPORTE + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2017 Laurent LAPORTE + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + ## Faker (37.1.0) - MIT License Faker is a Python package that generates fake data for you. @@ -1354,6 +1387,46 @@ Better dates & times for Python ``` +## asgiref (3.8.1) - BSD License + +ASGI specs, helper code, and adapters + +* URL: https://github.com/django/asgiref/ +* Author(s): Django Software Foundation + +### License Text + +``` +Copyright (c) Django Software Foundation and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of Django nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + ## asttokens (3.0.0) - Apache 2.0 Annotate AST trees with source code positions @@ -5062,6 +5135,54 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` +## dnspython (2.7.0) - ISC License (ISCL) + +DNS toolkit + +* URL: https://www.dnspython.org +* Author(s): Bob Halley + +### License Text + +``` +ISC License + +Copyright (C) Dnspython Contributors + +Permission to use, copy, modify, and/or distribute this software for +any purpose with or without fee is hereby granted, provided that the +above copyright notice and this permission notice appear in all +copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + + + +Copyright (C) 2001-2017 Nominum, Inc. +Copyright (C) Google Inc. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose with or without fee is hereby granted, +provided that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +``` + ## docutils (0.21.2) - BSD License; GNU General Public License (GPL); Public Domain; Python Software Foundation License Docutils -- Python Documentation Utilities @@ -5267,6 +5388,46 @@ OR OTHER DEALINGS IN THE SOFTWARE. ``` +## email_validator (2.2.0) - The Unlicense (Unlicense) + +A robust email address syntax and deliverability validation library. + +* URL: https://github.com/JoshData/python-email-validator +* Author(s): Joshua Tauberer + +### License Text + +``` +This is free and unencumbered software released into the public +domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a +compiled binary, for any purpose, commercial or non-commercial, +and by any means. + +In jurisdictions that recognize copyright laws, the author or +authors of this software dedicate any and all copyright +interest in the software to the public domain. We make this +dedication for the benefit of the public at large and to the +detriment of our heirs and successors. We intend this +dedication to be an overt act of relinquishment in perpetuity +of all present and future rights to this software under +copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +For more information, please refer to + +``` + ## enum-tools (0.12.0) - GNU Lesser General Public License v3 or later (LGPLv3+) Tools to expand Python's enum module. @@ -5510,6 +5671,74 @@ SOFTWARE. ``` +## fastapi (0.115.12) - MIT License + +FastAPI framework, high performance, easy to learn, fast to code, ready for production + +* URL: https://github.com/fastapi/fastapi +* Author(s): =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2018 Sebastián Ramírez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + +## fastapi-cli (0.0.7) - MIT License + +Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀 + +* URL: https://github.com/fastapi/fastapi-cli +* Author(s): =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2024 Sebastián Ramírez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## fastjsonschema (2.21.1) - BSD License Fastest Python implementation of JSON schema @@ -7714,6 +7943,40 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## httptools (0.6.4) - MIT License + +A collection of framework independent HTTP protocol utils. + +* URL: https://github.com/MagicStack/httptools +* Author(s): Yury Selivanov + +### License Text + +``` +The MIT License + +Copyright (c) 2015 MagicStack Inc. http://magic.io + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## httpx (0.28.1) - BSD License The next generation HTTP client. @@ -7847,58 +8110,273 @@ THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## iniconfig (2.1.0) - MIT License +## importlib_metadata (8.6.1) - Apache Software License -brain-dead simple config-ini parsing +Read metadata from Python packages -* URL: https://github.com/pytest-dev/iniconfig -* Author(s): Ronny Pfannschmidt , Holger Krekel +* URL: https://github.com/python/importlib_metadata +* Author(s): "Jason R. Coombs" ### License Text ``` -The MIT License (MIT) - -Copyright (c) 2010 - 2023 Holger Krekel and others - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -``` + 1. Definitions. -## ipykernel (6.29.5) - BSD License + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -IPython Kernel for Jupyter + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -* URL: https://ipython.org -* Author(s): IPython Development Team + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -### License Text + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -``` -BSD 3-Clause License + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -Copyright (c) 2015, IPython Development Team + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -All rights reserved. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## iniconfig (2.1.0) - MIT License + +brain-dead simple config-ini parsing + +* URL: https://github.com/pytest-dev/iniconfig +* Author(s): Ronny Pfannschmidt , Holger Krekel + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2010 - 2023 Holger Krekel and others + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## ipykernel (6.29.5) - BSD License + +IPython Kernel for Jupyter + +* URL: https://ipython.org +* Author(s): IPython Development Team + +### License Text + +``` +BSD 3-Clause License + +Copyright (c) 2015, IPython Development Team + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. @@ -9541,6 +10019,40 @@ license-expression is a comprehensive utility library to parse, compare, simplif ``` +## logfire (3.13.1) - MIT License + +The best Python observability tool! 🪵🔥 + +* URL: https://logfire.pydantic.dev/ +* Author(s): Pydantic Team , Samuel Colvin , Hasan Ramezani , Adrian Garcia Badaracco , David Montague , Marcelo Trylesinski , David Hewitt , Alex Hall + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2023 - present Pydantic Services inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## lxml (5.3.2) - BSD License Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. @@ -9584,7 +10096,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## marimo (0.12.4) - Apache Software License +## marimo (0.12.8) - Apache Software License A library for making reactive notebooks and apps @@ -12017,12 +12529,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## overrides (7.7.0) - Apache License, Version 2.0 +## opentelemetry-api (1.32.0) - Apache Software License -A decorator to automatically detect mismatch when overriding a method. +OpenTelemetry Python API -* URL: https://github.com/mkorpela/overrides -* Author(s): Mikko Korpela +* URL: https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-api +* Author(s): OpenTelemetry Authors ### License Text @@ -12207,7 +12719,7 @@ A decorator to automatically detect mismatch when overriding a method. APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -12215,7 +12727,7 @@ A decorator to automatically detect mismatch when overriding a method. same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12229,10 +12741,4083 @@ A decorator to automatically detect mismatch when overriding a method. See the License for the specific language governing permissions and limitations under the License. - ``` -## packageurl-python (0.16.0) - MIT License +## opentelemetry-exporter-otlp-proto-common (1.32.0) - Apache Software License + +OpenTelemetry Protobuf encoding + +* URL: https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-common +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-exporter-otlp-proto-http (1.32.0) - Apache Software License + +OpenTelemetry Collector Protobuf over HTTP Exporter + +* URL: https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-http +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-instrumentation (0.53b0) - Apache Software License + +Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/opentelemetry-instrumentation +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-instrumentation-asgi (0.53b0) - Apache Software License + +ASGI instrumentation for OpenTelemetry + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-asgi +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-instrumentation-dbapi (0.53b0) - Apache Software License + +OpenTelemetry Database API instrumentation + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-dbapi +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-instrumentation-fastapi (0.53b0) - Apache Software License + +OpenTelemetry FastAPI Instrumentation + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-fastapi +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-instrumentation-httpx (0.53b0) - Apache Software License + +OpenTelemetry HTTPX Instrumentation + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-httpx +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-instrumentation-jinja2 (0.53b0) - Apache Software License + +OpenTelemetry jinja2 instrumentation + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-jinja2 +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-instrumentation-requests (0.53b0) - Apache Software License + +OpenTelemetry requests instrumentation + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-requests +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-instrumentation-sqlite3 (0.53b0) - Apache Software License + +OpenTelemetry SQLite3 instrumentation + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-sqlite3 +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-instrumentation-system-metrics (0.53b0) - Apache Software License + +OpenTelemetry System Metrics Instrumentation + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-system-metrics +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-instrumentation-tornado (0.53b0) - Apache Software License + +Tornado instrumentation for OpenTelemetry + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-tornado +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-instrumentation-urllib (0.53b0) - Apache Software License + +OpenTelemetry urllib instrumentation + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-urllib +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-instrumentation-urllib3 (0.53b0) - Apache Software License + +OpenTelemetry urllib3 instrumentation + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-urllib3 +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-proto (1.32.0) - Apache Software License + +OpenTelemetry Python Proto + +* URL: https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-proto +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-sdk (1.32.0) - Apache Software License + +OpenTelemetry Python SDK + +* URL: https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-sdk +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-semantic-conventions (0.53b0) - Apache Software License + +OpenTelemetry Semantic Conventions + +* URL: https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-semantic-conventions +* Author(s): OpenTelemetry Authors + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## opentelemetry-util-http (0.53b0) - Apache Software License + +Web util for OpenTelemetry + +* URL: https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/util/opentelemetry-util-http +* Author(s): OpenTelemetry Authors + +## orjson (3.10.16) - Apache Software License; MIT License + +Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy + +* URL: https://github.com/ijl/orjson +* Author(s): ijl + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +``` + +## overrides (7.7.0) - Apache License, Version 2.0 + +A decorator to automatically detect mismatch when overriding a method. + +* URL: https://github.com/mkorpela/overrides +* Author(s): Mikko Korpela + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +``` + +## packageurl-python (0.16.0) - MIT License A purl aka. Package URL parser and builder @@ -15307,7 +19892,7 @@ pip requirements parser - a mostly correct pip requirements parsing library beca * URL: https://github.com/nexB/pip-requirements-parser * Author(s): The pip authors, nexB. Inc. and others -## pip_audit (2.8.0) - Apache Software License +## pip_audit (2.9.0) - Apache Software License A tool for scanning Python environments for known vulnerabilities @@ -19001,7 +23586,7 @@ SOFTWARE. ``` -## pydantic (2.11.2) - MIT License +## pydantic (2.11.3) - MIT License Data validation using Python type hints @@ -19035,6 +23620,40 @@ SOFTWARE. ``` +## pydantic-extra-types (2.10.3) - MIT License + +Extra Pydantic types. + +* URL: https://github.com/pydantic/pydantic-extra-types +* Author(s): Samuel Colvin , Yasser Tahiri + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2023 Samuel Colvin and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## pydantic-settings (2.8.1) - MIT License Settings management using Pydantic @@ -19286,7 +23905,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## pyright (1.1.398) - MIT +## pyright (1.1.399) - MIT Command line wrapper for pyright @@ -19635,7 +24254,7 @@ DEALINGS IN THE SOFTWARE. ``` -## pytest-docker (3.2.0) - MIT License +## pytest-docker (3.2.1) - MIT License Simple pytest fixtures for Docker and Docker Compose based tests @@ -19981,6 +24600,33 @@ This software includes the following licenced software: Licenced under ISC Licence Source: https://github.com/mkdocstrings/python +``` + +## python-multipart (0.0.20) - Apache Software License + +A streaming multipart parser for Python + +* URL: https://github.com/Kludex/python-multipart +* Author(s): Andrew Dunham , Marcelo Trylesinski + +### License Text + +``` +Copyright 2012, Andrew Dunham + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + ``` ## pytz (2025.2) - MIT License @@ -20534,6 +25180,39 @@ SOFTWARE. ``` +## rich-toolkit (0.14.1) - MIT License + +Rich toolkit for building command-line applications + +* URL: UNKNOWN + +### License Text + +``` +MIT License + +Copyright (c) 2024 Patrick Arminio + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## roman-numerals-py (3.1.0) - CC0 1.0 Universal (CC0 1.0) Public Domain Dedication; Zero-Clause BSD (0BSD) Manipulate well-formed Roman numerals @@ -20826,7 +25505,7 @@ ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of com ``` -## ruff (0.11.4) - MIT License +## ruff (0.11.5) - MIT License An extremely fast Python linter and code formatter, written in Rust. @@ -22460,6 +27139,40 @@ Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. ``` +## sentry-sdk (2.25.1) - BSD License + +Python client for Sentry (https://sentry.io) + +* URL: https://github.com/getsentry/sentry-python +* Author(s): Sentry Team and Contributors + +### License Text + +``` +MIT License + +Copyright (c) 2018 Functional Software, Inc. dba Sentry + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## setuptools (78.1.0) - MIT License Easily download, build, install, upgrade, and uninstall Python packages @@ -25533,13 +30246,175 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +``` + +## ujson (5.10.0) - BSD License + +Ultra fast JSON encoder and decoder for Python + +* URL: https://github.com/ultrajson/ultrajson +* Author(s): Jonas Tarnstrom + +### License Text + +``` +Developed by ESN, an Electronic Arts Inc. studio. +Copyright (c) 2014, Electronic Arts Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of ESN, Electronic Arts Inc. nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL ELECTRONIC ARTS INC. BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---- + +Portions of code from MODP_ASCII - Ascii transformations (upper/lower, etc) +https://github.com/client9/stringencoders + + Copyright 2005, 2006, 2007 + Nick Galbreath -- nickg [at] modp [dot] com + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + Neither the name of the modp.com nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This is the standard "new" BSD license: + http://www.opensource.org/licenses/bsd-license.php + +https://github.com/client9/stringencoders/blob/cfd5c1507325ae497ea9bacdacba12c0ffd79d30/COPYING + +---- + +Numeric decoder derived from from TCL library +https://opensource.apple.com/source/tcl/tcl-14/tcl/license.terms + * Copyright (c) 1988-1993 The Regents of the University of California. + * Copyright (c) 1994 Sun Microsystems, Inc. + + This software is copyrighted by the Regents of the University of + California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState + Corporation and other parties. The following terms apply to all files + associated with the software unless explicitly disclaimed in + individual files. + + The authors hereby grant permission to use, copy, modify, distribute, + and license this software and its documentation for any purpose, provided + that existing copyright notices are retained in all copies and that this + notice is included verbatim in any distributions. No written agreement, + license, or royalty fee is required for any of the authorized uses. + Modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided that + the new terms are clearly indicated on the first page of each file where + they apply. + + IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY + FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY + DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE + IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE + NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. + + GOVERNMENT USE: If you are acquiring this software on behalf of the + U.S. government, the Government shall have only "Restricted Rights" + in the software and related documentation as defined in the Federal + Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you + are acquiring the software on behalf of the Department of Defense, the + software shall be classified as "Commercial Computer Software" and the + Government shall have only "Restricted Rights" as defined in Clause + 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the + authors grant the U.S. Government and others acting in its behalf + permission to use and distribute the software in accordance with the + terms specified in this license. + +``` + +## uptime (3.0.1) - BSD License + +Cross-platform uptime library + +* URL: https://github.com/Cairnarvon/uptime +* Author(s): Koen Crolla + +### License Text + +``` +Copyright (c) 2012, Koen Crolla +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` @@ -25866,6 +30741,222 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## uvloop (0.21.0) - Apache Software License; MIT License + +Fast implementation of asyncio event loop on top of libuv + +* URL: UNKNOWN +* Author(s): Yury Selivanov + +### License Text + +``` +Copyright (C) 2016-present the uvloop authors and contributors. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2015-present MagicStack Inc. http://magic.io + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + ## virtualenv (20.30.0) - MIT License Virtual Python Environment builder @@ -26414,3 +31505,33 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` + +## zipp (3.21.0) - MIT License + +Backport of pathlib-compatible object wrapper for zip files + +* URL: https://github.com/jaraco/zipp +* Author(s): "Jason R. Coombs" + +### License Text + +``` +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. + +``` diff --git a/CLI_REFERENCE.md b/CLI_REFERENCE.md index 46f26567..ec74078c 100644 --- a/CLI_REFERENCE.md +++ b/CLI_REFERENCE.md @@ -1,6 +1,6 @@ # CLI Reference -Command Line Interface of the aignostics platform +Command Line Interface of **Usage**: @@ -14,21 +14,21 @@ $ aignostics [OPTIONS] COMMAND [ARGS]... * `--show-completion`: Show completion for the current shell, to copy it or customize the installation. * `--help`: Show this message and exit. -🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +🧠 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 **Commands**: -* `platform`: Platform diagnostics and utilities -* `application`: aignostics applications +* `application`: Application commands +* `system`: System commands -## `aignostics platform` +## `aignostics application` -Platform diagnostics and utilities +Application commands **Usage**: ```console -$ aignostics platform [OPTIONS] COMMAND [ARGS]... +$ aignostics application [OPTIONS] COMMAND [ARGS]... ``` **Options**: @@ -37,81 +37,49 @@ $ aignostics platform [OPTIONS] COMMAND [ARGS]... **Commands**: -* `install`: Complete and validate installation of the... -* `health`: Indicate if aignostics platform is healthy. -* `info`: Print info about service configuration. -* `openapi`: Dump the OpenAPI specification of to stdout. +* `list`: List available applications. +* `describe`: Describe application. * `bucket`: Transfer bucket provide by platform +* `dataset`: Datasets for use as input for applications +* `metadata`: Metadata required as input for applications +* `run`: Runs of applications -### `aignostics platform install` - -Complete and validate installation of the CLI. - -**Usage**: - -```console -$ aignostics platform install [OPTIONS] -``` - -**Options**: - -* `--help`: Show this message and exit. - -### `aignostics platform health` - -Indicate if aignostics platform is healthy. - -**Usage**: - -```console -$ aignostics platform health [OPTIONS] -``` - -**Options**: - -* `--help`: Show this message and exit. - -### `aignostics platform info` +### `aignostics application list` -Print info about service configuration. +List available applications. **Usage**: ```console -$ aignostics platform info [OPTIONS] +$ aignostics application list [OPTIONS] ``` **Options**: -* `--output-format [yaml|json]`: Output format [default: yaml] -* `--env / --no-env`: Include environment variables in output [default: no-env] -* `--filter-secrets / --no-filter-secrets`: Filter out secret values from environment variables [default: filter-secrets] * `--help`: Show this message and exit. -### `aignostics platform openapi` +### `aignostics application describe` -Dump the OpenAPI specification of to stdout. +Describe application. **Usage**: ```console -$ aignostics platform openapi [OPTIONS] +$ aignostics application describe [OPTIONS] ``` **Options**: -* `--api-version [v1]`: API Version [default: v1] -* `--output-format [yaml|json]`: Output format [default: yaml] * `--help`: Show this message and exit. -### `aignostics platform bucket` +### `aignostics application bucket` Transfer bucket provide by platform **Usage**: ```console -$ aignostics platform bucket [OPTIONS] COMMAND [ARGS]... +$ aignostics application bucket [OPTIONS] COMMAND [ARGS]... ``` **Options**: @@ -123,78 +91,28 @@ $ aignostics platform bucket [OPTIONS] COMMAND [ARGS]... * `ls`: List contents of tranfer bucket. * `purge`: Purge content of transfer bucket. -#### `aignostics platform bucket ls` +#### `aignostics application bucket ls` List contents of tranfer bucket. **Usage**: ```console -$ aignostics platform bucket ls [OPTIONS] +$ aignostics application bucket ls [OPTIONS] ``` **Options**: * `--help`: Show this message and exit. -#### `aignostics platform bucket purge` +#### `aignostics application bucket purge` Purge content of transfer bucket. **Usage**: ```console -$ aignostics platform bucket purge [OPTIONS] -``` - -**Options**: - -* `--help`: Show this message and exit. - -## `aignostics application` - -aignostics applications - -**Usage**: - -```console -$ aignostics application [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `list`: List available applications. -* `describe`: Describe application. -* `dataset`: Datasets for use as input for applications -* `metadata`: Metadata required as input for applications -* `run`: Runs of applications - -### `aignostics application list` - -List available applications. - -**Usage**: - -```console -$ aignostics application list [OPTIONS] -``` - -**Options**: - -* `--help`: Show this message and exit. - -### `aignostics application describe` - -Describe application. - -**Usage**: - -```console -$ aignostics application describe [OPTIONS] +$ aignostics application bucket purge [OPTIONS] ``` **Options**: @@ -404,3 +322,116 @@ $ aignostics application run result delete [OPTIONS] **Options**: * `--help`: Show this message and exit. + +## `aignostics system` + +System commands + +**Usage**: + +```console +$ aignostics system [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +* `--help`: Show this message and exit. + +**Commands**: + +* `health`: Determine and print system health. +* `info`: Determine and print system info. +* `openapi`: Dump the OpenAPI specification. +* `install`: Complete installation. +* `whoami`: Print user info. + +### `aignostics system health` + +Determine and print system health. + +Args: + output_format (OutputFormat): Output format (JSON or YAML). + +**Usage**: + +```console +$ aignostics system health [OPTIONS] +``` + +**Options**: + +* `--output-format [yaml|json]`: Output format [default: json] +* `--help`: Show this message and exit. + +### `aignostics system info` + +Determine and print system info. + +Args: + include_environ (bool): Include environment variables. + filter_secrets (bool): Filter secrets from the output. + output_format (OutputFormat): Output format (JSON or YAML). + +**Usage**: + +```console +$ aignostics system info [OPTIONS] +``` + +**Options**: + +* `--include-environ / --no-include-environ`: Include environment variables [default: no-include-environ] +* `--filter-secrets / --no-filter-secrets`: Filter secrets [default: filter-secrets] +* `--output-format [yaml|json]`: Output format [default: json] +* `--help`: Show this message and exit. + +### `aignostics system openapi` + +Dump the OpenAPI specification. + +Args: + api_version (str): API version to dump. + output_format (OutputFormat): Output format (JSON or YAML). + +Raises: + typer.Exit: If an invalid API version is provided. + +**Usage**: + +```console +$ aignostics system openapi [OPTIONS] +``` + +**Options**: + +* `--api-version TEXT`: API Version. Available: v1 [default: v1] +* `--output-format [yaml|json]`: Output format [default: json] +* `--help`: Show this message and exit. + +### `aignostics system install` + +Complete installation. + +**Usage**: + +```console +$ aignostics system install [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +### `aignostics system whoami` + +Print user info. + +**Usage**: + +```console +$ aignostics system whoami [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f84de8d6..b09fbc7c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,7 +9,7 @@ Install or update tools required for development: ```shell # Install Homebrew, uv package manager, copier and further dev tools -curl -LsSf https://raw.githubusercontent.com/helmut-hoffer-von-ankershoffen/oe-python-template/HEAD/install.sh | sh +curl -LsSf https://raw.githubusercontent.com/aignostics/python-sdk/HEAD/install.sh | sh ``` [Create a fork](https://github.com/aignostics/python-sdk/fork) and clone your fork using ```git clone URL_OF_YOUR_CLONE```. Then change into the directory of your local Aignostics Python SDK repository with ```cd python-sdk```. @@ -31,16 +31,16 @@ If you are one of the committers of https://github.com/aignostics/python-sdk you ├── .env # Environment variables, on .gitignore ├── .env.example # Example environment variables src/aignostics/ # Source code -├── __init__.py # Package initialization -├── constants.py # Constants used throughout the app -├── settings.py # Settings loaded from environment and .env -├── models.py # Models and data structures -├── service.py # Service exposed for use as shared library -├── cli.py # CLI enabling to interact with service from terminal -└── api.py # API exposing service as web service -tests/ # Unit and E2E tests -├── cli_tests.py # Verifies the CLI functionality -├── api_tests.py # Verifies the API functionality +├── __init__.py # Package initialization and +├── utils/*.py # Infrastructure for logging, sentry, logfire etc. +├── system/*.py # Module for system management, including service, CLI commands and API operations +├── hello/*.py # Module for "Hello" functionality, including service, CLI commands and API operations +├── cli.py # CLI entrypoint with auto-registration of CLI commands of modules +├── api.py # Webservice API entrypoint with auto-registration of API operations of modules +└── constants.py # Package specific constants such as major API versions and modules to instrument. +tests/aignostics/ # Tests +├── **/cli_tests.py # Verifies the core and module specific CLI commands +├── **/api_tests.py # Verifies the core and module specific API operations └── fixtures/ # Fixtures and mock data docs/ # Documentation ├── partials/*.md # Partials to compile README.md, _main partial included in HTML and PDF documentation @@ -68,7 +68,6 @@ reports/ # Compliance reports for auditing └── sbom.json # Software Bill of Materials in OWASP CycloneDX format ``` - ## Build, Run and Release ### Setup project specific development environment @@ -146,7 +145,7 @@ Build and run the Docker image with plain Docker ```shell # Build from Dockerimage -make docker build +make docker_build # Run the CLI docker run --env THE_VAR=THE_VALUE aignostics --help ``` @@ -164,7 +163,7 @@ echo "Checking health of v1 API ..." curl http://127.0.0.1:8000/api/v1/healthz echo "" echo "Saying hello world with v1 API ..." -curl http://127.0.0.1:8000/api/v1/hello-world +curl http://127.0.0.1:8000/api/v1/hello/world echo "" echo "Swagger docs of v1 API ..." curl http://127.0.0.1:8000/api/v1/docs @@ -173,7 +172,7 @@ echo "Checking health of v2 API ..." curl http://127.0.0.1:8000/api/v2/healthz echo "" echo "Saying hello world with v1 API ..." -curl http://127.0.0.1:8000/api/v2/hello-world +curl http://127.0.0.1:8000/api/v2/hello/world echo "" echo "Swagger docs of v2 API ..." curl http://127.0.0.1:8000/api/v2/docs diff --git a/Dockerfile b/Dockerfile index f35c3aef..ed6acd17 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,29 +17,30 @@ ENV PATH="/app/.venv/bin:$PATH" RUN --mount=type=cache,target=/root/.cache/uv \ --mount=type=bind,source=uv.lock,target=uv.lock \ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ - uv sync --frozen --no-install-project --no-dev --no-editable + uv sync --frozen --no-install-project --all-extras --no-dev --no-editable # Then, add the rest of the project source code and install it # Installing separately from its dependencies allows optimal layer caching COPY pyproject.toml /app +COPY .python-version /app COPY uv.lock /app COPY src /app/src -COPY .env.example /app/.env.example -COPY tests /app/tests COPY LICENSE /app COPY *.md /app -COPY .python-version /app + +COPY .env.example /app/.env.example +COPY tests /app/tests + +# Install project specifics +COPY codegen/out/aignx /app/codegen/out/aignx RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-dev --no-editable + uv sync --frozen --all-extras --no-dev --no-editable ENV AIGNOSTICS_PYTHON_SDK_RUNNING_IN_CONTAINER=1 -# API will run on port 8000 by default -EXPOSE 8000/tcp - # No healthcheck by default HEALTHCHECK NONE # But feel free to add arguments and options as needed when doing a docker run -ENTRYPOINT ["uv", "run", "--no-dev", "aignostics"] +ENTRYPOINT ["uv", "run", "--all-extras", "--no-dev", "aignostics"] diff --git a/Makefile b/Makefile index 2061d87f..27b82e76 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # Makefile for running common development tasks # Define all PHONY targets -.PHONY: all act audit bump clean dist docs docker_build lint setup setup test test_scheduled update_from_template +.PHONY: all act audit bump clean codegen dist docs docker_build lint setup setup test test_scheduled test_long_running update_from_template # Main target i.e. default sessions defined in noxfile.py all: @@ -34,6 +34,10 @@ act audit bump dist docs lint setup test update_from_template: test_scheduled: uv run --all-extras nox -s test -p 3.11 -- -m scheduled +## Run tests marked as long_running +test_long_running: + uv run --all-extras nox -s test -p 3.11 -- -m long_running + ## Clean build artifacts and caches clean: rm -rf .mypy_cache @@ -81,6 +85,7 @@ help: @echo " audit - Run security and license compliance audit" @echo " bump patch|minor|major|x.y.z - Bump version" @echo " clean - Clean build artifacts and caches" + @echo " codegen - Generate API code" @echo " dist - Build wheel and sdist into dist/" @echo " docs [pdf] - Build documentation (add pdf for PDF format)" @@ -89,6 +94,7 @@ help: @echo " setup - Setup development environment" @echo " test [3.11|3.12|3.13] - Run tests (for specific Python version)" @echo " test_scheduled - Run tests marked as scheduled with Python 3.11" + @echo " test_long_running - Run tests marked as long running with Python 3.11" @echo " update_from_template - Update from template using copier" @echo "" @echo "Built with love in Berlin 🐻" diff --git a/README.md b/README.md index 02ec54b3..aba96a5a 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,7 @@ # 🔬 Aignostics Python SDK -[![License](https://img.shields.io/github/license/aignostics/python-sdk?logo=opensourceinitiative&logoColor=3DA639&labelColor=414042&color=A41831) -](https://github.com/aignostics/python-sdk/blob/main/LICENSE) +[![License](https://img.shields.io/github/license/aignostics/python-sdk?logo=opensourceinitiative&logoColor=3DA639&labelColor=414042&color=A41831)](https://github.com/aignostics/python-sdk/blob/main/LICENSE) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/aignostics.svg?logo=python&color=204361&labelColor=1E2933)](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) [![CI](https://github.com/aignostics/python-sdk/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/aignostics/python-sdk/actions/workflows/test-and-report.yml) [![Read the Docs](https://img.shields.io/readthedocs/aignostics)](https://aignostics.readthedocs.io/en/latest/) @@ -13,7 +12,6 @@ [![Maintainability](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) - [![Dependabot](https://img.shields.io/badge/dependabot-active-brightgreen?style=flat-square&logo=dependabot)](https://github.com/aignostics/python-sdk/security/dependabot) [![Renovate enabled](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://github.com/aignostics/python-sdk/issues?q=is%3Aissue%20state%3Aopen%20Dependency%20Dashboard) [![Coverage](https://codecov.io/gh/aignostics/python-sdk/graph/badge.svg?token=SX34YRP30E)](https://codecov.io/gh/aignostics/python-sdk) @@ -28,6 +26,7 @@ [![Copier](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-grayscale-inverted-border-orange.json)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template) [![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE3IDE2VjdsLTYgNU0yIDlWOGwxLTFoMWw0IDMgOC04aDFsNCAyIDEgMXYxNGwtMSAxLTQgMmgtMWwtOC04LTQgM0gzbC0xLTF2LTFsMy0zIi8+PC9zdmc+)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/aignostics/python-sdk) [![Open in GitHub Codespaces](https://img.shields.io/static/v1?label=GitHub%20Codespaces&message=Open&color=blue&logo=github)](https://github.com/codespaces/new/aignostics/python-sdk) +[![Better Stack Badge](https://uptime.betterstack.com/status-badges/v1/monitor/1vtu1.svg)](https://aignostics.betteruptime.com/) > [!TIP] -> 📚 [Online documentation](https://aignostics.readthedocs.io/en/latest/) - 📖 [PDF Manual](https://aignostics.readthedocs.io/_/downloads/en/latest/pdf/) +> 📚 [Online documentation](https://aignostics.readthedocs.io/en/latest/) - 📖 +> [PDF Manual](https://aignostics.readthedocs.io/_/downloads/en/latest/pdf/) > [!NOTE] -> 🧠 This project was scaffolded using the template [oe-python-template](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template) with [copier](https://copier.readthedocs.io/). +> 🧠 This project was scaffolded using the template +> [oe-python-template](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template) +> with [copier](https://copier.readthedocs.io/). --- -from aignx.codegen.models import ItemCreationRequestfrom aignx.codegen.models import ItemCreationRequestfrom aignx.codegen.models import RunCreationRequest +from aignx.codegen.models import ItemCreationRequestfrom aignx.codegen.models +import ItemCreationRequestfrom aignx.codegen.models import RunCreationRequest ## Introduction @@ -111,19 +114,19 @@ The CLI is installed as part of the SDK. You can run it from your terminal using the `uvx` command. See as follows for the primary commands: ```shell -uvx aignostics platform health # checks if CLI and Platform are health -uvx aignostics platform info # shows information about the platform -uvx aignostics application list # lists AI applications available for the user +uvx aignostics system health # checks if the Python SDK and the aignostics platform are healthy +uvx aignostics system info # shows information about the configuration and runtime of the system +uvx aignostics application list # lists AI applications available for you # TODO (Helmut): Explain a bit more. ``` The CLI provides extensive help: ```shell -uvx aignostics --help # all CLI commands -uvx aignostics application --help # help for specific topic -uvx aignostics application list --help # help for specific topic -uvx aignostics serve --help +uvx aignostics --help # all subcommands +uvx aignostics application --help # list subcommands in the application space +uvx aignostics application list --help # help for specific command +uvx aignostics application run --help. # list subcommands in the application run space ``` Check out our @@ -132,32 +135,41 @@ to learn about all commands and options available. ## Using the Python SDK in your Codebase -The following sections showcase how you can integrate the Python SDK in your codebase. +The following sections showcase how you can integrate the Python SDK in your +codebase. ### Installation -Adding Aignostics Python SDK to your codebase as a dependency is easy. -You can directly import add the dependency via your favourite package manager, -e.g., [pip](https://pip.pypa.io/en/stable/) or [uv](https://docs.astral.sh/uv/). +Adding Aignostics Python SDK to your codebase as a dependency is easy. You can +directly import add the dependency via your favourite package manager, e.g., +[pip](https://pip.pypa.io/en/stable/) or [uv](https://docs.astral.sh/uv/). + +**Install with uv** -- If you don't have uv installed follow +[these instructions](https://docs.astral.sh/uv/getting-started/installation/). -**Install with uv** -- If you don't have uv installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). ```shell uv add aignostics # add SDK as dependency to your project ``` **Install with pip** + ```shell pip install aignostics # add SDK as dependency to your project ``` ### Usage -Read the [client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) to learn about all classes and methods. +Read the +[client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) +to learn about all classes and methods. -The following snippets showcase the basic code to run an application with the Python SDK. -A more detailed example - including comments - is available in the `examples` folder as Python notebooks: -[examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) (IPython) -[examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) (Marimo). +The following snippets showcase the basic code to run an application with the +Python SDK. A more detailed example - including comments - is available in the +`examples` folder as Python notebooks: +[examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) +(IPython) +[examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) +(Marimo). ```python import aignostics.client @@ -183,13 +195,18 @@ application_run.download_to_folder("path/to/download/folder") ``` ### Authentication Setup -The SDK uses the [OAuth2](https://oauth.net/2/) protocol for authentication. -Please visit [your personal dashboard on the aignostics platform](https://platform.aignostics.com) and scroll to the "Python SDK" section -to find your personalized setup instructions. + +The SDK uses the [OAuth2](https://oauth.net/2/) protocol for authentication. +Please visit +[your personal dashboard on the aignostics platform](https://platform.aignostics.com) +and scroll to the "Python SDK" section to find your personalized setup +instructions. ### Application Run Payloads -The payload expected to trigger an application run is specified by the `RunCreationRequest` pydantic model: +The payload expected to trigger an application run is specified by the +`RunCreationRequest` pydantic model: + ```python RunCreationRequest( application_version=..., @@ -199,8 +216,10 @@ RunCreationRequest( ] ) ``` -Next to the application version of the application you want to run, -it defines the items you want to be processed as `ItemCreationRequest` objects: + +Next to the application version of the application you want to run, it defines +the items you want to be processed as `ItemCreationRequest` objects: + ```python ItemCreationRequest( reference="1", @@ -218,20 +237,29 @@ ItemCreationRequest( ], ), ``` -For each item you want to process, you need to provide a unique `reference` string. -This is used to identify the item in the results later on. -The `input_artifacts` field is a list of `InputArtifactCreationRequest` objects, which defines what data & metadata you need to provide for each item. -The required artifacts depend on the application version you want to run - in the case of test application, there is only one artifact required, which is the image to process on. -The artifact name is defined as `user_slide`. -The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. +For each item you want to process, you need to provide a unique `reference` +string. This is used to identify the item in the results later on. The +`input_artifacts` field is a list of `InputArtifactCreationRequest` objects, +which defines what data & metadata you need to provide for each item. The +required artifacts depend on the application version you want to run - in the +case of test application, there is only one artifact required, which is the +image to process on. The artifact name is defined as `user_slide`. + +The `download_url` is a signed URL that allows the Aignostics Platform to +download the image data later during processing. #### Self-signed URLs for large files -To make the images you want to process available to the Aignostics Platform, you need to provide a signed URL that allows the platform to download the data. -Self-signed URLs for files in google storage buckets can be generated using the `generate_signed_url` ([code](https://github.com/aignostics/python-sdk/blob/407e74f7ae89289b70efd86cbda59ec7414050d5/src/aignostics/client/utils.py#L85)). +To make the images you want to process available to the Aignostics Platform, you +need to provide a signed URL that allows the platform to download the data. +Self-signed URLs for files in google storage buckets can be generated using the +`generate_signed_url` +([code](https://github.com/aignostics/python-sdk/blob/407e74f7ae89289b70efd86cbda59ec7414050d5/src/aignostics/client/utils.py#L85)). -**We expect that you provide the [required credentials](https://cloud.google.com/docs/authentication/application-default-credentials) for the Google Storage Bucket** +**We expect that you provide the +[required credentials](https://cloud.google.com/docs/authentication/application-default-credentials) +for the Google Storage Bucket** ## Run with Docker @@ -241,7 +269,7 @@ required you can run the CLI as a Docker container: ```shell # TODO (Helmut): Explain about the environment docker run helmuthva/aignostics-python-sdk --help -docker run helmuthva/aignostics-python-sdk platform health +docker run helmuthva/aignostics-python-sdk system health ``` Running via docker compose is supported as well. The .env is passed through from @@ -249,7 +277,7 @@ the host to the Docker container automatically. ```shell docker compose run aignostics --help -docker compose run aignostics platform health +docker compose run aignostics system health ``` @@ -348,13 +376,27 @@ When the application run is cancelled, either by the system or by the user, only ## Further Reading -* Inspect our [security policy](https://aignostics.readthedocs.io/en/latest/security.html) with detailed documentation of checks, tools and principles. -* Check out the [CLI Reference](https://aignostics.readthedocs.io/en/latest/cli_reference.html) with detailed documentation of all CLI commands and options. -* Check out the [Library Reference](https://aignostics.readthedocs.io/en/latest/lib_reference.html) with detailed documentation of public classes and functions. -* Check out the [API Reference](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) with detailed documentation of all API operations and parameters. -* Our [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) provide a complete log of recent improvements and changes. -* In case you want to help us improve 🔬 Aignostics Python SDK: The [contribution guidelines](https://aignostics.readthedocs.io/en/latest/contributing.html) explain how to setup your development environment and create pull requests. -* We gratefully acknowledge the [open source projects](https://aignostics.readthedocs.io/en/latest/attributions.html) that this project builds upon. Thank you to all these wonderful contributors! +- Inspect our + [security policy](https://aignostics.readthedocs.io/en/latest/security.html) + with detailed documentation of checks, tools and principles. +- Check out the + [CLI reference](https://aignostics.readthedocs.io/en/latest/cli_reference.html) + with detailed documentation of all CLI commands and options. +- Check out the + [library reference](https://aignostics.readthedocs.io/en/latest/lib_reference.html) + with detailed documentation of public classes and functions. +- Check out the + [API reference](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) + with detailed documentation of all API operations and parameters. +- Our + [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) + provide a complete log of recent improvements and changes. +- In case you want to help us improve 🔬 Aignostics Python SDK: The + [contribution guidelines](https://aignostics.readthedocs.io/en/latest/contributing.html) + explain how to setup your development environment and create pull requests. +- We gratefully acknowledge the + [open source projects](https://aignostics.readthedocs.io/en/latest/attributions.html) + that this project builds upon. Thank you to all these wonderful contributors! ## Star History diff --git a/SERVICE_CONNECTIONS.md b/SERVICE_CONNECTIONS.md index 9208bd3c..4ffcf025 100644 --- a/SERVICE_CONNECTIONS.md +++ b/SERVICE_CONNECTIONS.md @@ -75,6 +75,82 @@ 4. Enable Dependabot security updates 5. CodeQL analyis will be automatically set up via a GitHub action + +## Error monitoring and profiling with Sentry + +1. Goto https://sentry.io/ and sign-in - it's free for solo devs +2. Follow the instructions to create a new project and get the DSN. Copy the + value of the token into your clipboard. +3. For your local environment: Open your local `.env` file and set the + `AIGNOSTICS_SENTRY_DSN` variable to the value of the token from your + clipboard. You can check `.env.example` for the correct format. +4. For the test, preview and production stage: Goto + https://github.com/aignostics/python-sdk/settings/secrets/actions/new + and create a new repository secret called `AIGNOSTICS_SENTRY_DSN`, + pasting from your clipboard. + +## Logging and metrics with Logfire + +1. Goto https://pydantic.dev/logfire and sign-in - it's free for up to 10 + million spans/metrics per month. +2. Follow the instructions to create a new project and get the write token. Copy + the value of the token into your clipboard. +3. For your local environment: Open your local `.env` file and set the + `AIGNOSTICS_LOGFIRE_TOKEN` variable to the value of the token from + your clipboard. You can check `.env.example` for the correct format. +4. For the test, preview and production stage: Goto + https://github.com/aignostics/python-sdk/settings/secrets/actions/new + and create a new repository secret called `AIGNOSTICS_SENTRY_DSN`, + pasting from your clipboard. + +## Uptime monitoring with betterstack + +1. Goto https://betterstack.com/ and sign-in - it's free for up to 10 monitors + and one status page +2. Create a monitor pointing to the `/api/v1/healthz` endpoint of your API on + your production environment. +3. Create a status page in betterstack and add the monitor you created +4. Goto Advanced Settings / Github badge for your monitor on Betterstack and + copy the badge for yaml +5. Run copier update and paste the snippet when asked for it + +## Deploying webservice to Vercel as serverless function (optional) + +1. Ensure you enabled Vercel deployment when creating or updating the project. + If not, enable with `copier update` +2. Goto https://vercel.com/ and sign-in - it's free for solo devs and open + source projects +3. Execute `pnpm i -g vercel@latest` to install or update the Vercel CLI, see + https://vercel.com/docs/cli. +4. Execute `vercel login` to login to your Vercel account +5. In Vercel create a new project +6. Execute `vercel link` and link your repository to the newly created project +7. Execute `cat .vercel/project.json` to show the orgId and projectId +8. Goto + https://github.com/aignostics/python-sdk/settings/secrets/actions/new + and create a new repository secret called `VERCEL_ORG_ID`, copy and pasting + from the output of step 6. +9. Goto + https://github.com/aignostics/python-sdk/settings/secrets/actions/new + and create a new repository secret called `VERCEL_PROJECT_ID`, copy and + pasting from the output of step 6 +10. Goto `https://vercel.com/account/tokens` and create a new token called + `oe-python-template`. Copy the value of the token into your clipboard. +11. Goto + https://github.com/aignostics/python-sdk/settings/secrets/actions/new + and create a new repository secret called `VERCEL_TOKEN`, pasting from your + clipboard. +12. In your Vercel project go to Settings > Deployment Protection, enable + Protection Bypass for Automation, and copy the token it your clipboard. +13. Goto + https://github.com/aignostics/python-sdk/settings/secrets/actions/new + and create a new repository secret called `VERCEL_AUTOMATION_BYPASS_SECRET`, pasting from your + clipboard. This is so the smoke test post deploy via GitHub Action can validate + the deployment was successful. +14. Optional: In your Vercel project go to Settings > Environment Variables > Environments, and + add environment variables with key 'AIGNOSTICS_LOGFIRE_TOKEN' + and 'AIGNOSTICS_SENTRY_DSN' - check your `.env` file for the values + ## Polishing GitHub repository 1. Goto https://github.com/aignostics/python-sdk diff --git a/codegen/out/.openapi-generator/FILES b/codegen/out/.openapi-generator/FILES index 1a1f5837..b31b9c51 100644 --- a/codegen/out/.openapi-generator/FILES +++ b/codegen/out/.openapi-generator/FILES @@ -37,4 +37,3 @@ aignx/codegen/models/version_creation_response.py aignx/codegen/models/version_read_response.py aignx/codegen/rest.py docs/ExternalsApi.md -test/test_externals_api.py diff --git a/codegen/out/aignx/codegen/api/externals_api.py b/codegen/out/aignx/codegen/api/externals_api.py index 34da838a..4a9069a1 100644 --- a/codegen/out/aignx/codegen/api/externals_api.py +++ b/codegen/out/aignx/codegen/api/externals_api.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -3649,3 +3650,5 @@ def _register_version_v1_versions_post_serialize( _host=_host, _request_auth=_request_auth ) + + diff --git a/codegen/out/aignx/codegen/api_client.py b/codegen/out/aignx/codegen/api_client.py index 28ff5b57..5cfc4b77 100644 --- a/codegen/out/aignx/codegen/api_client.py +++ b/codegen/out/aignx/codegen/api_client.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference diff --git a/codegen/out/aignx/codegen/configuration.py b/codegen/out/aignx/codegen/configuration.py index 8657b694..07635c4c 100644 --- a/codegen/out/aignx/codegen/configuration.py +++ b/codegen/out/aignx/codegen/configuration.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference diff --git a/codegen/out/aignx/codegen/exceptions.py b/codegen/out/aignx/codegen/exceptions.py index c83a99c1..c5e6b23d 100644 --- a/codegen/out/aignx/codegen/exceptions.py +++ b/codegen/out/aignx/codegen/exceptions.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference diff --git a/codegen/out/aignx/codegen/models/application_read_response.py b/codegen/out/aignx/codegen/models/application_read_response.py index 0e7868ec..6bd4c16e 100644 --- a/codegen/out/aignx/codegen/models/application_read_response.py +++ b/codegen/out/aignx/codegen/models/application_read_response.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -90,3 +91,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "description": obj.get("description") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/application_run_status.py b/codegen/out/aignx/codegen/models/application_run_status.py index 15c12aa7..7c165877 100644 --- a/codegen/out/aignx/codegen/models/application_run_status.py +++ b/codegen/out/aignx/codegen/models/application_run_status.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -38,3 +39,5 @@ class ApplicationRunStatus(str, Enum): def from_json(cls, json_str: str) -> Self: """Create an instance of ApplicationRunStatus from a JSON string""" return cls(json.loads(json_str)) + + diff --git a/codegen/out/aignx/codegen/models/application_version.py b/codegen/out/aignx/codegen/models/application_version.py index 897acf35..e8a56270 100644 --- a/codegen/out/aignx/codegen/models/application_version.py +++ b/codegen/out/aignx/codegen/models/application_version.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -131,3 +132,5 @@ def to_dict(self) -> Optional[Union[Dict[str, Any], SlugVersionRequest, str]]: def to_str(self) -> str: """Returns the string representation of the actual instance""" return pprint.pformat(self.model_dump()) + + diff --git a/codegen/out/aignx/codegen/models/application_version_read_response.py b/codegen/out/aignx/codegen/models/application_version_read_response.py index 39569858..bac87039 100644 --- a/codegen/out/aignx/codegen/models/application_version_read_response.py +++ b/codegen/out/aignx/codegen/models/application_version_read_response.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -125,3 +126,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "output_artifacts": [OutputArtifactReadResponse.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/http_validation_error.py b/codegen/out/aignx/codegen/models/http_validation_error.py index c4c2ccad..009df7c1 100644 --- a/codegen/out/aignx/codegen/models/http_validation_error.py +++ b/codegen/out/aignx/codegen/models/http_validation_error.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -90,3 +91,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "detail": [ValidationError.from_dict(_item) for _item in obj["detail"]] if obj.get("detail") is not None else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/input_artifact.py b/codegen/out/aignx/codegen/models/input_artifact.py index c9d22bf7..646b7289 100644 --- a/codegen/out/aignx/codegen/models/input_artifact.py +++ b/codegen/out/aignx/codegen/models/input_artifact.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -94,3 +95,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "metadata_schema": obj.get("metadata_schema") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/input_artifact_creation_request.py b/codegen/out/aignx/codegen/models/input_artifact_creation_request.py index 81dab994..c97cf129 100644 --- a/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +++ b/codegen/out/aignx/codegen/models/input_artifact_creation_request.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -87,3 +88,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "metadata": obj.get("metadata") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/input_artifact_read_response.py b/codegen/out/aignx/codegen/models/input_artifact_read_response.py index 7c16a4cd..2f95578a 100644 --- a/codegen/out/aignx/codegen/models/input_artifact_read_response.py +++ b/codegen/out/aignx/codegen/models/input_artifact_read_response.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -94,3 +95,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "metadata_schema": obj.get("metadata_schema") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py b/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py index 1e18e972..ac0ebb60 100644 --- a/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py +++ b/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -86,3 +87,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "metadata_schema": obj.get("metadata_schema") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/item_creation_request.py b/codegen/out/aignx/codegen/models/item_creation_request.py index bca56b62..2e77ef0e 100644 --- a/codegen/out/aignx/codegen/models/item_creation_request.py +++ b/codegen/out/aignx/codegen/models/item_creation_request.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -92,3 +93,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "input_artifacts": [InputArtifactCreationRequest.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/item_result_read_response.py b/codegen/out/aignx/codegen/models/item_result_read_response.py index c5bf257d..a6e3093e 100644 --- a/codegen/out/aignx/codegen/models/item_result_read_response.py +++ b/codegen/out/aignx/codegen/models/item_result_read_response.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -106,3 +107,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "output_artifacts": [OutputArtifactResultReadResponse.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/item_status.py b/codegen/out/aignx/codegen/models/item_status.py index 92f1064a..3a12d81f 100644 --- a/codegen/out/aignx/codegen/models/item_status.py +++ b/codegen/out/aignx/codegen/models/item_status.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -36,3 +37,5 @@ class ItemStatus(str, Enum): def from_json(cls, json_str: str) -> Self: """Create an instance of ItemStatus from a JSON string""" return cls(json.loads(json_str)) + + diff --git a/codegen/out/aignx/codegen/models/output_artifact.py b/codegen/out/aignx/codegen/models/output_artifact.py index ee4a3ae0..7df90d2f 100644 --- a/codegen/out/aignx/codegen/models/output_artifact.py +++ b/codegen/out/aignx/codegen/models/output_artifact.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -100,3 +101,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "visibility": obj.get("visibility") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/output_artifact_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_read_response.py index 4e296bb3..3a1cf86a 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_read_response.py +++ b/codegen/out/aignx/codegen/models/output_artifact_read_response.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -97,3 +98,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "scope": obj.get("scope") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py index a1d9fa10..5507cfcc 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +++ b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -103,3 +104,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "download_url": obj.get("download_url") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py b/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py index d38bfb2d..4c948652 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py +++ b/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -92,3 +93,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "metadata_schema": obj.get("metadata_schema") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/output_artifact_scope.py b/codegen/out/aignx/codegen/models/output_artifact_scope.py index b3359895..9aa4591c 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_scope.py +++ b/codegen/out/aignx/codegen/models/output_artifact_scope.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -32,3 +33,5 @@ class OutputArtifactScope(str, Enum): def from_json(cls, json_str: str) -> Self: """Create an instance of OutputArtifactScope from a JSON string""" return cls(json.loads(json_str)) + + diff --git a/codegen/out/aignx/codegen/models/output_artifact_visibility.py b/codegen/out/aignx/codegen/models/output_artifact_visibility.py index 5e72dccc..531a9789 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_visibility.py +++ b/codegen/out/aignx/codegen/models/output_artifact_visibility.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -32,3 +33,5 @@ class OutputArtifactVisibility(str, Enum): def from_json(cls, json_str: str) -> Self: """Create an instance of OutputArtifactVisibility from a JSON string""" return cls(json.loads(json_str)) + + diff --git a/codegen/out/aignx/codegen/models/payload_input_artifact.py b/codegen/out/aignx/codegen/models/payload_input_artifact.py index da82bcb6..24cd013a 100644 --- a/codegen/out/aignx/codegen/models/payload_input_artifact.py +++ b/codegen/out/aignx/codegen/models/payload_input_artifact.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -87,3 +88,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "download_url": obj.get("download_url") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/payload_item.py b/codegen/out/aignx/codegen/models/payload_item.py index 6ff5fc09..93fbcbae 100644 --- a/codegen/out/aignx/codegen/models/payload_item.py +++ b/codegen/out/aignx/codegen/models/payload_item.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -112,3 +113,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/payload_output_artifact.py b/codegen/out/aignx/codegen/models/payload_output_artifact.py index 8d6b98d5..90a07f79 100644 --- a/codegen/out/aignx/codegen/models/payload_output_artifact.py +++ b/codegen/out/aignx/codegen/models/payload_output_artifact.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -93,3 +94,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "metadata": TransferUrls.from_dict(obj["metadata"]) if obj.get("metadata") is not None else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/run_creation_request.py b/codegen/out/aignx/codegen/models/run_creation_request.py index 371f032f..b1565284 100644 --- a/codegen/out/aignx/codegen/models/run_creation_request.py +++ b/codegen/out/aignx/codegen/models/run_creation_request.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -96,3 +97,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "items": [ItemCreationRequest.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/run_creation_response.py b/codegen/out/aignx/codegen/models/run_creation_response.py index 295aace8..2772483c 100644 --- a/codegen/out/aignx/codegen/models/run_creation_response.py +++ b/codegen/out/aignx/codegen/models/run_creation_response.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -82,3 +83,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "application_run_id": obj.get("application_run_id") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/run_read_response.py b/codegen/out/aignx/codegen/models/run_read_response.py index f4653f19..7e8df261 100644 --- a/codegen/out/aignx/codegen/models/run_read_response.py +++ b/codegen/out/aignx/codegen/models/run_read_response.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -105,3 +106,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "triggered_by": obj.get("triggered_by") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/slug_version_request.py b/codegen/out/aignx/codegen/models/slug_version_request.py index 70ddb318..78d45d67 100644 --- a/codegen/out/aignx/codegen/models/slug_version_request.py +++ b/codegen/out/aignx/codegen/models/slug_version_request.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -92,3 +93,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "version": obj.get("version") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/transfer_urls.py b/codegen/out/aignx/codegen/models/transfer_urls.py index c202ff4a..f7c2e90c 100644 --- a/codegen/out/aignx/codegen/models/transfer_urls.py +++ b/codegen/out/aignx/codegen/models/transfer_urls.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -85,3 +86,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "download_url": obj.get("download_url") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/user_payload.py b/codegen/out/aignx/codegen/models/user_payload.py index de12f128..e6b58e13 100644 --- a/codegen/out/aignx/codegen/models/user_payload.py +++ b/codegen/out/aignx/codegen/models/user_payload.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -114,3 +115,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "items": [PayloadItem.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/validation_error.py b/codegen/out/aignx/codegen/models/validation_error.py index 6c2061b9..c2d41de2 100644 --- a/codegen/out/aignx/codegen/models/validation_error.py +++ b/codegen/out/aignx/codegen/models/validation_error.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -94,3 +95,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "type": obj.get("type") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/validation_error_loc_inner.py b/codegen/out/aignx/codegen/models/validation_error_loc_inner.py index 7a396747..b2c780be 100644 --- a/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +++ b/codegen/out/aignx/codegen/models/validation_error_loc_inner.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -133,3 +134,5 @@ def to_dict(self) -> Optional[Union[Dict[str, Any], int, str]]: def to_str(self) -> str: """Returns the string representation of the actual instance""" return pprint.pformat(self.model_dump()) + + diff --git a/codegen/out/aignx/codegen/models/version_creation_request.py b/codegen/out/aignx/codegen/models/version_creation_request.py index b8366a1c..2dfc7257 100644 --- a/codegen/out/aignx/codegen/models/version_creation_request.py +++ b/codegen/out/aignx/codegen/models/version_creation_request.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -108,3 +109,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "output_artifacts": [OutputArtifactSchemaCreationRequest.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/version_creation_response.py b/codegen/out/aignx/codegen/models/version_creation_response.py index f34891b5..c84ea15f 100644 --- a/codegen/out/aignx/codegen/models/version_creation_response.py +++ b/codegen/out/aignx/codegen/models/version_creation_response.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -82,3 +83,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "application_version_id": obj.get("application_version_id") }) return _obj + + diff --git a/codegen/out/aignx/codegen/models/version_read_response.py b/codegen/out/aignx/codegen/models/version_read_response.py index 66c0611c..52f01af2 100644 --- a/codegen/out/aignx/codegen/models/version_read_response.py +++ b/codegen/out/aignx/codegen/models/version_read_response.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference @@ -118,3 +119,5 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "created_at": obj.get("created_at") }) return _obj + + diff --git a/codegen/out/aignx/codegen/rest.py b/codegen/out/aignx/codegen/rest.py index a9c1d729..401902fb 100644 --- a/codegen/out/aignx/codegen/rest.py +++ b/codegen/out/aignx/codegen/rest.py @@ -1,3 +1,4 @@ +# coding: utf-8 """ PAPI API Reference diff --git a/codegen/out/docs/ExternalsApi.md b/codegen/out/docs/ExternalsApi.md index 552d9cde..59e61f75 100644 --- a/codegen/out/docs/ExternalsApi.md +++ b/codegen/out/docs/ExternalsApi.md @@ -876,3 +876,4 @@ No authorization required **422** | Validation Error | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/compose.yaml b/compose.yaml index 3b3a4c2d..204084ca 100644 --- a/compose.yaml +++ b/compose.yaml @@ -3,15 +3,33 @@ services: build: . env_file: - path: .env - required: true + required: false develop: watch: - path: src action: rebuild - - path: codegen - action: rebuild restart: no profiles: - manual tty: true stdin_open: true + aignostics-api: + build: . + env_file: + - path: .env + required: false + develop: + watch: + - path: src + action: rebuild + command: serve --host=0.0.0.0 --port=8000 --no-watch + restart: always + ports: + - "8000:8000" + healthcheck: + test: [ "CMD", "curl", "-f", "http://127.0.0.1:8000/healthz" ] + interval: 5s + timeout: 2s + retries: 3 + start_period: 5s + start_interval: 1s diff --git a/docs/Makefile b/docs/Makefile index 4de76f95..3a741560 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -3,7 +3,7 @@ # You can set these variables from the command line, and also # from the environment for the first two. -SPHINXOPTS ?= -E -W --keep-going +SPHINXOPTS ?= -E --keep-going SPHINXBUILD ?= sphinx-build SOURCEDIR = source BUILDDIR = build diff --git a/docs/make.bat b/docs/make.bat index dc1312ab..747ffb7b 100644 --- a/docs/make.bat +++ b/docs/make.bat @@ -1,35 +1,35 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=source -set BUILDDIR=build - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.https://www.sphinx-doc.org/ - exit /b 1 -) - -if "%1" == "" goto help - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/partials/README_footer.md b/docs/partials/README_footer.md index 5fed0be7..98e6a62d 100644 --- a/docs/partials/README_footer.md +++ b/docs/partials/README_footer.md @@ -1,12 +1,26 @@ ## Further Reading -* Inspect our [security policy](https://aignostics.readthedocs.io/en/latest/security.html) with detailed documentation of checks, tools and principles. -* Check out the [CLI Reference](https://aignostics.readthedocs.io/en/latest/cli_reference.html) with detailed documentation of all CLI commands and options. -* Check out the [Library Reference](https://aignostics.readthedocs.io/en/latest/lib_reference.html) with detailed documentation of public classes and functions. -* Check out the [API Reference](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) with detailed documentation of all API operations and parameters. -* Our [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) provide a complete log of recent improvements and changes. -* In case you want to help us improve 🔬 Aignostics Python SDK: The [contribution guidelines](https://aignostics.readthedocs.io/en/latest/contributing.html) explain how to setup your development environment and create pull requests. -* We gratefully acknowledge the [open source projects](https://aignostics.readthedocs.io/en/latest/attributions.html) that this project builds upon. Thank you to all these wonderful contributors! +- Inspect our + [security policy](https://aignostics.readthedocs.io/en/latest/security.html) + with detailed documentation of checks, tools and principles. +- Check out the + [CLI reference](https://aignostics.readthedocs.io/en/latest/cli_reference.html) + with detailed documentation of all CLI commands and options. +- Check out the + [library reference](https://aignostics.readthedocs.io/en/latest/lib_reference.html) + with detailed documentation of public classes and functions. +- Check out the + [API reference](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) + with detailed documentation of all API operations and parameters. +- Our + [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) + provide a complete log of recent improvements and changes. +- In case you want to help us improve 🔬 Aignostics Python SDK: The + [contribution guidelines](https://aignostics.readthedocs.io/en/latest/contributing.html) + explain how to setup your development environment and create pull requests. +- We gratefully acknowledge the + [open source projects](https://aignostics.readthedocs.io/en/latest/attributions.html) + that this project builds upon. Thank you to all these wonderful contributors! ## Star History diff --git a/docs/partials/README_header.md b/docs/partials/README_header.md index 0b04981d..ae285fb9 100644 --- a/docs/partials/README_header.md +++ b/docs/partials/README_header.md @@ -1,7 +1,6 @@ # 🔬 Aignostics Python SDK -[![License](https://img.shields.io/github/license/aignostics/python-sdk?logo=opensourceinitiative&logoColor=3DA639&labelColor=414042&color=A41831) -](https://github.com/aignostics/python-sdk/blob/main/LICENSE) +[![License](https://img.shields.io/github/license/aignostics/python-sdk?logo=opensourceinitiative&logoColor=3DA639&labelColor=414042&color=A41831)](https://github.com/aignostics/python-sdk/blob/main/LICENSE) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/aignostics.svg?logo=python&color=204361&labelColor=1E2933)](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) [![CI](https://github.com/aignostics/python-sdk/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/aignostics/python-sdk/actions/workflows/test-and-report.yml) [![Read the Docs](https://img.shields.io/readthedocs/aignostics)](https://aignostics.readthedocs.io/en/latest/) @@ -10,7 +9,6 @@ [![Maintainability](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) [![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) - [![Dependabot](https://img.shields.io/badge/dependabot-active-brightgreen?style=flat-square&logo=dependabot)](https://github.com/aignostics/python-sdk/security/dependabot) [![Renovate enabled](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://github.com/aignostics/python-sdk/issues?q=is%3Aissue%20state%3Aopen%20Dependency%20Dashboard) [![Coverage](https://codecov.io/gh/aignostics/python-sdk/graph/badge.svg?token=SX34YRP30E)](https://codecov.io/gh/aignostics/python-sdk) @@ -25,6 +23,7 @@ [![Copier](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-grayscale-inverted-border-orange.json)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template) [![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE3IDE2VjdsLTYgNU0yIDlWOGwxLTFoMWw0IDMgOC04aDFsNCAyIDEgMXYxNGwtMSAxLTQgMmgtMWwtOC04LTQgM0gzbC0xLTF2LTFsMy0zIi8+PC9zdmc+)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/aignostics/python-sdk) [![Open in GitHub Codespaces](https://img.shields.io/static/v1?label=GitHub%20Codespaces&message=Open&color=blue&logo=github)](https://github.com/codespaces/new/aignostics/python-sdk) +[![Better Stack Badge](https://uptime.betterstack.com/status-badges/v1/monitor/1vtu1.svg)](https://aignostics.betteruptime.com/) > [!TIP] -> 📚 [Online documentation](https://aignostics.readthedocs.io/en/latest/) - 📖 [PDF Manual](https://aignostics.readthedocs.io/_/downloads/en/latest/pdf/) +> 📚 [Online documentation](https://aignostics.readthedocs.io/en/latest/) - 📖 +> [PDF Manual](https://aignostics.readthedocs.io/_/downloads/en/latest/pdf/) > [!NOTE] -> 🧠 This project was scaffolded using the template [oe-python-template](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template) with [copier](https://copier.readthedocs.io/). +> 🧠 This project was scaffolded using the template +> [oe-python-template](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template) +> with [copier](https://copier.readthedocs.io/). --- diff --git a/docs/partials/README_main.md b/docs/partials/README_main.md index 6872c866..1e420b88 100644 --- a/docs/partials/README_main.md +++ b/docs/partials/README_main.md @@ -1,4 +1,5 @@ -from aignx.codegen.models import ItemCreationRequestfrom aignx.codegen.models import ItemCreationRequestfrom aignx.codegen.models import RunCreationRequest +from aignx.codegen.models import ItemCreationRequestfrom aignx.codegen.models +import ItemCreationRequestfrom aignx.codegen.models import RunCreationRequest ## Introduction @@ -66,19 +67,19 @@ The CLI is installed as part of the SDK. You can run it from your terminal using the `uvx` command. See as follows for the primary commands: ```shell -uvx aignostics platform health # checks if CLI and Platform are health -uvx aignostics platform info # shows information about the platform -uvx aignostics application list # lists AI applications available for the user +uvx aignostics system health # checks if the Python SDK and the aignostics platform are healthy +uvx aignostics system info # shows information about the configuration and runtime of the system +uvx aignostics application list # lists AI applications available for you # TODO (Helmut): Explain a bit more. ``` The CLI provides extensive help: ```shell -uvx aignostics --help # all CLI commands -uvx aignostics application --help # help for specific topic -uvx aignostics application list --help # help for specific topic -uvx aignostics serve --help +uvx aignostics --help # all subcommands +uvx aignostics application --help # list subcommands in the application space +uvx aignostics application list --help # help for specific command +uvx aignostics application run --help. # list subcommands in the application run space ``` Check out our @@ -87,32 +88,41 @@ to learn about all commands and options available. ## Using the Python SDK in your Codebase -The following sections showcase how you can integrate the Python SDK in your codebase. +The following sections showcase how you can integrate the Python SDK in your +codebase. ### Installation -Adding Aignostics Python SDK to your codebase as a dependency is easy. -You can directly import add the dependency via your favourite package manager, -e.g., [pip](https://pip.pypa.io/en/stable/) or [uv](https://docs.astral.sh/uv/). +Adding Aignostics Python SDK to your codebase as a dependency is easy. You can +directly import add the dependency via your favourite package manager, e.g., +[pip](https://pip.pypa.io/en/stable/) or [uv](https://docs.astral.sh/uv/). + +**Install with uv** -- If you don't have uv installed follow +[these instructions](https://docs.astral.sh/uv/getting-started/installation/). -**Install with uv** -- If you don't have uv installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). ```shell uv add aignostics # add SDK as dependency to your project ``` **Install with pip** + ```shell pip install aignostics # add SDK as dependency to your project ``` ### Usage -Read the [client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) to learn about all classes and methods. +Read the +[client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) +to learn about all classes and methods. -The following snippets showcase the basic code to run an application with the Python SDK. -A more detailed example - including comments - is available in the `examples` folder as Python notebooks: -[examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) (IPython) -[examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) (Marimo). +The following snippets showcase the basic code to run an application with the +Python SDK. A more detailed example - including comments - is available in the +`examples` folder as Python notebooks: +[examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) +(IPython) +[examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) +(Marimo). ```python import aignostics.client @@ -138,13 +148,18 @@ application_run.download_to_folder("path/to/download/folder") ``` ### Authentication Setup -The SDK uses the [OAuth2](https://oauth.net/2/) protocol for authentication. -Please visit [your personal dashboard on the aignostics platform](https://platform.aignostics.com) and scroll to the "Python SDK" section -to find your personalized setup instructions. + +The SDK uses the [OAuth2](https://oauth.net/2/) protocol for authentication. +Please visit +[your personal dashboard on the aignostics platform](https://platform.aignostics.com) +and scroll to the "Python SDK" section to find your personalized setup +instructions. ### Application Run Payloads -The payload expected to trigger an application run is specified by the `RunCreationRequest` pydantic model: +The payload expected to trigger an application run is specified by the +`RunCreationRequest` pydantic model: + ```python RunCreationRequest( application_version=..., @@ -154,8 +169,10 @@ RunCreationRequest( ] ) ``` -Next to the application version of the application you want to run, -it defines the items you want to be processed as `ItemCreationRequest` objects: + +Next to the application version of the application you want to run, it defines +the items you want to be processed as `ItemCreationRequest` objects: + ```python ItemCreationRequest( reference="1", @@ -173,20 +190,29 @@ ItemCreationRequest( ], ), ``` -For each item you want to process, you need to provide a unique `reference` string. -This is used to identify the item in the results later on. -The `input_artifacts` field is a list of `InputArtifactCreationRequest` objects, which defines what data & metadata you need to provide for each item. -The required artifacts depend on the application version you want to run - in the case of test application, there is only one artifact required, which is the image to process on. -The artifact name is defined as `user_slide`. -The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. +For each item you want to process, you need to provide a unique `reference` +string. This is used to identify the item in the results later on. The +`input_artifacts` field is a list of `InputArtifactCreationRequest` objects, +which defines what data & metadata you need to provide for each item. The +required artifacts depend on the application version you want to run - in the +case of test application, there is only one artifact required, which is the +image to process on. The artifact name is defined as `user_slide`. + +The `download_url` is a signed URL that allows the Aignostics Platform to +download the image data later during processing. #### Self-signed URLs for large files -To make the images you want to process available to the Aignostics Platform, you need to provide a signed URL that allows the platform to download the data. -Self-signed URLs for files in google storage buckets can be generated using the `generate_signed_url` ([code](https://github.com/aignostics/python-sdk/blob/407e74f7ae89289b70efd86cbda59ec7414050d5/src/aignostics/client/utils.py#L85)). +To make the images you want to process available to the Aignostics Platform, you +need to provide a signed URL that allows the platform to download the data. +Self-signed URLs for files in google storage buckets can be generated using the +`generate_signed_url` +([code](https://github.com/aignostics/python-sdk/blob/407e74f7ae89289b70efd86cbda59ec7414050d5/src/aignostics/client/utils.py#L85)). -**We expect that you provide the [required credentials](https://cloud.google.com/docs/authentication/application-default-credentials) for the Google Storage Bucket** +**We expect that you provide the +[required credentials](https://cloud.google.com/docs/authentication/application-default-credentials) +for the Google Storage Bucket** ## Run with Docker @@ -196,7 +222,7 @@ required you can run the CLI as a Docker container: ```shell # TODO (Helmut): Explain about the environment docker run helmuthva/aignostics-python-sdk --help -docker run helmuthva/aignostics-python-sdk platform health +docker run helmuthva/aignostics-python-sdk system health ``` Running via docker compose is supported as well. The .env is passed through from @@ -204,5 +230,5 @@ the host to the Docker container automatically. ```shell docker compose run aignostics --help -docker compose run aignostics platform health +docker compose run aignostics system health ``` diff --git a/docs/source/conf.py b/docs/source/conf.py index 16d885f2..dc7dc3eb 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,7 +9,6 @@ "sphinx_toolbox.github", "sphinx_toolbox.source", "sphinx.ext.autodoc", - # "enum_tools.autoenum", # https://github.com/domdfcoding/enum_tools/tree/master # noqa: ERA001 "sphinx.ext.napoleon", # https://sphinxcontrib-napoleon.readthedocs.io/en/latest/ "sphinxcontrib.autodoc_pydantic", # https://autodoc-pydantic.readthedocs.io/en/stable/users/examples.html "sphinx.ext.coverage", diff --git a/docs/source/lib_reference.rst b/docs/source/lib_reference.rst index ff4b9dbf..6d9857bf 100644 --- a/docs/source/lib_reference.rst +++ b/docs/source/lib_reference.rst @@ -1,11 +1,17 @@ Library Reference ================= -.. automodule:: aignostics - :members: - .. automodule:: aignostics.client - :members: +:members: + +.. automodule:: aignostics.application +:members: -.. automodule:: aignx.codegen.api.externals_api - :members: +.. automodule:: aignostics.system +:members: + +.. automodule:: aignostics.utils +:members: + +.. automodule:: aignostics +:members: \ No newline at end of file diff --git a/docs/source/release-notes.rst b/docs/source/release-notes.rst index d76b3abd..831e3af8 100644 --- a/docs/source/release-notes.rst +++ b/docs/source/release-notes.rst @@ -1,4 +1,4 @@ Release Notes ============= -.. mdinclude:: ../../CHANGELOG.md \ No newline at end of file +.. mdinclude:: ../../CHANGELOG.md diff --git a/noxfile.py b/noxfile.py index 32edf5b7..3b2ca886 100644 --- a/noxfile.py +++ b/noxfile.py @@ -262,7 +262,7 @@ def _generate_openapi_schemas(session: nox.Session) -> None: Path("docs/source/_static").mkdir(parents=True, exist_ok=True) formats = { - "yaml": {"ext": "yaml", "args": []}, + "yaml": {"ext": "yaml", "args": ["--output-format=yaml"]}, "json": {"ext": "json", "args": ["--output-format=json"]}, } @@ -272,7 +272,7 @@ def _generate_openapi_schemas(session: nox.Session) -> None: with output_path.open("w", encoding="utf-8") as f: cmd_args = [ "aignostics", - "platform", + "system", "openapi", f"--api-version={version}", *format_info["args"], @@ -465,12 +465,46 @@ def docs_pdf(session: nox.Session) -> None: @nox.session(python=["3.11", "3.12", "3.13"]) def test(session: nox.Session) -> None: """Run tests with pytest.""" - _setup_venv(session, True) + _setup_venv(session) + session.run("rm", "-rf", ".coverage", external=True) + + # Build pytest arguments with skip_with_act filter if needed pytest_args = ["pytest", "--disable-warnings", JUNIT_XML, "-n", "auto", "--dist", "loadgroup"] if _is_act_environment(): pytest_args.extend(["-k", NOT_SKIP_WITH_ACT]) + pytest_args.extend(["-m", "not sequential"]) + pytest_args.extend(session.posargs) + session.run(*pytest_args) + # Sequential tests + sequential_args = [ + "pytest", + "--cov-append", + "--disable-warnings", + JUNIT_XML, + "-n", + "auto", + "--dist", + "loadgroup", + ] + if _is_act_environment(): + sequential_args.extend(["-k", NOT_SKIP_WITH_ACT]) + sequential_args.extend(["-m", "sequential"]) + sequential_args.extend(session.posargs) + + session.run(*sequential_args) + + session.run( + "bash", + "-c", + ( + "docker compose ls --format json | jq -r '.[].Name' | " + "grep ^pytest | xargs -I {} docker compose -p {} down --remove-orphans" + ), + external=True, + ) + @nox.session(python=["3.13"], default=False) def setup(session: nox.Session) -> None: diff --git a/pyproject.toml b/pyproject.toml index 053d5659..de98508a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,9 +63,22 @@ requires-python = ">=3.11, <4.0" dependencies = [ # From Template - "pydantic>=2.11.1", + "fastapi[standard,all]>=0.115.12", + "logfire[system-metrics]>=3.13.1", + "opentelemetry-instrumentation-fastapi>=0.53b0", + "opentelemetry-instrumentation-httpx>=0.53b0", + "opentelemetry-instrumentation-jinja2>=0.53b0", + "opentelemetry-instrumentation-requests>=0.53b0", + "opentelemetry-instrumentation-sqlite3>=0.53b0", + "opentelemetry-instrumentation-tornado>=0.53b0", + "opentelemetry-instrumentation-urllib>=0.53b0", + "opentelemetry-instrumentation-urllib3>=0.53b0", + "psutil>=7.0.0", + "pydantic>=2.11.3", "pydantic-settings>=2.8.1", + "sentry-sdk>=2.25.1", "typer>=0.15.1", + "uptime>=3.0.1", # Custom "appdirs>=1.4.4", "google-cloud-storage>=3.1.0", @@ -74,7 +87,8 @@ dependencies = [ "jsf>=0.11.2", "jsonschema>=4.23.0", "pyjwt[crypto]>=2.10.1", - "python-dotenv>=1.1.0", # Can be removed later + "python-dateutil>=2.9.0.post0", + "pyyaml>=6.0", "requests>=2.32.3", "requests-oauthlib>=2.0.0", "tqdm>=4.67.1", @@ -105,12 +119,12 @@ packages = ["src/aignostics", "codegen/out/aignx"] [project.optional-dependencies] examples = [ "streamlit>=1.44.1", - "marimo>=0.12.2", + "marimo>=0.12.8", "jupyter>=1.1.1", "jinja2>=3.1.6", ] -# formats = ["openslide-python>=1.4.1", "openslide-bin>=4.0.0.6"] aws = ["boto3>=1.37.27"] +# formats = ["openslide-python>=1.4.1", "openslide-bin>=4.0.0.6"] [dependency-groups] dev = [ @@ -124,20 +138,20 @@ dev = [ "matplotlib>=3.10.1", "mypy>=1.5.0", "nox[uv]>=2025.2.9", - "pip-audit>=2.8.0", + "pip-audit>=2.9.0", "pip-licenses @ git+https://github.com/neXenio/pip-licenses.git@master", # https://github.com/raimon49/pip-licenses/pull/224 "pre-commit>=4.1.0", - "pyright>=1.1.398", + "pyright>=1.1.399", "pytest>=8.3.5", "pytest-asyncio>=0.26.0", - "pytest-cov>=6.1.0", - "pytest-docker>=3.2.0", + "pytest-cov>=6.1.1", + "pytest-docker>=3.2.1", "pytest-env>=1.1.5", "pytest-regressions>=2.7.0", "pytest-subprocess>=1.5.3", "pytest-timeout>=2.3.1", "pytest-xdist[psutil]>=3.6.1", - "ruff>=0.11.2", + "ruff>=0.11.5", "sphinx>=8.2.3", "sphinx-autobuild>=2024.10.3", "sphinx-copybutton>=0.5.2", @@ -168,8 +182,9 @@ line-length = 120 extend-exclude = [ ".fixme", "notebook.py", - "playbook.py", # TODO (Helmut): refactor that code and reenable - "codegen", # TODO (Helmut): check if codegen can be tweaked to generate better code + "template/*.py", + "playbook.py", # TODO (Andreas): refactor and reenable, + "codegen", ] [tool.ruff.lint] @@ -199,7 +214,7 @@ ignore = [ ] [tool.ruff.lint.per-file-ignores] -"tests/**/*.py" = [ +"**/tests/**/*.py" = [ # we are more relaxed in tests, while sill applying hundreds of rules "S101", # asserts allowed in tests... "ARG", # unused function args -> fixtures nevertheless are functionally relevant... @@ -263,10 +278,12 @@ asyncio_default_fixture_loop_scope = "function" env = ["COVERAGE_FILE=.coverage", "COVERAGE_PROCESS_START=pyproject.toml"] markers = [ # From Template - "no_extras: tests that do require no extras installed", - "scheduled: tests to run on a schedule", - "sequential: exclude from parallel test execution", - "skip_with_act: don't run with act", + "no_extras: Tests that do require no extras installed.", + "scheduled: Tests to run on a schedule. They will still be part on non-scheduled test executions.", + "sequential: Exclude from parallel test execution.", + "skip_with_act: Don't run with act.", + "docker: tests That require Docker.", + "long_running: Tests that take a long time to run. Tests marked as long runing excluded from execution by default. Enable by passing any -m your_marker that matches a marker of the test.", # Custom # Nothing yet ] diff --git a/sitecustomize.py b/sitecustomize.py new file mode 100644 index 00000000..9302f6b1 --- /dev/null +++ b/sitecustomize.py @@ -0,0 +1,5 @@ +"""Site customization module to enable test coverage computation in subprocesses.""" + +import coverage + +coverage.process_startup() diff --git a/sonar-project.properties b/sonar-project.properties index 6ccf0488..cbda81b8 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -8,6 +8,5 @@ sonar.links.ci=https://github.com/aignostics/python-sdk/actions sonar.links.issues=https://github.com/aignostics/python-sdk/issues sonar.python.coverage.reportPaths=reports/coverage.xml sonar.python.version=3.11, 3.12, 3.13 -sonar.coverage.exclusions=noxfile.py, tests/**, examples/**, docs/**, codegen/** -sonar.exclusions=examples/**, docs/**, codegen/** -sonar.cpd.exclusions=noxfile.py +sonar.coverage.exclusions=noxfile.py, template/**, tests/**, examples/**, docs/**, dist/**, dist_vercel/**, codegen/** +sonar.exclusions=template/**, examples/**, docs/**, dist/**, dist_vercel/**, codegen/** \ No newline at end of file diff --git a/src/aignostics/__init__.py b/src/aignostics/__init__.py index ff6f960d..2e4b3883 100644 --- a/src/aignostics/__init__.py +++ b/src/aignostics/__init__.py @@ -1,68 +1,6 @@ -"""Python SDK providing access to Aignostics AI services.""" +"""Copier template to scaffold Python projects compliant with best practices and modern tooling.""" -from .constants import ( - API_ROOT_DEV, - API_ROOT_PRODUCTION, - API_ROOT_STAGING, - AUDIENCE_DEV, - AUDIENCE_PRODUCTION, - AUDIENCE_STAGING, - AUTHORIZATION_BASE_URL_DEV, - AUTHORIZATION_BASE_URL_PRODUCTION, - AUTHORIZATION_BASE_URL_STAGING, - DEVICE_URL_DEV, - DEVICE_URL_PRODUCTION, - DEVICE_URL_STAGING, - JWS_JSON_URL_DEV, - JWS_JSON_URL_PRODUCTION, - JWS_JSON_URL_STAGING, - REDIRECT_URI_DEV, - REDIRECT_URI_PRODUCTION, - REDIRECT_URI_STAGING, - TOKEN_URL_DEV, - TOKEN_URL_PRODUCTION, - TOKEN_URL_STAGING, - __project_name__, - __project_path__, - __version__, -) -from .exceptions import OpenAPISchemaError -from .models import Health, HealthStatus -from .platform import Platform -from .types import APIVersion, InfoOutputFormat, JsonType, JsonValue, OpenAPIOutputFormat +from .constants import MODULES_TO_INSTRUMENT +from .utils.boot import boot -__all__ = [ - "API_ROOT_DEV", - "API_ROOT_PRODUCTION", - "API_ROOT_STAGING", - "AUDIENCE_DEV", - "AUDIENCE_PRODUCTION", - "AUDIENCE_STAGING", - "AUTHORIZATION_BASE_URL_DEV", - "AUTHORIZATION_BASE_URL_PRODUCTION", - "AUTHORIZATION_BASE_URL_STAGING", - "DEVICE_URL_DEV", - "DEVICE_URL_PRODUCTION", - "DEVICE_URL_STAGING", - "JWS_JSON_URL_DEV", - "JWS_JSON_URL_PRODUCTION", - "JWS_JSON_URL_STAGING", - "REDIRECT_URI_DEV", - "REDIRECT_URI_PRODUCTION", - "REDIRECT_URI_STAGING", - "TOKEN_URL_DEV", - "TOKEN_URL_PRODUCTION", - "TOKEN_URL_STAGING", - "APIVersion", - "Health", - "HealthStatus", - "InfoOutputFormat", - "JsonType", - "JsonValue", - "OpenAPIOutputFormat", - "OpenAPISchemaError", - "Platform", - "__project_name__", - "__project_path__", - "__version__", -] +boot(modules_to_instrument=MODULES_TO_INSTRUMENT) diff --git a/src/aignostics/application/__init__.py b/src/aignostics/application/__init__.py new file mode 100644 index 00000000..7a274f1c --- /dev/null +++ b/src/aignostics/application/__init__.py @@ -0,0 +1,7 @@ +"""Application module.""" + +from ._cli import cli + +__all__ = [ + "cli", +] diff --git a/src/aignostics/application/_cli.py b/src/aignostics/application/_cli.py new file mode 100644 index 00000000..a861a301 --- /dev/null +++ b/src/aignostics/application/_cli.py @@ -0,0 +1,107 @@ +"""CLI (Command Line Interface) of Aignostics Python SDK.""" + +import typer + +import aignostics.client +from aignostics.utils import console, get_logger + +logger = get_logger(__name__) + +cli = typer.Typer(name="application", help="Application commands") + +bucket_app = typer.Typer() +cli.add_typer(bucket_app, name="bucket", help="Transfer bucket provide by platform") + +datasset_app = typer.Typer() +cli.add_typer(datasset_app, name="dataset", help="Datasets for use as input for applications") + +metadata_app = typer.Typer() +cli.add_typer(metadata_app, name="metadata", help="Metadata required as input for applications") + +run_app = typer.Typer() +cli.add_typer(run_app, name="run", help="Runs of applications") + +result_app = typer.Typer() +run_app.add_typer(result_app, name="result", help="Results of applications runs") + + +@bucket_app.command("ls") +def bucket_ls() -> None: + """List contents of tranfer bucket.""" + console.print("bucket ls") + + +@bucket_app.command("purge") +def bucket_purge() -> None: + """Purge content of transfer bucket.""" + console.print("bucket purged.") + + +@cli.command("list") +def application_list() -> None: + """List available applications.""" + client = aignostics.client.Client() + applications = client.applications.list() + console.print(applications) + + +@cli.command("describe") +def application_describe() -> None: + """Describe application.""" + console.print("describe application") + + +@datasset_app.command("download") +def dataset_download() -> None: + """Download dataset.""" + console.print("dataset download") + + +@metadata_app.command("generate") +def metadata_generate() -> None: + """Generate metadata.""" + console.print("generate metadata") + + +@run_app.command("submit") +def run_submit() -> None: + """Create run.""" + console.print("submit run") + + +@run_app.command("list") +def run_list() -> None: + """List runs.""" + client = aignostics.client.Client() + runs = client.runs.list() + console.print(runs) + + +@run_app.command("describe") +def run_describe() -> None: + """Describe run.""" + console.print("The run") + + +@run_app.command("cancel") +def run_cancel() -> None: + """Cancel run.""" + console.print("canceled run") + + +@result_app.command("describe") +def result_describe() -> None: + """Describe the result of an application run.""" + console.print("describe result") + + +@result_app.command("download") +def result_download() -> None: + """Download the result of an application run.""" + console.print("download result") + + +@result_app.command("delete") +def result_delete() -> None: + """Delete the result of an application run.""" + console.print("delete resuilt") diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index 8936a522..df05e0b4 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -1,172 +1,22 @@ """CLI (Command Line Interface) of Aignostics Python SDK.""" -from typing import Annotated +import sys import typer -import yaml -import aignostics.client +from .constants import MODULES_TO_INSTRUMENT +from .utils import __version__, boot, console, get_logger, prepare_cli -from . import APIVersion, InfoOutputFormat, OpenAPIOutputFormat, Platform, __version__ -from .utils import console, prepare_cli +boot(MODULES_TO_INSTRUMENT) +logger = get_logger(__name__) -_platform = Platform() -cli = typer.Typer(help="Command Line Interface of the aignostics platform") - -platform_app = typer.Typer() -cli.add_typer(platform_app, name="platform", help="Platform diagnostics and utilities") - -bucket_app = typer.Typer() -platform_app.add_typer(bucket_app, name="bucket", help="Transfer bucket provide by platform") - -application_app = typer.Typer() -cli.add_typer(application_app, name="application", help="aignostics applications") - -datasset_app = typer.Typer() -application_app.add_typer(datasset_app, name="dataset", help="Datasets for use as input for applications") - -metadata_app = typer.Typer() -application_app.add_typer(metadata_app, name="metadata", help="Metadata required as input for applications") - -run_app = typer.Typer() -application_app.add_typer(run_app, name="run", help="Runs of applications") - -result_app = typer.Typer() -run_app.add_typer(result_app, name="result", help="Results of applications runs") - - -@platform_app.command("install") -def install() -> None: - """Complete and validate installation of the CLI.""" - _platform.install() - - -@platform_app.command("health") -def health() -> None: - """Indicate if aignostics platform is healthy.""" - console.print(_platform.healthy()) - - -@platform_app.command("info") -def info( - output_format: Annotated[ - InfoOutputFormat, typer.Option(help="Output format", case_sensitive=False) - ] = InfoOutputFormat.YAML, - env: Annotated[bool, typer.Option(help="Include environment variables in output")] = False, - filter_secrets: Annotated[bool, typer.Option(help="Filter out secret values from environment variables")] = True, -) -> None: - """Print info about service configuration.""" - info = _platform.info(env=env, filter_secrets=filter_secrets) - match output_format: - case InfoOutputFormat.JSON: - console.print_json(data=info) - case InfoOutputFormat.YAML: - console.print(yaml.dump(info, default_flow_style=False), end="") - - -@platform_app.command("openapi") -def openapi( - api_version: Annotated[APIVersion, typer.Option(help="API Version", case_sensitive=False)] = APIVersion.V1, - output_format: Annotated[ - OpenAPIOutputFormat, typer.Option(help="Output format", case_sensitive=False) - ] = OpenAPIOutputFormat.YAML, -) -> None: - """Dump the OpenAPI specification of to stdout.""" - match api_version: - case APIVersion.V1: - schema = Platform.openapi_schema() - match output_format: - case OpenAPIOutputFormat.JSON: - console.print_json(data=schema) - case OpenAPIOutputFormat.YAML: - console.print(yaml.dump(schema, default_flow_style=False), end="") - - -@bucket_app.command("ls") -def bucket_ls() -> None: - """List contents of tranfer bucket.""" - console.print("bucket ls") - - -@bucket_app.command("purge") -def bucket_purge() -> None: - """Purge content of transfer bucket.""" - console.print("bucket purged.") - - -@application_app.command("list") -def application_list() -> None: - """List available applications.""" - papi_client = aignostics.client.Client() - applications = papi_client.applications.list() - console.print(applications) - - -@application_app.command("describe") -def application_describe() -> None: - """Describe application.""" - papi_client = aignostics.client.Client() - applications = papi_client.applications.list() - console.print(applications) - - -@datasset_app.command("download") -def dataset_download() -> None: - """Download dataset.""" - console.print("dataset download") - - -@metadata_app.command("generate") -def metadata_generate() -> None: - """Generate metadata.""" - console.print("generate metadata") - - -@run_app.command("submit") -def run_submit() -> None: - """Create run.""" - console.print("submit run") - - -@run_app.command("list") -def run_list() -> None: - """List runs.""" - papi_client = aignostics.client.Client() - runs = papi_client.runs.list() - console.print(runs) - - -@run_app.command("describe") -def run_describe() -> None: - """Describe run.""" - console.print("The run") - - -@run_app.command("cancel") -def run_cancel() -> None: - """Cancel run.""" - console.print("canceled run") - - -@result_app.command("describe") -def result_describe() -> None: - """Describe the result of an application run.""" - console.print("describe result") - - -@result_app.command("download") -def result_download() -> None: - """Download the result of an application run.""" - console.print("download result") - - -@result_app.command("delete") -def result_delete() -> None: - """Delete the result of an application run.""" - console.print("delete resuilt") - - -prepare_cli(cli, f"🔬 Aignostics Python SDK v{__version__} - built with love in Berlin 🐻") +cli = typer.Typer(help="Command Line Interface of ") +prepare_cli(cli, f"🧠 Aignostics Python SDK v{__version__} - built with love in Berlin 🐻") if __name__ == "__main__": # pragma: no cover - cli() # pragma: no cover + try: + cli() + except Exception as e: # noqa: BLE001 + logger.critical("Fatal error occurred: %s", e) + console.print(f"Fatal error occurred: {e}", style="error") + sys.exit(1) diff --git a/src/aignostics/client/__init__.py b/src/aignostics/client/__init__.py index 25bb963c..7751e43f 100644 --- a/src/aignostics/client/__init__.py +++ b/src/aignostics/client/__init__.py @@ -6,13 +6,64 @@ for all interactions with the Aignostics platform. """ -from aignostics.client._client import Client -from aignostics.client._messages import AUTHENTICATION_FAILED, NOT_YET_IMPLEMENTED -from aignostics.client._settings import authentication_settings +from ._client import Client +from ._constants import ( + API_ROOT_DEV, + API_ROOT_PRODUCTION, + API_ROOT_STAGING, + AUDIENCE_DEV, + AUDIENCE_PRODUCTION, + AUDIENCE_STAGING, + AUTHORIZATION_BASE_URL_DEV, + AUTHORIZATION_BASE_URL_PRODUCTION, + AUTHORIZATION_BASE_URL_STAGING, + DEVICE_URL_DEV, + DEVICE_URL_PRODUCTION, + DEVICE_URL_STAGING, + JWS_JSON_URL_DEV, + JWS_JSON_URL_PRODUCTION, + JWS_JSON_URL_STAGING, + REDIRECT_URI_DEV, + REDIRECT_URI_PRODUCTION, + REDIRECT_URI_STAGING, + TOKEN_URL_DEV, + TOKEN_URL_PRODUCTION, + TOKEN_URL_STAGING, +) +from ._messages import AUTHENTICATION_FAILED, NOT_YET_IMPLEMENTED, UNKNOWN_ENDPOINT_URL +from ._settings import Settings, settings +from ._utils import calculate_file_crc32c, download_file, mime_type_to_file_ending __all__ = [ + "API_ROOT_DEV", + "API_ROOT_PRODUCTION", + "API_ROOT_STAGING", + "AUDIENCE_DEV", + "AUDIENCE_PRODUCTION", + "AUDIENCE_STAGING", "AUTHENTICATION_FAILED", + "AUTHORIZATION_BASE_URL_DEV", + "AUTHORIZATION_BASE_URL_PRODUCTION", + "AUTHORIZATION_BASE_URL_STAGING", + "DEVICE_URL_DEV", + "DEVICE_URL_PRODUCTION", + "DEVICE_URL_STAGING", + "JWS_JSON_URL_DEV", + "JWS_JSON_URL_PRODUCTION", + "JWS_JSON_URL_STAGING", "NOT_YET_IMPLEMENTED", + "NOT_YET_IMPLEMENTED", + "REDIRECT_URI_DEV", + "REDIRECT_URI_PRODUCTION", + "REDIRECT_URI_STAGING", + "TOKEN_URL_DEV", + "TOKEN_URL_PRODUCTION", + "TOKEN_URL_STAGING", + "UNKNOWN_ENDPOINT_URL", "Client", - "authentication_settings", + "Settings", + "calculate_file_crc32c", + "download_file", + "mime_type_to_file_ending", + "settings", ] diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index 93c4fbfd..cf5957f6 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -1,4 +1,3 @@ -import errno import socket import time import typing as t @@ -14,8 +13,8 @@ from pydantic import BaseModel, SecretStr from requests_oauthlib import OAuth2Session -from aignostics.client._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI -from aignostics.client._settings import authentication_settings +from ._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI +from ._settings import settings CALLBACK_PORT_RETRY_COUNT = 5 @@ -41,8 +40,8 @@ def get_token(use_cache: bool = True, use_device_flow: bool = False) -> str: Raises: RuntimeError: If token retrieval fails. """ - if use_cache and authentication_settings().token_file.exists(): - stored_token = Path(authentication_settings().token_file).read_text(encoding="utf-8") + if use_cache and settings().token_file.exists(): + stored_token = Path(settings().token_file).read_text(encoding="utf-8") # Parse stored string "token:expiry_timestamp" parts = stored_token.split(":") token, expiry_str = parts @@ -62,8 +61,8 @@ def get_token(use_cache: bool = True, use_device_flow: bool = False) -> str: # Store new token with expiry if use_cache: timestamp = claims["exp"] - authentication_settings().token_file.parent.mkdir(parents=True, exist_ok=True) - Path(authentication_settings().token_file).write_text(f"{new_token}:{timestamp}", encoding="utf-8") + settings().token_file.parent.mkdir(parents=True, exist_ok=True) + Path(settings().token_file).write_text(f"{new_token}:{timestamp}", encoding="utf-8") return new_token @@ -84,7 +83,7 @@ def _authenticate(use_device_flow: bool) -> str: RuntimeError: If authentication fails. AssertionError: If the returned token doesn't have the expected format. """ - if refresh_token := authentication_settings().refresh_token: + if refresh_token := settings().refresh_token: token = _token_from_refresh_token(refresh_token) elif _can_open_browser() and not use_device_flow: token = _perform_authorization_code_with_pkce_flow() @@ -108,14 +107,14 @@ def verify_and_decode_token(token: str) -> dict[str, str]: Raises: RuntimeError: If token verification or decoding fails. """ - jwk_client = jwt.PyJWKClient(authentication_settings().jws_json_url) + jwk_client = jwt.PyJWKClient(settings().jws_json_url) try: # Get the public key from the JWK client key = jwk_client.get_signing_key_from_jwt(token).key # Verify and decode the token using the public key return t.cast( "dict[str, str]", - jwt.decode(token, key=key, algorithms=["RS256"], audience=authentication_settings().audience), + jwt.decode(token, key=key, algorithms=["RS256"], audience=settings().audience), ) except jwt.exceptions.PyJWTError as e: raise RuntimeError(AUTHENTICATION_FAILED) from e @@ -150,15 +149,15 @@ def _perform_authorization_code_with_pkce_flow() -> str: RuntimeError: If authentication fails. """ session = OAuth2Session( - authentication_settings().client_id_interactive.get_secret_value(), - scope=authentication_settings().scope_elements, - redirect_uri=authentication_settings().redirect_uri, + settings().client_id_interactive.get_secret_value(), + scope=settings().scope_elements, + redirect_uri=settings().redirect_uri, pkce="S256", ) authorization_url, _ = session.authorization_url( - authentication_settings().authorization_base_url, + settings().authorization_base_url, access_type="offline", - audience=authentication_settings().audience, + audience=settings().audience, ) authentication_result = AuthenticationResult() @@ -179,7 +178,7 @@ def do_GET(self) -> None: # noqa: N802 auth_code = query["code"][0] try: # Exchange code for token - token = session.fetch_token(authentication_settings().token_url, code=auth_code, include_client_id=True) + token = session.fetch_token(settings().token_url, code=auth_code, include_client_id=True) # Store the token authentication_result.token = token["access_token"] # Send success response @@ -212,25 +211,17 @@ def log_message(self, _format: str, *_args) -> None: # type: ignore[no-untyped- return # Create and start the server - parsed_redirect = parse.urlparse(authentication_settings().redirect_uri) + parsed_redirect = parse.urlparse(settings().redirect_uri) host, port = parsed_redirect.hostname, parsed_redirect.port if not host or not port: raise RuntimeError(INVALID_REDIRECT_URI) - # check if port is callback port is available - port_unavailable_msg = f"Port {port} is already in use. Free the port, or use the device flow." - if not _ensure_local_port_is_available(port): - raise RuntimeError(port_unavailable_msg) - # start the server - try: - with HTTPServer((host, port), OAuthCallbackHandler) as server: - # Call Auth0 with challenge and redirect to localhost with code after successful authN - webbrowser.open_new(authorization_url) - # Extract authorization_code from redirected request, see: OAuthCallbackHandler - server.handle_request() - except OSError as e: - if e.errno == errno.EADDRINUSE: - raise RuntimeError(port_unavailable_msg) from e - raise RuntimeError(AUTHENTICATION_FAILED) from e + # TODO(Andreas): This fails if the application runs multiple times in parallel, which is quite an issue. + # At least we must fail with better info for the user, and actually block another run + with HTTPServer((host, port), OAuthCallbackHandler) as server: + # Call Auth0 with challenge and redirect to localhost with code after successful authN + webbrowser.open_new(authorization_url) + # Extract authorization_code from redirected request, see: OAuthCallbackHandler + server.handle_request() if authentication_result.error or not authentication_result.token: raise RuntimeError(AUTHENTICATION_FAILED) @@ -251,13 +242,13 @@ def _perform_device_flow() -> str | None: RuntimeError: If authentication fails or is denied. """ response = requests.post( - authentication_settings().device_url, + settings().device_url, data={ - "client_id": authentication_settings().client_id_device.get_secret_value(), - "scope": authentication_settings().scope_elements, - "audience": authentication_settings().audience, + "client_id": settings().client_id_device.get_secret_value(), + "scope": settings().scope_elements, + "audience": settings().audience, }, - timeout=authentication_settings().request_timeout_seconds, + timeout=settings().request_timeout_seconds, ) try: response.raise_for_status() @@ -277,14 +268,14 @@ def _perform_device_flow() -> str | None: while True: try: json_response = requests.post( - authentication_settings().token_url, + settings().token_url, headers={"Accept": "application/json"}, data={ "grant_type": "urn:ietf:params:oauth:grant-type:device_code", "device_code": device_code, - "client_id": authentication_settings().client_id_device.get_secret_value(), + "client_id": settings().client_id_device.get_secret_value(), }, - timeout=authentication_settings().request_timeout_seconds, + timeout=settings().request_timeout_seconds, ).json() if "error" in json_response: if json_response["error"] in {"authorization_pending", "slow_down"}: @@ -314,14 +305,14 @@ def _token_from_refresh_token(refresh_token: SecretStr) -> str | None: """ try: response = requests.post( - authentication_settings().token_url, + settings().token_url, headers={"Accept": "application/json"}, data={ "grant_type": "refresh_token", - "client_id": authentication_settings().client_id_interactive.get_secret_value(), + "client_id": settings().client_id_interactive.get_secret_value(), "refresh_token": refresh_token.get_secret_value(), }, - timeout=authentication_settings().request_timeout_seconds, + timeout=settings().request_timeout_seconds, ) response.raise_for_status() return t.cast("str", response.json()["access_token"]) diff --git a/src/aignostics/client/_client.py b/src/aignostics/client/_client.py index 5f4ec466..c78d6b40 100644 --- a/src/aignostics/client/_client.py +++ b/src/aignostics/client/_client.py @@ -6,7 +6,8 @@ from aignostics.client.resources.applications import Applications from aignostics.client.resources.runs import Runs -from ._settings import authentication_settings +from ._constants import API_ROOT_DEV, API_ROOT_PRODUCTION, API_ROOT_STAGING +from ._settings import settings class Client: @@ -46,9 +47,30 @@ def get_api_client(cache_token: bool = True) -> ExternalsApi: token = get_token(use_cache=cache_token) client = ApiClient( Configuration( - host=authentication_settings().api_root, + host=settings().api_root, ), header_name="Authorization", header_value=f"Bearer {token}", ) return ExternalsApi(client) + + @staticmethod + def get_info() -> dict[str, dict]: # type: ignore[type-arg] + """Retrieves process information. + + Returns: + dict[str, dict]: Process information including platform API roots. + """ + return { + "platform": { + "production": { + "API_ROOT": API_ROOT_PRODUCTION, + }, + "staging": { + "API_ROOT": API_ROOT_STAGING, + }, + "dev": { + "API_ROOT": API_ROOT_DEV, + }, + } + } diff --git a/src/aignostics/client/_constants.py b/src/aignostics/client/_constants.py new file mode 100644 index 00000000..1386f268 --- /dev/null +++ b/src/aignostics/client/_constants.py @@ -0,0 +1,27 @@ +"""Client specific constants.""" + +TODO_URL = "https://todo" +API_ROOT_PRODUCTION = "https://platform.aignostics.com" +AUDIENCE_PRODUCTION = "https://aignostics-platform-samia" +AUTHORIZATION_BASE_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/authorize" +TOKEN_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/oauth/token" # noqa: S105 +REDIRECT_URI_PRODUCTION = "http://localhost:8989/" +DEVICE_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/oauth/device/code" +JWS_JSON_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/.well-known/jwks.json" + +API_ROOT_STAGING = "https://platform-staging.aignostics.com" +# TODO (Andreas): hhva: please fill in +AUDIENCE_STAGING = TODO_URL +AUTHORIZATION_BASE_URL_STAGING = TODO_URL +TOKEN_URL_STAGING = TODO_URL +REDIRECT_URI_STAGING = TODO_URL +DEVICE_URL_STAGING = TODO_URL +JWS_JSON_URL_STAGING = TODO_URL + +API_ROOT_DEV = "https://platform-dev.aignostics.com" +AUDIENCE_DEV = "https://dev-8ouohmmrbuh2h4vu-samia" +AUTHORIZATION_BASE_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize" +TOKEN_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" # noqa: S105 +REDIRECT_URI_DEV = "http://localhost:8989/" +DEVICE_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/device/code" +JWS_JSON_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/.well-known/jwks.json" diff --git a/src/aignostics/client/_settings.py b/src/aignostics/client/_settings.py index ef33e338..aaeebf08 100644 --- a/src/aignostics/client/_settings.py +++ b/src/aignostics/client/_settings.py @@ -1,11 +1,17 @@ +"""Settings of the Python SDK.""" + +import logging import os from pathlib import Path +from typing import Annotated, TypeVar import appdirs -from pydantic import SecretStr, computed_field, model_validator +from pydantic import Field, PlainSerializer, SecretStr, computed_field, model_validator from pydantic_settings import BaseSettings, SettingsConfigDict -from aignostics import ( +from aignostics.utils import OpaqueSettings, __project_name__, load_settings + +from ._constants import ( API_ROOT_PRODUCTION, AUDIENCE_DEV, AUDIENCE_PRODUCTION, @@ -25,32 +31,81 @@ TOKEN_URL_DEV, TOKEN_URL_PRODUCTION, TOKEN_URL_STAGING, - __project_name__, ) - from ._messages import UNKNOWN_ENDPOINT_URL +logger = logging.getLogger(__name__) + +T = TypeVar("T", bound=BaseSettings) + + +class Settings(OpaqueSettings): + """Configuration settings for the Aignostics SDK. + + This class handles configuration settings loaded from environment variables, + configuration files, or default values. It manages authentication endpoints, + client credentials, token storage, and other SDK behaviors. + + Attributes: + client_id_device (SecretStr): Client ID for device authorization flow. + client_id_interactive (SecretStr): Client ID for interactive authorization flow. + api_root (str): Base URL of the Aignostics API. + scope (str): OAuth scopes required by the SDK. + scope_elements (list[str]): OAuth scopes split into individual elements. + audience (str): OAuth audience claim. + authorization_base_url (str): Authorization endpoint for OAuth flows. + token_url (str): Token endpoint for OAuth flows. + redirect_uri (str): Redirect URI for OAuth authorization code flow. + device_url (str): Device authorization endpoint for device flow. + jws_json_url (str): URL for JWS key set. + refresh_token (SecretStr | None): OAuth refresh token if available. + cache_dir (str): Directory for caching tokens and other data. + token_file (Path): Path to the token storage file. + request_timeout_seconds (int): Timeout for API requests in seconds. + authorization_backoff_seconds (int): Backoff time for authorization retries in seconds. + """ -class AuthenticationSettings(BaseSettings): model_config = SettingsConfigDict( env_prefix=f"{__project_name__.upper()}_", env_file=( - os.getenv(f"{__project_name__.upper()}_ENV_FILE", Path.home() / f".{__project_name__}/env"), os.getenv(f"{__project_name__.upper()}_ENV_FILE", Path.home() / f".{__project_name__}/.env"), + Path(".env"), ), env_file_encoding="utf-8", extra="ignore", ) - client_id_device: SecretStr - client_id_interactive: SecretStr - api_root: str = API_ROOT_PRODUCTION + client_id_device: Annotated[ + SecretStr, + PlainSerializer( + func=OpaqueSettings.serialize_sensitive_info, return_type=str, when_used="always" + ), # allow to unhide sensitive info from CLI or if user presents valid token via API + Field(description="OAuth Client ID Interactive"), + ] + client_id_interactive: Annotated[ + SecretStr, + PlainSerializer( + func=OpaqueSettings.serialize_sensitive_info, return_type=str, when_used="always" + ), # allow to unhide sensitive info from CLI or if user presents valid token via API + Field(description="OAuth Client ID Interactive"), + ] + api_root: Annotated[ + str, + Field(description="URL of the API root", default=API_ROOT_PRODUCTION), + ] scope: str = "offline_access" @computed_field # type: ignore[prop-decorator] @property def scope_elements(self) -> list[str]: + """Get the OAuth scope elements as a list. + + Splits the scope string by comma and strips whitespace from each element. + + Returns: + list[str]: List of individual scope elements. + """ if not self.scope: return [] return [element.strip() for element in self.scope.split(",")] @@ -69,13 +124,32 @@ def scope_elements(self) -> list[str]: @computed_field # type: ignore[prop-decorator] @property def token_file(self) -> Path: + """Get the path to the token file. + + Returns: + Path: The path to the file where the authentication token is stored. + """ return Path(self.cache_dir) / ".token" request_timeout_seconds: int = 30 authorization_backoff_seconds: int = 3 @model_validator(mode="before") - def pre_init(cls, values): # type: ignore[no-untyped-def] # noqa: ANN001, ANN202, N805 + def pre_init(cls, values: dict) -> dict: # type: ignore[type-arg] # noqa: N805 + """Initialize auth-related fields based on the API root. + + This validator sets the appropriate authentication URLs and parameters + based on the target environment (production, staging, or development). + + Args: + values: The input data dictionary to validate. + + Returns: + The updated values dictionary with all environment-specific fields populated. + + Raises: + ValueError: If the API root URL is not recognized. + """ # See https://github.com/pydantic/pydantic/issues/9789 api_root = values.get("api_root", API_ROOT_PRODUCTION) match api_root: @@ -106,10 +180,10 @@ def pre_init(cls, values): # type: ignore[no-untyped-def] # noqa: ANN001, ANN2 return values -__cached_authentication_settings: AuthenticationSettings | None = None +__cached_settings: Settings | None = None -def authentication_settings() -> AuthenticationSettings: +def settings() -> Settings: """Lazy load authentication settings from the environment or a file. * Given we use Pydantic Settings, validation is done automatically. @@ -120,7 +194,7 @@ def authentication_settings() -> AuthenticationSettings: Returns: AuthenticationSettings: The loaded authentication settings. """ - global __cached_authentication_settings # noqa: PLW0603 - if __cached_authentication_settings is None: - __cached_authentication_settings = AuthenticationSettings() # pyright: ignore[reportCallIssue] - return __cached_authentication_settings + global __cached_settings # noqa: PLW0603 + if __cached_settings is None: + __cached_settings = load_settings(Settings) # pyright: ignore[reportCallIssue] + return __cached_settings diff --git a/src/aignostics/client/utils.py b/src/aignostics/client/_utils.py similarity index 100% rename from src/aignostics/client/utils.py rename to src/aignostics/client/_utils.py diff --git a/src/aignostics/client/resources/__init__.py b/src/aignostics/client/resources/__init__.py new file mode 100644 index 00000000..78237a26 --- /dev/null +++ b/src/aignostics/client/resources/__init__.py @@ -0,0 +1 @@ +"""Resources exposed by the client.""" diff --git a/src/aignostics/client/resources/runs.py b/src/aignostics/client/resources/runs.py index c444e4ee..85eb31cb 100644 --- a/src/aignostics/client/resources/runs.py +++ b/src/aignostics/client/resources/runs.py @@ -22,9 +22,9 @@ from jsonschema.exceptions import ValidationError from jsonschema.validators import validate +from aignostics.client._utils import calculate_file_crc32c, download_file, mime_type_to_file_ending from aignostics.client.resources.applications import Versions from aignostics.client.resources.utils import paginate -from aignostics.client.utils import calculate_file_crc32c, download_file, mime_type_to_file_ending class ApplicationRun: diff --git a/src/aignostics/constants.py b/src/aignostics/constants.py index 34194444..02a51cb7 100644 --- a/src/aignostics/constants.py +++ b/src/aignostics/constants.py @@ -1,34 +1,4 @@ -"""Constants used throughout Aignostics Python SDK's codebase .""" +"""Constants for the Aignostics Python SDK.""" -import importlib.metadata -import pathlib - -__project_name__ = __name__.split(".")[0] -__project_path__ = str(pathlib.Path(__file__).parent.parent.parent) -__version__ = importlib.metadata.version(__project_name__) - -TODO_URL = "https://todo" -API_ROOT_PRODUCTION = "https://platform.aignostics.com" -AUDIENCE_PRODUCTION = "https://aignostics-platform-samia" -AUTHORIZATION_BASE_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/authorize" -TOKEN_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/oauth/token" # noqa: S105 -REDIRECT_URI_PRODUCTION = "http://localhost:8989/" -DEVICE_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/oauth/device/code" -JWS_JSON_URL_PRODUCTION = "https://aignostics-platform.eu.auth0.com/.well-known/jwks.json" - -API_ROOT_STAGING = "https://platform-staging.aignostics.com" -# TODO (Andreas): hhva: please fill in -AUDIENCE_STAGING = TODO_URL -AUTHORIZATION_BASE_URL_STAGING = TODO_URL -TOKEN_URL_STAGING = TODO_URL -REDIRECT_URI_STAGING = TODO_URL -DEVICE_URL_STAGING = TODO_URL -JWS_JSON_URL_STAGING = TODO_URL - -API_ROOT_DEV = "https://platform-dev.aignostics.com" -AUDIENCE_DEV = "https://dev-8ouohmmrbuh2h4vu-samia" -AUTHORIZATION_BASE_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize" -TOKEN_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" # noqa: S105 -REDIRECT_URI_DEV = "http://localhost:8989/" -DEVICE_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/device/code" -JWS_JSON_URL_DEV = "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/.well-known/jwks.json" +API_VERSIONS = {"v1": "1.0.0"} +MODULES_TO_INSTRUMENT = ["aignostics.client", "aignostics.application"] diff --git a/src/aignostics/models.py b/src/aignostics/models.py deleted file mode 100644 index 089d7c36..00000000 --- a/src/aignostics/models.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Models used throughout Aignostics Python SDK's codebase .""" - -from enum import StrEnum - -from pydantic import BaseModel - - -class HealthStatus(StrEnum): - """Health status enumeration.""" - - UP = "UP" - DOWN = "DOWN" - - -class Health(BaseModel): - """Health status model.""" - - status: HealthStatus - reason: str | None = None diff --git a/src/aignostics/platform.py b/src/aignostics/platform.py deleted file mode 100644 index df291cc8..00000000 --- a/src/aignostics/platform.py +++ /dev/null @@ -1,151 +0,0 @@ -"""Service providing platform diagnostics and utilities.""" - -import json -import os -import platform -import sys -from pathlib import Path -from typing import Any - -from dotenv import load_dotenv - -from . import OpenAPISchemaError -from .client import authentication_settings -from .constants import ( - API_ROOT_DEV, - API_ROOT_PRODUCTION, - API_ROOT_STAGING, - __project_name__, - __project_path__, - __version__, -) -from .settings import Settings -from .types import JsonType -from .utils.process import get_process_info - -load_dotenv() - - -class Platform: - """Service providing platform diagnostics and utilities.""" - - _settings: Settings - - def __init__(self) -> None: - """Initialize service.""" - self._settings = Settings() # pyright: ignore[reportCallIssue] - false positive - self.is_healthy = True - - def healthy(self) -> bool: - """ - Check if the platform is healthy. - - Returns: - bool: True if the platform is healthy, False otherwise. - """ - return self.is_healthy - - def info(self, env: bool = True, filter_secrets: bool = True) -> dict[str, Any]: - """ - For diagnostics compile info about user and platform environment. - - Returns: - dict: Info about user and environment, including organisation, - execution environment, local and remote platform. - """ - info_dict = { - "user": { - "name": "TODO", - "email": "TODO", - "id": "TODO", - "organisation": { - "name": "TODO", - "id": "TODO", - "tier": "TODO", - }, - }, - "local": { - "sdk": { - "version": __version__, - "name": __project_name__, - "path": __project_path__, - }, - "execution": { - "interpreter_path": sys.executable, - "command_line": " ".join(sys.argv), - "entry_point": sys.argv[0] if sys.argv else None, - "process_info": json.loads(get_process_info().model_dump_json()), - }, - "platform": { - "os": { - "system": platform.system(), - "release": platform.release(), - "version": platform.version(), - "machine": platform.machine(), - "processor": platform.processor(), - }, - "python": { - "version": platform.python_version(), - "compiler": platform.python_compiler(), - "implementation": platform.python_implementation(), - }, - }, - "settings": { - "core": json.loads(self._settings.model_dump_json()), - "authentication": json.loads(authentication_settings().model_dump_json()), - }, - }, - "remote": { - "platform": { - "production": { - "API_ROOT": API_ROOT_PRODUCTION, - }, - "staging": { - "API_ROOT": API_ROOT_STAGING, - }, - "dev": { - "API_ROOT": API_ROOT_DEV, - }, - } - }, - } - - if env: - if filter_secrets: - info_dict["local"]["execution"]["env"] = { # type: ignore[index] - k: v - for k, v in os.environ.items() - if not ( - "token" in k.lower() - or "key" in k.lower() - or "secret" in k.lower() - or "password" in k.lower() - or "auth" in k.lower() - ) - } - else: - info_dict["local"]["execution"]["env"] = dict(os.environ) # type: ignore[index] - - return info_dict - - def install(self) -> None: - """Complete and validate installation of the CLI.""" - # TODO (Helmut, Andreas): Build - - @staticmethod - def openapi_schema() -> JsonType: - """ - Get OpenAPI schema of the webservice API provided by the platform. - - Returns: - dict[str, object]: OpenAPI schema. - - Raises: - OpenAPISchemaError: If the OpenAPI schema file cannot be found or is not valid JSON. - """ - schema_path = Path(__file__).parent.parent.parent / "codegen" / "in" / "api.json" - try: - with schema_path.open(encoding="utf-8") as f: - return json.load(f) # type: ignore[no-any-return] - except (FileNotFoundError, json.JSONDecodeError) as e: - raise OpenAPISchemaError(e) from e diff --git a/src/aignostics/settings.py b/src/aignostics/settings.py deleted file mode 100644 index ff6804ac..00000000 --- a/src/aignostics/settings.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Settings of Aignostics Python SDK.""" - -from enum import StrEnum -from typing import Annotated - -from pydantic import Field -from pydantic_settings import BaseSettings, SettingsConfigDict - -from . import __project_name__ - - -class Language(StrEnum): - """Supported languages.""" - - GERMAN = "de_DE" - US_ENGLISH = "en_US" - - -class Settings(BaseSettings): - """Settings.""" - - model_config = SettingsConfigDict( - env_prefix=f"{__project_name__.upper()}_", - extra="ignore", - env_file=".env", - env_file_encoding="utf-8", - ) - - language: Annotated[ - Language, - Field( - Language.US_ENGLISH, - description="Language to use for output - defaults to US english.", - ), - ] diff --git a/src/aignostics/system/__init__.py b/src/aignostics/system/__init__.py new file mode 100644 index 00000000..fe20ef16 --- /dev/null +++ b/src/aignostics/system/__init__.py @@ -0,0 +1,11 @@ +"""Hello module.""" + +from ._cli import cli +from ._service import Service +from ._settings import Settings + +__all__ = [ + "Service", + "Settings", + "cli", +] diff --git a/src/aignostics/system/_cli.py b/src/aignostics/system/_cli.py new file mode 100644 index 00000000..c9c60ca5 --- /dev/null +++ b/src/aignostics/system/_cli.py @@ -0,0 +1,125 @@ +"""System CLI commands.""" + +import json +from enum import StrEnum +from typing import Annotated + +import typer +import yaml + +from ..constants import API_VERSIONS # noqa: TID252 +from ..utils import console, get_logger # noqa: TID252 +from ._service import Service + +logger = get_logger(__name__) + +cli = typer.Typer(name="system", help="System commands") + +_service = Service() + + +class OutputFormat(StrEnum): + """ + Enum representing the supported output formats. + + This enum defines the possible formats for output data: + - YAML: Output data in YAML format + - JSON: Output data in JSON format + + Usage: + format = OutputFormat.YAML + print(f"Using {format} format") + """ + + YAML = "yaml" + JSON = "json" + + +@cli.command() +def health( + output_format: Annotated[ + OutputFormat, typer.Option(help="Output format", case_sensitive=False) + ] = OutputFormat.JSON, +) -> None: + """Determine and print system health. + + Args: + output_format (OutputFormat): Output format (JSON or YAML). + """ + match output_format: + case OutputFormat.JSON: + console.print_json(data=_service.health().model_dump()) + case OutputFormat.YAML: + console.print( + yaml.dump(data=json.loads(_service.health().model_dump_json()), width=80, default_flow_style=False), + end="", + ) + + +@cli.command() +def info( + include_environ: Annotated[bool, typer.Option(help="Include environment variables")] = False, + filter_secrets: Annotated[bool, typer.Option(help="Filter secrets")] = True, + output_format: Annotated[ + OutputFormat, typer.Option(help="Output format", case_sensitive=False) + ] = OutputFormat.JSON, +) -> None: + """Determine and print system info. + + Args: + include_environ (bool): Include environment variables. + filter_secrets (bool): Filter secrets from the output. + output_format (OutputFormat): Output format (JSON or YAML). + """ + info = _service.info(include_environ=include_environ, filter_secrets=filter_secrets) + match output_format: + case OutputFormat.JSON: + console.print_json(data=info) + case OutputFormat.YAML: + console.print(yaml.dump(info, width=80, default_flow_style=False), end="") + + +@cli.command() +def openapi( + api_version: Annotated[ + str, typer.Option(help=f"API Version. Available: {', '.join(API_VERSIONS.keys())}", case_sensitive=False) + ] = next(iter(API_VERSIONS.keys())), + output_format: Annotated[ + OutputFormat, typer.Option(help="Output format", case_sensitive=False) + ] = OutputFormat.JSON, +) -> None: + """Dump the OpenAPI specification. + + Args: + api_version (str): API version to dump. + output_format (OutputFormat): Output format (JSON or YAML). + + Raises: + typer.Exit: If an invalid API version is provided. + """ + match api_version: + case "v1": + schema = Service.openapi_schema() + case _: + available_versions = ", ".join(API_VERSIONS.keys()) + console.print( + f"[bold red]Error:[/] Invalid API version '{api_version}'. Available versions: {available_versions}" + ) + raise typer.Exit(code=1) + match output_format: + case OutputFormat.JSON: + console.print_json(data=schema) + case OutputFormat.YAML: + console.print(yaml.dump(schema, default_flow_style=False), end="") + + +@cli.command() +def install() -> None: + """Complete installation.""" + console.print("Installation complete.") + + +@cli.command("whoami") +def whoami() -> None: + """Print user info.""" + console.print("TK (whoami)") diff --git a/src/aignostics/exceptions.py b/src/aignostics/system/_exceptions.py similarity index 86% rename from src/aignostics/exceptions.py rename to src/aignostics/system/_exceptions.py index f4912724..e0a20046 100644 --- a/src/aignostics/exceptions.py +++ b/src/aignostics/system/_exceptions.py @@ -1,4 +1,4 @@ -"""Exceptions of Aignostics Python SDK.""" +"""Exceptions of system module.""" class OpenAPISchemaError(ValueError): diff --git a/src/aignostics/system/_service.py b/src/aignostics/system/_service.py new file mode 100644 index 00000000..f79da622 --- /dev/null +++ b/src/aignostics/system/_service.py @@ -0,0 +1,188 @@ +"""System service.""" + +import json +import os +import platform +import pwd +import sys +import typing as t +from pathlib import Path +from typing import Any + +from pydantic_settings import BaseSettings +from uptime import boottime, uptime + +from ..utils import ( # noqa: TID252 + UNHIDE_SENSITIVE_INFO, + BaseService, + Health, + __env__, + __project_name__, + __project_path__, + __repository_url__, + __version__, + get_logger, + get_process_info, + load_settings, + locate_subclasses, +) +from ._exceptions import OpenAPISchemaError +from ._settings import Settings + +logger = get_logger(__name__) + +JsonType: t.TypeAlias = list["JsonValue"] | t.Mapping[str, "JsonValue"] +JsonValue: t.TypeAlias = str | int | float | JsonType | None + + +class Service(BaseService): + """System service.""" + + _settings: Settings + + def __init__(self) -> None: + """Initialize service.""" + super().__init__(Settings) + + @staticmethod + def _is_healthy() -> bool: + """Check if the service itself is healthy. + + Returns: + bool: True if the service is healthy, False otherwise. + """ + return True + + def health(self) -> Health: + """Determine aggregate health of the system. + + - Health exposed by implementations of BaseService in other + modules is automatically included into the health tree. + - See utils/_health.py:Health for an explanation of the health tree. + + Returns: + Health: The aggregate health of the system. + """ + components: dict[str, Health] = {} + for service_class in locate_subclasses(BaseService): + if service_class is not Service: + components[f"{service_class.__module__}.{service_class.__name__}"] = service_class().health() + + # Set the system health status based on is_healthy attribute + status = Health.Code.UP if self._is_healthy() else Health.Code.DOWN + reason = None if self._is_healthy() else "System marked as unhealthy" + return Health(status=status, components=components, reason=reason) + + def is_token_valid(self, token: str) -> bool: + """Check if the presented token is valid. + + Returns: + bool: True if the token is valid, False otherwise. + """ + logger.info(token) + if not self._settings.token: + logger.warning("Token is not set in settings.") + return False + return token == self._settings.token.get_secret_value() + + @staticmethod + def info(include_environ: bool = False, filter_secrets: bool = True) -> dict[str, Any]: + """ + Get info about configuration of service. + + - Runtime information is automatically compiled. + - Settings are automatically aggregated from all implementations of + Pydantic BaseSettings in this package. + - Info exposed by implementations of BaseService in other modules is + automatically included into the info dict. + + Returns: + dict[str, Any]: Service configuration. + """ + bootdatetime = boottime() + rtn = { + "package": { + "version": __version__, + "name": __project_name__, + "repository": __repository_url__, + "local": __project_path__, + }, + "runtime": { + "environment": __env__, + "python": { + "version": platform.python_version(), + "compiler": platform.python_compiler(), + "implementation": platform.python_implementation(), + }, + "interpreter_path": sys.executable, + "command_line": " ".join(sys.argv), + "entry_point": sys.argv[0] if sys.argv else None, + "process_info": json.loads(get_process_info().model_dump_json()), + "username": pwd.getpwuid(os.getuid())[0], + "host": { + "system": platform.system(), + "release": platform.release(), + "version": platform.version(), + "machine": platform.machine(), + "processor": platform.processor(), + "hostname": platform.node(), + "ip_address": platform.uname().node, + "cpu_count": os.cpu_count(), + "uptime": uptime(), + "boottime": bootdatetime.isoformat() if bootdatetime else None, + }, + }, + } + + if include_environ: + if filter_secrets: + rtn["runtime"]["environ"] = { + k: v + for k, v in os.environ.items() + if not ( + "token" in k.lower() + or "key" in k.lower() + or "secret" in k.lower() + or "password" in k.lower() + or "auth" in k.lower() + ) + } + else: + rtn["runtime"]["environ"] = dict(os.environ) + + settings = {} + for settings_class in locate_subclasses(BaseSettings): + settings_instance = load_settings(settings_class) + env_prefix = settings_instance.model_config.get("env_prefix", "") + settings_dict = json.loads( + settings_instance.model_dump_json(context={UNHIDE_SENSITIVE_INFO: not filter_secrets}) + ) + for key, value in settings_dict.items(): + flat_key = f"{env_prefix}{key}".upper() + settings[flat_key] = value + rtn["settings"] = settings + + for service_class in locate_subclasses(BaseService): + if service_class is not Service: + service = service_class() + rtn[service.key()] = service.info() + + return rtn + + @staticmethod + def openapi_schema() -> JsonType: + """ + Get OpenAPI schema of the webservice API provided by the platform. + + Returns: + dict[str, object]: OpenAPI schema. + + Raises: + OpenAPISchemaError: If the OpenAPI schema file cannot be found or is not valid JSON. + """ + schema_path = Path(__file__).parent.parent.parent.parent / "codegen" / "in" / "api.json" + try: + with schema_path.open(encoding="utf-8") as f: + return json.load(f) # type: ignore[no-any-return] + except (FileNotFoundError, json.JSONDecodeError) as e: + raise OpenAPISchemaError(e) from e diff --git a/src/aignostics/system/_settings.py b/src/aignostics/system/_settings.py new file mode 100644 index 00000000..a97992de --- /dev/null +++ b/src/aignostics/system/_settings.py @@ -0,0 +1,31 @@ +"""Settings of the system module.""" + +from typing import Annotated + +from pydantic import Field, PlainSerializer, SecretStr +from pydantic_settings import SettingsConfigDict + +from ..utils import OpaqueSettings, __env_file__, __project_name__ # noqa: TID252 + + +class Settings(OpaqueSettings): + """Settings.""" + + model_config = SettingsConfigDict( + env_prefix=f"{__project_name__.upper()}_SYSTEM_", + extra="ignore", + env_file=__env_file__, + env_file_encoding="utf-8", + ) + + token: Annotated[ + SecretStr | None, + PlainSerializer(func=OpaqueSettings.serialize_sensitive_info, return_type=str, when_used="always"), + Field( + description=( + "Secret token to present when performing sensitive operations such as " + "retrieving info via webservice API" + ), + default=None, + ), + ] diff --git a/src/aignostics/types.py b/src/aignostics/types.py deleted file mode 100644 index 60baf7d8..00000000 --- a/src/aignostics/types.py +++ /dev/null @@ -1,57 +0,0 @@ -"""Types of Aignostics Python SDK.""" - -import typing as t -from enum import StrEnum - -JsonType: t.TypeAlias = list["JsonValue"] | t.Mapping[str, "JsonValue"] -JsonValue: t.TypeAlias = str | int | float | JsonType | None - - -class APIVersion(StrEnum): - """ - Enum representing the API versions. - - This enum defines the supported API verions: - - V1: Output doc for v1 API - - Usage: - version = APIVersion.V1 - print(f"Using {version} version") - - """ - - V1 = "v1" - - -class OpenAPIOutputFormat(StrEnum): - """ - Enum representing the supported output formats. - - This enum defines the possible formats for output data: - - YAML: Output data in YAML format - - JSON: Output data in JSON format - - Usage: - format = OpenAPIOutputFormat.YAML - print(f"Using {format} format") - """ - - YAML = "yaml" - JSON = "json" - - -class InfoOutputFormat(StrEnum): - """ - Enum representing the supported output formats. - - This enum defines the possible formats for output data: - - YAML: Output data in YAML format - - JSON: Output data in JSON format - - Usage: - format = InfoOutputFormat.YAML - print(f"Using {format} format") - """ - - YAML = "yaml" - JSON = "json" diff --git a/src/aignostics/utils/__init__.py b/src/aignostics/utils/__init__.py index f8d3a371..46b5a385 100644 --- a/src/aignostics/utils/__init__.py +++ b/src/aignostics/utils/__init__.py @@ -1,11 +1,60 @@ -"""Utility functions and classes for the starbridge package.""" +"""Utilities module.""" -from .cli import prepare_cli -from .console import console -from .process import get_process_info +from ._cli import prepare_cli +from ._console import console +from ._constants import ( + __author_email__, + __author_name__, + __base__url__, + __documentation__url__, + __env__, + __env_file__, + __is_development_mode__, + __is_running_in_container__, + __project_name__, + __project_path__, + __repository_url__, + __version__, +) +from ._di import locate_implementations, locate_subclasses +from ._health import Health +from ._log import LogSettings, get_logger +from ._logfire import LogfireSettings +from ._process import ProcessInfo, get_process_info +from ._sentry import SentrySettings +from ._service import BaseService +from ._settings import UNHIDE_SENSITIVE_INFO, OpaqueSettings, load_settings, strip_to_none_before_validator +from .boot import boot __all__ = [ + "UNHIDE_SENSITIVE_INFO", + "BaseService", + "Health", + "LogSettings", + "LogSettings", + "LogfireSettings", + "OpaqueSettings", + "ProcessInfo", + "SentrySettings", + "__author_email__", + "__author_name__", + "__base__url__", + "__documentation__url__", + "__env__", + "__env_file__", + "__is_development_mode__", + "__is_running_in_container__", + "__project_name__", + "__project_path__", + "__repository_url__", + "__version__", + "boot", "console", + "get_logger", "get_process_info", + "load_settings", + "locate_implementations", + "locate_subclasses", "prepare_cli", + "strip_to_none_before_validator", ] diff --git a/src/aignostics/utils/cli.py b/src/aignostics/utils/_cli.py similarity index 90% rename from src/aignostics/utils/cli.py rename to src/aignostics/utils/_cli.py index 7824fe55..fb675c47 100644 --- a/src/aignostics/utils/cli.py +++ b/src/aignostics/utils/_cli.py @@ -5,6 +5,8 @@ import typer +from ._di import locate_implementations + def prepare_cli(cli: typer.Typer, epilog: str) -> None: """ @@ -13,8 +15,11 @@ def prepare_cli(cli: typer.Typer, epilog: str) -> None: Args: cli (typer.Typer): Typer instance epilog (str): Epilog to add - """ + for _cli in locate_implementations(typer.Typer): + if _cli != cli: + cli.add_typer(_cli) + cli.info.epilog = epilog cli.info.no_args_is_help = True if not any(arg.endswith("typer") for arg in Path(sys.argv[0]).parts): @@ -36,7 +41,6 @@ def _add_epilog_recursively(cli: typer.Typer, epilog: str) -> None: Args: cli (typer.Typer): Typer instance epilog (str): Epilog to add - """ cli.info.epilog = epilog for group in cli.registered_groups: @@ -51,11 +55,10 @@ def _add_epilog_recursively(cli: typer.Typer, epilog: str) -> None: def _no_args_is_help_recursively(cli: typer.Typer) -> None: """ - Add epilog to all typers in the tree. + Show help if no command is given by the user. Args: cli (typer.Typer): Typer instance - """ for group in cli.registered_groups: if isinstance(group, typer.models.TyperInfo): diff --git a/src/aignostics/utils/console.py b/src/aignostics/utils/_console.py similarity index 83% rename from src/aignostics/utils/console.py rename to src/aignostics/utils/_console.py index 9349c5e9..76d0a9b2 100644 --- a/src/aignostics/utils/console.py +++ b/src/aignostics/utils/_console.py @@ -1,4 +1,4 @@ -"""Define styling for typer, overriding defaults.""" +"""Themed rich console.""" from rich.console import Console from rich.theme import Theme diff --git a/src/aignostics/utils/_constants.py b/src/aignostics/utils/_constants.py new file mode 100644 index 00000000..eec5e78b --- /dev/null +++ b/src/aignostics/utils/_constants.py @@ -0,0 +1,59 @@ +"""Constants used throughout.""" + +import os +import sys +from importlib import metadata +from pathlib import Path + +from dotenv import load_dotenv + +load_dotenv() + +__project_name__ = __name__.split(".")[0] +__project_path__ = str(Path(__file__).parent.parent.parent) +__version__ = metadata.version(__project_name__) +__is_development_mode__ = "uvx" not in sys.argv[0].lower() +__is_running_in_container__ = os.getenv(f"{__project_name__.upper()}_RUNNING_IN_CONTAINER") +__env__ = os.getenv("ENV", os.getenv("VERCEL_ENV", "local")) +__env_file__ = [ + Path.home() / f".{__project_name__}" / ".env", + Path.home() / f".{__project_name__}" / f".env.{__env__}", + Path(".env"), + Path(f".env.{__env__}"), +] +env_file_path = os.getenv(f"{__project_name__.upper()}_ENV_FILE") +if env_file_path: + __env_file__.insert(2, Path(env_file_path)) + +vercel_base_url = os.getenv("VERCEL_URL", None) +if vercel_base_url: + vercel_base_url = "https://" + vercel_base_url +__base__url__ = os.getenv(__project_name__.upper() + "_BASE_URL", None) +if not __base__url__ and vercel_base_url: + __base__url__ = vercel_base_url + + +def get_project_url_by_label(prefix: str) -> str: + """Get labeled Project-URL. + + See https://packaging.python.org/en/latest/specifications/core-metadata/#core-metadata-project-url + + Args: + prefix(str): The prefix to match at the beginning of URL entries. + + Returns: + The extracted URL string if found, or an empty string if not found. + """ + for url_entry in metadata.metadata(__project_name__).get_all("Project-URL", []): + if url_entry.startswith(prefix): + return str(url_entry.split(", ", 1)[1]) + + return "" + + +_authors = metadata.metadata(__project_name__).get_all("Author-email", []) +_author = _authors[0] if _authors else None +__author_name__ = _author.split("<")[0].strip() if _author else None +__author_email__ = _author.split("<")[1].strip(" >") if _author else None +__repository_url__ = get_project_url_by_label("Source") +__documentation__url__ = get_project_url_by_label("Documentation") diff --git a/src/aignostics/utils/_di.py b/src/aignostics/utils/_di.py new file mode 100644 index 00000000..ced5c194 --- /dev/null +++ b/src/aignostics/utils/_di.py @@ -0,0 +1,70 @@ +"""Module for dynamic import and discovery of implementations and subclasses.""" + +import importlib +import pkgutil +from inspect import isclass +from typing import Any + +from ._constants import __project_name__ + +_implementation_cache: dict[Any, list[Any]] = {} +_subclass_cache: dict[Any, list[Any]] = {} + + +def locate_implementations(_class: type[Any]) -> list[Any]: + """ + Dynamically discover all instances of some class. + + Args: + _class (type[Any]): Class to search for. + + Returns: + list[Any]: List of discovered implementations of the given class. + """ + if _class in _implementation_cache: + return _implementation_cache[_class] + + implementations = [] + package = importlib.import_module(__project_name__) + + for _, name, _ in pkgutil.iter_modules(package.__path__): + module = importlib.import_module(f"{__project_name__}.{name}") + # Check all members of the module + for member_name in dir(module): + member = getattr(module, member_name) + if isinstance(member, _class): + implementations.append(member) + + _implementation_cache[_class] = implementations + return implementations + + +def locate_subclasses(_class: type[Any]) -> list[Any]: + """ + Dynamically discover all classes that are subclasses of some type. + + Args: + _class (type[Any]): Parent class of subclasses to search for. + + Returns: + list[type[Any]]: List of discovered subclasses of the given class. + """ + if _class in _subclass_cache: + return _subclass_cache[_class] + + subclasses = [] + package = importlib.import_module(__project_name__) + + for _, name, _ in pkgutil.iter_modules(package.__path__): + try: + module = importlib.import_module(f"{__project_name__}.{name}") + # Check all members of the module + for member_name in dir(module): + member = getattr(module, member_name) + if isclass(member) and issubclass(member, _class) and member != _class: + subclasses.append(member) + except ImportError: + continue + + _subclass_cache[_class] = subclasses + return subclasses diff --git a/src/aignostics/utils/_health.py b/src/aignostics/utils/_health.py new file mode 100644 index 00000000..11377cc5 --- /dev/null +++ b/src/aignostics/utils/_health.py @@ -0,0 +1,107 @@ +"""Health models and status definitions for service health checks.""" + +from enum import StrEnum +from typing import ClassVar, Self + +from pydantic import BaseModel, Field, model_validator + + +class _HealthStatus(StrEnum): + UP = "UP" + DOWN = "DOWN" + + +class Health(BaseModel): + """Represents the health status of a service with optional components and failure reasons. + + - A health object can have child components, i.e. health forms a tree. + - Any node in the tree can set itself to DOWN. In this case the node is required + to set the reason attribute. If reason is not set when DOWN, + automatic model validation of the tree will fail. + - DOWN'ness is propagated to parent health objects. I.e. the health of a parent + node is automatically set to DOWN if any of its child components are DOWN. The + child components leading to this will be listed in the reason. + - The root of the health tree is computed in the system module. The health of other + modules is automatically picked up by the system module. + """ + + Code: ClassVar[type[_HealthStatus]] = _HealthStatus + status: _HealthStatus + reason: str | None = None + components: dict[str, "Health"] = Field(default_factory=dict) + + def compute_health_from_components(self) -> Self: + """Recursively compute health status from components. + + - If health is already DOWN, it remains DOWN with its original reason. + - If health is UP but any component is DOWN, health becomes DOWN with + a reason listing all failed components. + + Returns: + Self: The updated health instance with computed status. + """ + # Skip recomputation if already known to be DOWN + if self.status == _HealthStatus.DOWN: + return self + + # No components means we keep the existing status + if not self.components: + return self + + # Find all DOWN components + down_components = [] + for component_name, component in self.components.items(): + # Recursively compute health for each component + component.compute_health_from_components() + if component.status == _HealthStatus.DOWN: + down_components.append(component_name) + + # If any components are DOWN, mark the parent as DOWN + if down_components: + self.status = _HealthStatus.DOWN + if len(down_components) == 1: + self.reason = f"Component '{down_components[0]}' is DOWN" + else: + component_list = "', '".join(down_components) + self.reason = f"Components '{component_list}' are DOWN" + + return self + + @model_validator(mode="after") + def validate_health_state(self) -> Self: + """Validate the health state and ensure consistency. + + - Compute overall health based on component health + - Ensure UP status has no associated reason + - Ensure DOWN status always has a reason + + Returns: + Self: The validated model instance with correct health status. + + Raises: + ValueError: If validation fails due to inconsistency. + """ + # First compute health from components + self.compute_health_from_components() + + # Validate that UP status has no reason + if (self.status == _HealthStatus.UP) and self.reason: + msg = f"Health {self.status} must not have reason" + raise ValueError(msg) + + # Validate that DOWN status always has a reason + if (self.status == _HealthStatus.DOWN) and not self.reason: + msg = "Health DOWN must have a reason" + raise ValueError(msg) + + return self + + def __str__(self) -> str: + """Return string representation of health status with optional reason for DOWN state. + + Returns: + str: The health status value, with reason appended if status is DOWN. + """ + if self.status == _HealthStatus.DOWN and self.reason: + return f"{self.status.value}: {self.reason}" + return self.status.value diff --git a/src/aignostics/utils/_log.py b/src/aignostics/utils/_log.py new file mode 100644 index 00000000..d10c380b --- /dev/null +++ b/src/aignostics/utils/_log.py @@ -0,0 +1,122 @@ +"""Logging configuration and utilities.""" + +import logging as python_logging +import typing as t +from logging import FileHandler +from typing import Annotated, Literal + +import click +import logfire +from pydantic import Field +from pydantic_settings import BaseSettings, SettingsConfigDict +from rich.console import Console +from rich.logging import RichHandler + +from ._constants import __env_file__, __project_name__ +from ._settings import load_settings + + +def get_logger(name: str | None) -> python_logging.Logger: + """ + Get a logger instance with the given name or project name as default. + + Args: + name(str): The name for the logger. If None, uses project name. + + Returns: + Logger: Configured logger instance. + """ + if (name is None) or (name == __project_name__): + return python_logging.getLogger(__project_name__) + return python_logging.getLogger(f"{__project_name__}.{name}") + + +class LogSettings(BaseSettings): + """Settings for configuring logging behavior.""" + + model_config = SettingsConfigDict( + env_prefix=f"{__project_name__.upper()}_LOG_", + extra="ignore", + env_file=__env_file__, + env_file_encoding="utf-8", + ) + + level: Annotated[ + Literal["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"], + Field(description="Logging level", default="INFO"), + ] + file_enabled: Annotated[ + bool, + Field(description="Enable logging to file", default=False), + ] + file_name: Annotated[ + str, + Field(description="Name of the log file", default=f"{__project_name__}.log"), + ] + console_enabled: Annotated[ + bool, + Field(description="Enable logging to console", default=False), + ] + + +class CustomFilter(python_logging.Filter): + """Custom filter for log records.""" + + @staticmethod + def filter(_record: python_logging.LogRecord) -> bool: + """ + Filter log records based on custom criteria. + + Args: + record: The log record to filter. + + Returns: + bool: True if record should be logged, False otherwise. + """ + return True + + +def logging_initialize(log_to_logfire: bool = False) -> None: + """Initialize logging configuration.""" + log_filter = CustomFilter() + + handlers = [] + + settings = load_settings(LogSettings) + + if settings.file_enabled: + file_handler = python_logging.FileHandler(settings.file_name) + file_formatter = python_logging.Formatter( + fmt="%(asctime)s %(process)d %(levelname)s %(name)s %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + ) + file_handler.setFormatter(file_formatter) + file_handler.addFilter(log_filter) + handlers.append(file_handler) + + if settings.console_enabled: + rich_handler = RichHandler( + console=Console(stderr=True), + markup=True, + rich_tracebacks=True, + tracebacks_suppress=[click], + show_time=True, + omit_repeated_times=True, + show_path=True, + show_level=True, + enable_link_path=True, + ) + rich_handler.addFilter(log_filter) + handlers.append(t.cast("FileHandler", rich_handler)) + + if log_to_logfire: + logfire_handler = logfire.LogfireLoggingHandler() + logfire_handler.addFilter(log_filter) + handlers.append(t.cast("FileHandler", logfire_handler)) + + python_logging.basicConfig( + level=settings.level, + format="%(name)s %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + handlers=handlers, + ) diff --git a/src/aignostics/utils/_logfire.py b/src/aignostics/utils/_logfire.py new file mode 100644 index 00000000..42c9c918 --- /dev/null +++ b/src/aignostics/utils/_logfire.py @@ -0,0 +1,69 @@ +"""Logfire integration for logging and instrumentation.""" + +from typing import Annotated + +import logfire +from pydantic import BeforeValidator, Field, PlainSerializer, SecretStr +from pydantic_settings import SettingsConfigDict + +from ._constants import __env__, __env_file__, __project_name__, __repository_url__, __version__ +from ._settings import OpaqueSettings, load_settings, strip_to_none_before_validator + + +class LogfireSettings(OpaqueSettings): + """Configuration settings for Logfire integration.""" + + model_config = SettingsConfigDict( + env_prefix=f"{__project_name__.upper()}_LOGFIRE_", + env_file=__env_file__, + env_file_encoding="utf-8", + extra="ignore", + ) + + token: Annotated[ + SecretStr | None, + BeforeValidator(strip_to_none_before_validator), + PlainSerializer(func=OpaqueSettings.serialize_sensitive_info, return_type=str, when_used="always"), + Field(description="Logfire token. Leave empty to disable logfire.", examples=["YOUR_TOKEN"], default=None), + ] + instrument_system_metrics: Annotated[ + bool, + Field(description="Enable system metrics instrumentation", default=False), + ] + + +def logfire_initialize(modules: list["str"]) -> bool: + """Initialize Logfire integration. + + Args: + modules(list["str"]): List of modules to be instrumented. + + Returns: + bool: True if initialized successfully False otherwise + """ + settings = load_settings(LogfireSettings) + + if settings.token is None: + return False + + logfire.configure( + send_to_logfire="if-token-present", + token=settings.token.get_secret_value(), + environment=__env__, + service_name=__project_name__, + console=False, + code_source=logfire.CodeSource( + repository=__repository_url__, + revision=__version__, + root_path="", + ), + ) + + if settings.instrument_system_metrics: + logfire.instrument_system_metrics(base="full") + + logfire.instrument_pydantic() + + logfire.install_auto_tracing(modules=modules, min_duration=0.0) + + return True diff --git a/src/aignostics/utils/process.py b/src/aignostics/utils/_process.py similarity index 99% rename from src/aignostics/utils/process.py rename to src/aignostics/utils/_process.py index e20cc20a..480bbd23 100644 --- a/src/aignostics/utils/process.py +++ b/src/aignostics/utils/_process.py @@ -27,7 +27,6 @@ def get_process_info() -> ProcessInfo: Returns: ProcessInfo: Object containing process information. - """ current_process = psutil.Process() parent = current_process.parent() diff --git a/src/aignostics/utils/_sentry.py b/src/aignostics/utils/_sentry.py new file mode 100644 index 00000000..8eaee97d --- /dev/null +++ b/src/aignostics/utils/_sentry.py @@ -0,0 +1,102 @@ +"""Sentry integration for application monitoring.""" + +from typing import Annotated + +import sentry_sdk +from pydantic import BeforeValidator, Field, PlainSerializer, SecretStr +from pydantic_settings import SettingsConfigDict +from sentry_sdk.integrations.typer import TyperIntegration + +from ._constants import __env__, __env_file__, __project_name__, __version__ +from ._settings import OpaqueSettings, load_settings, strip_to_none_before_validator + + +class SentrySettings(OpaqueSettings): + """Configuration settings for Sentry integration.""" + + model_config = SettingsConfigDict( + env_prefix=f"{__project_name__.upper()}_SENTRY_", + env_file=__env_file__, + env_file_encoding="utf-8", + extra="ignore", + ) + + dsn: Annotated[ + SecretStr | None, + BeforeValidator(strip_to_none_before_validator), + PlainSerializer(func=OpaqueSettings.serialize_sensitive_info, return_type=str, when_used="always"), + Field(description="Sentry DSN", examples=["https://SECRET@SECRET.ingest.de.sentry.io/SECRET"], default=None), + ] + + debug: Annotated[ + bool, + Field(description="Debug (https://docs.sentry.io/platforms/python/configuration/options/)", default=False), + ] + + send_default_pii: Annotated[ + bool, + Field( + description="Send default personal identifiable information (https://docs.sentry.io/platforms/python/configuration/options/)", + default=False, + ), + ] + + max_breadcrumbs: Annotated[ + int, + Field( + description="Max breadcrumbs (https://docs.sentry.io/platforms/python/configuration/options/#max_breadcrumbs)", + ge=0, + default=50, + ), + ] + sample_rate: Annotated[ + float, + Field( + ge=0.0, + description="Sample Rate (https://docs.sentry.io/platforms/python/configuration/sampling/#sampling-error-events)", + default=1.0, + ), + ] + traces_sample_rate: Annotated[ + float, + Field( + ge=0.0, + description="Traces Sample Rate (https://docs.sentry.io/platforms/python/configuration/sampling/#configuring-the-transaction-sample-rate)", + default=1.0, + ), + ] + profiles_sample_rate: Annotated[ + float, + Field( + ge=0.0, + description="Traces Sample Rate (https://docs.sentry.io/platforms/python/tracing/#configure)", + default=1.0, + ), + ] + + +def sentry_initialize() -> bool: + """Initialize Sentry integration. + + Returns: + bool: True if initialized successfully, False otherwise + """ + settings = load_settings(SentrySettings) + + if settings.dsn is None: + return False + + sentry_sdk.init( + release=f"{__project_name__}@{__version__}", # https://docs.sentry.io/platforms/python/configuration/releases/, + environment=__env__, + dsn=settings.dsn.get_secret_value().strip(), + max_breadcrumbs=settings.max_breadcrumbs, + debug=settings.debug, + send_default_pii=settings.send_default_pii, + sample_rate=settings.sample_rate, + traces_sample_rate=settings.traces_sample_rate, + profiles_sample_rate=settings.profiles_sample_rate, + integrations=[TyperIntegration()], + ) + + return True diff --git a/src/aignostics/utils/_service.py b/src/aignostics/utils/_service.py new file mode 100644 index 00000000..6d605401 --- /dev/null +++ b/src/aignostics/utils/_service.py @@ -0,0 +1,39 @@ +"""Base class for services.""" + +from abc import ABC, abstractmethod +from typing import Any, TypeVar + +from pydantic_settings import BaseSettings + +from ._health import Health +from ._settings import load_settings + +T = TypeVar("T", bound=BaseSettings) + + +class BaseService(ABC): + """Base class for services.""" + + _settings: BaseSettings + + def __init__(self, settings_class: type[T] | None = None) -> None: + """ + Initialize service with optional settings. + + Args: + settings_class: Optional settings class to load configuration. + """ + if settings_class is not None: + self._settings = load_settings(settings_class) + + def key(self) -> str: + """Return the module name of the instance.""" + return self.__module__.split(".")[-2] + + @abstractmethod + def health(self) -> Health: + """Get health of this service. Override in subclass.""" + + @abstractmethod + def info(self) -> dict[str, Any]: + """Get info of this service. Override in subclass.""" diff --git a/src/aignostics/utils/_settings.py b/src/aignostics/utils/_settings.py new file mode 100644 index 00000000..3aab9a7a --- /dev/null +++ b/src/aignostics/utils/_settings.py @@ -0,0 +1,89 @@ +"""Utilities around Pydantic settings.""" + +import json +import logging +import sys +from pathlib import Path +from typing import TypeVar + +from pydantic import FieldSerializationInfo, SecretStr, ValidationError +from pydantic_settings import BaseSettings +from rich.panel import Panel +from rich.text import Text + +from ._console import console + +T = TypeVar("T", bound=BaseSettings) + +logger = logging.getLogger(__name__) + +UNHIDE_SENSITIVE_INFO = "unhide_sensitive_info" + + +def strip_to_none_before_validator(v: str | None) -> str | None: + if v is None: + return None + v = v.strip() + if not v: + return None + return v + + +class OpaqueSettings(BaseSettings): + @staticmethod + def serialize_sensitive_info(input_value: SecretStr, info: FieldSerializationInfo) -> str | None: + if not input_value: + return None + if info.context.get(UNHIDE_SENSITIVE_INFO, False): # type: ignore + return input_value.get_secret_value() + return str(input_value) + + +def load_settings(settings_class: type[T]) -> T: + """ + Load settings with error handling and nice formatting. + + Args: + settings_class: The Pydantic settings class to instantiate + + Returns: + (T): Instance of the settings class + + Raises: + SystemExit: If settings validation fails + """ + try: + return settings_class() + except ValidationError as e: + errors = json.loads(e.json()) + text = Text() + text.append( + "Validation error(s): \n\n", + style="debug", + ) + + prefix = settings_class.model_config.get("env_prefix", "") + for error in errors: + env_var = f"{prefix}{error['loc'][0]}".upper() + logger.fatal(f"Configuration invalid! {env_var}: {error['msg']}") + text.append(f"• {env_var}", style="yellow bold") + text.append(f": {error['msg']}\n") + + text.append( + "\nCheck settings defined in the process environment and in file ", + style="info", + ) + env_file = str(settings_class.model_config.get("env_file", ".env") or ".env") + text.append( + str(Path(__file__).parent.parent.parent.parent / env_file), + style="bold blue underline", + ) + + console.print( + Panel( + text, + title="Configuration invalid!", + border_style="error", + ), + ) + sys.exit(78) diff --git a/src/aignostics/utils/boot.py b/src/aignostics/utils/boot.py new file mode 100644 index 00000000..8fa9e99a --- /dev/null +++ b/src/aignostics/utils/boot.py @@ -0,0 +1,86 @@ +"""Boot sequence.""" + +import os +import sys + +from ._log import logging_initialize +from ._logfire import logfire_initialize +from ._sentry import sentry_initialize + +_boot_called = False + + +def boot(modules_to_instrument: list[str]) -> None: + """Boot the application. + + Args: + modules_to_instrument (list): List of modules to be instrumented. + repository_url (str): URL of the repository. + repository_root_path (str): The root path of the repository. Default is the root path. + """ + global _boot_called # noqa: PLW0603 + if _boot_called: + return + _boot_called = True + sentry_initialize() + log_to_logfire = logfire_initialize(modules_to_instrument) + logging_initialize(log_to_logfire) + _amend_library_path() + _parse_env_args() + _log_boot_message() + + +from ._constants import __project_name__, __version__ # noqa: E402 +from ._log import get_logger # noqa: E402 +from ._process import get_process_info # noqa: E402 + + +def _parse_env_args() -> None: + """Parse --env arguments from command line and add to environment if prefix matches. + + - Last but not least removes those args so typer does not complain about them. + """ + i = 1 # Start after script name + to_remove = [] + prefix = f"{__project_name__.upper()}_" + + while i < len(sys.argv): + current_arg = sys.argv[i] + + # Handle "--env KEY=VALUE" or "-e KEY=VALUE" format (two separate arguments) + if (current_arg in {"--env", "-e"}) and i + 1 < len(sys.argv): + key_value = sys.argv[i + 1] + if "=" in key_value: + key, value = key_value.split("=", 1) + if key.startswith(prefix): + os.environ[key] = value.strip("\"'") + to_remove.extend([i, i + 1]) + i += 2 + continue + + i += 1 + + # Remove processed arguments from sys.argv in reverse order + for index in sorted(to_remove, reverse=True): + del sys.argv[index] + + +def _amend_library_path() -> None: + """Patch environment variables before any other imports.""" + if "DYLD_FALLBACK_LIBRARY_PATH" not in os.environ: + os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = f"{os.getenv('HOMEBREW_PREFIX', '/opt/homebrew')}/lib/" + + +def _log_boot_message() -> None: + """Log boot message with version and process information.""" + logger = get_logger(__name__) + process_info = get_process_info() + logger.info( + "⭐ Booting %s v%s (project root %s, pid %s), parent '%s' (pid %s)", + __project_name__, + __version__, + process_info.project_root, + process_info.pid, + process_info.parent.name, + process_info.parent.pid, + ) diff --git a/tests/__init__.py b/tests/__init__.py index 3a3c8893..4851adef 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1 +1 @@ -"""Test suite for Aignostics Python SDK.""" +"""Test suite of Aignostics Python SDK.""" diff --git a/tests/aignostics/__init__.py b/tests/aignostics/__init__.py new file mode 100644 index 00000000..daf30e80 --- /dev/null +++ b/tests/aignostics/__init__.py @@ -0,0 +1 @@ +"""Test suite for package {{ import_package_name }}.""" diff --git a/tests/aignostics/application/__init__.py b/tests/aignostics/application/__init__.py new file mode 100644 index 00000000..b64cd422 --- /dev/null +++ b/tests/aignostics/application/__init__.py @@ -0,0 +1 @@ +"""Tests of application module.""" diff --git a/tests/aignostics/cli/core_test.py b/tests/aignostics/application/cli_test.py similarity index 58% rename from tests/aignostics/cli/core_test.py rename to tests/aignostics/application/cli_test.py index b91aeef4..38b55729 100644 --- a/tests/aignostics/cli/core_test.py +++ b/tests/aignostics/application/cli_test.py @@ -3,13 +3,8 @@ import pytest from typer.testing import CliRunner -from aignostics import ( - __version__, -) from aignostics.cli import cli -BUILT_WITH_LOVE = "built with love in Berlin" - @pytest.fixture def runner() -> CliRunner: @@ -17,79 +12,16 @@ def runner() -> CliRunner: return CliRunner() -def test_cli_built_with_love(runner) -> None: - """Check epilog shown.""" - result = runner.invoke(cli, ["--help"]) - assert result.exit_code == 0 - assert BUILT_WITH_LOVE in result.output - assert __version__ in result.output - - -@pytest.mark.scheduled -def test_cli_health(runner: CliRunner) -> None: - """Check health is true.""" - result = runner.invoke(cli, ["platform", "health"]) - assert result.exit_code == 0 - assert "True" in result.output - - -def test_cli_info(runner: CliRunner) -> None: - """Check info command returns system information.""" - result = runner.invoke(cli, ["platform", "info"]) - assert result.exit_code == 0 - assert "CPython" in result.output - - -def test_cli_info_json(runner: CliRunner) -> None: - """Check info command returns system information.""" - result = runner.invoke(cli, ["platform", "info", "--output-format", "json"]) - assert result.exit_code == 0 - assert "CPython" in result.output - - -def test_cli_info_full(runner: CliRunner) -> None: - """Check info command returns system information.""" - result = runner.invoke(cli, ["platform", "info", "--env", "--no-filter-secrets"]) - assert result.exit_code == 0 - assert "HOME" in result.output - - -def test_cli_openapi_yaml(runner: CliRunner) -> None: - """Check openapi command outputs YAML schema.""" - result = runner.invoke(cli, ["platform", "openapi"]) - assert result.exit_code == 0 - # Check for common OpenAPI YAML elements - assert "openapi:" in result.output - assert "info:" in result.output - assert "paths:" in result.output - - -def test_cli_openapi_json(runner: CliRunner) -> None: - """Check openapi command outputs JSON schema.""" - result = runner.invoke(cli, ["platform", "openapi", "--output-format", "json"]) - assert result.exit_code == 0 - # Check for common OpenAPI JSON elements - assert '"openapi":' in result.output - assert '"info":' in result.output - assert '"paths":' in result.output - - -def test_cli_install(runner: CliRunner) -> None: - """Check install command runs successfully.""" - result = runner.invoke(cli, ["platform", "install"]) - assert result.exit_code == 0 - - def test_cli_bucket_ls(runner: CliRunner) -> None: """Check bucket ls command runs successfully.""" - result = runner.invoke(cli, ["platform", "bucket", "ls"]) + result = runner.invoke(cli, ["application", "bucket", "ls"]) assert result.exit_code == 0 assert "bucket ls" in result.output def test_cli_bucket_purge(runner: CliRunner) -> None: """Check bucket purge command runs successfully.""" - result = runner.invoke(cli, ["platform", "bucket", "purge"]) + result = runner.invoke(cli, ["application", "bucket", "purge"]) assert result.exit_code == 0 assert "bucket purged" in result.output @@ -127,6 +59,8 @@ def test_cli_run_submit(runner: CliRunner) -> None: assert "submit run" in result.output +# TODO(Andreas): Check, just call uv run aignostics application run list +@pytest.mark.skip(reason="This test is skipped because it fails with inconsistent auth stated.") def test_cli_run_list(runner: CliRunner) -> None: """Check run list command runs successfully.""" result = runner.invoke(cli, ["application", "run", "list"]) diff --git a/tests/aignostics/cli_test.py b/tests/aignostics/cli_test.py new file mode 100644 index 00000000..edf0c203 --- /dev/null +++ b/tests/aignostics/cli_test.py @@ -0,0 +1,91 @@ +"""Tests to verify the CLI functionality of OE Python Template.""" + +import os +import subprocess +import sys + +import pytest +from typer.testing import CliRunner + +from aignostics.cli import cli +from aignostics.utils import ( + __version__, +) + +BUILT_WITH_LOVE = "built with love in Berlin" +THE_VALUE = "THE_VALUE" + + +@pytest.fixture +def runner() -> CliRunner: + """Provide a CLI test runner fixture.""" + return CliRunner() + + +def test_cli_built_with_love(runner) -> None: + """Check epilog shown.""" + result = runner.invoke(cli, ["--help"]) + assert result.exit_code == 0 + assert BUILT_WITH_LOVE in result.output + assert __version__ in result.output + + +def test_cli_fails_on_invalid_setting_with_env_arg() -> None: + """Check system fails on boot with invalid setting using subprocess.""" + # Run the CLI as a subprocess with environment variable + result = subprocess.run( + [ + sys.executable, + "-m", + "aignostics.cli", + "system", + "info", + "--env", + "AIGNOSTICS_LOG_LEVEL=FAIL", + ], + capture_output=True, + text=True, + check=False, + ) + + # Check the return code (78 indicates validation failed) + assert result.returncode == 78 + # Check that the error message is in the stderr + assert "Input should be 'CRITICAL'" in result.stdout + + +def test_cli_fails_on_invalid_setting_with_environ(runner) -> None: + """Check system fails on boot with invalid setting using CliRunner and environment variables.""" + # Set the environment variable directly + with runner.isolated_filesystem(): + # Set environment variable for the test + env = os.environ.copy() + env["AIGNOSTICS_LOG_LEVEL"] = "DEBUG" + + # custom + env["AIGNOSTICS_CLIENT_ID_DEVICE"] = THE_VALUE + env["AIGNOSTICS_CLIENT_ID_INTERACTIVE"] = THE_VALUE + # end custon + + # Run the CLI with the runner + result = runner.invoke(cli, ["system", "info"], env=env) + + # Check the exit code (0 indicates all good) + assert result.exit_code == 0 + + # Set environment variable for the test + env = os.environ.copy() + env["AIGNOSTICS_LOG_LEVEL"] = "FAIL" + + # custom + env["AIGNOSTICS_CLIENT_ID_DEVICE"] = THE_VALUE + env["AIGNOSTICS_CLIENT_ID_INTERACTIVE"] = THE_VALUE + # end custon + + # Run the CLI with the runner + result = runner.invoke(cli, ["system", "info"], env=env) + + # Check the exit code (78 indicates validation failed) + assert result.exit_code == 78 + # Check that the error message is in the output + assert "Input should be 'CRITICAL'" in result.output diff --git a/tests/aignostics/client/__init__.py b/tests/aignostics/client/__init__.py new file mode 100644 index 00000000..185dfe7f --- /dev/null +++ b/tests/aignostics/client/__init__.py @@ -0,0 +1 @@ +"""Tests of client module.""" diff --git a/tests/aignostics/client/authentication_test.py b/tests/aignostics/client/authentication_test.py index 4a3974cb..c9021ed7 100644 --- a/tests/aignostics/client/authentication_test.py +++ b/tests/aignostics/client/authentication_test.py @@ -31,7 +31,7 @@ def mock_settings() -> MagicMock: Yields: MagicMock: A mock of the authentication settings. """ - with patch("aignostics.client._authentication.authentication_settings") as mock_settings: + with patch("aignostics.client._authentication.settings") as mock_settings: settings = MagicMock() # Using tmp_path in a controlled test environment is acceptable for testing settings.token_file = Path("mock_token_path") # Avoid hardcoded /tmp path diff --git a/tests/aignostics/client/scheduled_test.py b/tests/aignostics/client/scheduled_test.py index 2020bd8c..a32dfbe3 100644 --- a/tests/aignostics/client/scheduled_test.py +++ b/tests/aignostics/client/scheduled_test.py @@ -19,7 +19,7 @@ ) import aignostics.client -from aignostics.client.utils import calculate_file_crc32c, generate_signed_url, mime_type_to_file_ending +from aignostics.client._utils import calculate_file_crc32c, generate_signed_url, mime_type_to_file_ending def three_spots_payload() -> list[ItemCreationRequest]: diff --git a/tests/aignostics/client/settings_test.py b/tests/aignostics/client/settings_test.py index 928b4ec4..3ef580b7 100644 --- a/tests/aignostics/client/settings_test.py +++ b/tests/aignostics/client/settings_test.py @@ -8,7 +8,7 @@ import pytest from pydantic import SecretStr -from aignostics import ( +from aignostics.client import ( API_ROOT_DEV, API_ROOT_PRODUCTION, API_ROOT_STAGING, @@ -30,10 +30,11 @@ TOKEN_URL_DEV, TOKEN_URL_PRODUCTION, TOKEN_URL_STAGING, - __project_name__, + UNKNOWN_ENDPOINT_URL, + Settings, + settings, ) -from aignostics.client._messages import UNKNOWN_ENDPOINT_URL -from aignostics.client._settings import AuthenticationSettings, authentication_settings +from aignostics.utils import __project_name__ @pytest.fixture @@ -52,26 +53,23 @@ def mock_env_vars(): # noqa: ANN201 @pytest.fixture def reset_cached_settings(): # noqa: ANN201 """Reset the cached authentication settings.""" - from aignostics.client._settings import __cached_authentication_settings + from aignostics.client._settings import __cached_settings # Store original - original = __cached_authentication_settings + original = __cached_settings - # Reset for test - from aignostics.client import _settings - - _settings.__cached_authentication_settings = None + settings.__cached_settings = None yield # Restore original - _settings.__cached_authentication_settings = original + settings.__cached_settings = original def test_authentication_settings_production(mock_env_vars, reset_cached_settings) -> None: """Test authentication settings with production API root.""" # Create settings with production API root - settings = AuthenticationSettings( + settings = Settings( client_id_device=SecretStr("test-client-id-device"), client_id_interactive=SecretStr("test-client-id-interactive"), api_root=API_ROOT_PRODUCTION, @@ -97,7 +95,7 @@ def test_authentication_settings_production(mock_env_vars, reset_cached_settings def test_authentication_settings_staging(mock_env_vars) -> None: """Test authentication settings with staging API root.""" - settings = AuthenticationSettings( + settings = Settings( client_id_device=SecretStr("test-client-id-device"), client_id_interactive=SecretStr("test-client-id-interactive"), api_root=API_ROOT_STAGING, @@ -114,7 +112,7 @@ def test_authentication_settings_staging(mock_env_vars) -> None: def test_authentication_settings_dev(mock_env_vars) -> None: """Test authentication settings with dev API root.""" - settings = AuthenticationSettings( + settings = Settings( client_id_device=SecretStr("test-client-id-device"), client_id_interactive=SecretStr("test-client-id-interactive"), api_root=API_ROOT_DEV, @@ -132,7 +130,7 @@ def test_authentication_settings_dev(mock_env_vars) -> None: def test_authentication_settings_unknown_api_root(mock_env_vars) -> None: """Test authentication settings with unknown API root raises ValueError.""" with pytest.raises(ValueError, match=UNKNOWN_ENDPOINT_URL): - AuthenticationSettings( + Settings( client_id_device=SecretStr("test-client-id-device"), client_id_interactive=SecretStr("test-client-id-interactive"), api_root="https://unknown.example.com", @@ -141,7 +139,7 @@ def test_authentication_settings_unknown_api_root(mock_env_vars) -> None: def test_scope_elements_empty() -> None: """Test scope_elements property with empty scope.""" - settings = AuthenticationSettings( + settings = Settings( client_id_device=SecretStr("test-client-id-device"), client_id_interactive=SecretStr("test-client-id-interactive"), scope="", @@ -152,7 +150,7 @@ def test_scope_elements_empty() -> None: def test_scope_elements_multiple() -> None: """Test scope_elements property with multiple scopes.""" - settings = AuthenticationSettings( + settings = Settings( client_id_device=SecretStr("test-client-id-device"), client_id_interactive=SecretStr("test-client-id-interactive"), scope="offline_access, profile, email", @@ -163,7 +161,7 @@ def test_scope_elements_multiple() -> None: def test_authentication_settings_with_refresh_token(mock_env_vars) -> None: """Test authentication settings with refresh token.""" - settings = AuthenticationSettings( + settings = Settings( client_id_device=SecretStr("test-client-id-device"), client_id_interactive=SecretStr("test-client-id-interactive"), refresh_token=SecretStr("test-refresh-token"), @@ -175,19 +173,20 @@ def test_authentication_settings_with_refresh_token(mock_env_vars) -> None: def test_lazy_authentication_settings(mock_env_vars, reset_cached_settings) -> None: """Test lazy loading of authentication settings.""" # First call should create the settings - settings1 = authentication_settings() + settings1 = settings() assert settings1 is not None # Second call should return the same instance - settings2 = authentication_settings() + settings2 = settings() assert settings2 is settings1 +@pytest.mark.sequential def test_authentication_settings_with_env_vars(mock_env_vars, reset_cached_settings) -> None: """Test authentication settings from environment variables.""" - settings = authentication_settings() - assert settings.client_id_device.get_secret_value() == "test-client-id-device" - assert settings.client_id_interactive.get_secret_value() == "test-client-id-interactive" + settings1 = settings() + assert settings1.client_id_device.get_secret_value() == "test-client-id-device" + assert settings1.client_id_interactive.get_secret_value() == "test-client-id-interactive" # TODO(Helmut): fixme @@ -196,14 +195,14 @@ def test_custom_env_file_location(mock_env_vars) -> None: """Test custom env file location.""" custom_env_file = "/home/dummy/test_env_file" with mock.patch.dict(os.environ, {f"{__project_name__.upper()}_ENV_FILE": custom_env_file}): - settings = AuthenticationSettings.model_config + settings = Settings.model_config assert custom_env_file in settings["env_file"] def test_custom_cache_dir(mock_env_vars) -> None: """Test custom cache directory.""" custom_cache_dir = "/home/dummy/test_cache_dir" - settings = AuthenticationSettings( + settings = Settings( client_id_device=SecretStr("test-client-id-device"), client_id_interactive=SecretStr("test-client-id-interactive"), cache_dir=custom_cache_dir, diff --git a/tests/aignostics/client/utils_test.py b/tests/aignostics/client/utils_test.py index 327db71b..c91b9001 100644 --- a/tests/aignostics/client/utils_test.py +++ b/tests/aignostics/client/utils_test.py @@ -2,7 +2,7 @@ import pytest -from aignostics.client.utils import mime_type_to_file_ending +from aignostics.client import mime_type_to_file_ending class TestMimeTypeToFileEnding: diff --git a/tests/aignostics/cli/docker_test.py b/tests/aignostics/docker_test.py similarity index 72% rename from tests/aignostics/cli/docker_test.py rename to tests/aignostics/docker_test.py index f2ce767f..6cc0d84e 100644 --- a/tests/aignostics/cli/docker_test.py +++ b/tests/aignostics/docker_test.py @@ -1,4 +1,4 @@ -"""Tests to verify the CLI functionality of Aignostics Python SDK.""" +"""Tests to verify the CLI functionality of OE Python Template works with Docker.""" import pytest @@ -7,9 +7,11 @@ @pytest.mark.xdist_group(name="docker") @pytest.mark.skip_with_act -@pytest.mark.skip +@pytest.mark.docker +@pytest.mark.long_running +@pytest.mark.scheduled def test_core_docker_cli_help_with_love(docker_services) -> None: """Test the CLI help command with docker services returns expected output.""" - out = docker_services._docker_compose.execute("run aignostics --help ") + out = docker_services._docker_compose.execute("run aignostics --help") out_str = out.decode("utf-8") assert "built with love in Berlin" in out_str diff --git a/tests/aignostics/system/__init__.py b/tests/aignostics/system/__init__.py new file mode 100644 index 00000000..b347f6bb --- /dev/null +++ b/tests/aignostics/system/__init__.py @@ -0,0 +1 @@ +"""Tests of system module.""" diff --git a/tests/aignostics/system/cli_test.py b/tests/aignostics/system/cli_test.py new file mode 100644 index 00000000..1b8b7462 --- /dev/null +++ b/tests/aignostics/system/cli_test.py @@ -0,0 +1,88 @@ +"""Tests to verify the CLI functionality of the system module.""" + +import os + +import pytest +from typer.testing import CliRunner + +from aignostics.cli import cli + +THE_VALUE = "THE_VALUE" + + +@pytest.fixture +def runner() -> CliRunner: + """Provide a CLI test runner fixture.""" + return CliRunner() + + +@pytest.mark.scheduled +def test_cli_health(runner: CliRunner) -> None: + """Check health is true.""" + result = runner.invoke(cli, ["system", "health"]) + assert result.exit_code == 0 + assert "UP" in result.output + + +def test_cli_info(runner: CliRunner) -> None: + """Check health is true.""" + result = runner.invoke(cli, ["system", "info"]) + assert result.exit_code == 0 + assert "aignostics.log" in result.output + + +def test_cli_info_secrets(runner: CliRunner) -> None: + """Check secrets only shown if requested.""" + with runner.isolated_filesystem(): + # Set environment variable for the test + env = os.environ.copy() + env["AIGNOSTICS_SYSTEM_TOKEN"] = THE_VALUE + + # custom + env["AIGNOSTICS_CLIENT_ID_DEVICE"] = THE_VALUE + env["AIGNOSTICS_CLIENT_ID_INTERACTIVE"] = THE_VALUE + # end custon + + # Run the CLI with the runner + result = runner.invoke(cli, ["system", "info"], env=env) + assert result.exit_code == 0 + assert THE_VALUE not in result.output + + # Run the CLI with the runner + result = runner.invoke(cli, ["system", "info", "--no-filter-secrets"], env=env) + assert result.exit_code == 0 + assert THE_VALUE in result.output + + +def test_cli_openapi_yaml(runner: CliRunner) -> None: + """Check openapi command outputs YAML schema.""" + result = runner.invoke(cli, ["system", "openapi", "--output-format", "yaml"]) + assert result.exit_code == 0 + # Check for common OpenAPI YAML elements + assert "ApplicationRunStatus:" in result.output + + result = runner.invoke(cli, ["system", "openapi", "--api-version", "v3", "--output-format", "yaml"]) + assert result.exit_code == 1 + assert "Error: Invalid API version 'v3'. Available versions: v1" in result.output + + +def test_cli_openapi_json(runner: CliRunner) -> None: + """Check openapi command outputs JSON schema.""" + result = runner.invoke(cli, ["system", "openapi"]) + assert result.exit_code == 0 + # Check for common OpenAPI JSON elements + assert '"openapi":' in result.output + assert '"info":' in result.output + assert '"paths":' in result.output + + +def test_cli_install(runner: CliRunner) -> None: + """Check install command runs successfully.""" + result = runner.invoke(cli, ["system", "install"]) + assert result.exit_code == 0 + + +def test_cli_whoami(runner: CliRunner) -> None: + """Check install command runs successfully.""" + result = runner.invoke(cli, ["system", "whoami"]) + assert result.exit_code == 0 diff --git a/tests/aignostics/system/service_test.py b/tests/aignostics/system/service_test.py new file mode 100644 index 00000000..afc6ec1e --- /dev/null +++ b/tests/aignostics/system/service_test.py @@ -0,0 +1,36 @@ +"""Tests of the system service.""" + +import os +from unittest import mock + +from aignostics.system._service import Service + + +def test_is_token_valid() -> None: + """Test that is_token_valid works correctly with environment variable.""" + # Set the environment variable for the test + the_value = "the_value" + with mock.patch.dict(os.environ, {"AIGNOSTICS_SYSTEM_TOKEN": the_value}): + # Create a new service instance to pick up the environment variable + service = Service() + + # Test with matching token + assert service.is_token_valid(the_value) is True + + # Test with non-matching token + assert service.is_token_valid("wrong-value") is False + + # Test with empty token + assert service.is_token_valid("") is False + + +def test_is_token_valid_when_not_set() -> None: + """Test that is_token_valid handles the case when no token is set.""" + # Ensure the environment variable is not set + with mock.patch.dict(os.environ, {"AIGNOSTICS_SYSTEM_TOKEN": ""}, clear=True): + # Create a new service instance with no token set + service = Service() + + # Should return False for any token when no token is set + assert service.is_token_valid("any-token") is False + assert service.is_token_valid("") is False diff --git a/tests/conftest.py b/tests/conftest.py index d9500480..4b9d8a0d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,15 +1,74 @@ """Common test fixtures and configuration.""" +import os from pathlib import Path import pytest +def pytest_collection_modifyitems(config, items) -> None: + """Modify collected test items by skipping tests marked as 'long_running' unless matching marker given. + + Args: + config: The pytest configuration object. + items: The list of collected test items. + """ + if not config.getoption("-m"): + skip_me = pytest.mark.skip(reason="skipped as no marker given on execution using '-m'") + for item in items: + if "long_running" in item.keywords: + item.add_marker(skip_me) + + @pytest.fixture(scope="session") def docker_compose_file(pytestconfig) -> str: """Get the path to the docker compose file. + Args: + pytestconfig: The pytest configuration object. + Returns: str: The path to the docker compose file. """ + # We want to test the compose.yaml file in the root of the project. return str(Path(pytestconfig.rootdir) / "compose.yaml") + + +@pytest.fixture(scope="session") +def docker_setup() -> list[str] | str: + """Commands to run when spinning up services. + + Args: + scope: The scope of the fixture. + + Returns: + list[str] | str: The commands to run. + """ + # You can consider to return an empty list so you can decide on the + # commands to run in the test itself + return ["up --build -d"] + + +def docker_compose_project_name() -> str: + """Generate a project name using the current process PID. + + Returns: + str: The project name. + """ + # You can consider to override this with a project name to reuse the stack + # across test executions. + return f"pytest{os.getpid()}" + + +def pytest_sessionfinish(session, exitstatus) -> None: + """Run after the test session ends. + + Does change behavior if no test matching the marker is found: + - Sets the exit status to 0 instead of 5. + + Args: + session: The pytest session object. + exitstatus: The exit status of the test session. + """ + if exitstatus == 5: + session.exitstatus = 0 diff --git a/tests/fixtures/.keep b/tests/fixtures/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/fixtures/__init__.py b/tests/fixtures/__init__.py new file mode 100644 index 00000000..10ce9158 --- /dev/null +++ b/tests/fixtures/__init__.py @@ -0,0 +1 @@ +"""Fixtures shared accross test suite.""" diff --git a/uv.lock b/uv.lock index b610d74d..84feedf7 100644 --- a/uv.lock +++ b/uv.lock @@ -16,19 +16,33 @@ version = "0.0.10" source = { editable = "." } dependencies = [ { name = "appdirs" }, + { name = "fastapi", extra = ["all", "standard"] }, { name = "google-cloud-storage" }, { name = "google-crc32c" }, { name = "httpx" }, { name = "jsf" }, { name = "jsonschema" }, + { name = "logfire", extra = ["system-metrics"] }, + { name = "opentelemetry-instrumentation-fastapi" }, + { name = "opentelemetry-instrumentation-httpx" }, + { name = "opentelemetry-instrumentation-jinja2" }, + { name = "opentelemetry-instrumentation-requests" }, + { name = "opentelemetry-instrumentation-sqlite3" }, + { name = "opentelemetry-instrumentation-tornado" }, + { name = "opentelemetry-instrumentation-urllib" }, + { name = "opentelemetry-instrumentation-urllib3" }, + { name = "psutil" }, { name = "pydantic" }, { name = "pydantic-settings" }, { name = "pyjwt", extra = ["crypto"] }, - { name = "python-dotenv" }, + { name = "python-dateutil" }, + { name = "pyyaml" }, { name = "requests" }, { name = "requests-oauthlib" }, + { name = "sentry-sdk" }, { name = "tqdm" }, { name = "typer" }, + { name = "uptime" }, { name = "urllib3" }, ] @@ -89,6 +103,7 @@ dev = [ requires-dist = [ { name = "appdirs", specifier = ">=1.4.4" }, { name = "boto3", marker = "extra == 'aws'", specifier = ">=1.37.27" }, + { name = "fastapi", extras = ["standard", "all"], specifier = ">=0.115.12" }, { name = "google-cloud-storage", specifier = ">=3.1.0" }, { name = "google-crc32c", specifier = ">=1.7.1" }, { name = "httpx", specifier = ">=0.28.1" }, @@ -96,16 +111,29 @@ requires-dist = [ { name = "jsf", specifier = ">=0.11.2" }, { name = "jsonschema", specifier = ">=4.23.0" }, { name = "jupyter", marker = "extra == 'examples'", specifier = ">=1.1.1" }, - { name = "marimo", marker = "extra == 'examples'", specifier = ">=0.12.2" }, - { name = "pydantic", specifier = ">=2.11.1" }, + { name = "logfire", extras = ["system-metrics"], specifier = ">=3.13.1" }, + { name = "marimo", marker = "extra == 'examples'", specifier = ">=0.12.8" }, + { name = "opentelemetry-instrumentation-fastapi", specifier = ">=0.53b0" }, + { name = "opentelemetry-instrumentation-httpx", specifier = ">=0.53b0" }, + { name = "opentelemetry-instrumentation-jinja2", specifier = ">=0.53b0" }, + { name = "opentelemetry-instrumentation-requests", specifier = ">=0.53b0" }, + { name = "opentelemetry-instrumentation-sqlite3", specifier = ">=0.53b0" }, + { name = "opentelemetry-instrumentation-tornado", specifier = ">=0.53b0" }, + { name = "opentelemetry-instrumentation-urllib", specifier = ">=0.53b0" }, + { name = "opentelemetry-instrumentation-urllib3", specifier = ">=0.53b0" }, + { name = "psutil", specifier = ">=7.0.0" }, + { name = "pydantic", specifier = ">=2.11.3" }, { name = "pydantic-settings", specifier = ">=2.8.1" }, { name = "pyjwt", extras = ["crypto"], specifier = ">=2.10.1" }, - { name = "python-dotenv", specifier = ">=1.1.0" }, + { name = "python-dateutil", specifier = ">=2.9.0.post0" }, + { name = "pyyaml", specifier = ">=6.0" }, { name = "requests", specifier = ">=2.32.3" }, { name = "requests-oauthlib", specifier = ">=2.0.0" }, + { name = "sentry-sdk", specifier = ">=2.25.1" }, { name = "streamlit", marker = "extra == 'examples'", specifier = ">=1.44.1" }, { name = "tqdm", specifier = ">=4.67.1" }, { name = "typer", specifier = ">=0.15.1" }, + { name = "uptime", specifier = ">=3.0.1" }, { name = "urllib3", specifier = ">=2.2.3" }, ] provides-extras = ["examples", "aws"] @@ -122,20 +150,20 @@ dev = [ { name = "matplotlib", specifier = ">=3.10.1" }, { name = "mypy", specifier = ">=1.5.0" }, { name = "nox", extras = ["uv"], specifier = ">=2025.2.9" }, - { name = "pip-audit", specifier = ">=2.8.0" }, + { name = "pip-audit", specifier = ">=2.9.0" }, { name = "pip-licenses", git = "https://github.com/neXenio/pip-licenses.git?rev=master" }, { name = "pre-commit", specifier = ">=4.1.0" }, - { name = "pyright", specifier = ">=1.1.398" }, + { name = "pyright", specifier = ">=1.1.399" }, { name = "pytest", specifier = ">=8.3.5" }, { name = "pytest-asyncio", specifier = ">=0.26.0" }, - { name = "pytest-cov", specifier = ">=6.1.0" }, - { name = "pytest-docker", specifier = ">=3.2.0" }, + { name = "pytest-cov", specifier = ">=6.1.1" }, + { name = "pytest-docker", specifier = ">=3.2.1" }, { name = "pytest-env", specifier = ">=1.1.5" }, { name = "pytest-regressions", specifier = ">=2.7.0" }, { name = "pytest-subprocess", specifier = ">=1.5.3" }, { name = "pytest-timeout", specifier = ">=2.3.1" }, { name = "pytest-xdist", extras = ["psutil"], specifier = ">=3.6.1" }, - { name = "ruff", specifier = ">=0.11.2" }, + { name = "ruff", specifier = ">=0.11.5" }, { name = "sphinx", specifier = ">=8.2.3" }, { name = "sphinx-autobuild", specifier = ">=2024.10.3" }, { name = "sphinx-copybutton", specifier = ">=0.5.2" }, @@ -301,6 +329,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", size = 66419 }, ] +[[package]] +name = "asgiref" +version = "3.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/38/b3395cc9ad1b56d2ddac9970bc8f4141312dbaec28bc7c218b0dfafd0f42/asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590", size = 35186 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", size = 23828 }, +] + [[package]] name = "asttokens" version = "3.0.0" @@ -925,6 +962,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/99/2c/3e3afb1df3dc8a8deeb143f6ac41acbfdfae4f03a54c760871c56832a554/dependency_groups-1.3.0-py3-none-any.whl", hash = "sha256:1abf34d712deda5581e80d507512664d52b35d1c2d7caf16c85e58ca508547e0", size = 8597 }, ] +[[package]] +name = "deprecated" +version = "1.2.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 }, +] + [[package]] name = "detect-secrets" version = "1.5.0" @@ -960,6 +1009,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, ] +[[package]] +name = "dnspython" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 }, +] + [[package]] name = "docutils" version = "0.21.2" @@ -982,6 +1040,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/11/208f72084084d3f6a2ed5ebfdfc846692c3f7ad6dce65e400194924f7eed/domdf_python_tools-3.10.0-py3-none-any.whl", hash = "sha256:5e71c1be71bbcc1f881d690c8984b60e64298ec256903b3147f068bc33090c36", size = 126860 }, ] +[[package]] +name = "email-validator" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521 }, +] + [[package]] name = "enum-tools" version = "0.12.0" @@ -1025,6 +1096,63 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/a1/8936bc8e79af80ca38288dd93ed44ed1f9d63beb25447a4c59e746e01f8d/faker-37.1.0-py3-none-any.whl", hash = "sha256:dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c", size = 1918783 }, ] +[[package]] +name = "fastapi" +version = "0.115.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164 }, +] + +[package.optional-dependencies] +all = [ + { name = "email-validator" }, + { name = "fastapi-cli", extra = ["standard"] }, + { name = "httpx" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "orjson" }, + { name = "pydantic-extra-types" }, + { name = "pydantic-settings" }, + { name = "python-multipart" }, + { name = "pyyaml" }, + { name = "ujson" }, + { name = "uvicorn", extra = ["standard"] }, +] +standard = [ + { name = "email-validator" }, + { name = "fastapi-cli", extra = ["standard"] }, + { name = "httpx" }, + { name = "jinja2" }, + { name = "python-multipart" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "fastapi-cli" +version = "0.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "rich-toolkit" }, + { name = "typer" }, + { name = "uvicorn", extra = ["standard"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705 }, +] + +[package.optional-dependencies] +standard = [ + { name = "uvicorn", extra = ["standard"] }, +] + [[package]] name = "fastjsonschema" version = "2.21.1" @@ -1287,6 +1415,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, ] +[[package]] +name = "httptools" +version = "0.6.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029 }, + { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492 }, + { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891 }, + { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788 }, + { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214 }, + { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120 }, + { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565 }, + { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683 }, + { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337 }, + { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796 }, + { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837 }, + { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289 }, + { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779 }, + { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634 }, + { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214 }, + { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431 }, + { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121 }, + { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805 }, + { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858 }, + { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042 }, + { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682 }, +] + [[package]] name = "httpx" version = "0.28.1" @@ -1329,6 +1486,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, ] +[[package]] +name = "importlib-metadata" +version = "8.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/08/c1395a292bb23fd03bdf572a1357c5a733d3eecbab877641ceacab23db6e/importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580", size = 55767 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e", size = 26971 }, +] + [[package]] name = "iniconfig" version = "2.1.0" @@ -1828,6 +1997,29 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/53/84/8a89614b2e7eeeaf0a68a4046d6cfaea4544c8619ea02595ebeec9b2bae3/license_expression-30.4.1-py3-none-any.whl", hash = "sha256:679646bc3261a17690494a3e1cada446e5ee342dbd87dcfa4a0c24cc5dce13ee", size = 111457 }, ] +[[package]] +name = "logfire" +version = "3.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "executing" }, + { name = "opentelemetry-exporter-otlp-proto-http" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-sdk" }, + { name = "protobuf" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/60/8bffe248b2261cd22808e49a882de70e93b2fc7548582daa1009a0ecf9a5/logfire-3.13.1.tar.gz", hash = "sha256:56cd1133bf93d25d2cd44c004df131183997d479a163290e9aab81d58118889a", size = 471902 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/5f/8a05978d8a4ddb13cf04acf7f510b461b76db8d5547cfefe50e42e8a16e8/logfire-3.13.1-py3-none-any.whl", hash = "sha256:b1c662dcb88fbdcfa1b6561f20ed0e758778e5542b21618cca71fee3c45c27eb", size = 191891 }, +] + +[package.optional-dependencies] +system-metrics = [ + { name = "opentelemetry-instrumentation-system-metrics" }, +] + [[package]] name = "lxml" version = "5.3.2" @@ -1889,7 +2081,7 @@ wheels = [ [[package]] name = "marimo" -version = "0.12.4" +version = "0.12.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1910,9 +2102,9 @@ dependencies = [ { name = "uvicorn" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/88/74/9825fd4318bac7a921bb56581407495ce83f6221b9ae1310efdab3c8fd40/marimo-0.12.4.tar.gz", hash = "sha256:2635246a2ae1c685110c7ae64b26b9f098b3b18e948d0bbd780baf025279201c", size = 10712066 } +sdist = { url = "https://files.pythonhosted.org/packages/42/f5/3a7a8637b2c606b3dc66cb5887d0ab638ec29b3cc98931658994c2106d5a/marimo-0.12.8.tar.gz", hash = "sha256:d2d627924a32c73a9491f84e4358df8c83bbe0d4d35d38112f3020b1be32aef1", size = 10727118 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/fa/8e1c719fc75c9f06d90471757b016a1b50c2e35a8a73f422db7537b44891/marimo-0.12.4-py3-none-any.whl", hash = "sha256:b22f38563b0d8811ecf3ed422a906962a040bda914e72ffb74bb4a972ecfcd1e", size = 11070089 }, + { url = "https://files.pythonhosted.org/packages/eb/38/7894596a93c988c9506212ffc5005acf4a8f3877feebfe7598f317adc138/marimo-0.12.8-py3-none-any.whl", hash = "sha256:b4724d224d4bd9dffa4251d1b659a531c7419fe7eb6dea416763845094983f50", size = 11083695 }, ] [[package]] @@ -2345,6 +2537,327 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688 }, ] +[[package]] +name = "opentelemetry-api" +version = "1.32.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "importlib-metadata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7b/34/e701d77900123af17a11dbaf0c9f527fa7ef94b8f02b2c55bed94477890a/opentelemetry_api-1.32.0.tar.gz", hash = "sha256:2623280c916f9b19cad0aa4280cb171265f19fd2909b0d47e4f06f7c83b02cb5", size = 64134 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/e8/d05fd19c1c7e7e230ab44c366791179fd64c843bc587c257a56e853893c5/opentelemetry_api-1.32.0-py3-none-any.whl", hash = "sha256:15df743c765078611f376037b0d9111ec5c1febf2ec9440cdd919370faa1ce55", size = 65285 }, +] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.32.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-proto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/d1/17cae7d133d9e826050f999e282650c7aa7a45cc44e2bab9ca25b65a9bb7/opentelemetry_exporter_otlp_proto_common-1.32.0.tar.gz", hash = "sha256:2bca672f2a279c4f517115e635c0cc1269d07b2982a36681c521f7e56179a222", size = 20624 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/54/b5fd2489edc26280b3065afb2bfa2b3ebfda224af94d5d560cb5e38eba4c/opentelemetry_exporter_otlp_proto_common-1.32.0-py3-none-any.whl", hash = "sha256:277a63a18768b3b460d082a489f6f80d4ae2c1e6b185bb701c6bd4e91405e4bd", size = 18814 }, +] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-http" +version = "1.32.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "googleapis-common-protos" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-proto-common" }, + { name = "opentelemetry-proto" }, + { name = "opentelemetry-sdk" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a4/12/73653c6ad0a8dd63fe314ae10682f80b8ad3aad0c4d15661f355c5ba2fed/opentelemetry_exporter_otlp_proto_http-1.32.0.tar.gz", hash = "sha256:a5dfd94603da86e313e4f4fb8d181fd3b64a7c2a9c7b408c3653d2b1bc68d14f", size = 15129 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/09/431d56e8ee769afd3dea847ef4851e453c81d71d0d48b8832d2936273f9c/opentelemetry_exporter_otlp_proto_http-1.32.0-py3-none-any.whl", hash = "sha256:e2ffecd6d2220eaf1291a46339f109bc0a57ee7c4c6abb8174df418bf00ce01f", size = 17241 }, +] + +[[package]] +name = "opentelemetry-instrumentation" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "packaging" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/93/3b7cc47eb1dd4a347a46d47cafb92767a4ee518d3cbb931d114b4c15d97a/opentelemetry_instrumentation-0.53b0.tar.gz", hash = "sha256:f2c21d71a3cdf28c656e3d90d247ee7558fb9b0239b3d9e9190266499dbed9d2", size = 27902 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/a5/353c9511673615f51b45e0c6a0ba4881370104848f6da7471898fc9cf84f/opentelemetry_instrumentation-0.53b0-py3-none-any.whl", hash = "sha256:70600778fd567c9c5fbfca181378ae179c0dec3ff613171707d3d77c360ff105", size = 30694 }, +] + +[[package]] +name = "opentelemetry-instrumentation-asgi" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a5/43/8bf33d949202ce2f66e184ed5343208ab2b73a85175d77469338bfc24fb1/opentelemetry_instrumentation_asgi-0.53b0.tar.gz", hash = "sha256:b82d7cecdd6a4239ee87e1c629bfd7dae208142ddbb24528d9a9274eb2bc4e44", size = 24231 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/87/c38d049c82436a2b889117f96e0cbab6e98a619407f68eeebd128c1b8ff0/opentelemetry_instrumentation_asgi-0.53b0-py3-none-any.whl", hash = "sha256:a2e242e0633541150bf8e42ed983f8aeec94acb397bc67a3dbdb47933bfdc7f8", size = 16338 }, +] + +[[package]] +name = "opentelemetry-instrumentation-dbapi" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/91/b1ce1ff5dd21e8b58a7ad140fb7965e1b81146e16197b6cb01716e226f4e/opentelemetry_instrumentation_dbapi-0.53b0.tar.gz", hash = "sha256:64baa1499094789e8af65384f9d100238417c05d419d940fdcce2db30353f882", size = 14143 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/4d/4908faa5d2303812f03a333e937d149306d6c8ce53424eccf0681a602cf7/opentelemetry_instrumentation_dbapi-0.53b0-py3-none-any.whl", hash = "sha256:0a3134a6ba366b0b8455412f86d0e689657db5f2b7296dc4d76810aa33257943", size = 12450 }, +] + +[[package]] +name = "opentelemetry-instrumentation-fastapi" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-instrumentation-asgi" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2b/c4/480029aaec9151f4d38c9bffa5f686a7ed86387ddba2344af0fb634df2e1/opentelemetry_instrumentation_fastapi-0.53b0.tar.gz", hash = "sha256:a901ded31595d6e64d35c92379c08d8314baffc8715653ac42349b6140c725ce", size = 19324 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/58/cb008bffa3e59bd3a6a8c9796f5439c9e4d00e95c2c912d41a84d929d482/opentelemetry_instrumentation_fastapi-0.53b0-py3-none-any.whl", hash = "sha256:c29b7b3f5ca5aeb89436a605ac481467630bc761a241cc4258058ba00e6d40ed", size = 12128 }, +] + +[[package]] +name = "opentelemetry-instrumentation-httpx" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/8f/c8432ce48bba5b3a8b1d6a686986ab58a256dcac648d9bea4de4648f04c6/opentelemetry_instrumentation_httpx-0.53b0.tar.gz", hash = "sha256:35b3f84ff0f9cd4ee88b9878776eacdada288136a1a2e87a66120096c4901258", size = 17734 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/26/03e736ed2ef50614a20af7317f447b9a41db505877d44810b0dfb7bc86a5/opentelemetry_instrumentation_httpx-0.53b0-py3-none-any.whl", hash = "sha256:b460764ebe98a0fb8f0939848fc577c16e5be7904aa390b8bd6d8f1b40008cca", size = 14131 }, +] + +[[package]] +name = "opentelemetry-instrumentation-jinja2" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/e5/ecc50073a0ad5313ff45e270477985d24df6c7c9ca71f205c303a381f3c9/opentelemetry_instrumentation_jinja2-0.53b0.tar.gz", hash = "sha256:e5e8a4aed9b3d0abbbf3ad14fb6ebb7ee0cb7a5cfa8e098695cb27a5b42cfcbf", size = 8468 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/18/22d90db173a1fb00d7f859adb22982b1183fa59d6a94247d9529e65ebfd1/opentelemetry_instrumentation_jinja2-0.53b0-py3-none-any.whl", hash = "sha256:d05a7218ca66a719093e034aa881332d4cd91a74ad14063f9432b6706bababd6", size = 9427 }, +] + +[[package]] +name = "opentelemetry-instrumentation-requests" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/bb/39983a82eef85dc26779797dc61b423b46c2c10c7fd10bdb86ab98667129/opentelemetry_instrumentation_requests-0.53b0.tar.gz", hash = "sha256:e6e1d2e9d2e98ce6993f0f4224e5f5cd42cb8843cf594aaa6ff436682c0a200a", size = 14377 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/3f/df98d052613e11e643ed2aeaa660a91d2adbd334b346c5f9a5e8b7c82ab1/opentelemetry_instrumentation_requests-0.53b0-py3-none-any.whl", hash = "sha256:d3fe68fee86e281223d5590f1c37f69b86db7dacd6d69e4a879a32c2281cc2c7", size = 12746 }, +] + +[[package]] +name = "opentelemetry-instrumentation-sqlite3" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-instrumentation-dbapi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/ad/5d08e2a7feb474fc363ab41ff9d5f7fa207485db2633c08c9e16e886832f/opentelemetry_instrumentation_sqlite3-0.53b0.tar.gz", hash = "sha256:4c82214228af8b1fdbef921458c42d204770fc283e7054a23e043e657ae16fab", size = 7931 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/7a/8a8a8d39006db41587392ceda54583bc54c8c04360a47cae216fbc2ce8d6/opentelemetry_instrumentation_sqlite3-0.53b0-py3-none-any.whl", hash = "sha256:39895e81c821192485ef132e1a9fa3865dfaf49a7a6a0a714866b693b27bc844", size = 9340 }, +] + +[[package]] +name = "opentelemetry-instrumentation-system-metrics" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "psutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/24/67d93a698f9a9c6c14f5f39b0520e6116099ad3a3836a2792c9a2d16c42b/opentelemetry_instrumentation_system_metrics-0.53b0.tar.gz", hash = "sha256:fbcc15900f5e8a0c99d85ee6cb9529ecfcbfbe9e6b6d6e158ac80340f40df779", size = 15008 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/26/6678e948955301821f3ef0e3f21138df2b6b0980b5b5ca960ee743c6bee5/opentelemetry_instrumentation_system_metrics-0.53b0-py3-none-any.whl", hash = "sha256:d0c57bc9bb0b5828113d562b9530c399189e1c66b22a7a40a8f2a3966cd6dfbe", size = 13093 }, +] + +[[package]] +name = "opentelemetry-instrumentation-tornado" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d4/b9/39f23cee423083fd1ffcac4494ada724f8aef0d17c54f5f682c8bc454577/opentelemetry_instrumentation_tornado-0.53b0.tar.gz", hash = "sha256:41fb3928767194d72733557b1364d13d6a26baabd47d9a0e129c42697fa417e3", size = 17085 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/2e/ab23c83855ccadc6b4bb54fabb9a91e3f55b04be4a5bb41ae49fefbd0eed/opentelemetry_instrumentation_tornado-0.53b0-py3-none-any.whl", hash = "sha256:03a86b72cef422eaac58332886aeb0daf4b044c683f56752c6ab9aa49886a861", size = 15319 }, +] + +[[package]] +name = "opentelemetry-instrumentation-urllib" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/a8/65be8833eba7500ea801410253f9233ad694d023cbbbee3458cb7f3852ea/opentelemetry_instrumentation_urllib-0.53b0.tar.gz", hash = "sha256:1cbbc161a5e2a6a268edce777eb766aae7de79f74b177669eb4f4a20e4cf2f7c", size = 13790 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/cc/83dd2ab34556926662133d6860195590c26960f132dc27e4e1b34f318f19/opentelemetry_instrumentation_urllib-0.53b0-py3-none-any.whl", hash = "sha256:6c650f13b37f1ce9a3b743d184491b54cf099dedd95d3ac259b6404fb06b686b", size = 12626 }, +] + +[[package]] +name = "opentelemetry-instrumentation-urllib3" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/4b/5a9fcc20123d1b211bf4d7e5801212a40462ec69ddbf220bd241b9129299/opentelemetry_instrumentation_urllib3-0.53b0.tar.gz", hash = "sha256:6741157ade407d971c4ffabda843461c0ad1d3d3b87eecdf8c4f64d46ccfa395", size = 15696 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/8c/0753c35e8464ae52abd039b0c0463342b4a3da3373cbdaa77bbb42bee3b2/opentelemetry_instrumentation_urllib3-0.53b0-py3-none-any.whl", hash = "sha256:ab743da7e564068fc7aaaf686c7cb219fe54ff2bcf8aa2cdb7cde14000ed9679", size = 13126 }, +] + +[[package]] +name = "opentelemetry-proto" +version = "1.32.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/49/1fa0b05e49667c964b59e08770f80c08a17075fe9b5cdea2bb18ae9bf40d/opentelemetry_proto-1.32.0.tar.gz", hash = "sha256:f8b70ae52f4ef8a4e4c0760e87c9071e07ece2618c080d4839bef44c0156cd44", size = 34359 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/7d/6246def5239d9e70861b00e713bd51a880aabdd5d09b3d2453eaadc73a08/opentelemetry_proto-1.32.0-py3-none-any.whl", hash = "sha256:f699269dc037e18fba05442580a8682c9fbd0f4c7f5addfed82c44be0c53c5ff", size = 55852 }, +] + +[[package]] +name = "opentelemetry-sdk" +version = "1.32.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e8/0c/842aed73035cab0302ec70057f3180f4f023974d74bd9764ef3046f358fb/opentelemetry_sdk-1.32.0.tar.gz", hash = "sha256:5ff07fb371d1ab1189fa7047702e2e888b5403c5efcbb18083cae0d5aa5f58d2", size = 161043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/6a/b8cb562234bd94bcf12ad3058ef7f31319b94a8df65130ce9cc2ff3c8d55/opentelemetry_sdk-1.32.0-py3-none-any.whl", hash = "sha256:ed252d035c22a15536c1f603ca089298daab60850fc2f5ddfa95d95cc1c043ea", size = 118990 }, +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "opentelemetry-api" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/c4/213d23239df175b420b74c6e25899c482701e6614822dc51f8c20dae7e2d/opentelemetry_semantic_conventions-0.53b0.tar.gz", hash = "sha256:05b7908e1da62d72f9bf717ed25c72f566fe005a2dd260c61b11e025f2552cf6", size = 114343 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/23/0bef11f394f828f910f32567d057f097dbaba23edf33114018a380a0d0bf/opentelemetry_semantic_conventions-0.53b0-py3-none-any.whl", hash = "sha256:561da89f766ab51615c0e72b12329e0a1bc16945dbd62c8646ffc74e36a1edff", size = 188441 }, +] + +[[package]] +name = "opentelemetry-util-http" +version = "0.53b0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/83/c3b4641f79f1cc9979c4d5ae8cd8125fa0ddad965044688cd5a7acd4c0be/opentelemetry_util_http-0.53b0.tar.gz", hash = "sha256:521111872be0cdfd4346e15e9d4822aeeb8501b094c721ef49c26277b286084e", size = 8044 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/25/f2f7c8d288abdbb32bbef5756f2b7812e6f1a0ab9315d99ad44f3e57fb9c/opentelemetry_util_http-0.53b0-py3-none-any.whl", hash = "sha256:eca40d8cd1c1149081142c44756c0a2da0be306931339b839e1b436a9de101a4", size = 7303 }, +] + +[[package]] +name = "orjson" +version = "3.10.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/c7/03913cc4332174071950acf5b0735463e3f63760c80585ef369270c2b372/orjson-3.10.16.tar.gz", hash = "sha256:d2aaa5c495e11d17b9b93205f5fa196737ee3202f000aaebf028dc9a73750f10", size = 5410415 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/29/43f91a5512b5d2535594438eb41c5357865fd5e64dec745d90a588820c75/orjson-3.10.16-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44fcbe1a1884f8bc9e2e863168b0f84230c3d634afe41c678637d2728ea8e739", size = 249180 }, + { url = "https://files.pythonhosted.org/packages/0c/36/2a72d55e266473c19a86d97b7363bb8bf558ab450f75205689a287d5ce61/orjson-3.10.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78177bf0a9d0192e0b34c3d78bcff7fe21d1b5d84aeb5ebdfe0dbe637b885225", size = 138510 }, + { url = "https://files.pythonhosted.org/packages/bb/ad/f86d6f55c1a68b57ff6ea7966bce5f4e5163f2e526ddb7db9fc3c2c8d1c4/orjson-3.10.16-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12824073a010a754bb27330cad21d6e9b98374f497f391b8707752b96f72e741", size = 132373 }, + { url = "https://files.pythonhosted.org/packages/5e/8b/d18f2711493a809f3082a88fda89342bc8e16767743b909cd3c34989fba3/orjson-3.10.16-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddd41007e56284e9867864aa2f29f3136bb1dd19a49ca43c0b4eda22a579cf53", size = 136773 }, + { url = "https://files.pythonhosted.org/packages/a1/dc/ce025f002f8e0749e3f057c4d773a4d4de32b7b4c1fc5a50b429e7532586/orjson-3.10.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0877c4d35de639645de83666458ca1f12560d9fa7aa9b25d8bb8f52f61627d14", size = 138029 }, + { url = "https://files.pythonhosted.org/packages/0e/1b/cf9df85852b91160029d9f26014230366a2b4deb8cc51fabe68e250a8c1a/orjson-3.10.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a09a539e9cc3beead3e7107093b4ac176d015bec64f811afb5965fce077a03c", size = 142677 }, + { url = "https://files.pythonhosted.org/packages/92/18/5b1e1e995bffad49dc4311a0bdfd874bc6f135fd20f0e1f671adc2c9910e/orjson-3.10.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31b98bc9b40610fec971d9a4d67bb2ed02eec0a8ae35f8ccd2086320c28526ca", size = 132800 }, + { url = "https://files.pythonhosted.org/packages/d6/eb/467f25b580e942fcca1344adef40633b7f05ac44a65a63fc913f9a805d58/orjson-3.10.16-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0ce243f5a8739f3a18830bc62dc2e05b69a7545bafd3e3249f86668b2bcd8e50", size = 135451 }, + { url = "https://files.pythonhosted.org/packages/8d/4b/9d10888038975cb375982e9339d9495bac382d5c976c500b8d6f2c8e2e4e/orjson-3.10.16-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:64792c0025bae049b3074c6abe0cf06f23c8e9f5a445f4bab31dc5ca23dbf9e1", size = 412358 }, + { url = "https://files.pythonhosted.org/packages/3b/e2/cfbcfcc4fbe619e0ca9bdbbfccb2d62b540bbfe41e0ee77d44a628594f59/orjson-3.10.16-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ea53f7e68eec718b8e17e942f7ca56c6bd43562eb19db3f22d90d75e13f0431d", size = 152772 }, + { url = "https://files.pythonhosted.org/packages/b9/d6/627a1b00569be46173007c11dde3da4618c9bfe18409325b0e3e2a82fe29/orjson-3.10.16-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a741ba1a9488c92227711bde8c8c2b63d7d3816883268c808fbeada00400c164", size = 137225 }, + { url = "https://files.pythonhosted.org/packages/0a/7b/a73c67b505021af845b9f05c7c848793258ea141fa2058b52dd9b067c2b4/orjson-3.10.16-cp311-cp311-win32.whl", hash = "sha256:c7ed2c61bb8226384c3fdf1fb01c51b47b03e3f4536c985078cccc2fd19f1619", size = 141733 }, + { url = "https://files.pythonhosted.org/packages/f4/22/5e8217c48d68c0adbfb181e749d6a733761074e598b083c69a1383d18147/orjson-3.10.16-cp311-cp311-win_amd64.whl", hash = "sha256:cd67d8b3e0e56222a2e7b7f7da9031e30ecd1fe251c023340b9f12caca85ab60", size = 133784 }, + { url = "https://files.pythonhosted.org/packages/5d/15/67ce9d4c959c83f112542222ea3b9209c1d424231d71d74c4890ea0acd2b/orjson-3.10.16-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6d3444abbfa71ba21bb042caa4b062535b122248259fdb9deea567969140abca", size = 249325 }, + { url = "https://files.pythonhosted.org/packages/da/2c/1426b06f30a1b9ada74b6f512c1ddf9d2760f53f61cdb59efeb9ad342133/orjson-3.10.16-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:30245c08d818fdcaa48b7d5b81499b8cae09acabb216fe61ca619876b128e184", size = 133621 }, + { url = "https://files.pythonhosted.org/packages/9e/88/18d26130954bc73bee3be10f95371ea1dfb8679e0e2c46b0f6d8c6289402/orjson-3.10.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0ba1d0baa71bf7579a4ccdcf503e6f3098ef9542106a0eca82395898c8a500a", size = 138270 }, + { url = "https://files.pythonhosted.org/packages/4f/f9/6d8b64fcd58fae072e80ee7981be8ba0d7c26ace954e5cd1d027fc80518f/orjson-3.10.16-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb0beefa5ef3af8845f3a69ff2a4aa62529b5acec1cfe5f8a6b4141033fd46ef", size = 132346 }, + { url = "https://files.pythonhosted.org/packages/16/3f/2513fd5bc786f40cd12af569c23cae6381aeddbefeed2a98f0a666eb5d0d/orjson-3.10.16-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6daa0e1c9bf2e030e93c98394de94506f2a4d12e1e9dadd7c53d5e44d0f9628e", size = 136845 }, + { url = "https://files.pythonhosted.org/packages/6d/42/b0e7b36720f5ab722b48e8ccf06514d4f769358dd73c51abd8728ef58d0b/orjson-3.10.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9da9019afb21e02410ef600e56666652b73eb3e4d213a0ec919ff391a7dd52aa", size = 138078 }, + { url = "https://files.pythonhosted.org/packages/a3/a8/d220afb8a439604be74fc755dbc740bded5ed14745ca536b304ed32eb18a/orjson-3.10.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:daeb3a1ee17b69981d3aae30c3b4e786b0f8c9e6c71f2b48f1aef934f63f38f4", size = 142712 }, + { url = "https://files.pythonhosted.org/packages/8c/88/7e41e9883c00f84f92fe357a8371edae816d9d7ef39c67b5106960c20389/orjson-3.10.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fed80eaf0e20a31942ae5d0728849862446512769692474be5e6b73123a23b", size = 133136 }, + { url = "https://files.pythonhosted.org/packages/e9/ca/61116095307ad0be828ea26093febaf59e38596d84a9c8d765c3c5e4934f/orjson-3.10.16-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73390ed838f03764540a7bdc4071fe0123914c2cc02fb6abf35182d5fd1b7a42", size = 135258 }, + { url = "https://files.pythonhosted.org/packages/dc/1b/09493cf7d801505f094c9295f79c98c1e0af2ac01c7ed8d25b30fcb19ada/orjson-3.10.16-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a22bba012a0c94ec02a7768953020ab0d3e2b884760f859176343a36c01adf87", size = 412326 }, + { url = "https://files.pythonhosted.org/packages/ea/02/125d7bbd7f7a500190ddc8ae5d2d3c39d87ed3ed28f5b37cfe76962c678d/orjson-3.10.16-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5385bbfdbc90ff5b2635b7e6bebf259652db00a92b5e3c45b616df75b9058e88", size = 152800 }, + { url = "https://files.pythonhosted.org/packages/f9/09/7658a9e3e793d5b3b00598023e0fb6935d0e7bbb8ff72311c5415a8ce677/orjson-3.10.16-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:02c6279016346e774dd92625d46c6c40db687b8a0d685aadb91e26e46cc33e1e", size = 137516 }, + { url = "https://files.pythonhosted.org/packages/29/87/32b7a4831e909d347278101a48d4cf9f3f25901b2295e7709df1651f65a1/orjson-3.10.16-cp312-cp312-win32.whl", hash = "sha256:7ca55097a11426db80f79378e873a8c51f4dde9ffc22de44850f9696b7eb0e8c", size = 141759 }, + { url = "https://files.pythonhosted.org/packages/35/ce/81a27e7b439b807bd393585271364cdddf50dc281fc57c4feef7ccb186a6/orjson-3.10.16-cp312-cp312-win_amd64.whl", hash = "sha256:86d127efdd3f9bf5f04809b70faca1e6836556ea3cc46e662b44dab3fe71f3d6", size = 133944 }, + { url = "https://files.pythonhosted.org/packages/87/b9/ff6aa28b8c86af9526160905593a2fe8d004ac7a5e592ee0b0ff71017511/orjson-3.10.16-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:148a97f7de811ba14bc6dbc4a433e0341ffd2cc285065199fb5f6a98013744bd", size = 249289 }, + { url = "https://files.pythonhosted.org/packages/6c/81/6d92a586149b52684ab8fd70f3623c91d0e6a692f30fd8c728916ab2263c/orjson-3.10.16-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1d960c1bf0e734ea36d0adc880076de3846aaec45ffad29b78c7f1b7962516b8", size = 133640 }, + { url = "https://files.pythonhosted.org/packages/c2/88/b72443f4793d2e16039ab85d0026677932b15ab968595fb7149750d74134/orjson-3.10.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a318cd184d1269f68634464b12871386808dc8b7c27de8565234d25975a7a137", size = 138286 }, + { url = "https://files.pythonhosted.org/packages/c3/3c/72a22d4b28c076c4016d5a52bd644a8e4d849d3bb0373d9e377f9e3b2250/orjson-3.10.16-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df23f8df3ef9223d1d6748bea63fca55aae7da30a875700809c500a05975522b", size = 132307 }, + { url = "https://files.pythonhosted.org/packages/8a/a2/f1259561bdb6ad7061ff1b95dab082fe32758c4bc143ba8d3d70831f0a06/orjson-3.10.16-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b94dda8dd6d1378f1037d7f3f6b21db769ef911c4567cbaa962bb6dc5021cf90", size = 136739 }, + { url = "https://files.pythonhosted.org/packages/3d/af/c7583c4b34f33d8b8b90cfaab010ff18dd64e7074cc1e117a5f1eff20dcf/orjson-3.10.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12970a26666a8775346003fd94347d03ccb98ab8aa063036818381acf5f523e", size = 138076 }, + { url = "https://files.pythonhosted.org/packages/d7/59/d7fc7fbdd3d4a64c2eae4fc7341a5aa39cf9549bd5e2d7f6d3c07f8b715b/orjson-3.10.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15a1431a245d856bd56e4d29ea0023eb4d2c8f71efe914beb3dee8ab3f0cd7fb", size = 142643 }, + { url = "https://files.pythonhosted.org/packages/92/0e/3bd8f2197d27601f16b4464ae948826da2bcf128af31230a9dbbad7ceb57/orjson-3.10.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83655cfc247f399a222567d146524674a7b217af7ef8289c0ff53cfe8db09f0", size = 133168 }, + { url = "https://files.pythonhosted.org/packages/af/a8/351fd87b664b02f899f9144d2c3dc848b33ac04a5df05234cbfb9e2a7540/orjson-3.10.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fa59ae64cb6ddde8f09bdbf7baf933c4cd05734ad84dcf4e43b887eb24e37652", size = 135271 }, + { url = "https://files.pythonhosted.org/packages/ba/b0/a6d42a7d412d867c60c0337d95123517dd5a9370deea705ea1be0f89389e/orjson-3.10.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ca5426e5aacc2e9507d341bc169d8af9c3cbe88f4cd4c1cf2f87e8564730eb56", size = 412444 }, + { url = "https://files.pythonhosted.org/packages/79/ec/7572cd4e20863f60996f3f10bc0a6da64a6fd9c35954189a914cec0b7377/orjson-3.10.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6fd5da4edf98a400946cd3a195680de56f1e7575109b9acb9493331047157430", size = 152737 }, + { url = "https://files.pythonhosted.org/packages/a9/19/ceb9e8fed5403b2e76a8ac15f581b9d25780a3be3c9b3aa54b7777a210d5/orjson-3.10.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:980ecc7a53e567169282a5e0ff078393bac78320d44238da4e246d71a4e0e8f5", size = 137482 }, + { url = "https://files.pythonhosted.org/packages/1b/78/a78bb810f3786579dbbbd94768284cbe8f2fd65167cd7020260679665c17/orjson-3.10.16-cp313-cp313-win32.whl", hash = "sha256:28f79944dd006ac540a6465ebd5f8f45dfdf0948ff998eac7a908275b4c1add6", size = 141714 }, + { url = "https://files.pythonhosted.org/packages/81/9c/b66ce9245ff319df2c3278acd351a3f6145ef34b4a2d7f4b0f739368370f/orjson-3.10.16-cp313-cp313-win_amd64.whl", hash = "sha256:fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7", size = 133954 }, +] + [[package]] name = "overrides" version = "7.7.0" @@ -2515,7 +3028,7 @@ wheels = [ [[package]] name = "pip-audit" -version = "2.8.0" +version = "2.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cachecontrol", extra = ["filecache"] }, @@ -2528,9 +3041,9 @@ dependencies = [ { name = "rich" }, { name = "toml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e8/c8/44ccea85bd2024f1ebe55eb6cdaf1f2183359176689eed3c0b01926c24ad/pip_audit-2.8.0.tar.gz", hash = "sha256:9816cbd94de6f618a8965c117433006b3d565a708dc05d5a7be47ab65b66fa05", size = 51073 } +sdist = { url = "https://files.pythonhosted.org/packages/cc/7f/28fad19a9806f796f13192ab6974c07c4a04d9cbb8e30dd895c3c11ce7ee/pip_audit-2.9.0.tar.gz", hash = "sha256:0b998410b58339d7a231e5aa004326a294e4c7c6295289cdc9d5e1ef07b1f44d", size = 52089 } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/0c/be5c42643284b2cfc5d9d36b576b7465268a163bd7df481a3979a3d87a0b/pip_audit-2.8.0-py3-none-any.whl", hash = "sha256:200f50d56cb6fba3a9189c20d53250354f72f161d63b6ef77ae5de2b53044566", size = 57002 }, + { url = "https://files.pythonhosted.org/packages/43/9e/f4dfd9d3dadb6d6dc9406f1111062f871e2e248ed7b584cca6020baf2ac1/pip_audit-2.9.0-py3-none-any.whl", hash = "sha256:348b16e60895749a0839875d7cc27ebd692e1584ebe5d5cb145941c8e25a80bd", size = 58634 }, ] [[package]] @@ -2798,7 +3311,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.11.2" +version = "2.11.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -2806,9 +3319,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b0/41/832125a41fe098b58d1fdd04ae819b4dc6b34d6b09ed78304fd93d4bc051/pydantic-2.11.2.tar.gz", hash = "sha256:2138628e050bd7a1e70b91d4bf4a91167f4ad76fdb83209b107c8d84b854917e", size = 784742 } +sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/c2/0f3baea344d0b15e35cb3e04ad5b953fa05106b76efbf4c782a3f47f22f5/pydantic-2.11.2-py3-none-any.whl", hash = "sha256:7f17d25846bcdf89b670a86cdfe7b29a9f1c9ca23dee154221c9aa81845cfca7", size = 443295 }, + { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591 }, ] [[package]] @@ -2876,6 +3389,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951 }, ] +[[package]] +name = "pydantic-extra-types" +version = "2.10.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/fa/6b268a47839f8af46ffeb5bb6aee7bded44fbad54e6bf826c11f17aef91a/pydantic_extra_types-2.10.3.tar.gz", hash = "sha256:dcc0a7b90ac9ef1b58876c9b8fdede17fbdde15420de9d571a9fccde2ae175bb", size = 95128 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/0a/f6f8e5f79d188e2f3fa9ecfccfa72538b685985dd5c7c2886c67af70e685/pydantic_extra_types-2.10.3-py3-none-any.whl", hash = "sha256:e8b372752b49019cd8249cc192c62a820d8019f5382a8789d0f887338a59c0f3", size = 37175 }, +] + [[package]] name = "pydantic-settings" version = "2.8.1" @@ -2949,15 +3475,15 @@ wheels = [ [[package]] name = "pyright" -version = "1.1.398" +version = "1.1.399" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nodeenv" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/24/d6/48740f1d029e9fc4194880d1ad03dcf0ba3a8f802e0e166b8f63350b3584/pyright-1.1.398.tar.gz", hash = "sha256:357a13edd9be8082dc73be51190913e475fa41a6efb6ec0d4b7aab3bc11638d8", size = 3892675 } +sdist = { url = "https://files.pythonhosted.org/packages/db/9d/d91d5f6d26b2db95476fefc772e2b9a16d54c6bd0ea6bb5c1b6d635ab8b4/pyright-1.1.399.tar.gz", hash = "sha256:439035d707a36c3d1b443aec980bc37053fbda88158eded24b8eedcf1c7b7a1b", size = 3856954 } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/e0/5283593f61b3c525d6d7e94cfb6b3ded20b3df66e953acaf7bb4f23b3f6e/pyright-1.1.398-py3-none-any.whl", hash = "sha256:0a70bfd007d9ea7de1cf9740e1ad1a40a122592cfe22a3f6791b06162ad08753", size = 5780235 }, + { url = "https://files.pythonhosted.org/packages/2f/b5/380380c9e7a534cb1783c70c3e8ac6d1193c599650a55838d0557586796e/pyright-1.1.399-py3-none-any.whl", hash = "sha256:55f9a875ddf23c9698f24208c764465ffdfd38be6265f7faf9a176e1dc549f3b", size = 5592584 }, ] [[package]] @@ -3014,15 +3540,15 @@ wheels = [ [[package]] name = "pytest-docker" -version = "3.2.0" +version = "3.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8f/05/5c25661d15d45ab0f7537545d552fc97b296215b82e1677c0a1916d48a22/pytest_docker-3.2.0.tar.gz", hash = "sha256:3d6537564e1582cab39e6cc3d6f3d931e92398af62f8313fc826e436f8233e21", size = 13461 } +sdist = { url = "https://files.pythonhosted.org/packages/dd/38/ba9344240455a09195863f2c4466468b41a08be0dff8c5611f7ec63f260d/pytest_docker-3.2.1.tar.gz", hash = "sha256:fc2cd9d1d317ac0854c140738182a60331fbcee8c0ef655b790e8f40a96e226f", size = 13499 } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/70/d0148590517cd275bc6fa1fddd836fa787b77092ec3e9d3218466bd492aa/pytest_docker-3.2.0-py3-none-any.whl", hash = "sha256:3e266db66887aa3611b2dfd86fb2a3b42f25f3a29d3f14b6e57a831e93a64f60", size = 8545 }, + { url = "https://files.pythonhosted.org/packages/d5/22/8495ea7fbb9685efccb969e5139d564cbc5a8645b86278b28cbaa21bce0d/pytest_docker-3.2.1-py3-none-any.whl", hash = "sha256:ad1be411336959bee768b965c1c4949657e743eec9cf9e7a921fadf83ad97526", size = 8584 }, ] [[package]] @@ -3123,6 +3649,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/08/20/0f2523b9e50a8052bc6a8b732dfc8568abbdc42010aef03a2d750bdab3b2/python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7", size = 15163 }, ] +[[package]] +name = "python-multipart" +version = "0.0.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, +] + [[package]] name = "pytz" version = "2025.2" @@ -3363,6 +3898,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/69/963f0bf44a654f6465bdb66fb5a91051b0d7af9f742b5bd7202607165036/rich_click-1.8.8-py3-none-any.whl", hash = "sha256:205aabd5a98e64ab2c105dee9e368be27480ba004c7dfa2accd0ed44f9f1550e", size = 35747 }, ] +[[package]] +name = "rich-toolkit" +version = "0.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/ea/13945d58d556a28dfb0f774ad5c8af759527390e59505a40d164bf8ce1ce/rich_toolkit-0.14.1.tar.gz", hash = "sha256:9248e2d087bfc01f3e4c5c8987e05f7fa744d00dd22fa2be3aa6e50255790b3f", size = 104416 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/e8/61c5b12d1567fdba41a6775db12a090d88b8305424ee7c47259c70d33cb4/rich_toolkit-0.14.1-py3-none-any.whl", hash = "sha256:dc92c0117d752446d04fdc828dbca5873bcded213a091a5d3742a2beec2e6559", size = 24177 }, +] + [[package]] name = "roman-numerals-py" version = "3.1.0" @@ -3513,27 +4062,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.11.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/5b/3ae20f89777115944e89c2d8c2e795dcc5b9e04052f76d5347e35e0da66e/ruff-0.11.4.tar.gz", hash = "sha256:f45bd2fb1a56a5a85fae3b95add03fb185a0b30cf47f5edc92aa0355ca1d7407", size = 3933063 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/db/baee59ac88f57527fcbaad3a7b309994e42329c6bc4d4d2b681a3d7b5426/ruff-0.11.4-py3-none-linux_armv6l.whl", hash = "sha256:d9f4a761ecbde448a2d3e12fb398647c7f0bf526dbc354a643ec505965824ed2", size = 10106493 }, - { url = "https://files.pythonhosted.org/packages/c1/d6/9a0962cbb347f4ff98b33d699bf1193ff04ca93bed4b4222fd881b502154/ruff-0.11.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8c1747d903447d45ca3d40c794d1a56458c51e5cc1bc77b7b64bd2cf0b1626cc", size = 10876382 }, - { url = "https://files.pythonhosted.org/packages/3a/8f/62bab0c7d7e1ae3707b69b157701b41c1ccab8f83e8501734d12ea8a839f/ruff-0.11.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:51a6494209cacca79e121e9b244dc30d3414dac8cc5afb93f852173a2ecfc906", size = 10237050 }, - { url = "https://files.pythonhosted.org/packages/09/96/e296965ae9705af19c265d4d441958ed65c0c58fc4ec340c27cc9d2a1f5b/ruff-0.11.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f171605f65f4fc49c87f41b456e882cd0c89e4ac9d58e149a2b07930e1d466f", size = 10424984 }, - { url = "https://files.pythonhosted.org/packages/e5/56/644595eb57d855afed6e54b852e2df8cd5ca94c78043b2f29bdfb29882d5/ruff-0.11.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ebf99ea9af918878e6ce42098981fc8c1db3850fef2f1ada69fb1dcdb0f8e79e", size = 9957438 }, - { url = "https://files.pythonhosted.org/packages/86/83/9d3f3bed0118aef3e871ded9e5687fb8c5776bde233427fd9ce0a45db2d4/ruff-0.11.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edad2eac42279df12e176564a23fc6f4aaeeb09abba840627780b1bb11a9d223", size = 11547282 }, - { url = "https://files.pythonhosted.org/packages/40/e6/0c6e4f5ae72fac5ccb44d72c0111f294a5c2c8cc5024afcb38e6bda5f4b3/ruff-0.11.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f103a848be9ff379fc19b5d656c1f911d0a0b4e3e0424f9532ececf319a4296e", size = 12182020 }, - { url = "https://files.pythonhosted.org/packages/b5/92/4aed0e460aeb1df5ea0c2fbe8d04f9725cccdb25d8da09a0d3f5b8764bf8/ruff-0.11.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:193e6fac6eb60cc97b9f728e953c21cc38a20077ed64f912e9d62b97487f3f2d", size = 11679154 }, - { url = "https://files.pythonhosted.org/packages/1b/d3/7316aa2609f2c592038e2543483eafbc62a0e1a6a6965178e284808c095c/ruff-0.11.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7af4e5f69b7c138be8dcffa5b4a061bf6ba6a3301f632a6bce25d45daff9bc99", size = 13905985 }, - { url = "https://files.pythonhosted.org/packages/63/80/734d3d17546e47ff99871f44ea7540ad2bbd7a480ed197fe8a1c8a261075/ruff-0.11.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:126b1bf13154aa18ae2d6c3c5efe144ec14b97c60844cfa6eb960c2a05188222", size = 11348343 }, - { url = "https://files.pythonhosted.org/packages/04/7b/70fc7f09a0161dce9613a4671d198f609e653d6f4ff9eee14d64c4c240fb/ruff-0.11.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8806daaf9dfa881a0ed603f8a0e364e4f11b6ed461b56cae2b1c0cab0645304", size = 10308487 }, - { url = "https://files.pythonhosted.org/packages/1a/22/1cdd62dabd678d75842bf4944fd889cf794dc9e58c18cc547f9eb28f95ed/ruff-0.11.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5d94bb1cc2fc94a769b0eb975344f1b1f3d294da1da9ddbb5a77665feb3a3019", size = 9929091 }, - { url = "https://files.pythonhosted.org/packages/9f/20/40e0563506332313148e783bbc1e4276d657962cc370657b2fff20e6e058/ruff-0.11.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:995071203d0fe2183fc7a268766fd7603afb9996785f086b0d76edee8755c896", size = 10924659 }, - { url = "https://files.pythonhosted.org/packages/b5/41/eef9b7aac8819d9e942f617f9db296f13d2c4576806d604aba8db5a753f1/ruff-0.11.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7a37ca937e307ea18156e775a6ac6e02f34b99e8c23fe63c1996185a4efe0751", size = 11428160 }, - { url = "https://files.pythonhosted.org/packages/ff/61/c488943414fb2b8754c02f3879de003e26efdd20f38167ded3fb3fc1cda3/ruff-0.11.4-py3-none-win32.whl", hash = "sha256:0e9365a7dff9b93af933dab8aebce53b72d8f815e131796268709890b4a83270", size = 10311496 }, - { url = "https://files.pythonhosted.org/packages/b6/2b/2a1c8deb5f5dfa3871eb7daa41492c4d2b2824a74d2b38e788617612a66d/ruff-0.11.4-py3-none-win_amd64.whl", hash = "sha256:5a9fa1c69c7815e39fcfb3646bbfd7f528fa8e2d4bebdcf4c2bd0fa037a255fb", size = 11399146 }, - { url = "https://files.pythonhosted.org/packages/4f/03/3aec4846226d54a37822e4c7ea39489e4abd6f88388fba74e3d4abe77300/ruff-0.11.4-py3-none-win_arm64.whl", hash = "sha256:d435db6b9b93d02934cf61ef332e66af82da6d8c69aefdea5994c89997c7a0fc", size = 10450306 }, +version = "0.11.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/45/71/5759b2a6b2279bb77fe15b1435b89473631c2cd6374d45ccdb6b785810be/ruff-0.11.5.tar.gz", hash = "sha256:cae2e2439cb88853e421901ec040a758960b576126dab520fa08e9de431d1bef", size = 3976488 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/db/6efda6381778eec7f35875b5cbefd194904832a1153d68d36d6b269d81a8/ruff-0.11.5-py3-none-linux_armv6l.whl", hash = "sha256:2561294e108eb648e50f210671cc56aee590fb6167b594144401532138c66c7b", size = 10103150 }, + { url = "https://files.pythonhosted.org/packages/44/f2/06cd9006077a8db61956768bc200a8e52515bf33a8f9b671ee527bb10d77/ruff-0.11.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac12884b9e005c12d0bd121f56ccf8033e1614f736f766c118ad60780882a077", size = 10898637 }, + { url = "https://files.pythonhosted.org/packages/18/f5/af390a013c56022fe6f72b95c86eb7b2585c89cc25d63882d3bfe411ecf1/ruff-0.11.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4bfd80a6ec559a5eeb96c33f832418bf0fb96752de0539905cf7b0cc1d31d779", size = 10236012 }, + { url = "https://files.pythonhosted.org/packages/b8/ca/b9bf954cfed165e1a0c24b86305d5c8ea75def256707f2448439ac5e0d8b/ruff-0.11.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0947c0a1afa75dcb5db4b34b070ec2bccee869d40e6cc8ab25aca11a7d527794", size = 10415338 }, + { url = "https://files.pythonhosted.org/packages/d9/4d/2522dde4e790f1b59885283f8786ab0046958dfd39959c81acc75d347467/ruff-0.11.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ad871ff74b5ec9caa66cb725b85d4ef89b53f8170f47c3406e32ef040400b038", size = 9965277 }, + { url = "https://files.pythonhosted.org/packages/e5/7a/749f56f150eef71ce2f626a2f6988446c620af2f9ba2a7804295ca450397/ruff-0.11.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6cf918390cfe46d240732d4d72fa6e18e528ca1f60e318a10835cf2fa3dc19f", size = 11541614 }, + { url = "https://files.pythonhosted.org/packages/89/b2/7d9b8435222485b6aac627d9c29793ba89be40b5de11584ca604b829e960/ruff-0.11.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56145ee1478582f61c08f21076dc59153310d606ad663acc00ea3ab5b2125f82", size = 12198873 }, + { url = "https://files.pythonhosted.org/packages/00/e0/a1a69ef5ffb5c5f9c31554b27e030a9c468fc6f57055886d27d316dfbabd/ruff-0.11.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e5f66f8f1e8c9fc594cbd66fbc5f246a8d91f916cb9667e80208663ec3728304", size = 11670190 }, + { url = "https://files.pythonhosted.org/packages/05/61/c1c16df6e92975072c07f8b20dad35cd858e8462b8865bc856fe5d6ccb63/ruff-0.11.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80b4df4d335a80315ab9afc81ed1cff62be112bd165e162b5eed8ac55bfc8470", size = 13902301 }, + { url = "https://files.pythonhosted.org/packages/79/89/0af10c8af4363304fd8cb833bd407a2850c760b71edf742c18d5a87bb3ad/ruff-0.11.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3068befab73620b8a0cc2431bd46b3cd619bc17d6f7695a3e1bb166b652c382a", size = 11350132 }, + { url = "https://files.pythonhosted.org/packages/b9/e1/ecb4c687cbf15164dd00e38cf62cbab238cad05dd8b6b0fc68b0c2785e15/ruff-0.11.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f5da2e710a9641828e09aa98b92c9ebbc60518fdf3921241326ca3e8f8e55b8b", size = 10312937 }, + { url = "https://files.pythonhosted.org/packages/cf/4f/0e53fe5e500b65934500949361e3cd290c5ba60f0324ed59d15f46479c06/ruff-0.11.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ef39f19cb8ec98cbc762344921e216f3857a06c47412030374fffd413fb8fd3a", size = 9936683 }, + { url = "https://files.pythonhosted.org/packages/04/a8/8183c4da6d35794ae7f76f96261ef5960853cd3f899c2671961f97a27d8e/ruff-0.11.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b2a7cedf47244f431fd11aa5a7e2806dda2e0c365873bda7834e8f7d785ae159", size = 10950217 }, + { url = "https://files.pythonhosted.org/packages/26/88/9b85a5a8af21e46a0639b107fcf9bfc31da4f1d263f2fc7fbe7199b47f0a/ruff-0.11.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:81be52e7519f3d1a0beadcf8e974715b2dfc808ae8ec729ecfc79bddf8dbb783", size = 11404521 }, + { url = "https://files.pythonhosted.org/packages/fc/52/047f35d3b20fd1ae9ccfe28791ef0f3ca0ef0b3e6c1a58badd97d450131b/ruff-0.11.5-py3-none-win32.whl", hash = "sha256:e268da7b40f56e3eca571508a7e567e794f9bfcc0f412c4b607931d3af9c4afe", size = 10320697 }, + { url = "https://files.pythonhosted.org/packages/b9/fe/00c78010e3332a6e92762424cf4c1919065707e962232797d0b57fd8267e/ruff-0.11.5-py3-none-win_amd64.whl", hash = "sha256:6c6dc38af3cfe2863213ea25b6dc616d679205732dc0fb673356c2d69608f800", size = 11378665 }, + { url = "https://files.pythonhosted.org/packages/43/7c/c83fe5cbb70ff017612ff36654edfebec4b1ef79b558b8e5fd933bab836b/ruff-0.11.5-py3-none-win_arm64.whl", hash = "sha256:67e241b4314f4eacf14a601d586026a962f4002a475aa702c69980a38087aa4e", size = 10460287 }, ] [[package]] @@ -3557,6 +4106,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072 }, ] +[[package]] +name = "sentry-sdk" +version = "2.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/2f/a0f732270cc7c1834f5ec45539aec87c360d5483a8bd788217a9102ccfbd/sentry_sdk-2.25.1.tar.gz", hash = "sha256:f9041b7054a7cf12d41eadabe6458ce7c6d6eea7a97cfe1b760b6692e9562cf0", size = 322190 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/b6/84049ab0967affbc7cc7590d86ae0170c1b494edb69df8786707100420e5/sentry_sdk-2.25.1-py2.py3-none-any.whl", hash = "sha256:60b016d0772789454dc55a284a6a44212044d4a16d9f8448725effee97aaf7f6", size = 339851 }, +] + [[package]] name = "setuptools" version = "78.1.0" @@ -4218,6 +4780,50 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, ] +[[package]] +name = "ujson" +version = "5.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/00/3110fd566786bfa542adb7932d62035e0c0ef662a8ff6544b6643b3d6fd7/ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1", size = 7154885 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/ec/3c551ecfe048bcb3948725251fb0214b5844a12aa60bee08d78315bb1c39/ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00", size = 55353 }, + { url = "https://files.pythonhosted.org/packages/8d/9f/4731ef0671a0653e9f5ba18db7c4596d8ecbf80c7922dd5fe4150f1aea76/ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126", size = 51813 }, + { url = "https://files.pythonhosted.org/packages/1f/2b/44d6b9c1688330bf011f9abfdb08911a9dc74f76926dde74e718d87600da/ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8", size = 51988 }, + { url = "https://files.pythonhosted.org/packages/29/45/f5f5667427c1ec3383478092a414063ddd0dfbebbcc533538fe37068a0a3/ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b", size = 53561 }, + { url = "https://files.pythonhosted.org/packages/26/21/a0c265cda4dd225ec1be595f844661732c13560ad06378760036fc622587/ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9", size = 58497 }, + { url = "https://files.pythonhosted.org/packages/28/36/8fde862094fd2342ccc427a6a8584fed294055fdee341661c78660f7aef3/ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f", size = 997877 }, + { url = "https://files.pythonhosted.org/packages/90/37/9208e40d53baa6da9b6a1c719e0670c3f474c8fc7cc2f1e939ec21c1bc93/ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4", size = 1140632 }, + { url = "https://files.pythonhosted.org/packages/89/d5/2626c87c59802863d44d19e35ad16b7e658e4ac190b0dead17ff25460b4c/ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1", size = 1043513 }, + { url = "https://files.pythonhosted.org/packages/2f/ee/03662ce9b3f16855770f0d70f10f0978ba6210805aa310c4eebe66d36476/ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f", size = 38616 }, + { url = "https://files.pythonhosted.org/packages/3e/20/952dbed5895835ea0b82e81a7be4ebb83f93b079d4d1ead93fcddb3075af/ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720", size = 42071 }, + { url = "https://files.pythonhosted.org/packages/e8/a6/fd3f8bbd80842267e2d06c3583279555e8354c5986c952385199d57a5b6c/ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5", size = 55642 }, + { url = "https://files.pythonhosted.org/packages/a8/47/dd03fd2b5ae727e16d5d18919b383959c6d269c7b948a380fdd879518640/ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e", size = 51807 }, + { url = "https://files.pythonhosted.org/packages/25/23/079a4cc6fd7e2655a473ed9e776ddbb7144e27f04e8fc484a0fb45fe6f71/ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043", size = 51972 }, + { url = "https://files.pythonhosted.org/packages/04/81/668707e5f2177791869b624be4c06fb2473bf97ee33296b18d1cf3092af7/ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1", size = 53686 }, + { url = "https://files.pythonhosted.org/packages/bd/50/056d518a386d80aaf4505ccf3cee1c40d312a46901ed494d5711dd939bc3/ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3", size = 58591 }, + { url = "https://files.pythonhosted.org/packages/fc/d6/aeaf3e2d6fb1f4cfb6bf25f454d60490ed8146ddc0600fae44bfe7eb5a72/ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21", size = 997853 }, + { url = "https://files.pythonhosted.org/packages/f8/d5/1f2a5d2699f447f7d990334ca96e90065ea7f99b142ce96e85f26d7e78e2/ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2", size = 1140689 }, + { url = "https://files.pythonhosted.org/packages/f2/2c/6990f4ccb41ed93744aaaa3786394bca0875503f97690622f3cafc0adfde/ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e", size = 1043576 }, + { url = "https://files.pythonhosted.org/packages/14/f5/a2368463dbb09fbdbf6a696062d0c0f62e4ae6fa65f38f829611da2e8fdd/ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e", size = 38764 }, + { url = "https://files.pythonhosted.org/packages/59/2d/691f741ffd72b6c84438a93749ac57bf1a3f217ac4b0ea4fd0e96119e118/ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc", size = 42211 }, + { url = "https://files.pythonhosted.org/packages/0d/69/b3e3f924bb0e8820bb46671979770c5be6a7d51c77a66324cdb09f1acddb/ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287", size = 55646 }, + { url = "https://files.pythonhosted.org/packages/32/8a/9b748eb543c6cabc54ebeaa1f28035b1bd09c0800235b08e85990734c41e/ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e", size = 51806 }, + { url = "https://files.pythonhosted.org/packages/39/50/4b53ea234413b710a18b305f465b328e306ba9592e13a791a6a6b378869b/ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557", size = 51975 }, + { url = "https://files.pythonhosted.org/packages/b4/9d/8061934f960cdb6dd55f0b3ceeff207fcc48c64f58b43403777ad5623d9e/ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988", size = 53693 }, + { url = "https://files.pythonhosted.org/packages/f5/be/7bfa84b28519ddbb67efc8410765ca7da55e6b93aba84d97764cd5794dbc/ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816", size = 58594 }, + { url = "https://files.pythonhosted.org/packages/48/eb/85d465abafb2c69d9699cfa5520e6e96561db787d36c677370e066c7e2e7/ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20", size = 997853 }, + { url = "https://files.pythonhosted.org/packages/9f/76/2a63409fc05d34dd7d929357b7a45e3a2c96f22b4225cd74becd2ba6c4cb/ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0", size = 1140694 }, + { url = "https://files.pythonhosted.org/packages/45/ed/582c4daba0f3e1688d923b5cb914ada1f9defa702df38a1916c899f7c4d1/ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f", size = 1043580 }, + { url = "https://files.pythonhosted.org/packages/d7/0c/9837fece153051e19c7bade9f88f9b409e026b9525927824cdf16293b43b/ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165", size = 38766 }, + { url = "https://files.pythonhosted.org/packages/d7/72/6cb6728e2738c05bbe9bd522d6fc79f86b9a28402f38663e85a28fddd4a0/ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539", size = 42212 }, +] + +[[package]] +name = "uptime" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/53/6c420ddf6949097d6f9406358951c9322505849bea9cb79efe3acc0bb55d/uptime-3.0.1.tar.gz", hash = "sha256:7c300254775b807ce46e3dcbcda30aa3b9a204b9c57a7ac1e79ee6dbe3942973", size = 6630 } + [[package]] name = "uri-template" version = "1.3.0" @@ -4274,6 +4880,43 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, ] +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410 }, + { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476 }, + { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855 }, + { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185 }, + { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256 }, + { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323 }, + { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284 }, + { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349 }, + { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089 }, + { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770 }, + { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321 }, + { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022 }, + { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123 }, + { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325 }, + { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806 }, + { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068 }, + { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428 }, + { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018 }, +] + [[package]] name = "virtualenv" version = "20.30.0" @@ -4515,3 +5158,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 }, { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, ] + +[[package]] +name = "zipp" +version = "3.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, +] From 8bd4b784af3152ce4301d6070e1eabea98a461b4 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Mon, 14 Apr 2025 17:42:01 +0200 Subject: [PATCH 097/110] chore: Rework documentation --- .gitignore | 1 + README.md | 68 +++-- docs/partials/README_main.md | 68 +++-- examples/notebook.ipynb | 482 ++--------------------------------- examples/notebook.py | 5 +- examples/script.py | 2 +- 6 files changed, 108 insertions(+), 518 deletions(-) diff --git a/.gitignore b/.gitignore index 36d6a6d6..b82023ea 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,4 @@ node_modules/ # Application specific tests/reports/**/* **/__marimo__ +**/.ipynb_checkpoints diff --git a/README.md b/README.md index aba96a5a..c4c2771f 100644 --- a/README.md +++ b/README.md @@ -133,43 +133,59 @@ Check out our [CLI reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html#cli) to learn about all commands and options available. +## Use in Python Notebooks + +We provided example notebooks to help you get started with the Python SDK. +Before you can start, you need to setup your authentication information: + +**Authentication:** +The SDK uses the [OAuth2](https://oauth.net/2/) protocol for authentication. +Please visit +[your personal dashboard on the aignostics platform](https://platform.aignostics.com/getting-started/quick-start) +and look at the `Enterprise Integration` section to obtain your personal client information. + +**Examples:** The notebooks showcase the interaction with the Aignostics platform using our test application. +To run one them, please follow the steps shown below to (i) clone this repository and start either the [Jupyter](https://docs.jupyter.org/en/latest/index.html) ([examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb)) or +[Marimo](https://marimo.io/) ([examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py)) notebook: + +```shell +# clone the `python-sdk` repository +git clone https://github.com/aignostics/python-sdk.git +# within the cloned repository, install the SDK and all dependencies +uv sync --all-extras +# show jupyter example notebook in the browser +uv run jupyter notebook examples/notebook.ipynb +# show marimo example notebook in the browser +uv run marimo edit examples/notebook.py +``` + ## Using the Python SDK in your Codebase -The following sections showcase how you can integrate the Python SDK in your -codebase. +Next to using the CLI and notebooks, you can also use the Python SDK in your +codebase. The following sections outline how to install the SDK and interact with it. ### Installation - Adding Aignostics Python SDK to your codebase as a dependency is easy. You can -directly import add the dependency via your favourite package manager, e.g., -[pip](https://pip.pypa.io/en/stable/) or [uv](https://docs.astral.sh/uv/). +directly add the dependency via your favourite package manager: -**Install with uv** -- If you don't have uv installed follow +**Install with [uv](https://docs.astral.sh/uv/):** If you don't have uv installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). ```shell -uv add aignostics # add SDK as dependency to your project +# add SDK as dependency to your project +uv add aignostics ``` -**Install with pip** +**Install with [pip](https://pip.pypa.io/en/stable/)** ```shell -pip install aignostics # add SDK as dependency to your project +# add SDK as dependency to your project +pip install aignostics ``` ### Usage -Read the -[client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) -to learn about all classes and methods. - -The following snippets showcase the basic code to run an application with the -Python SDK. A more detailed example - including comments - is available in the -`examples` folder as Python notebooks: -[examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) -(IPython) -[examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) -(Marimo). +The following snippet shows how to use the Python SDK to trigger an application run: ```python import aignostics.client @@ -194,15 +210,11 @@ application_run = client.runs.create( application_run.download_to_folder("path/to/download/folder") ``` -### Authentication Setup - -The SDK uses the [OAuth2](https://oauth.net/2/) protocol for authentication. -Please visit -[your personal dashboard on the aignostics platform](https://platform.aignostics.com) -and scroll to the "Python SDK" section to find your personalized setup -instructions. +Please look at the notebooks in the `example` folder for a more detailed example and read the +[client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) +to learn about all classes and methods. -### Application Run Payloads +#### Application Run Payloads The payload expected to trigger an application run is specified by the `RunCreationRequest` pydantic model: diff --git a/docs/partials/README_main.md b/docs/partials/README_main.md index 1e420b88..4e358b22 100644 --- a/docs/partials/README_main.md +++ b/docs/partials/README_main.md @@ -86,43 +86,59 @@ Check out our [CLI reference documentation](https://aignostics.readthedocs.io/en/latest/reference.html#cli) to learn about all commands and options available. +## Use in Python Notebooks + +We provided example notebooks to help you get started with the Python SDK. +Before you can start, you need to setup your authentication information: + +**Authentication:** +The SDK uses the [OAuth2](https://oauth.net/2/) protocol for authentication. +Please visit +[your personal dashboard on the aignostics platform](https://platform.aignostics.com/getting-started/quick-start) +and look at the `Enterprise Integration` section to obtain your personal client information. + +**Examples:** The notebooks showcase the interaction with the Aignostics platform using our test application. +To run one them, please follow the steps shown below to (i) clone this repository and start either the [Jupyter](https://docs.jupyter.org/en/latest/index.html) ([examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb)) or +[Marimo](https://marimo.io/) ([examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py)) notebook: + +```shell +# clone the `python-sdk` repository +git clone https://github.com/aignostics/python-sdk.git +# within the cloned repository, install the SDK and all dependencies +uv sync --all-extras +# show jupyter example notebook in the browser +uv run jupyter notebook examples/notebook.ipynb +# show marimo example notebook in the browser +uv run marimo edit examples/notebook.py +``` + ## Using the Python SDK in your Codebase -The following sections showcase how you can integrate the Python SDK in your -codebase. +Next to using the CLI and notebooks, you can also use the Python SDK in your +codebase. The following sections outline how to install the SDK and interact with it. ### Installation - Adding Aignostics Python SDK to your codebase as a dependency is easy. You can -directly import add the dependency via your favourite package manager, e.g., -[pip](https://pip.pypa.io/en/stable/) or [uv](https://docs.astral.sh/uv/). +directly add the dependency via your favourite package manager: -**Install with uv** -- If you don't have uv installed follow +**Install with [uv](https://docs.astral.sh/uv/):** If you don't have uv installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). ```shell -uv add aignostics # add SDK as dependency to your project +# add SDK as dependency to your project +uv add aignostics ``` -**Install with pip** +**Install with [pip](https://pip.pypa.io/en/stable/)** ```shell -pip install aignostics # add SDK as dependency to your project +# add SDK as dependency to your project +pip install aignostics ``` ### Usage -Read the -[client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) -to learn about all classes and methods. - -The following snippets showcase the basic code to run an application with the -Python SDK. A more detailed example - including comments - is available in the -`examples` folder as Python notebooks: -[examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb) -(IPython) -[examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py) -(Marimo). +The following snippet shows how to use the Python SDK to trigger an application run: ```python import aignostics.client @@ -147,15 +163,11 @@ application_run = client.runs.create( application_run.download_to_folder("path/to/download/folder") ``` -### Authentication Setup - -The SDK uses the [OAuth2](https://oauth.net/2/) protocol for authentication. -Please visit -[your personal dashboard on the aignostics platform](https://platform.aignostics.com) -and scroll to the "Python SDK" section to find your personalized setup -instructions. +Please look at the notebooks in the `example` folder for a more detailed example and read the +[client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) +to learn about all classes and methods. -### Application Run Payloads +#### Application Run Payloads The payload expected to trigger an application run is specified by the `RunCreationRequest` pydantic model: diff --git a/examples/notebook.ipynb b/examples/notebook.ipynb index 330d73dc..b6c9051d 100644 --- a/examples/notebook.ipynb +++ b/examples/notebook.ipynb @@ -20,13 +20,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-13T19:35:07.002519Z", - "start_time": "2025-04-13T19:35:06.725532Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "from collections.abc import Iterator\n", @@ -48,13 +43,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-13T19:40:23.461659Z", - "start_time": "2025-04-13T19:40:22.940324Z" - } - }, + "execution_count": null, + "metadata": {}, "outputs": [], "source": [ "import aignostics.client\n", @@ -74,78 +64,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-13T19:35:12.466054Z", - "start_time": "2025-04-13T19:35:12.339753Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
application_idnameslugregulatory_classesdescription
0ee5566d2-d3cb-4303-9e23-8a5ab3e5b8edTwoTaskDummytwo-task-dummy[demo, RuO]This is just a dummy application with two algo...
1f7aa7f53-3b4c-476a-bc25-561ef9cfbf6dH&E TMEh-e-tme[]This is the H&E TME Application.
\n", - "
" - ], - "text/plain": [ - " application_id name slug \\\n", - "0 ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed TwoTaskDummy two-task-dummy \n", - "1 f7aa7f53-3b4c-476a-bc25-561ef9cfbf6d H&E TME h-e-tme \n", - "\n", - " regulatory_classes description \n", - "0 [demo, RuO] This is just a dummy application with two algo... \n", - "1 [] This is the H&E TME Application. " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "applications = client.applications.list()\n", "# visualize\n", @@ -163,80 +84,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-13T19:35:17.204173Z", - "start_time": "2025-04-13T19:35:17.160585Z" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
application_version_idapplication_version_slugversionapplication_idflow_idchangeloginput_artifactsoutput_artifacts
060e7b441-307a-4b41-8a97-5b02e7bc73a4two-task-dummy:v0.0.30.0.3ee5566d2-d3cb-4303-9e23-8a5ab3e5b8edNone<some_changelog>[{'name': 'user_slide', 'mime_type': 'image/ti...[{'name': 'tissue_segmentation:geojson_polygon...
\n", - "
" - ], - "text/plain": [ - " application_version_id application_version_slug version \\\n", - "0 60e7b441-307a-4b41-8a97-5b02e7bc73a4 two-task-dummy:v0.0.3 0.0.3 \n", - "\n", - " application_id flow_id changelog \\\n", - "0 ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed None \n", - "\n", - " input_artifacts \\\n", - "0 [{'name': 'user_slide', 'mime_type': 'image/ti... \n", - "\n", - " output_artifacts \n", - "0 [{'name': 'tissue_segmentation:geojson_polygon... " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "application_versions = client.applications.versions.list(for_application=\"ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed\")\n", "# visualize\n", @@ -254,82 +104,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-13T19:35:21.235134Z", - "start_time": "2025-04-13T19:35:21.171620Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/akunft/dev/python-sdk/.venv/lib/python3.11/site-packages/IPython/core/display.py:636: UserWarning: JSON expects JSONable dict or list, not JSON strings\n", - " warnings.warn(\"JSON expects JSONable dict or list, not JSON strings\")\n" - ] - }, - { - "data": { - "application/json": { - "metadata_schema": { - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "description": "Metadata corresponding to an RGB image.", - "properties": { - "base_mpp": { - "maximum": 0.5, - "minimum": 0.125, - "title": "Base Mpp", - "type": "number" - }, - "checksum_crc32c": { - "title": "Checksum Crc32C", - "type": "string" - }, - "height": { - "title": "Height", - "type": "integer" - }, - "mime_type": { - "default": "image/tiff", - "enum": [ - "image/tiff" - ], - "title": "Mime Type", - "type": "string" - }, - "width": { - "title": "Width", - "type": "integer" - } - }, - "required": [ - "checksum_crc32c", - "width", - "height" - ], - "title": "RGBImageMetadata", - "type": "object" - }, - "mime_type": "image/tiff", - "name": "user_slide" - }, - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": { - "application/json": { - "expanded": false, - "root": "root" - } - }, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from IPython.display import JSON\n", "\n", @@ -371,27 +148,10 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-13T19:41:34.397794Z", - "start_time": "2025-04-13T19:41:32.578439Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Application run `d51def04-326b-4138-a411-47bc073bc5ac`: running, 1 items - (1/0/0) [pending/succeeded/error]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ - "import os\n", - "\n", - "os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"] = \"/Users/akunft/Downloads/aignx-platform-api-shsodcule-9086ce65109a.json\"\n", - "\n", "from aignx.codegen.models import (\n", " ApplicationVersion,\n", " InputArtifactCreationRequest,\n", @@ -399,7 +159,7 @@ " RunCreationRequest,\n", ")\n", "\n", - "from aignostics.client.utils import generate_signed_url\n", + "from aignostics.client._utils import generate_signed_url # noqa: PLC2701\n", "\n", "payload = [\n", " ItemCreationRequest(\n", @@ -464,59 +224,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-13T19:41:55.544603Z", - "start_time": "2025-04-13T19:41:46.365776Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Application run `01a5cb5b-1c34-48fb-be83-c6fa886f8c20`: completed, 3 items - (0/3/0) [pending/succeeded/error]\n", - "Application run `026a1c42-537b-455c-9459-abb0ee9970eb`: completed, 3 items - (0/3/0) [pending/succeeded/error]\n", - "Application run `029ec139-46b7-49d6-ae70-29aea43dc757`: completed, 3 items - (0/3/0) [pending/succeeded/error]\n", - "Application run `02f85458-76ca-4400-863a-8b7cd55bc7e5`: completed, 3 items - (0/3/0) [pending/succeeded/error]\n", - "Application run `04c915b8-3b2a-4b7a-be76-7766190ca60d`: completed, 3 items - (0/3/0) [pending/succeeded/error]\n", - "Application run `06434c6c-eb57-436b-bdf7-82bede577d8b`: running, 3 items - (1/0/2) [pending/succeeded/error]\n", - "Application run `0a543af7-3b72-4ff0-80bd-6aab58571969`: completed, 3 items - (0/3/0) [pending/succeeded/error]\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[4]\u001b[39m\u001b[32m, line 4\u001b[39m\n\u001b[32m 2\u001b[39m application_runs = client.runs.list()\n\u001b[32m 3\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m run \u001b[38;5;129;01min\u001b[39;00m application_runs:\n\u001b[32m----> \u001b[39m\u001b[32m4\u001b[39m \u001b[38;5;28mprint\u001b[39m(run)\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/src/aignostics/client/resources/runs.py:200\u001b[39m, in \u001b[36mApplicationRun.__str__\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 192\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"Returns a string representation of the application run.\u001b[39;00m\n\u001b[32m 193\u001b[39m \n\u001b[32m 194\u001b[39m \u001b[33;03mThe string includes run ID, status, and item statistics.\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 197\u001b[39m \u001b[33;03m str: String representation of the application run.\u001b[39;00m\n\u001b[32m 198\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 199\u001b[39m app_status = \u001b[38;5;28mself\u001b[39m.status().status.value\n\u001b[32m--> \u001b[39m\u001b[32m200\u001b[39m item_status = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mitem_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 201\u001b[39m pending, succeeded, error = \u001b[32m0\u001b[39m, \u001b[32m0\u001b[39m, \u001b[32m0\u001b[39m\n\u001b[32m 202\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m item \u001b[38;5;129;01min\u001b[39;00m item_status.values():\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/src/aignostics/client/resources/runs.py:82\u001b[39m, in \u001b[36mApplicationRun.item_status\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 80\u001b[39m results = \u001b[38;5;28mself\u001b[39m.results()\n\u001b[32m 81\u001b[39m item_status = {}\n\u001b[32m---> \u001b[39m\u001b[32m82\u001b[39m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mitem\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mresults\u001b[49m\u001b[43m:\u001b[49m\n\u001b[32m 83\u001b[39m \u001b[43m \u001b[49m\u001b[43mitem_status\u001b[49m\u001b[43m[\u001b[49m\u001b[43mitem\u001b[49m\u001b[43m.\u001b[49m\u001b[43mreference\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mitem\u001b[49m\u001b[43m.\u001b[49m\u001b[43mstatus\u001b[49m\n\u001b[32m 84\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m item_status\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/src/aignostics/client/resources/utils.py:31\u001b[39m, in \u001b[36mpaginate\u001b[39m\u001b[34m(func, *args, **kwargs)\u001b[39m\n\u001b[32m 29\u001b[39m page = \u001b[32m1\u001b[39m\n\u001b[32m 30\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m---> \u001b[39m\u001b[32m31\u001b[39m results = \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpage\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpage\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpage_size\u001b[49m\u001b[43m=\u001b[49m\u001b[43mPAGE_SIZE\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 32\u001b[39m \u001b[38;5;28;01myield from\u001b[39;00m results\n\u001b[32m 33\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(results) < PAGE_SIZE:\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:39\u001b[39m, in \u001b[36mupdate_wrapper_attributes..wrapper_function\u001b[39m\u001b[34m(*args, **kwargs)\u001b[39m\n\u001b[32m 37\u001b[39m \u001b[38;5;129m@functools\u001b[39m.wraps(wrapped)\n\u001b[32m 38\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mwrapper_function\u001b[39m(*args, **kwargs):\n\u001b[32m---> \u001b[39m\u001b[32m39\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mwrapper\u001b[49m\u001b[43m(\u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/pydantic/_internal/_validate_call.py:136\u001b[39m, in \u001b[36mValidateCallWrapper.__call__\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m\n\u001b[32m 133\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m.__pydantic_complete__:\n\u001b[32m 134\u001b[39m \u001b[38;5;28mself\u001b[39m._create_validators()\n\u001b[32m--> \u001b[39m\u001b[32m136\u001b[39m res = \u001b[38;5;28mself\u001b[39m.__pydantic_validator__.validate_python(pydantic_core.ArgsKwargs(args, kwargs))\n\u001b[32m 137\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.__return_pydantic_validator__:\n\u001b[32m 138\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.__return_pydantic_validator__(res)\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/codegen/out/aignx/codegen/api/externals_api.py:2141\u001b[39m, in \u001b[36mExternalsApi.list_run_results_v1_runs_application_run_id_results_get\u001b[39m\u001b[34m(self, application_run_id, item_id__in, page, page_size, reference__in, status__in, sort, _request_timeout, _request_auth, _content_type, _headers, _host_index)\u001b[39m\n\u001b[32m 2122\u001b[39m _param = \u001b[38;5;28mself\u001b[39m._list_run_results_v1_runs_application_run_id_results_get_serialize(\n\u001b[32m 2123\u001b[39m application_run_id=application_run_id,\n\u001b[32m 2124\u001b[39m item_id__in=item_id__in,\n\u001b[32m (...)\u001b[39m\u001b[32m 2133\u001b[39m _host_index=_host_index\n\u001b[32m 2134\u001b[39m )\n\u001b[32m 2136\u001b[39m _response_types_map: Dict[\u001b[38;5;28mstr\u001b[39m, Optional[\u001b[38;5;28mstr\u001b[39m]] = {\n\u001b[32m 2137\u001b[39m \u001b[33m'\u001b[39m\u001b[33m200\u001b[39m\u001b[33m'\u001b[39m: \u001b[33m\"\u001b[39m\u001b[33mList[ItemResultReadResponse]\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 2138\u001b[39m \u001b[33m'\u001b[39m\u001b[33m404\u001b[39m\u001b[33m'\u001b[39m: \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[32m 2139\u001b[39m \u001b[33m'\u001b[39m\u001b[33m422\u001b[39m\u001b[33m'\u001b[39m: \u001b[33m\"\u001b[39m\u001b[33mHTTPValidationError\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 2140\u001b[39m }\n\u001b[32m-> \u001b[39m\u001b[32m2141\u001b[39m response_data = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mapi_client\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcall_api\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 2142\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m_param\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2143\u001b[39m \u001b[43m \u001b[49m\u001b[43m_request_timeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43m_request_timeout\u001b[49m\n\u001b[32m 2144\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 2145\u001b[39m response_data.read()\n\u001b[32m 2146\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.api_client.response_deserialize(\n\u001b[32m 2147\u001b[39m response_data=response_data,\n\u001b[32m 2148\u001b[39m response_types_map=_response_types_map,\n\u001b[32m 2149\u001b[39m ).data\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/codegen/out/aignx/codegen/api_client.py:272\u001b[39m, in \u001b[36mApiClient.call_api\u001b[39m\u001b[34m(self, method, url, header_params, body, post_params, _request_timeout)\u001b[39m\n\u001b[32m 258\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"Makes the HTTP request (synchronous)\u001b[39;00m\n\u001b[32m 259\u001b[39m \u001b[33;03m:param method: Method to call.\u001b[39;00m\n\u001b[32m 260\u001b[39m \u001b[33;03m:param url: Path to method endpoint.\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 267\u001b[39m \u001b[33;03m:return: RESTResponse\u001b[39;00m\n\u001b[32m 268\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 270\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 271\u001b[39m \u001b[38;5;66;03m# perform request and return response\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m272\u001b[39m response_data = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mrest_client\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 273\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 274\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheader_params\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 275\u001b[39m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[43m=\u001b[49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpost_params\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpost_params\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 276\u001b[39m \u001b[43m \u001b[49m\u001b[43m_request_timeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43m_request_timeout\u001b[49m\n\u001b[32m 277\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 279\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m ApiException \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 280\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m e\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/codegen/out/aignx/codegen/rest.py:244\u001b[39m, in \u001b[36mRESTClientObject.request\u001b[39m\u001b[34m(self, method, url, headers, body, post_params, _request_timeout)\u001b[39m\n\u001b[32m 241\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m ApiException(status=\u001b[32m0\u001b[39m, reason=msg)\n\u001b[32m 242\u001b[39m \u001b[38;5;66;03m# For `GET`, `HEAD`\u001b[39;00m\n\u001b[32m 243\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m244\u001b[39m r = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mpool_manager\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrequest\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 245\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 246\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 247\u001b[39m \u001b[43m \u001b[49m\u001b[43mfields\u001b[49m\u001b[43m=\u001b[49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 248\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 249\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 250\u001b[39m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\n\u001b[32m 251\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 252\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m urllib3.exceptions.SSLError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 253\u001b[39m msg = \u001b[33m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m.join([\u001b[38;5;28mtype\u001b[39m(e).\u001b[34m__name__\u001b[39m, \u001b[38;5;28mstr\u001b[39m(e)])\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/urllib3/_request_methods.py:135\u001b[39m, in \u001b[36mRequestMethods.request\u001b[39m\u001b[34m(self, method, url, body, fields, headers, json, **urlopen_kw)\u001b[39m\n\u001b[32m 132\u001b[39m urlopen_kw[\u001b[33m\"\u001b[39m\u001b[33mbody\u001b[39m\u001b[33m\"\u001b[39m] = body\n\u001b[32m 134\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m method \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m._encode_url_methods:\n\u001b[32m--> \u001b[39m\u001b[32m135\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mrequest_encode_url\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 136\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 137\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 138\u001b[39m \u001b[43m \u001b[49m\u001b[43mfields\u001b[49m\u001b[43m=\u001b[49m\u001b[43mfields\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[32m 139\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 140\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43murlopen_kw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 141\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 142\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 143\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.request_encode_body(\n\u001b[32m 144\u001b[39m method, url, fields=fields, headers=headers, **urlopen_kw\n\u001b[32m 145\u001b[39m )\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/urllib3/_request_methods.py:182\u001b[39m, in \u001b[36mRequestMethods.request_encode_url\u001b[39m\u001b[34m(self, method, url, fields, headers, **urlopen_kw)\u001b[39m\n\u001b[32m 179\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m fields:\n\u001b[32m 180\u001b[39m url += \u001b[33m\"\u001b[39m\u001b[33m?\u001b[39m\u001b[33m\"\u001b[39m + urlencode(fields)\n\u001b[32m--> \u001b[39m\u001b[32m182\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mextra_kw\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/urllib3/poolmanager.py:443\u001b[39m, in \u001b[36mPoolManager.urlopen\u001b[39m\u001b[34m(self, method, url, redirect, **kw)\u001b[39m\n\u001b[32m 441\u001b[39m response = conn.urlopen(method, url, **kw)\n\u001b[32m 442\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m443\u001b[39m response = \u001b[43mconn\u001b[49m\u001b[43m.\u001b[49m\u001b[43murlopen\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mu\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrequest_uri\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkw\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 445\u001b[39m redirect_location = redirect \u001b[38;5;129;01mand\u001b[39;00m response.get_redirect_location()\n\u001b[32m 446\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m redirect_location:\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/urllib3/connectionpool.py:787\u001b[39m, in \u001b[36mHTTPConnectionPool.urlopen\u001b[39m\u001b[34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[39m\n\u001b[32m 784\u001b[39m response_conn = conn \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m release_conn \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m 786\u001b[39m \u001b[38;5;66;03m# Make the request on the HTTPConnection object\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m787\u001b[39m response = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_make_request\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 788\u001b[39m \u001b[43m \u001b[49m\u001b[43mconn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 789\u001b[39m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 790\u001b[39m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 791\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m=\u001b[49m\u001b[43mtimeout_obj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 792\u001b[39m \u001b[43m \u001b[49m\u001b[43mbody\u001b[49m\u001b[43m=\u001b[49m\u001b[43mbody\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 793\u001b[39m \u001b[43m \u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m=\u001b[49m\u001b[43mheaders\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 794\u001b[39m \u001b[43m \u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m=\u001b[49m\u001b[43mchunked\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 795\u001b[39m \u001b[43m \u001b[49m\u001b[43mretries\u001b[49m\u001b[43m=\u001b[49m\u001b[43mretries\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 796\u001b[39m \u001b[43m \u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[43m=\u001b[49m\u001b[43mresponse_conn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 797\u001b[39m \u001b[43m \u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m=\u001b[49m\u001b[43mpreload_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 798\u001b[39m \u001b[43m \u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdecode_content\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 799\u001b[39m \u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mresponse_kw\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 800\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 802\u001b[39m \u001b[38;5;66;03m# Everything went great!\u001b[39;00m\n\u001b[32m 803\u001b[39m clean_exit = \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/urllib3/connectionpool.py:534\u001b[39m, in \u001b[36mHTTPConnectionPool._make_request\u001b[39m\u001b[34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[39m\n\u001b[32m 532\u001b[39m \u001b[38;5;66;03m# Receive the response from the server\u001b[39;00m\n\u001b[32m 533\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m534\u001b[39m response = \u001b[43mconn\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 535\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m (BaseSSLError, \u001b[38;5;167;01mOSError\u001b[39;00m) \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[32m 536\u001b[39m \u001b[38;5;28mself\u001b[39m._raise_timeout(err=e, url=url, timeout_value=read_timeout)\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/dev/python-sdk/.venv/lib/python3.11/site-packages/urllib3/connection.py:516\u001b[39m, in \u001b[36mHTTPConnection.getresponse\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 513\u001b[39m _shutdown = \u001b[38;5;28mgetattr\u001b[39m(\u001b[38;5;28mself\u001b[39m.sock, \u001b[33m\"\u001b[39m\u001b[33mshutdown\u001b[39m\u001b[33m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m 515\u001b[39m \u001b[38;5;66;03m# Get the response from http.client.HTTPConnection\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m516\u001b[39m httplib_response = \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m.\u001b[49m\u001b[43mgetresponse\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 518\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 519\u001b[39m assert_header_parsing(httplib_response.msg)\n", - "\u001b[36mFile \u001b[39m\u001b[32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/http/client.py:1395\u001b[39m, in \u001b[36mHTTPConnection.getresponse\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 1393\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 1394\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1395\u001b[39m \u001b[43mresponse\u001b[49m\u001b[43m.\u001b[49m\u001b[43mbegin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1396\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mConnectionError\u001b[39;00m:\n\u001b[32m 1397\u001b[39m \u001b[38;5;28mself\u001b[39m.close()\n", - "\u001b[36mFile \u001b[39m\u001b[32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/http/client.py:325\u001b[39m, in \u001b[36mHTTPResponse.begin\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 323\u001b[39m \u001b[38;5;66;03m# read until we get a non-100 response\u001b[39;00m\n\u001b[32m 324\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m325\u001b[39m version, status, reason = \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_read_status\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 326\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m status != CONTINUE:\n\u001b[32m 327\u001b[39m \u001b[38;5;28;01mbreak\u001b[39;00m\n", - "\u001b[36mFile \u001b[39m\u001b[32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/http/client.py:286\u001b[39m, in \u001b[36mHTTPResponse._read_status\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 285\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_read_status\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[32m--> \u001b[39m\u001b[32m286\u001b[39m line = \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28mself\u001b[39m.fp.readline(_MAXLINE + \u001b[32m1\u001b[39m), \u001b[33m\"\u001b[39m\u001b[33miso-8859-1\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m 287\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(line) > _MAXLINE:\n\u001b[32m 288\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m LineTooLong(\u001b[33m\"\u001b[39m\u001b[33mstatus line\u001b[39m\u001b[33m\"\u001b[39m)\n", - "\u001b[36mFile \u001b[39m\u001b[32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/socket.py:706\u001b[39m, in \u001b[36mSocketIO.readinto\u001b[39m\u001b[34m(self, b)\u001b[39m\n\u001b[32m 704\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[32m 705\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m706\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_sock\u001b[49m\u001b[43m.\u001b[49m\u001b[43mrecv_into\u001b[49m\u001b[43m(\u001b[49m\u001b[43mb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 707\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m timeout:\n\u001b[32m 708\u001b[39m \u001b[38;5;28mself\u001b[39m._timeout_occurred = \u001b[38;5;28;01mTrue\u001b[39;00m\n", - "\u001b[36mFile \u001b[39m\u001b[32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ssl.py:1314\u001b[39m, in \u001b[36mSSLSocket.recv_into\u001b[39m\u001b[34m(self, buffer, nbytes, flags)\u001b[39m\n\u001b[32m 1310\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m flags != \u001b[32m0\u001b[39m:\n\u001b[32m 1311\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 1312\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mnon-zero flags not allowed in calls to recv_into() on \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[33m\"\u001b[39m %\n\u001b[32m 1313\u001b[39m \u001b[38;5;28mself\u001b[39m.\u001b[34m__class__\u001b[39m)\n\u001b[32m-> \u001b[39m\u001b[32m1314\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43mnbytes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuffer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1315\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1316\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m().recv_into(buffer, nbytes, flags)\n", - "\u001b[36mFile \u001b[39m\u001b[32m/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ssl.py:1166\u001b[39m, in \u001b[36mSSLSocket.read\u001b[39m\u001b[34m(self, len, buffer)\u001b[39m\n\u001b[32m 1164\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 1165\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m buffer \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1166\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_sslobj\u001b[49m\u001b[43m.\u001b[49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mlen\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbuffer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1167\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 1168\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._sslobj.read(\u001b[38;5;28mlen\u001b[39m)\n", - "\u001b[31mKeyboardInterrupt\u001b[39m: " - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# list currently running applications\n", "application_runs = client.runs.list()\n", @@ -526,148 +236,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-13T19:42:51.785683Z", - "start_time": "2025-04-13T19:42:47.947385Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "> Download for tissue_segmentation:geojson_polygons to /var/folders/65/t33k_dcn45s6545hgkwg9y3m0000gn/T/d51def04-326b-4138-a411-47bc073bc5ac/1/tissue_segmentation:geojson_polygons.json\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "445d60b97449400da8780eff0e3ed87d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0.00/2.00 [00:00 Download for tissue_segmentation:tiff_heatmap to /var/folders/65/t33k_dcn45s6545hgkwg9y3m0000gn/T/d51def04-326b-4138-a411-47bc073bc5ac/1/tissue_segmentation:tiff_heatmap.tiff\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "b6bd7f16afb04991ac4975eaee8f42cc", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0.00/4.02M [00:00 Download for tissue_qc:tiff_heatmap to /var/folders/65/t33k_dcn45s6545hgkwg9y3m0000gn/T/d51def04-326b-4138-a411-47bc073bc5ac/1/tissue_qc:tiff_heatmap.tiff\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "74c8410e8c5f4747bd74bba81c1ce7c4", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0.00/4.02M [00:00 Download for tissue_qc:csv_class_information to /var/folders/65/t33k_dcn45s6545hgkwg9y3m0000gn/T/d51def04-326b-4138-a411-47bc073bc5ac/1/tissue_qc:csv_class_information.csv\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "a29e7543417f4d64a790164072f2eb5b", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0.00/103 [00:00 Download for tissue_qc:geojson_polygons to /var/folders/65/t33k_dcn45s6545hgkwg9y3m0000gn/T/d51def04-326b-4138-a411-47bc073bc5ac/1/tissue_qc:geojson_polygons.json\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "1c4ec47207334e818f0e2a69f19eef3d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0.00/2.00 [00:00 Download for tissue_segmentation:csv_class_information to /var/folders/65/t33k_dcn45s6545hgkwg9y3m0000gn/T/d51def04-326b-4138-a411-47bc073bc5ac/1/tissue_segmentation:csv_class_information.csv\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "8b3947bd1c9242eb892ffc3df089279c", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - " 0%| | 0.00/103 [00:00 Date: Sun, 13 Apr 2025 19:21:20 +0200 Subject: [PATCH 098/110] chore: Integrate public API rework --- API_REFERENCE_v1.md | 1198 +++-------- README.md | 36 +- codegen/config.json | 2 +- codegen/in/api.json | 2 +- codegen/out/.openapi-generator/FILES | 14 +- .../api/{externals_api.py => public_api.py} | 1834 ++++------------- codegen/out/aignx/codegen/api_client.py | 5 +- codegen/out/aignx/codegen/configuration.py | 18 +- codegen/out/aignx/codegen/exceptions.py | 5 +- codegen/out/aignx/codegen/models/__init__.py | 10 - .../models/application_read_response.py | 21 +- .../codegen/models/application_run_status.py | 7 +- .../codegen/models/application_version.py | 136 -- .../application_version_read_response.py | 33 +- .../codegen/models/http_validation_error.py | 7 +- .../aignx/codegen/models/input_artifact.py | 99 - .../models/input_artifact_creation_request.py | 13 +- .../models/input_artifact_read_response.py | 11 +- .../input_artifact_schema_creation_request.py | 91 - .../codegen/models/item_creation_request.py | 13 +- .../models/item_result_read_response.py | 19 +- .../out/aignx/codegen/models/item_status.py | 7 +- .../aignx/codegen/models/output_artifact.py | 105 - .../models/output_artifact_read_response.py | 11 +- .../output_artifact_result_read_response.py | 19 +- ...output_artifact_schema_creation_request.py | 97 - .../codegen/models/output_artifact_scope.py | 7 +- .../models/output_artifact_visibility.py | 37 - .../codegen/models/payload_input_artifact.py | 7 +- .../out/aignx/codegen/models/payload_item.py | 7 +- .../codegen/models/payload_output_artifact.py | 7 +- .../codegen/models/run_creation_request.py | 23 +- .../codegen/models/run_creation_response.py | 13 +- .../aignx/codegen/models/run_read_response.py | 21 +- .../codegen/models/slug_version_request.py | 97 - .../out/aignx/codegen/models/transfer_urls.py | 7 +- .../out/aignx/codegen/models/user_payload.py | 7 +- .../aignx/codegen/models/validation_error.py | 7 +- .../models/validation_error_loc_inner.py | 7 +- .../models/version_creation_request.py | 113 - .../models/version_creation_response.py | 87 - .../codegen/models/version_read_response.py | 123 -- codegen/out/aignx/codegen/rest.py | 5 +- codegen/out/docs/ExternalsApi.md | 879 -------- codegen/out/docs/PublicApi.md | 665 ++++++ docs/partials/README_main.md | 36 +- docs/source/_static/openapi_v1.json | 1138 +++------- docs/source/_static/openapi_v1.yaml | 726 +++---- examples/notebook.ipynb | 138 +- examples/notebook.py | 90 +- examples/script.py | 58 +- src/aignostics/client/__init__.py | 12 + src/aignostics/client/_authentication.py | 23 +- src/aignostics/client/_client.py | 6 +- .../client/resources/applications.py | 47 +- src/aignostics/client/resources/runs.py | 43 +- .../client/resources/applications_test.py | 12 +- .../aignostics/client/resources/runs_test.py | 29 +- tests/aignostics/client/scheduled_test.py | 8 +- 59 files changed, 2294 insertions(+), 6004 deletions(-) rename codegen/out/aignx/codegen/api/{externals_api.py => public_api.py} (64%) delete mode 100644 codegen/out/aignx/codegen/models/application_version.py delete mode 100644 codegen/out/aignx/codegen/models/input_artifact.py delete mode 100644 codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/output_artifact_visibility.py delete mode 100644 codegen/out/aignx/codegen/models/slug_version_request.py delete mode 100644 codegen/out/aignx/codegen/models/version_creation_request.py delete mode 100644 codegen/out/aignx/codegen/models/version_creation_response.py delete mode 100644 codegen/out/aignx/codegen/models/version_read_response.py delete mode 100644 codegen/out/docs/ExternalsApi.md create mode 100644 codegen/out/docs/PublicApi.md diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md index 42cc5470..8425b45f 100644 --- a/API_REFERENCE_v1.md +++ b/API_REFERENCE_v1.md @@ -1,13 +1,28 @@ # API v1 Reference -## PAPI API Reference v1.0.0 +## Aignostics Platform API reference v1.0.0 > Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. +The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via +`+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. + Base URLs: -* +* [/api](/api) + +## Authentication + +- oAuth2 authentication. + + - Flow: authorizationCode + - Authorization URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize) + - Token URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token) -## Externals +|Scope|Scope Description| +|---|---| + +## Public ### list_applications_v1_applications_get @@ -18,10 +33,11 @@ Base URLs: ```python import requests headers = { - 'Accept': 'application/json' + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' } -r = requests.get('/v1/applications', headers = headers) +r = requests.get('/api/v1/applications', headers = headers) print(r.json()) @@ -30,10 +46,11 @@ print(r.json()) ```javascript const headers = { - 'Accept':'application/json' + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' }; -fetch('/v1/applications', +fetch('/api/v1/applications', { method: 'GET', @@ -51,6 +68,12 @@ fetch('/v1/applications', *List Applications* +Returns the list of the applications, available to the caller. + +The application is available if any of the version of the application is assigned to the +user organization. To switch between organizations, the user should re-login and choose the +needed organization. + #### Parameters |Name|In|Type|Required|Description| @@ -66,13 +89,12 @@ fetch('/v1/applications', ```json [ { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", + "application_id": "h-e-tme", + "description": "string", "name": "HETA", "regulatory_classes": [ "RuO" - ], - "slug": "heta" + ] } ] ``` @@ -94,14 +116,14 @@ Status Code **200** |---|---|---|---|---| |Response List Applications V1 Applications Get|[[ApplicationReadResponse](#schemaapplicationreadresponse)]|false|none|none| |» ApplicationReadResponse|[ApplicationReadResponse](#schemaapplicationreadresponse)|false|none|none| -|»» application_id|string(uuid)|true|none|none| -|»» description|string|true|none|none| -|»» name|string|true|none|none| -|»» regulatory_classes|[string]|true|none|none| -|»» slug|string|true|none|none| +|»» application_id|string|true|none|Application ID| +|»» description|string|true|none|Application documentations| +|»» name|string|true|none|Application display name| +|»» regulatory_classes|[string]|true|none|Regulatory class, to which the applications compliance| -This operation does not require authentication +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer ### list_versions_by_application_id_v1_applications__application_id__versions_get @@ -113,10 +135,11 @@ This operation does not require authentication ```python import requests headers = { - 'Accept': 'application/json' + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' } -r = requests.get('/v1/applications/{application_id}/versions', headers = headers) +r = requests.get('/api/v1/applications/{application_id}/versions', headers = headers) print(r.json()) @@ -125,10 +148,11 @@ print(r.json()) ```javascript const headers = { - 'Accept':'application/json' + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' }; -fetch('/v1/applications/{application_id}/versions', +fetch('/api/v1/applications/{application_id}/versions', { method: 'GET', @@ -146,234 +170,18 @@ fetch('/v1/applications/{application_id}/versions', *List Versions By Application Id* -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_id|path|string(uuid)|true|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|version|query|any|false|none| -|include|query|any|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "application_version_slug": "tissue-segmentation-qc:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Versions By Application Id V1 Applications Application Id Versions Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| -|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| -|»» application_id|string(uuid)|true|none|none| -|»» application_version_id|string(uuid)|true|none|none| -|»» application_version_slug|string|true|none|none| -|»» changelog|string|true|none|none| -|»» flow_id|any|false|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string(uuid)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| -|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| -|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|»» version|string|true|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|scope|item| -|scope|global| - - -This operation does not require authentication - - -### read_application_by_slug_v1_applications__application_slug__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/applications/{application_slug}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/applications/{application_slug}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_slug}` - -*Read Application By Slug* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_slug|path|string|true|none| - -> Example responses - -> 200 Response - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ], - "slug": "heta" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[ApplicationReadResponse](#schemaapplicationreadresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -### list_versions_by_application_slug_v1_applications__application_slug__versions_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/applications/{application_slug}/versions', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/applications/{application_slug}/versions', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` +Returns the list of the application versions for this application, available to the caller. -`GET /v1/applications/{application_slug}/versions` +The application version is available if it is assigned to the user's organization. -*List Versions By Application Slug* +The application versions are assigned to the organization by the Aignostics admin. To +assign or unassign a version from your organization, please contact Aignostics support team. #### Parameters |Name|In|Type|Required|Description| |---|---|---|---|---| -|application_slug|path|string|true|none| +|application_id|path|string|true|none| |page|query|integer|false|none| |page_size|query|integer|false|none| |version|query|any|false|none| @@ -387,9 +195,8 @@ fetch('/v1/applications/{application_slug}/versions', ```json [ { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "application_id": "string", + "application_version_id": "h-e-tme:v0.0.1", "changelog": "string", "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", "input_artifacts": [ @@ -423,17 +230,16 @@ fetch('/v1/applications/{application_slug}/versions', Status Code **200** -*Response List Versions By Application Slug V1 Applications Application Slug Versions Get* +*Response List Versions By Application Id V1 Applications Application Id Versions Get* |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|Response List Versions By Application Slug V1 Applications Application Slug Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| +|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| |» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| -|»» application_id|string(uuid)|true|none|none| -|»» application_version_id|string(uuid)|true|none|none| -|»» application_version_slug|string|true|none|none| -|»» changelog|string|true|none|none| -|»» flow_id|any|false|none|none| +|»» application_id|string|true|none|Application ID| +|»» application_version_id|string|true|none|Application version ID| +|»» changelog|string|true|none|Description of the changes relative to the previous version| +|»» flow_id|any|false|none|Flow ID, used internally by the platform| *anyOf* @@ -451,18 +257,18 @@ Status Code **200** |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| +|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|List of the input fields, provided by the User| |»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| |»»»» metadata_schema|object|true|none|none| |»»»» mime_type|string|true|none|none| |»»»» name|string|true|none|none| -|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| +|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|List of the output fields, generated by the application| |»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| |»»»» metadata_schema|object|true|none|none| |»»»» mime_type|string|true|none|none| |»»»» name|string|true|none|none| |»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|»» version|string|true|none|none| +|»» version|string|true|none|Semantic version of the application| ##### Enumerated Values @@ -472,7 +278,8 @@ Status Code **200** |scope|global| -This operation does not require authentication +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer ### list_application_runs_v1_runs_get @@ -484,10 +291,11 @@ This operation does not require authentication ```python import requests headers = { - 'Accept': 'application/json' + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' } -r = requests.get('/v1/runs', headers = headers) +r = requests.get('/api/v1/runs', headers = headers) print(r.json()) @@ -496,10 +304,11 @@ print(r.json()) ```javascript const headers = { - 'Accept':'application/json' + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' }; -fetch('/v1/runs', +fetch('/api/v1/runs', { method: 'GET', @@ -517,13 +326,16 @@ fetch('/v1/runs', *List Application Runs* +The endpoint returns the application runs triggered by the caller. After the application run +is created by POST /v1/runs, it becomes available for the current endpoint + #### Parameters |Name|In|Type|Required|Description| |---|---|---|---|---| -|application_id|query|any|false|none| -|application_version_id|query|any|false|none| -|include|query|any|false|none| +|application_id|query|any|false|Optional application ID filter| +|application_version|query|any|false|Optional application version filter| +|include|query|any|false|Request optional output values. Used internally by the platform| |page|query|integer|false|none| |page_size|query|integer|false|none| |sort|query|any|false|none| @@ -536,13 +348,13 @@ fetch('/v1/runs', [ { "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_id": "string", "organization_id": "string", "status": "canceled_system", "triggered_at": "2019-08-24T14:15:22Z", "triggered_by": "string", "user_payload": { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_id": "string", "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", "global_output_artifacts": { "property1": { @@ -632,20 +444,20 @@ Status Code **200** |---|---|---|---|---| |Response List Application Runs V1 Runs Get|[[RunReadResponse](#schemarunreadresponse)]|false|none|none| |» RunReadResponse|[RunReadResponse](#schemarunreadresponse)|false|none|none| -|»» application_run_id|string(uuid)|true|none|none| -|»» application_version_id|string(uuid)|true|none|none| -|»» organization_id|string|true|none|none| +|»» application_run_id|string(uuid)|true|none|UUID of the application| +|»» application_version_id|string|true|none|ID of the application version| +|»» organization_id|string|true|none|Organization of the owner of the application run| |»» status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| -|»» triggered_at|string(date-time)|true|none|none| -|»» triggered_by|string|true|none|none| -|»» user_payload|any|false|none|none| +|»» triggered_at|string(date-time)|true|none|Timestamp showing when the application run was triggered| +|»» triggered_by|string|true|none|Id of the user who triggered the application run| +|»» user_payload|any|false|none|Field used internally by the Platform| *anyOf* |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| |»»» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| -|»»»» application_id|string(uuid)|true|none|none| +|»»»» application_id|string|true|none|none| |»»»» application_run_id|string(uuid)|true|none|none| |»»»» global_output_artifacts|any|true|none|none| @@ -702,7 +514,8 @@ Status Code **200** |status|scheduled| -This operation does not require authentication +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer ### create_application_run_v1_runs_post @@ -715,10 +528,11 @@ This operation does not require authentication import requests headers = { 'Content-Type': 'application/json', - 'Accept': 'application/json' + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' } -r = requests.post('/v1/runs', headers = headers) +r = requests.post('/api/v1/runs', headers = headers) print(r.json()) @@ -726,7 +540,7 @@ print(r.json()) ```javascript const inputBody = '{ - "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "application_version_id": "h-e-tme:v1.2.3", "items": [ { "input_artifacts": [ @@ -748,10 +562,11 @@ const inputBody = '{ }'; const headers = { 'Content-Type':'application/json', - 'Accept':'application/json' + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' }; -fetch('/v1/runs', +fetch('/api/v1/runs', { method: 'POST', body: inputBody, @@ -769,11 +584,31 @@ fetch('/v1/runs', *Create Application Run* -> Body parameter +The endpoint is used to process the input items by the chosen application version. The endpoint +returns the `application_run_id`. The processing fo the items is done asynchronously. + +To check the status or cancel the execution, use the /v1/runs/{application_run_id} endpoint. + +#### Payload + +The payload includes `application_version_id` and `items` base fields. + +`application_version_id` is the id used for `/v1/versions/{application_id}` endpoint. + +`items` includes the list of the items to process (slides, in case of HETA application). +Every item has a set of standard fields defined by the API, plus the metadata, specific to the +chosen application. + +Example payload structure with the comments: +``` +{ + application_version_id: "heta:v1.0.0", + items: [{ + "reference": "slide_1" Body parameter ```json { - "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "application_version_id": "h-e-tme:v1.2.3", "items": [ { "input_artifacts": [ @@ -807,7 +642,7 @@ fetch('/v1/runs', ```json { - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" + "application_run_id": "Application run id" } ``` @@ -820,7 +655,8 @@ fetch('/v1/runs', |422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| -This operation does not require authentication +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer ### get_run_v1_runs__application_run_id__get @@ -832,10 +668,11 @@ This operation does not require authentication ```python import requests headers = { - 'Accept': 'application/json' + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' } -r = requests.get('/v1/runs/{application_run_id}', headers = headers) +r = requests.get('/api/v1/runs/{application_run_id}', headers = headers) print(r.json()) @@ -844,10 +681,11 @@ print(r.json()) ```javascript const headers = { - 'Accept':'application/json' + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' }; -fetch('/v1/runs/{application_run_id}', +fetch('/api/v1/runs/{application_run_id}', { method: 'GET', @@ -865,11 +703,17 @@ fetch('/v1/runs/{application_run_id}', *Get Run* +Returns the details of the application run. The application run is available as soon as it is +created via `POST /runs/` endpoint. To download the items results, call +`/runs/{application_run_id}/results`. + +The application is only available to the user who triggered it, regardless of the role. + #### Parameters |Name|In|Type|Required|Description| |---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| +|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| |include|query|any|false|none| > Example responses @@ -879,13 +723,13 @@ fetch('/v1/runs/{application_run_id}', ```json { "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_id": "string", "organization_id": "string", "status": "canceled_system", "triggered_at": "2019-08-24T14:15:22Z", "triggered_by": "string", "user_payload": { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_id": "string", "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", "global_output_artifacts": { "property1": { @@ -965,10 +809,11 @@ fetch('/v1/runs/{application_run_id}', |422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| -This operation does not require authentication +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer -### cancel_run_v1_runs__application_run_id__cancel_post +### cancel_application_run_v1_runs__application_run_id__cancel_post @@ -977,10 +822,11 @@ This operation does not require authentication ```python import requests headers = { - 'Accept': 'application/json' + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' } -r = requests.post('/v1/runs/{application_run_id}/cancel', headers = headers) +r = requests.post('/api/v1/runs/{application_run_id}/cancel', headers = headers) print(r.json()) @@ -989,10 +835,11 @@ print(r.json()) ```javascript const headers = { - 'Accept':'application/json' + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' }; -fetch('/v1/runs/{application_run_id}/cancel', +fetch('/api/v1/runs/{application_run_id}/cancel', { method: 'POST', @@ -1008,13 +855,20 @@ fetch('/v1/runs/{application_run_id}/cancel', `POST /v1/runs/{application_run_id}/cancel` -*Cancel Run* +*Cancel Application Run* + +The application run can be canceled by the user who created the application run. + +The execution can be canceled any time while the application is not in a final state. The +pending items will not be processed and will not add to the cost. + +When the application is canceled, the already completed items stay available for download. #### Parameters |Name|In|Type|Required|Description| |---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| +|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| > Example responses @@ -1035,10 +889,11 @@ null #### Response Schema -This operation does not require authentication +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer -### delete_run_results_v1_runs__application_run_id__results_delete +### delete_application_run_results_v1_runs__application_run_id__results_delete @@ -1047,10 +902,11 @@ This operation does not require authentication ```python import requests headers = { - 'Accept': 'application/json' + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' } -r = requests.delete('/v1/runs/{application_run_id}/results', headers = headers) +r = requests.delete('/api/v1/runs/{application_run_id}/results', headers = headers) print(r.json()) @@ -1059,10 +915,11 @@ print(r.json()) ```javascript const headers = { - 'Accept':'application/json' + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' }; -fetch('/v1/runs/{application_run_id}/results', +fetch('/api/v1/runs/{application_run_id}/results', { method: 'DELETE', @@ -1078,13 +935,19 @@ fetch('/v1/runs/{application_run_id}/results', `DELETE /v1/runs/{application_run_id}/results` -*Delete Run Results* +*Delete Application Run Results* + +Delete the application run results. It can only be called when the application is in a final +state (meaning it's not in `received` or `pending` states). To delete the results of the running +artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel the application run. + +The output results are deleted automatically 30 days after the application run is finished. #### Parameters |Name|In|Type|Required|Description| |---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| +|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| > Example responses @@ -1113,7 +976,8 @@ fetch('/v1/runs/{application_run_id}/results', |422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| -This operation does not require authentication +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer ### list_run_results_v1_runs__application_run_id__results_get @@ -1125,10 +989,11 @@ This operation does not require authentication ```python import requests headers = { - 'Accept': 'application/json' + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' } -r = requests.get('/v1/runs/{application_run_id}/results', headers = headers) +r = requests.get('/api/v1/runs/{application_run_id}/results', headers = headers) print(r.json()) @@ -1137,10 +1002,11 @@ print(r.json()) ```javascript const headers = { - 'Accept':'application/json' + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' }; -fetch('/v1/runs/{application_run_id}/results', +fetch('/api/v1/runs/{application_run_id}/results', { method: 'GET', @@ -1158,16 +1024,18 @@ fetch('/v1/runs/{application_run_id}/results', *List Run Results* +Get the list of the results for the run items + #### Parameters |Name|In|Type|Required|Description| |---|---|---|---|---| -|application_run_id|path|string(uuid)|true|none| -|item_id__in|query|any|false|none| +|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| +|item_id__in|query|any|false|Filter for items ids| +|reference__in|query|any|false|Filter for items by their reference from the input payload| +|status__in|query|any|false|Filter for items in certain statuses| |page|query|integer|false|none| |page_size|query|integer|false|none| -|reference__in|query|any|false|none| -|status__in|query|any|false|none| |sort|query|any|false|none| > Example responses @@ -1213,8 +1081,8 @@ Status Code **200** |---|---|---|---|---| |Response List Run Results V1 Runs Application Run Id Results Get|[[ItemResultReadResponse](#schemaitemresultreadresponse)]|false|none|none| |» ItemResultReadResponse|[ItemResultReadResponse](#schemaitemresultreadresponse)|false|none|none| -|»» application_run_id|string(uuid)|true|none|none| -|»» error|any|true|none|none| +|»» application_run_id|string(uuid)|true|none|Application run UUID to which the item belongs| +|»» error|any|true|none|The error message in case the item is in `error_system` or `error_user` state| *anyOf* @@ -1232,10 +1100,10 @@ Status Code **200** |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|»» item_id|string(uuid)|true|none|none| -|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| +|»» item_id|string(uuid)|true|none|Item UUID generated by the Platform| +|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|The list of the results generated by the application algorithm. The number of files and theirtypes depend on the particular application version, call `/v1/versions/{version_id}` to getthe details.| |»»» OutputArtifactResultReadResponse|[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)|false|none|none| -|»»»» download_url|any|true|none|none| +|»»»» download_url|any|true|none|The download URL to the output file. The URL is valid for 1 hour after the endpoint is called.A new URL is generated every time the endpoint is called.| *anyOf* @@ -1253,11 +1121,11 @@ Status Code **200** |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|»»»» metadata|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» output_artifact_id|string(uuid)|true|none|none| -|»» reference|string|true|none|none| +|»»»» metadata|object|true|none|The metadata of the output artifact, provided by the application| +|»»»» mime_type|string|true|none|The mime type of the output file| +|»»»» name|string|true|none|Name of the output from the output schema from the `/v1/versions/{version_id}` endpoint.| +|»»»» output_artifact_id|string(uuid)|true|none|The Id of the artifact. Used internally| +|»» reference|string|true|none|The reference of the item from the user payload| |»» status|[ItemStatus](#schemaitemstatus)|true|none|none| ##### Enumerated Values @@ -1272,262 +1140,51 @@ Status Code **200** |status|succeeded| -This operation does not require authentication +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer -### register_version_v1_versions_post +## Schemas +### ApplicationReadResponse -> Code samples -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json' + + + +```json +{ + "application_id": "h-e-tme", + "description": "string", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ] } -r = requests.post('/v1/versions', headers = headers) +``` + +ApplicationReadResponse -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json' -}; - -fetch('/v1/versions', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/versions` - -*Register Version* - -> Body parameter - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[VersionCreationRequest](#schemaversioncreationrequest)|true|none| - -> Example responses - -> 201 Response - -```json -{ - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[VersionCreationResponse](#schemaversioncreationresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -### get_version_v1_versions__application_version_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json' -} - -r = requests.get('/v1/versions/{application_version_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json' -}; - -fetch('/v1/versions/{application_version_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/versions/{application_version_id}` - -*Get Version* - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_version_id|path|string(uuid)|true|none| -|include|query|any|false|none| - -> Example responses - -> 200 Response - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "changelog": "string", - "created_at": "2019-08-24T14:15:22Z", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[VersionReadResponse](#schemaversionreadresponse)| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -This operation does not require authentication - - -## Schemas - -### ApplicationReadResponse - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "description": "Aignostics H&E TME application", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ], - "slug": "heta" -} - -``` - -ApplicationReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|description|string|true|none|none| -|name|string|true|none|none| -|regulatory_classes|[string]|true|none|none| -|slug|string|true|none|none| - -### ApplicationRunStatus - - - - - - -```json -"canceled_system" +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string|true|none|Application ID| +|description|string|true|none|Application documentations| +|name|string|true|none|Application display name| +|regulatory_classes|[string]|true|none|Regulatory class, to which the applications compliance| + +### ApplicationRunStatus + + + + + + +```json +"canceled_system" ``` @@ -1561,9 +1218,8 @@ ApplicationRunStatus ```json { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "application_version_slug": "tissue-segmentation-qc:v0.0.1", + "application_id": "string", + "application_version_id": "h-e-tme:v0.0.1", "changelog": "string", "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", "input_artifacts": [ @@ -1592,11 +1248,10 @@ ApplicationVersionReadResponse |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|application_version_id|string(uuid)|true|none|none| -|application_version_slug|string|true|none|none| -|changelog|string|true|none|none| -|flow_id|any|false|none|none| +|application_id|string|true|none|Application ID| +|application_version_id|string|true|none|Application version ID| +|changelog|string|true|none|Description of the changes relative to the previous version| +|flow_id|any|false|none|Flow ID, used internally by the platform| anyOf @@ -1614,9 +1269,9 @@ continued |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|none| -|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|none| -|version|string|true|none|none| +|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|List of the input fields, provided by the User| +|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|List of the output fields, generated by the application| +|version|string|true|none|Semantic version of the application| ### HTTPValidationError @@ -1648,32 +1303,6 @@ HTTPValidationError |---|---|---|---|---| |detail|[[ValidationError](#schemavalidationerror)]|false|none|none| -### InputArtifact - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" -} - -``` - -InputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - ### InputArtifactCreationRequest @@ -1702,9 +1331,9 @@ InputArtifactCreationRequest |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|metadata|object|true|none|none| -|name|string|true|none|none| +|download_url|string(uri)|true|none|[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) to the input artifact file. The URL should be valid for at least 6 days from the payload submission time.| +|metadata|object|true|none|The metadata of the artifact, required by the application version. The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. The schema is located in `input_artifacts.[].metadata_schema`| +|name|string|true|none|The artifact name according to the application version. List of required artifacts is returned by `/v1/versions/{application_version_id}`. The artifact names are located in the `input_artifacts.[].name` value| ### InputArtifactReadResponse @@ -1732,32 +1361,6 @@ InputArtifactReadResponse |mime_type|string|true|none|none| |name|string|true|none|none| -### InputArtifactSchemaCreationRequest - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" -} - -``` - -InputArtifactSchemaCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - ### ItemCreationRequest @@ -1791,8 +1394,8 @@ ItemCreationRequest |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|none| -|reference|string|true|none|none| +|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|All the input files of the item, required by the application version| +|reference|string|true|none|The ID of the slide provided by the caller. The reference should be unique across all items of the application run| ### ItemResultReadResponse @@ -1827,8 +1430,8 @@ ItemResultReadResponse |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|application_run_id|string(uuid)|true|none|none| -|error|any|true|none|none| +|application_run_id|string(uuid)|true|none|Application run UUID to which the item belongs| +|error|any|true|none|The error message in case the item is in `error_system` or `error_user` state| anyOf @@ -1846,10 +1449,10 @@ continued |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|item_id|string(uuid)|true|none|none| -|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|none| -|reference|string|true|none|none| -|status|[ItemStatus](#schemaitemstatus)|true|none|none| +|item_id|string(uuid)|true|none|Item UUID generated by the Platform| +|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|The list of the results generated by the application algorithm. The number of files and theirtypes depend on the particular application version, call `/v1/versions/{version_id}` to getthe details.| +|reference|string|true|none|The reference of the item from the user payload| +|status|[ItemStatus](#schemaitemstatus)|true|none|When the item is not processed yet, the status is set to `pending`.When the item is successfully finished, status is set to `succeeded`, and the processing resultsbecome available for download in `output_artifacts` field.When the item processing is failed because the provided item is invalid, the status is set to`error_user`. When the item processing failed because of the error in the model or platform,the status is set to `error_system`. When the application_run is canceled, the status of allpending items is set to either `cancelled_user` or `cancelled_system`.| ### ItemStatus @@ -1882,36 +1485,6 @@ ItemStatus |ItemStatus|error_system| |ItemStatus|succeeded| -### OutputArtifact - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" -} - -``` - -OutputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| - ### OutputArtifactReadResponse @@ -1964,7 +1537,7 @@ OutputArtifactResultReadResponse |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|download_url|any|true|none|none| +|download_url|any|true|none|The download URL to the output file. The URL is valid for 1 hour after the endpoint is called.A new URL is generated every time the endpoint is called.| anyOf @@ -1982,40 +1555,10 @@ continued |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|metadata|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|output_artifact_id|string(uuid)|true|none|none| - -### OutputArtifactSchemaCreationRequest - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" -} - -``` - -OutputArtifactSchemaCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|visibility|[OutputArtifactVisibility](#schemaoutputartifactvisibility)|true|none|none| +|metadata|object|true|none|The metadata of the output artifact, provided by the application| +|mime_type|string|true|none|The mime type of the output file| +|name|string|true|none|Name of the output from the output schema from the `/v1/versions/{version_id}` endpoint.| +|output_artifact_id|string(uuid)|true|none|The Id of the artifact. Used internally| ### OutputArtifactScope @@ -2044,33 +1587,6 @@ OutputArtifactScope |OutputArtifactScope|item| |OutputArtifactScope|global| -### OutputArtifactVisibility - - - - - - -```json -"internal" - -``` - -OutputArtifactVisibility - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|OutputArtifactVisibility|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|OutputArtifactVisibility|internal| -|OutputArtifactVisibility|external| - ### PayloadInputArtifact @@ -2200,7 +1716,7 @@ PayloadOutputArtifact ```json { - "application_version": "efbf9822-a1e5-4045-a283-dbf26e8064a9", + "application_version_id": "h-e-tme:v1.2.3", "items": [ { "input_artifacts": [ @@ -2229,25 +1745,8 @@ RunCreationRequest |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|application_version|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[SlugVersionRequest](#schemaslugversionrequest)|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|none| +|application_version_id|string|true|none|Application version ID| +|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|List of the items to process by the application| ### RunCreationResponse @@ -2258,7 +1757,7 @@ continued ```json { - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe" + "application_run_id": "Application run id" } ``` @@ -2269,7 +1768,7 @@ RunCreationResponse |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|application_run_id|string(uuid)|true|none|none| +|application_run_id|string(uuid)|false|none|none| ### RunReadResponse @@ -2281,13 +1780,13 @@ RunCreationResponse ```json { "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", + "application_version_id": "string", "organization_id": "string", "status": "canceled_system", "triggered_at": "2019-08-24T14:15:22Z", "triggered_by": "string", "user_payload": { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_id": "string", "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", "global_output_artifacts": { "property1": { @@ -2365,13 +1864,13 @@ RunReadResponse |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|application_run_id|string(uuid)|true|none|none| -|application_version_id|string(uuid)|true|none|none| -|organization_id|string|true|none|none| -|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| -|triggered_at|string(date-time)|true|none|none| -|triggered_by|string|true|none|none| -|user_payload|any|false|none|none| +|application_run_id|string(uuid)|true|none|UUID of the application| +|application_version_id|string|true|none|ID of the application version| +|organization_id|string|true|none|Organization of the owner of the application run| +|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|When the application run request is received by the Platform, the `status` of it is set to`received`. Then it is transitioned to `scheduled`, when it is scheduled for the processing.When the application run is scheduled, it will process the input items and generate the resultincrementally. As soon as the first result is generated, the state is changed to `running`.The results can be downloaded via `/v1/runs/{run_id}/results` endpoint.When all items are processed and all results are generated, the application status is set to`completed`. If the processing is done, but some items fail, the status is set to`completed_with_error`.When the application run request is rejected by the Platform before scheduling, it is transferredto `rejected`. When the application run reaches the threshold of number of failed items, the wholeapplication run is set to `canceled_system` and the remaining pending items are not processed.When the application run fails, the finished item results are available for download.If the application run is canceled by calling `POST /v1/runs/{run_id}/cancel` endpoint, theprocessing of the items is stopped, and the application status is set to `cancelled_user`| +|triggered_at|string(date-time)|true|none|Timestamp showing when the application run was triggered| +|triggered_by|string|true|none|Id of the user who triggered the application run| +|user_payload|any|false|none|Field used internally by the Platform| anyOf @@ -2385,30 +1884,6 @@ or |---|---|---|---|---| |» *anonymous*|null|false|none|none| -### SlugVersionRequest - - - - - - -```json -{ - "application_slug": "string", - "version": "string" -} - -``` - -SlugVersionRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_slug|string|true|none|none| -|version|string|true|none|none| - ### TransferUrls @@ -2442,7 +1917,7 @@ TransferUrls ```json { - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", + "application_id": "string", "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", "global_output_artifacts": { "property1": { @@ -2519,7 +1994,7 @@ UserPayload |Name|Type|Required|Restrictions|Description| |---|---|---|---|---| -|application_id|string(uuid)|true|none|none| +|application_id|string|true|none|none| |application_run_id|string(uuid)|true|none|none| |global_output_artifacts|any|true|none|none| @@ -2586,138 +2061,3 @@ continued |---|---|---|---|---| |msg|string|true|none|none| |type|string|true|none|none| - -### VersionCreationRequest - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} - -``` - -VersionCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|changelog|string|true|none|none| -|flow_id|string(uuid)|true|none|none| -|input_artifacts|[[InputArtifactSchemaCreationRequest](#schemainputartifactschemacreationrequest)]|true|none|none| -|output_artifacts|[[OutputArtifactSchemaCreationRequest](#schemaoutputartifactschemacreationrequest)]|true|none|none| -|version|string|true|none|none| - -### VersionCreationResponse - - - - - - -```json -{ - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c" -} - -``` - -VersionCreationResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_version_id|string(uuid)|true|none|none| - -### VersionReadResponse - - - - - - -```json -{ - "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c", - "application_version_id": "4108b546-90d4-4689-8b58-78cd9ef4691c", - "changelog": "string", - "created_at": "2019-08-24T14:15:22Z", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item", - "visibility": "internal" - } - ], - "version": "string" -} - -``` - -VersionReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string(uuid)|true|none|none| -|application_version_id|string(uuid)|true|none|none| -|changelog|string|true|none|none| -|created_at|string(date-time)|true|none|none| -|flow_id|any|false|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifact](#schemainputartifact)]|true|none|none| -|output_artifacts|[[OutputArtifact](#schemaoutputartifact)]|true|none|none| -|version|string|true|none|none| diff --git a/README.md b/README.md index c4c2771f..d3f2bc19 100644 --- a/README.md +++ b/README.md @@ -45,9 +45,6 @@ --- -from aignx.codegen.models import ItemCreationRequestfrom aignx.codegen.models -import ItemCreationRequestfrom aignx.codegen.models import RunCreationRequest - ## Introduction The aignostics Python SDK opens multiple pathways to interact with the @@ -188,23 +185,30 @@ pip install aignostics The following snippet shows how to use the Python SDK to trigger an application run: ```python -import aignostics.client -from aignx.codegen.models import ( - ApplicationVersion, - RunCreationRequest, - ItemCreationRequest -) +import aignostics.client as platform # initialize the client -client = aignostics.client.Client() +client = platform.Client() # trigger an application run application_run = client.runs.create( - RunCreationRequest( - application_version=ApplicationVersion("..."), - items=[ - ItemCreationRequest(...) - ], - ) + application_version="two-task-dummy:v0.35.0", + items=[ + platform.Item( + reference="slide-1", + input_artifacts=[ + platform.InputArtifact( + name="user_slide", + download_url="
", + metadata={ + "checksum_crc32c": "AAAAAA==", + "base_mpp": 0.25, + "width": 1000, + "height": 1000, + }, + ) + ], + ), + ], ) # wait for the results and download incrementally as they become available application_run.download_to_folder("path/to/download/folder") diff --git a/codegen/config.json b/codegen/config.json index b3cc9010..412683c8 100644 --- a/codegen/config.json +++ b/codegen/config.json @@ -3,7 +3,7 @@ "models": "", "modelTests": false, "modelDocs": false, - "apis": "Externals", + "apis": "Public", "apiTests": false, "apiDocs": true, "supportingFiles": "configuration.py,rest.py,api_client.py,exceptions.py,api_response.py" diff --git a/codegen/in/api.json b/codegen/in/api.json index f9212f0d..0570982d 100644 --- a/codegen/in/api.json +++ b/codegen/in/api.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"PAPI API Reference","version":"1.0.0"},"servers":[{"url":""}],"paths":{"/v1/applications":{"get":{"tags":["Externals"],"summary":"List Applications","operationId":"list_applications_v1_applications_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationReadResponse"},"title":"Response List Applications V1 Applications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_slug}":{"get":{"tags":["Externals"],"summary":"Read Application By Slug","operationId":"read_application_by_slug_v1_applications__application_slug__get","parameters":[{"name":"application_slug","in":"path","required":true,"schema":{"type":"string","title":"Application Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs":{"get":{"tags":["Externals"],"summary":"List Application Runs","operationId":"list_application_runs_v1_runs_get","parameters":[{"name":"application_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Id"}},{"name":"application_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Version Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RunReadResponse"},"title":"Response List Application Runs V1 Runs Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Externals"],"summary":"Create Application Run","operationId":"create_application_run_v1_runs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}":{"get":{"tags":["Externals"],"summary":"Get Run","operationId":"get_run_v1_runs__application_run_id__get","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunReadResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/cancel":{"post":{"tags":["Externals"],"summary":"Cancel Run","operationId":"cancel_run_v1_runs__application_run_id__cancel_post","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/results":{"get":{"tags":["Externals"],"summary":"List Run Results","operationId":"list_run_results_v1_runs__application_run_id__results_get","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}},{"name":"item_id__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"title":"Item Id In"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"reference__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Reference In"}},{"name":"status__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ItemStatus"}},{"type":"null"}],"title":"Status In"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ItemResultReadResponse"},"title":"Response List Run Results V1 Runs Application Run Id Results Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Externals"],"summary":"Delete Run Results","operationId":"delete_run_results_v1_runs__application_run_id__results_delete","parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Run Id"}}],"responses":{"204":{"description":"Successful Response"},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/versions":{"post":{"tags":["Externals"],"summary":"Register Version","operationId":"register_version_v1_versions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreationRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionCreationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_id}/versions":{"get":{"tags":["Externals"],"summary":"List Versions By Application Id","operationId":"list_versions_by_application_id_v1_applications__application_id__versions_get","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Id V1 Applications Application Id Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_slug}/versions":{"get":{"tags":["Externals"],"summary":"List Versions By Application Slug","operationId":"list_versions_by_application_slug_v1_applications__application_slug__versions_get","parameters":[{"name":"application_slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z](-?[a-z])*$","title":"Application Slug"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Slug V1 Applications Application Slug Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/versions/{application_version_id}":{"get":{"tags":["Externals"],"summary":"Get Version","operationId":"get_version_v1_versions__application_version_id__get","parameters":[{"name":"application_version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Version Id"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionReadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ApplicationReadResponse":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"},"name":{"type":"string","title":"Name","examples":["HETA"]},"slug":{"type":"string","title":"Slug","examples":["heta"]},"regulatory_classes":{"items":{"type":"string"},"type":"array","title":"Regulatory Classes","examples":[["RuO"]]},"description":{"type":"string","title":"Description","examples":["Aignostics H&E TME application"]}},"type":"object","required":["application_id","name","slug","regulatory_classes","description"],"title":"ApplicationReadResponse"},"ApplicationRunStatus":{"type":"string","enum":["canceled_system","canceled_user","completed","completed_with_error","received","rejected","running","scheduled"],"title":"ApplicationRunStatus"},"ApplicationVersionReadResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"application_version_slug":{"type":"string","pattern":"^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$","title":"Application Version Slug","examples":["tissue-segmentation-qc:v0.0.1"]},"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactReadResponse"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactReadResponse"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["application_version_id","application_version_slug","version","application_id","changelog","input_artifacts","output_artifacts"],"title":"ApplicationVersionReadResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InputArtifact":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifact"},"InputArtifactCreationRequest":{"properties":{"name":{"type":"string","title":"Name","examples":["slide"]},"download_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Download Url","examples":["https://example.com/case-no-1-slide.tiff"]},"metadata":{"type":"object","title":"Metadata","examples":[{"checksum_crc32c":"752f9554","height":2000,"height_mpp":0.5,"width":10000,"width_mpp":0.5}]}},"type":"object","required":["name","download_url","metadata"],"title":"InputArtifactCreationRequest"},"InputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactReadResponse"},"InputArtifactSchemaCreationRequest":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactSchemaCreationRequest"},"ItemCreationRequest":{"properties":{"reference":{"type":"string","title":"Reference","examples":["case-no-1"]},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactCreationRequest"},"type":"array","title":"Input Artifacts"}},"type":"object","required":["reference","input_artifacts"],"title":"ItemCreationRequest"},"ItemResultReadResponse":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"reference":{"type":"string","title":"Reference"},"status":{"$ref":"#/components/schemas/ItemStatus"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactResultReadResponse"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["item_id","application_run_id","reference","status","error","output_artifacts"],"title":"ItemResultReadResponse"},"ItemStatus":{"type":"string","enum":["pending","canceled_user","canceled_system","error_user","error_system","succeeded"],"title":"ItemStatus"},"OutputArtifact":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"},"visibility":{"$ref":"#/components/schemas/OutputArtifactVisibility"}},"type":"object","required":["name","mime_type","metadata_schema","scope","visibility"],"title":"OutputArtifact"},"OutputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"}},"type":"object","required":["name","mime_type","metadata_schema","scope"],"title":"OutputArtifactReadResponse"},"OutputArtifactResultReadResponse":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata":{"type":"object","title":"Metadata"},"download_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Download Url"}},"type":"object","required":["output_artifact_id","name","mime_type","metadata","download_url"],"title":"OutputArtifactResultReadResponse"},"OutputArtifactSchemaCreationRequest":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"},"visibility":{"$ref":"#/components/schemas/OutputArtifactVisibility"},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","scope","visibility","metadata_schema"],"title":"OutputArtifactSchemaCreationRequest"},"OutputArtifactScope":{"type":"string","enum":["item","global"],"title":"OutputArtifactScope"},"OutputArtifactVisibility":{"type":"string","enum":["internal","external"],"title":"OutputArtifactVisibility"},"PayloadInputArtifact":{"properties":{"input_artifact_id":{"type":"string","format":"uuid","title":"Input Artifact Id"},"metadata":{"type":"object","title":"Metadata"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["metadata","download_url"],"title":"PayloadInputArtifact"},"PayloadItem":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"input_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadInputArtifact"},"type":"object","title":"Input Artifacts"},"output_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object","title":"Output Artifacts"}},"type":"object","required":["item_id","input_artifacts","output_artifacts"],"title":"PayloadItem"},"PayloadOutputArtifact":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"data":{"$ref":"#/components/schemas/TransferUrls"},"metadata":{"$ref":"#/components/schemas/TransferUrls"}},"type":"object","required":["output_artifact_id","data","metadata"],"title":"PayloadOutputArtifact"},"RunCreationRequest":{"properties":{"application_version":{"anyOf":[{"type":"string","format":"uuid"},{"$ref":"#/components/schemas/SlugVersionRequest"}],"title":"Application Version","examples":["efbf9822-a1e5-4045-a283-dbf26e8064a9"]},"items":{"items":{"$ref":"#/components/schemas/ItemCreationRequest"},"type":"array","title":"Items"}},"type":"object","required":["application_version","items"],"title":"RunCreationRequest"},"RunCreationResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"}},"type":"object","required":["application_run_id"],"title":"RunCreationResponse"},"RunReadResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"organization_id":{"type":"string","title":"Organization Id"},"user_payload":{"anyOf":[{"$ref":"#/components/schemas/UserPayload"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/ApplicationRunStatus"},"triggered_at":{"type":"string","format":"date-time","title":"Triggered At"},"triggered_by":{"type":"string","title":"Triggered By"}},"type":"object","required":["application_run_id","application_version_id","organization_id","status","triggered_at","triggered_by"],"title":"RunReadResponse"},"SlugVersionRequest":{"properties":{"application_slug":{"type":"string","pattern":"^[a-z](-?[a-z])*$","title":"Application Slug"},"version":{"type":"string","title":"Version"}},"type":"object","required":["application_slug","version"],"title":"SlugVersionRequest"},"TransferUrls":{"properties":{"upload_url":{"type":"string","minLength":1,"format":"uri","title":"Upload Url"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["upload_url","download_url"],"title":"TransferUrls"},"UserPayload":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"global_output_artifacts":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object"},{"type":"null"}],"title":"Global Output Artifacts"},"items":{"items":{"$ref":"#/components/schemas/PayloadItem"},"type":"array","title":"Items"}},"type":"object","required":["application_id","application_run_id","global_output_artifacts","items"],"title":"UserPayload"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionCreationRequest":{"properties":{"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"type":"string","format":"uuid","title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactSchemaCreationRequest"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactSchemaCreationRequest"},"type":"array","title":"Output Artifacts"}},"type":"object","required":["version","application_id","flow_id","changelog","input_artifacts","output_artifacts"],"title":"VersionCreationRequest"},"VersionCreationResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"}},"type":"object","required":["application_version_id"],"title":"VersionCreationResponse"},"VersionReadResponse":{"properties":{"application_version_id":{"type":"string","format":"uuid","title":"Application Version Id"},"version":{"type":"string","title":"Version"},"application_id":{"type":"string","format":"uuid","title":"Application Id"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id"},"changelog":{"type":"string","title":"Changelog"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifact"},"type":"array","title":"Input Artifacts"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifact"},"type":"array","title":"Output Artifacts"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["application_version_id","version","application_id","changelog","input_artifacts","output_artifacts","created_at"],"title":"VersionReadResponse"}}}} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"Aignostics Platform API reference","description":"\nPagination is done via `page` and `page_size`. Sorting via `sort` query parameter.\nThe `sort` query parameter can be provided multiple times. The sorting direction can be indicated via\n`+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`.","version":"1.0.0"},"servers":[{"url":"/api"}],"paths":{"/v1/applications":{"get":{"tags":["Public"],"summary":"List Applications","description":"Returns the list of the applications, available to the caller.\n\nThe application is available if any of the version of the application is assigned to the\nuser organization. To switch between organizations, the user should re-login and choose the\nneeded organization.","operationId":"list_applications_v1_applications_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationReadResponse"},"title":"Response List Applications V1 Applications Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/applications/{application_id}/versions":{"get":{"tags":["Public"],"summary":"List Versions By Application Id","description":"Returns the list of the application versions for this application, available to the caller.\n\nThe application version is available if it is assigned to the user's organization.\n\nThe application versions are assigned to the organization by the Aignostics admin. To\nassign or unassign a version from your organization, please contact Aignostics support team.","operationId":"list_versions_by_application_id_v1_applications__application_id__versions_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","title":"Application Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApplicationVersionReadResponse"},"title":"Response List Versions By Application Id V1 Applications Application Id Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs":{"get":{"tags":["Public"],"summary":"List Application Runs","description":"The endpoint returns the application runs triggered by the caller. After the application run\nis created by POST /v1/runs, it becomes available for the current endpoint","operationId":"list_application_runs_v1_runs_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional application ID filter","title":"Application Id"},"description":"Optional application ID filter"},{"name":"application_version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional application version filter","title":"Application Version"},"description":"Optional application version filter"},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"description":"Request optional output values. Used internally by the platform","title":"Include"},"description":"Request optional output values. Used internally by the platform"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RunReadResponse"},"title":"Response List Application Runs V1 Runs Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Public"],"summary":"Create Application Run","description":"The endpoint is used to process the input items by the chosen application version. The endpoint\nreturns the `application_run_id`. The processing fo the items is done asynchronously.\n\nTo check the status or cancel the execution, use the /v1/runs/{application_run_id} endpoint.\n\n### Payload\n\nThe payload includes `application_version_id` and `items` base fields.\n\n`application_version_id` is the id used for `/v1/versions/{application_id}` endpoint.\n\n`items` includes the list of the items to process (slides, in case of HETA application).\nEvery item has a set of standard fields defined by the API, plus the metadata, specific to the\nchosen application.\n\nExample payload structure with the comments:\n```\n{\n application_version_id: \"heta:v1.0.0\",\n items: [{\n \"reference\": \"slide_1\" <-- Input ID to connect the input and the output artifact\n \"input_artifacts\": [{\n \"name\": \"input_slide\" <-- Name of the artifact defined by the application (For HETA it is\"input_slide\")\n \"download_url\": \"https://...\" <-- signed URL to the input file in the S3 or GCS. Should be valid for more than 6 days\n \"metadata\": { <-- The metadata fields defined by the application. (The example fields set for a slide files are provided)\n \"checksum_crc32c\": \"abc12==\",\n \"mime_type\": \"image/tiff\",\n \"height\": 100,\n \"weight\": 500,\n \"mpp\": 0.543\n }\n }]\n }]\n}\n```\n\n### Response\n\nThe endpoint returns the application run UUID. After that the job is scheduled for the\nexecution in the background.\n\nTo check the status of the run call `v1/runs/{application_run_id}`.\n\n### Rejection\n\nApart from the authentication, authorization and malformed input error, the request can be\nrejected when the quota limit is exceeded. More details on quotas is described in the\ndocumentation","operationId":"create_application_run_v1_runs_post","security":[{"OAuth2AuthorizationCodeBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunCreationResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}":{"get":{"tags":["Public"],"summary":"Get Run","description":"Returns the details of the application run. The application run is available as soon as it is\ncreated via `POST /runs/` endpoint. To download the items results, call\n`/runs/{application_run_id}/results`.\n\nThe application is only available to the user who triggered it, regardless of the role.","operationId":"get_run_v1_runs__application_run_id__get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"Application run id, returned by `POST /runs/` endpoint","title":"Application Run Id"},"description":"Application run id, returned by `POST /runs/` endpoint"},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"type":"array","prefixItems":[{"type":"string"}],"minItems":1,"maxItems":1},{"type":"null"}],"title":"Include"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunReadResponse"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/cancel":{"post":{"tags":["Public"],"summary":"Cancel Application Run","description":"The application run can be canceled by the user who created the application run.\n\nThe execution can be canceled any time while the application is not in a final state. The\npending items will not be processed and will not add to the cost.\n\nWhen the application is canceled, the already completed items stay available for download.","operationId":"cancel_application_run_v1_runs__application_run_id__cancel_post","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"Application run id, returned by `POST /runs/` endpoint","title":"Application Run Id"},"description":"Application run id, returned by `POST /runs/` endpoint"}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/runs/{application_run_id}/results":{"get":{"tags":["Public"],"summary":"List Run Results","description":"Get the list of the results for the run items","operationId":"list_run_results_v1_runs__application_run_id__results_get","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"Application run id, returned by `POST /runs/` endpoint","title":"Application Run Id"},"description":"Application run id, returned by `POST /runs/` endpoint"},{"name":"item_id__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"description":"Filter for items ids","title":"Item Id In"},"description":"Filter for items ids"},{"name":"reference__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter for items by their reference from the input payload","title":"Reference In"},"description":"Filter for items by their reference from the input payload"},{"name":"status__in","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ItemStatus"}},{"type":"null"}],"description":"Filter for items in certain statuses","title":"Status In"},"description":"Filter for items in certain statuses"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":50,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ItemResultReadResponse"},"title":"Response List Run Results V1 Runs Application Run Id Results Get"}}}},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Public"],"summary":"Delete Application Run Results","description":"Delete the application run results. It can only be called when the application is in a final\nstate (meaning it's not in `received` or `pending` states). To delete the results of the running\nartifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel the application run.\n\nThe output results are deleted automatically 30 days after the application run is finished.","operationId":"delete_application_run_results_v1_runs__application_run_id__results_delete","security":[{"OAuth2AuthorizationCodeBearer":[]}],"parameters":[{"name":"application_run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"Application run id, returned by `POST /runs/` endpoint","title":"Application Run Id"},"description":"Application run id, returned by `POST /runs/` endpoint"}],"responses":{"204":{"description":"Successful Response"},"404":{"description":"Application run not found"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ApplicationReadResponse":{"properties":{"application_id":{"type":"string","title":"Application Id","description":"Application ID","examples":["h-e-tme"]},"name":{"type":"string","title":"Name","description":"Application display name","examples":["HETA"]},"regulatory_classes":{"items":{"type":"string"},"type":"array","title":"Regulatory Classes","description":"Regulatory class, to which the applications compliance","examples":[["RuO"]]},"description":{"type":"string","title":"Description","description":"Application documentations"}},"type":"object","required":["application_id","name","regulatory_classes","description"],"title":"ApplicationReadResponse"},"ApplicationRunStatus":{"type":"string","enum":["canceled_system","canceled_user","completed","completed_with_error","received","rejected","running","scheduled"],"title":"ApplicationRunStatus"},"ApplicationVersionReadResponse":{"properties":{"application_version_id":{"type":"string","title":"Application Version Id","description":"Application version ID","examples":["h-e-tme:v0.0.1"]},"version":{"type":"string","title":"Version","description":"Semantic version of the application"},"application_id":{"type":"string","title":"Application Id","description":"Application ID"},"flow_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Flow Id","description":"Flow ID, used internally by the platform"},"changelog":{"type":"string","title":"Changelog","description":"Description of the changes relative to the previous version"},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactReadResponse"},"type":"array","title":"Input Artifacts","description":"List of the input fields, provided by the User"},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactReadResponse"},"type":"array","title":"Output Artifacts","description":"List of the output fields, generated by the application"}},"type":"object","required":["application_version_id","version","application_id","changelog","input_artifacts","output_artifacts"],"title":"ApplicationVersionReadResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InputArtifactCreationRequest":{"properties":{"name":{"type":"string","title":"Name","description":"The artifact name according to the application version. List of required artifacts is returned by `/v1/versions/{application_version_id}`. The artifact names are located in the `input_artifacts.[].name` value","examples":["slide"]},"download_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Download Url","description":"[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) to the input artifact file. The URL should be valid for at least 6 days from the payload submission time.","examples":["https://example.com/case-no-1-slide.tiff"]},"metadata":{"type":"object","title":"Metadata","description":"The metadata of the artifact, required by the application version. The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. The schema is located in `input_artifacts.[].metadata_schema`","examples":[{"checksum_crc32c":"752f9554","height":2000,"height_mpp":0.5,"width":10000,"width_mpp":0.5}]}},"type":"object","required":["name","download_url","metadata"],"title":"InputArtifactCreationRequest"},"InputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","examples":["image/tiff"]},"metadata_schema":{"type":"object","title":"Metadata Schema"}},"type":"object","required":["name","mime_type","metadata_schema"],"title":"InputArtifactReadResponse"},"ItemCreationRequest":{"properties":{"reference":{"type":"string","title":"Reference","description":"The ID of the slide provided by the caller. The reference should be unique across all items of the application run","examples":["case-no-1"]},"input_artifacts":{"items":{"$ref":"#/components/schemas/InputArtifactCreationRequest"},"type":"array","title":"Input Artifacts","description":"All the input files of the item, required by the application version"}},"type":"object","required":["reference","input_artifacts"],"title":"ItemCreationRequest"},"ItemResultReadResponse":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id","description":"Item UUID generated by the Platform"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id","description":"Application run UUID to which the item belongs"},"reference":{"type":"string","title":"Reference","description":"The reference of the item from the user payload"},"status":{"$ref":"#/components/schemas/ItemStatus","description":"\nWhen the item is not processed yet, the status is set to `pending`.\n\nWhen the item is successfully finished, status is set to `succeeded`, and the processing results\nbecome available for download in `output_artifacts` field.\n\nWhen the item processing is failed because the provided item is invalid, the status is set to\n`error_user`. When the item processing failed because of the error in the model or platform,\nthe status is set to `error_system`. When the application_run is canceled, the status of all\npending items is set to either `cancelled_user` or `cancelled_system`.\n "},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"\nThe error message in case the item is in `error_system` or `error_user` state\n "},"output_artifacts":{"items":{"$ref":"#/components/schemas/OutputArtifactResultReadResponse"},"type":"array","title":"Output Artifacts","description":"\nThe list of the results generated by the application algorithm. The number of files and their\ntypes depend on the particular application version, call `/v1/versions/{version_id}` to get\nthe details.\n "}},"type":"object","required":["item_id","application_run_id","reference","status","error","output_artifacts"],"title":"ItemResultReadResponse"},"ItemStatus":{"type":"string","enum":["pending","canceled_user","canceled_system","error_user","error_system","succeeded"],"title":"ItemStatus"},"OutputArtifactReadResponse":{"properties":{"name":{"type":"string","title":"Name"},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","examples":["application/vnd.apache.parquet"]},"metadata_schema":{"type":"object","title":"Metadata Schema"},"scope":{"$ref":"#/components/schemas/OutputArtifactScope"}},"type":"object","required":["name","mime_type","metadata_schema","scope"],"title":"OutputArtifactReadResponse"},"OutputArtifactResultReadResponse":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id","description":"The Id of the artifact. Used internally"},"name":{"type":"string","title":"Name","description":"\nName of the output from the output schema from the `/v1/versions/{version_id}` endpoint.\n "},"mime_type":{"type":"string","pattern":"^\\w+\\/\\w+[-+.|\\w+]+\\w+$","title":"Mime Type","description":"The mime type of the output file","examples":["application/vnd.apache.parquet"]},"metadata":{"type":"object","title":"Metadata","description":"The metadata of the output artifact, provided by the application"},"download_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Download Url","description":"\nThe download URL to the output file. The URL is valid for 1 hour after the endpoint is called.\nA new URL is generated every time the endpoint is called.\n "}},"type":"object","required":["output_artifact_id","name","mime_type","metadata","download_url"],"title":"OutputArtifactResultReadResponse"},"OutputArtifactScope":{"type":"string","enum":["item","global"],"title":"OutputArtifactScope"},"PayloadInputArtifact":{"properties":{"input_artifact_id":{"type":"string","format":"uuid","title":"Input Artifact Id"},"metadata":{"type":"object","title":"Metadata"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["metadata","download_url"],"title":"PayloadInputArtifact"},"PayloadItem":{"properties":{"item_id":{"type":"string","format":"uuid","title":"Item Id"},"input_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadInputArtifact"},"type":"object","title":"Input Artifacts"},"output_artifacts":{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object","title":"Output Artifacts"}},"type":"object","required":["item_id","input_artifacts","output_artifacts"],"title":"PayloadItem"},"PayloadOutputArtifact":{"properties":{"output_artifact_id":{"type":"string","format":"uuid","title":"Output Artifact Id"},"data":{"$ref":"#/components/schemas/TransferUrls"},"metadata":{"$ref":"#/components/schemas/TransferUrls"}},"type":"object","required":["output_artifact_id","data","metadata"],"title":"PayloadOutputArtifact"},"RunCreationRequest":{"properties":{"application_version_id":{"type":"string","title":"Application Version Id","description":"Application version ID","examples":["h-e-tme:v1.2.3"]},"items":{"items":{"$ref":"#/components/schemas/ItemCreationRequest"},"type":"array","title":"Items","description":"List of the items to process by the application"}},"type":"object","required":["application_version_id","items"],"title":"RunCreationRequest","description":"Application run payload. It describes which application version is chosen, and which user data\nshould be processed."},"RunCreationResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id","default":"Application run id"}},"type":"object","title":"RunCreationResponse"},"RunReadResponse":{"properties":{"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id","description":"UUID of the application"},"application_version_id":{"type":"string","title":"Application Version Id","description":"ID of the application version"},"organization_id":{"type":"string","title":"Organization Id","description":"Organization of the owner of the application run"},"user_payload":{"anyOf":[{"$ref":"#/components/schemas/UserPayload"},{"type":"null"}],"description":"Field used internally by the Platform"},"status":{"$ref":"#/components/schemas/ApplicationRunStatus","description":"\nWhen the application run request is received by the Platform, the `status` of it is set to\n`received`. Then it is transitioned to `scheduled`, when it is scheduled for the processing.\nWhen the application run is scheduled, it will process the input items and generate the result\nincrementally. As soon as the first result is generated, the state is changed to `running`.\nThe results can be downloaded via `/v1/runs/{run_id}/results` endpoint.\nWhen all items are processed and all results are generated, the application status is set to\n`completed`. If the processing is done, but some items fail, the status is set to\n`completed_with_error`.\n\nWhen the application run request is rejected by the Platform before scheduling, it is transferred\nto `rejected`. When the application run reaches the threshold of number of failed items, the whole\napplication run is set to `canceled_system` and the remaining pending items are not processed.\nWhen the application run fails, the finished item results are available for download.\n\nIf the application run is canceled by calling `POST /v1/runs/{run_id}/cancel` endpoint, the\nprocessing of the items is stopped, and the application status is set to `cancelled_user`\n "},"triggered_at":{"type":"string","format":"date-time","title":"Triggered At","description":"Timestamp showing when the application run was triggered"},"triggered_by":{"type":"string","title":"Triggered By","description":"Id of the user who triggered the application run"}},"type":"object","required":["application_run_id","application_version_id","organization_id","status","triggered_at","triggered_by"],"title":"RunReadResponse"},"TransferUrls":{"properties":{"upload_url":{"type":"string","minLength":1,"format":"uri","title":"Upload Url"},"download_url":{"type":"string","minLength":1,"format":"uri","title":"Download Url"}},"type":"object","required":["upload_url","download_url"],"title":"TransferUrls"},"UserPayload":{"properties":{"application_id":{"type":"string","title":"Application Id"},"application_run_id":{"type":"string","format":"uuid","title":"Application Run Id"},"global_output_artifacts":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/PayloadOutputArtifact"},"type":"object"},{"type":"null"}],"title":"Global Output Artifacts"},"items":{"items":{"$ref":"#/components/schemas/PayloadItem"},"type":"array","title":"Items"}},"type":"object","required":["application_id","application_run_id","global_output_artifacts","items"],"title":"UserPayload"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"OAuth2AuthorizationCodeBearer":{"type":"oauth2","flows":{"authorizationCode":{"scopes":{},"authorizationUrl":"https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize","tokenUrl":"https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token"}}}}}} \ No newline at end of file diff --git a/codegen/out/.openapi-generator/FILES b/codegen/out/.openapi-generator/FILES index b31b9c51..912a04c6 100644 --- a/codegen/out/.openapi-generator/FILES +++ b/codegen/out/.openapi-generator/FILES @@ -1,39 +1,29 @@ -aignx/codegen/api/externals_api.py +aignx/codegen/api/public_api.py aignx/codegen/api_client.py aignx/codegen/api_response.py aignx/codegen/configuration.py aignx/codegen/exceptions.py aignx/codegen/models/application_read_response.py aignx/codegen/models/application_run_status.py -aignx/codegen/models/application_version.py aignx/codegen/models/application_version_read_response.py aignx/codegen/models/http_validation_error.py -aignx/codegen/models/input_artifact.py aignx/codegen/models/input_artifact_creation_request.py aignx/codegen/models/input_artifact_read_response.py -aignx/codegen/models/input_artifact_schema_creation_request.py aignx/codegen/models/item_creation_request.py aignx/codegen/models/item_result_read_response.py aignx/codegen/models/item_status.py -aignx/codegen/models/output_artifact.py aignx/codegen/models/output_artifact_read_response.py aignx/codegen/models/output_artifact_result_read_response.py -aignx/codegen/models/output_artifact_schema_creation_request.py aignx/codegen/models/output_artifact_scope.py -aignx/codegen/models/output_artifact_visibility.py aignx/codegen/models/payload_input_artifact.py aignx/codegen/models/payload_item.py aignx/codegen/models/payload_output_artifact.py aignx/codegen/models/run_creation_request.py aignx/codegen/models/run_creation_response.py aignx/codegen/models/run_read_response.py -aignx/codegen/models/slug_version_request.py aignx/codegen/models/transfer_urls.py aignx/codegen/models/user_payload.py aignx/codegen/models/validation_error.py aignx/codegen/models/validation_error_loc_inner.py -aignx/codegen/models/version_creation_request.py -aignx/codegen/models/version_creation_response.py -aignx/codegen/models/version_read_response.py aignx/codegen/rest.py -docs/ExternalsApi.md +docs/PublicApi.md diff --git a/codegen/out/aignx/codegen/api/externals_api.py b/codegen/out/aignx/codegen/api/public_api.py similarity index 64% rename from codegen/out/aignx/codegen/api/externals_api.py rename to codegen/out/aignx/codegen/api/public_api.py index 4a9069a1..b8e46286 100644 --- a/codegen/out/aignx/codegen/api/externals_api.py +++ b/codegen/out/aignx/codegen/api/public_api.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -16,7 +15,7 @@ from typing import Any, Dict, List, Optional, Tuple, Union from typing_extensions import Annotated -from pydantic import Field, StrictStr, field_validator +from pydantic import Field, StrictStr from typing import Any, List, Optional from typing_extensions import Annotated from aignx.codegen.models.application_read_response import ApplicationReadResponse @@ -26,16 +25,13 @@ from aignx.codegen.models.run_creation_request import RunCreationRequest from aignx.codegen.models.run_creation_response import RunCreationResponse from aignx.codegen.models.run_read_response import RunReadResponse -from aignx.codegen.models.version_creation_request import VersionCreationRequest -from aignx.codegen.models.version_creation_response import VersionCreationResponse -from aignx.codegen.models.version_read_response import VersionReadResponse from aignx.codegen.api_client import ApiClient, RequestSerialized from aignx.codegen.api_response import ApiResponse from aignx.codegen.rest import RESTResponseType -class ExternalsApi: +class PublicApi: """NOTE: This class is auto generated by OpenAPI Generator Ref: https://openapi-generator.tech @@ -49,9 +45,9 @@ def __init__(self, api_client=None) -> None: @validate_call - def cancel_run_v1_runs_application_run_id_cancel_post( + def cancel_application_run_v1_runs_application_run_id_cancel_post( self, - application_run_id: StrictStr, + application_run_id: Annotated[StrictStr, Field(description="Application run id, returned by `POST /runs/` endpoint")], _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -65,10 +61,11 @@ def cancel_run_v1_runs_application_run_id_cancel_post( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> object: - """Cancel Run + """Cancel Application Run + The application run can be canceled by the user who created the application run. The execution can be canceled any time while the application is not in a final state. The pending items will not be processed and will not add to the cost. When the application is canceled, the already completed items stay available for download. - :param application_run_id: (required) + :param application_run_id: Application run id, returned by `POST /runs/` endpoint (required) :type application_run_id: str :param _request_timeout: timeout setting for this request. If one number provided, it will be total request @@ -92,7 +89,7 @@ def cancel_run_v1_runs_application_run_id_cancel_post( :return: Returns the result object. """ # noqa: E501 - _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( + _param = self._cancel_application_run_v1_runs_application_run_id_cancel_post_serialize( application_run_id=application_run_id, _request_auth=_request_auth, _content_type=_content_type, @@ -117,9 +114,9 @@ def cancel_run_v1_runs_application_run_id_cancel_post( @validate_call - def cancel_run_v1_runs_application_run_id_cancel_post_with_http_info( + def cancel_application_run_v1_runs_application_run_id_cancel_post_with_http_info( self, - application_run_id: StrictStr, + application_run_id: Annotated[StrictStr, Field(description="Application run id, returned by `POST /runs/` endpoint")], _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -133,10 +130,11 @@ def cancel_run_v1_runs_application_run_id_cancel_post_with_http_info( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[object]: - """Cancel Run + """Cancel Application Run + The application run can be canceled by the user who created the application run. The execution can be canceled any time while the application is not in a final state. The pending items will not be processed and will not add to the cost. When the application is canceled, the already completed items stay available for download. - :param application_run_id: (required) + :param application_run_id: Application run id, returned by `POST /runs/` endpoint (required) :type application_run_id: str :param _request_timeout: timeout setting for this request. If one number provided, it will be total request @@ -160,7 +158,7 @@ def cancel_run_v1_runs_application_run_id_cancel_post_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( + _param = self._cancel_application_run_v1_runs_application_run_id_cancel_post_serialize( application_run_id=application_run_id, _request_auth=_request_auth, _content_type=_content_type, @@ -185,9 +183,9 @@ def cancel_run_v1_runs_application_run_id_cancel_post_with_http_info( @validate_call - def cancel_run_v1_runs_application_run_id_cancel_post_without_preload_content( + def cancel_application_run_v1_runs_application_run_id_cancel_post_without_preload_content( self, - application_run_id: StrictStr, + application_run_id: Annotated[StrictStr, Field(description="Application run id, returned by `POST /runs/` endpoint")], _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -201,10 +199,11 @@ def cancel_run_v1_runs_application_run_id_cancel_post_without_preload_content( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """Cancel Run + """Cancel Application Run + The application run can be canceled by the user who created the application run. The execution can be canceled any time while the application is not in a final state. The pending items will not be processed and will not add to the cost. When the application is canceled, the already completed items stay available for download. - :param application_run_id: (required) + :param application_run_id: Application run id, returned by `POST /runs/` endpoint (required) :type application_run_id: str :param _request_timeout: timeout setting for this request. If one number provided, it will be total request @@ -228,7 +227,7 @@ def cancel_run_v1_runs_application_run_id_cancel_post_without_preload_content( :return: Returns the result object. """ # noqa: E501 - _param = self._cancel_run_v1_runs_application_run_id_cancel_post_serialize( + _param = self._cancel_application_run_v1_runs_application_run_id_cancel_post_serialize( application_run_id=application_run_id, _request_auth=_request_auth, _content_type=_content_type, @@ -248,7 +247,7 @@ def cancel_run_v1_runs_application_run_id_cancel_post_without_preload_content( return response_data.response - def _cancel_run_v1_runs_application_run_id_cancel_post_serialize( + def _cancel_application_run_v1_runs_application_run_id_cancel_post_serialize( self, application_run_id, _request_auth, @@ -291,6 +290,7 @@ def _cancel_run_v1_runs_application_run_id_cancel_post_serialize( # authentication setting _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( @@ -330,6 +330,7 @@ def create_application_run_v1_runs_post( ) -> RunCreationResponse: """Create Application Run + The endpoint is used to process the input items by the chosen application version. The endpoint returns the `application_run_id`. The processing fo the items is done asynchronously. To check the status or cancel the execution, use the /v1/runs/{application_run_id} endpoint. ### Payload The payload includes `application_version_id` and `items` base fields. `application_version_id` is the id used for `/v1/versions/{application_id}` endpoint. `items` includes the list of the items to process (slides, in case of HETA application). Every item has a set of standard fields defined by the API, plus the metadata, specific to the chosen application. Example payload structure with the comments: ``` { application_version_id: \"heta:v1.0.0\", items: [{ \"reference\": \"slide_1\" <-- Input ID to connect the input and the output artifact \"input_artifacts\": [{ \"name\": \"input_slide\" <-- Name of the artifact defined by the application (For HETA it is\"input_slide\") \"download_url\": \"https://...\" <-- signed URL to the input file in the S3 or GCS. Should be valid for more than 6 days \"metadata\": { <-- The metadata fields defined by the application. (The example fields set for a slide files are provided) \"checksum_crc32c\": \"abc12==\", \"mime_type\": \"image/tiff\", \"height\": 100, \"weight\": 500, \"mpp\": 0.543 } }] }] } ``` ### Response The endpoint returns the application run UUID. After that the job is scheduled for the execution in the background. To check the status of the run call `v1/runs/{application_run_id}`. ### Rejection Apart from the authentication, authorization and malformed input error, the request can be rejected when the quota limit is exceeded. More details on quotas is described in the documentation :param run_creation_request: (required) :type run_creation_request: RunCreationRequest @@ -398,6 +399,7 @@ def create_application_run_v1_runs_post_with_http_info( ) -> ApiResponse[RunCreationResponse]: """Create Application Run + The endpoint is used to process the input items by the chosen application version. The endpoint returns the `application_run_id`. The processing fo the items is done asynchronously. To check the status or cancel the execution, use the /v1/runs/{application_run_id} endpoint. ### Payload The payload includes `application_version_id` and `items` base fields. `application_version_id` is the id used for `/v1/versions/{application_id}` endpoint. `items` includes the list of the items to process (slides, in case of HETA application). Every item has a set of standard fields defined by the API, plus the metadata, specific to the chosen application. Example payload structure with the comments: ``` { application_version_id: \"heta:v1.0.0\", items: [{ \"reference\": \"slide_1\" <-- Input ID to connect the input and the output artifact \"input_artifacts\": [{ \"name\": \"input_slide\" <-- Name of the artifact defined by the application (For HETA it is\"input_slide\") \"download_url\": \"https://...\" <-- signed URL to the input file in the S3 or GCS. Should be valid for more than 6 days \"metadata\": { <-- The metadata fields defined by the application. (The example fields set for a slide files are provided) \"checksum_crc32c\": \"abc12==\", \"mime_type\": \"image/tiff\", \"height\": 100, \"weight\": 500, \"mpp\": 0.543 } }] }] } ``` ### Response The endpoint returns the application run UUID. After that the job is scheduled for the execution in the background. To check the status of the run call `v1/runs/{application_run_id}`. ### Rejection Apart from the authentication, authorization and malformed input error, the request can be rejected when the quota limit is exceeded. More details on quotas is described in the documentation :param run_creation_request: (required) :type run_creation_request: RunCreationRequest @@ -466,6 +468,7 @@ def create_application_run_v1_runs_post_without_preload_content( ) -> RESTResponseType: """Create Application Run + The endpoint is used to process the input items by the chosen application version. The endpoint returns the `application_run_id`. The processing fo the items is done asynchronously. To check the status or cancel the execution, use the /v1/runs/{application_run_id} endpoint. ### Payload The payload includes `application_version_id` and `items` base fields. `application_version_id` is the id used for `/v1/versions/{application_id}` endpoint. `items` includes the list of the items to process (slides, in case of HETA application). Every item has a set of standard fields defined by the API, plus the metadata, specific to the chosen application. Example payload structure with the comments: ``` { application_version_id: \"heta:v1.0.0\", items: [{ \"reference\": \"slide_1\" <-- Input ID to connect the input and the output artifact \"input_artifacts\": [{ \"name\": \"input_slide\" <-- Name of the artifact defined by the application (For HETA it is\"input_slide\") \"download_url\": \"https://...\" <-- signed URL to the input file in the S3 or GCS. Should be valid for more than 6 days \"metadata\": { <-- The metadata fields defined by the application. (The example fields set for a slide files are provided) \"checksum_crc32c\": \"abc12==\", \"mime_type\": \"image/tiff\", \"height\": 100, \"weight\": 500, \"mpp\": 0.543 } }] }] } ``` ### Response The endpoint returns the application run UUID. After that the job is scheduled for the execution in the background. To check the status of the run call `v1/runs/{application_run_id}`. ### Rejection Apart from the authentication, authorization and malformed input error, the request can be rejected when the quota limit is exceeded. More details on quotas is described in the documentation :param run_creation_request: (required) :type run_creation_request: RunCreationRequest @@ -567,6 +570,7 @@ def _create_application_run_v1_runs_post_serialize( # authentication setting _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( @@ -588,9 +592,9 @@ def _create_application_run_v1_runs_post_serialize( @validate_call - def delete_run_results_v1_runs_application_run_id_results_delete( + def delete_application_run_results_v1_runs_application_run_id_results_delete( self, - application_run_id: StrictStr, + application_run_id: Annotated[StrictStr, Field(description="Application run id, returned by `POST /runs/` endpoint")], _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -604,10 +608,11 @@ def delete_run_results_v1_runs_application_run_id_results_delete( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> None: - """Delete Run Results + """Delete Application Run Results + Delete the application run results. It can only be called when the application is in a final state (meaning it's not in `received` or `pending` states). To delete the results of the running artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel the application run. The output results are deleted automatically 30 days after the application run is finished. - :param application_run_id: (required) + :param application_run_id: Application run id, returned by `POST /runs/` endpoint (required) :type application_run_id: str :param _request_timeout: timeout setting for this request. If one number provided, it will be total request @@ -631,7 +636,7 @@ def delete_run_results_v1_runs_application_run_id_results_delete( :return: Returns the result object. """ # noqa: E501 - _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + _param = self._delete_application_run_results_v1_runs_application_run_id_results_delete_serialize( application_run_id=application_run_id, _request_auth=_request_auth, _content_type=_content_type, @@ -656,9 +661,9 @@ def delete_run_results_v1_runs_application_run_id_results_delete( @validate_call - def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( + def delete_application_run_results_v1_runs_application_run_id_results_delete_with_http_info( self, - application_run_id: StrictStr, + application_run_id: Annotated[StrictStr, Field(description="Application run id, returned by `POST /runs/` endpoint")], _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -672,10 +677,11 @@ def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> ApiResponse[None]: - """Delete Run Results + """Delete Application Run Results + Delete the application run results. It can only be called when the application is in a final state (meaning it's not in `received` or `pending` states). To delete the results of the running artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel the application run. The output results are deleted automatically 30 days after the application run is finished. - :param application_run_id: (required) + :param application_run_id: Application run id, returned by `POST /runs/` endpoint (required) :type application_run_id: str :param _request_timeout: timeout setting for this request. If one number provided, it will be total request @@ -699,7 +705,7 @@ def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + _param = self._delete_application_run_results_v1_runs_application_run_id_results_delete_serialize( application_run_id=application_run_id, _request_auth=_request_auth, _content_type=_content_type, @@ -724,9 +730,9 @@ def delete_run_results_v1_runs_application_run_id_results_delete_with_http_info( @validate_call - def delete_run_results_v1_runs_application_run_id_results_delete_without_preload_content( + def delete_application_run_results_v1_runs_application_run_id_results_delete_without_preload_content( self, - application_run_id: StrictStr, + application_run_id: Annotated[StrictStr, Field(description="Application run id, returned by `POST /runs/` endpoint")], _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -740,10 +746,11 @@ def delete_run_results_v1_runs_application_run_id_results_delete_without_preload _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """Delete Run Results + """Delete Application Run Results + Delete the application run results. It can only be called when the application is in a final state (meaning it's not in `received` or `pending` states). To delete the results of the running artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel the application run. The output results are deleted automatically 30 days after the application run is finished. - :param application_run_id: (required) + :param application_run_id: Application run id, returned by `POST /runs/` endpoint (required) :type application_run_id: str :param _request_timeout: timeout setting for this request. If one number provided, it will be total request @@ -767,7 +774,7 @@ def delete_run_results_v1_runs_application_run_id_results_delete_without_preload :return: Returns the result object. """ # noqa: E501 - _param = self._delete_run_results_v1_runs_application_run_id_results_delete_serialize( + _param = self._delete_application_run_results_v1_runs_application_run_id_results_delete_serialize( application_run_id=application_run_id, _request_auth=_request_auth, _content_type=_content_type, @@ -787,7 +794,7 @@ def delete_run_results_v1_runs_application_run_id_results_delete_without_preload return response_data.response - def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( + def _delete_application_run_results_v1_runs_application_run_id_results_delete_serialize( self, application_run_id, _request_auth, @@ -830,6 +837,7 @@ def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( # authentication setting _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( @@ -853,7 +861,7 @@ def _delete_run_results_v1_runs_application_run_id_results_delete_serialize( @validate_call def get_run_v1_runs_application_run_id_get( self, - application_run_id: StrictStr, + application_run_id: Annotated[StrictStr, Field(description="Application run id, returned by `POST /runs/` endpoint")], include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, _request_timeout: Union[ None, @@ -870,8 +878,9 @@ def get_run_v1_runs_application_run_id_get( ) -> RunReadResponse: """Get Run + Returns the details of the application run. The application run is available as soon as it is created via `POST /runs/` endpoint. To download the items results, call `/runs/{application_run_id}/results`. The application is only available to the user who triggered it, regardless of the role. - :param application_run_id: (required) + :param application_run_id: Application run id, returned by `POST /runs/` endpoint (required) :type application_run_id: str :param include: :type include: List[object] @@ -925,7 +934,7 @@ def get_run_v1_runs_application_run_id_get( @validate_call def get_run_v1_runs_application_run_id_get_with_http_info( self, - application_run_id: StrictStr, + application_run_id: Annotated[StrictStr, Field(description="Application run id, returned by `POST /runs/` endpoint")], include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, _request_timeout: Union[ None, @@ -942,8 +951,9 @@ def get_run_v1_runs_application_run_id_get_with_http_info( ) -> ApiResponse[RunReadResponse]: """Get Run + Returns the details of the application run. The application run is available as soon as it is created via `POST /runs/` endpoint. To download the items results, call `/runs/{application_run_id}/results`. The application is only available to the user who triggered it, regardless of the role. - :param application_run_id: (required) + :param application_run_id: Application run id, returned by `POST /runs/` endpoint (required) :type application_run_id: str :param include: :type include: List[object] @@ -997,7 +1007,7 @@ def get_run_v1_runs_application_run_id_get_with_http_info( @validate_call def get_run_v1_runs_application_run_id_get_without_preload_content( self, - application_run_id: StrictStr, + application_run_id: Annotated[StrictStr, Field(description="Application run id, returned by `POST /runs/` endpoint")], include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, _request_timeout: Union[ None, @@ -1014,8 +1024,9 @@ def get_run_v1_runs_application_run_id_get_without_preload_content( ) -> RESTResponseType: """Get Run + Returns the details of the application run. The application run is available as soon as it is created via `POST /runs/` endpoint. To download the items results, call `/runs/{application_run_id}/results`. The application is only available to the user who triggered it, regardless of the role. - :param application_run_id: (required) + :param application_run_id: Application run id, returned by `POST /runs/` endpoint (required) :type application_run_id: str :param include: :type include: List[object] @@ -1111,6 +1122,7 @@ def _get_run_v1_runs_application_run_id_get_serialize( # authentication setting _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( @@ -1132,10 +1144,14 @@ def _get_run_v1_runs_application_run_id_get_serialize( @validate_call - def get_version_v1_versions_application_version_id_get( + def list_application_runs_v1_runs_get( self, - application_version_id: StrictStr, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + application_id: Annotated[Optional[StrictStr], Field(description="Optional application ID filter")] = None, + application_version: Annotated[Optional[StrictStr], Field(description="Optional application version filter")] = None, + include: Annotated[Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]], Field(description="Request optional output values. Used internally by the platform")] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -1148,14 +1164,23 @@ def get_version_v1_versions_application_version_id_get( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> VersionReadResponse: - """Get Version + ) -> List[RunReadResponse]: + """List Application Runs + The endpoint returns the application runs triggered by the caller. After the application run is created by POST /v1/runs, it becomes available for the current endpoint - :param application_version_id: (required) - :type application_version_id: str - :param include: + :param application_id: Optional application ID filter + :type application_id: str + :param application_version: Optional application version filter + :type application_version: str + :param include: Request optional output values. Used internally by the platform :type include: List[object] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -1178,9 +1203,13 @@ def get_version_v1_versions_application_version_id_get( :return: Returns the result object. """ # noqa: E501 - _param = self._get_version_v1_versions_application_version_id_get_serialize( - application_version_id=application_version_id, + _param = self._list_application_runs_v1_runs_get_serialize( + application_id=application_id, + application_version=application_version, include=include, + page=page, + page_size=page_size, + sort=sort, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -1188,7 +1217,8 @@ def get_version_v1_versions_application_version_id_get( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "VersionReadResponse", + '200': "List[RunReadResponse]", + '404': None, '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -1203,10 +1233,14 @@ def get_version_v1_versions_application_version_id_get( @validate_call - def get_version_v1_versions_application_version_id_get_with_http_info( + def list_application_runs_v1_runs_get_with_http_info( self, - application_version_id: StrictStr, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + application_id: Annotated[Optional[StrictStr], Field(description="Optional application ID filter")] = None, + application_version: Annotated[Optional[StrictStr], Field(description="Optional application version filter")] = None, + include: Annotated[Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]], Field(description="Request optional output values. Used internally by the platform")] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -1219,14 +1253,23 @@ def get_version_v1_versions_application_version_id_get_with_http_info( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[VersionReadResponse]: - """Get Version + ) -> ApiResponse[List[RunReadResponse]]: + """List Application Runs + The endpoint returns the application runs triggered by the caller. After the application run is created by POST /v1/runs, it becomes available for the current endpoint - :param application_version_id: (required) - :type application_version_id: str - :param include: + :param application_id: Optional application ID filter + :type application_id: str + :param application_version: Optional application version filter + :type application_version: str + :param include: Request optional output values. Used internally by the platform :type include: List[object] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -1249,9 +1292,13 @@ def get_version_v1_versions_application_version_id_get_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._get_version_v1_versions_application_version_id_get_serialize( - application_version_id=application_version_id, + _param = self._list_application_runs_v1_runs_get_serialize( + application_id=application_id, + application_version=application_version, include=include, + page=page, + page_size=page_size, + sort=sort, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -1259,7 +1306,8 @@ def get_version_v1_versions_application_version_id_get_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "VersionReadResponse", + '200': "List[RunReadResponse]", + '404': None, '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -1274,10 +1322,14 @@ def get_version_v1_versions_application_version_id_get_with_http_info( @validate_call - def get_version_v1_versions_application_version_id_get_without_preload_content( + def list_application_runs_v1_runs_get_without_preload_content( self, - application_version_id: StrictStr, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, + application_id: Annotated[Optional[StrictStr], Field(description="Optional application ID filter")] = None, + application_version: Annotated[Optional[StrictStr], Field(description="Optional application version filter")] = None, + include: Annotated[Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]], Field(description="Request optional output values. Used internally by the platform")] = None, + page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, + page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, + sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, Annotated[StrictFloat, Field(gt=0)], @@ -1291,13 +1343,22 @@ def get_version_v1_versions_application_version_id_get_without_preload_content( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """Get Version + """List Application Runs + The endpoint returns the application runs triggered by the caller. After the application run is created by POST /v1/runs, it becomes available for the current endpoint - :param application_version_id: (required) - :type application_version_id: str - :param include: + :param application_id: Optional application ID filter + :type application_id: str + :param application_version: Optional application version filter + :type application_version: str + :param include: Request optional output values. Used internally by the platform :type include: List[object] + :param page: + :type page: int + :param page_size: + :type page_size: int + :param sort: + :type sort: List[str] :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of @@ -1320,9 +1381,13 @@ def get_version_v1_versions_application_version_id_get_without_preload_content( :return: Returns the result object. """ # noqa: E501 - _param = self._get_version_v1_versions_application_version_id_get_serialize( - application_version_id=application_version_id, + _param = self._list_application_runs_v1_runs_get_serialize( + application_id=application_id, + application_version=application_version, include=include, + page=page, + page_size=page_size, + sort=sort, _request_auth=_request_auth, _content_type=_content_type, _headers=_headers, @@ -1330,7 +1395,8 @@ def get_version_v1_versions_application_version_id_get_without_preload_content( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "VersionReadResponse", + '200': "List[RunReadResponse]", + '404': None, '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -1340,10 +1406,14 @@ def get_version_v1_versions_application_version_id_get_without_preload_content( return response_data.response - def _get_version_v1_versions_application_version_id_get_serialize( + def _list_application_runs_v1_runs_get_serialize( self, - application_version_id, + application_id, + application_version, include, + page, + page_size, + sort, _request_auth, _content_type, _headers, @@ -1354,6 +1424,7 @@ def _get_version_v1_versions_application_version_id_get_serialize( _collection_formats: Dict[str, str] = { 'include': 'multi', + 'sort': 'multi', } _path_params: Dict[str, str] = {} @@ -1366,13 +1437,31 @@ def _get_version_v1_versions_application_version_id_get_serialize( _body_params: Optional[bytes] = None # process the path parameters - if application_version_id is not None: - _path_params['application_version_id'] = application_version_id # process the query parameters + if application_id is not None: + + _query_params.append(('application_id', application_id)) + + if application_version is not None: + + _query_params.append(('application_version', application_version)) + if include is not None: _query_params.append(('include', include)) + if page is not None: + + _query_params.append(('page', page)) + + if page_size is not None: + + _query_params.append(('page_size', page_size)) + + if sort is not None: + + _query_params.append(('sort', sort)) + # process the header parameters # process the form parameters # process the body parameter @@ -1389,11 +1478,12 @@ def _get_version_v1_versions_application_version_id_get_serialize( # authentication setting _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( method='GET', - resource_path='/v1/versions/{application_version_id}', + resource_path='/v1/runs', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -1410,11 +1500,8 @@ def _get_version_v1_versions_application_version_id_get_serialize( @validate_call - def list_application_runs_v1_runs_get( + def list_applications_v1_applications_get( self, - application_id: Optional[StrictStr] = None, - application_version_id: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, sort: Optional[List[StrictStr]] = None, @@ -1430,16 +1517,11 @@ def list_application_runs_v1_runs_get( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[RunReadResponse]: - """List Application Runs + ) -> List[ApplicationReadResponse]: + """List Applications + Returns the list of the applications, available to the caller. The application is available if any of the version of the application is assigned to the user organization. To switch between organizations, the user should re-login and choose the needed organization. - :param application_id: - :type application_id: str - :param application_version_id: - :type application_version_id: str - :param include: - :type include: List[object] :param page: :type page: int :param page_size: @@ -1468,10 +1550,7 @@ def list_application_runs_v1_runs_get( :return: Returns the result object. """ # noqa: E501 - _param = self._list_application_runs_v1_runs_get_serialize( - application_id=application_id, - application_version_id=application_version_id, - include=include, + _param = self._list_applications_v1_applications_get_serialize( page=page, page_size=page_size, sort=sort, @@ -1482,8 +1561,7 @@ def list_application_runs_v1_runs_get( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[RunReadResponse]", - '404': None, + '200': "List[ApplicationReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -1498,11 +1576,8 @@ def list_application_runs_v1_runs_get( @validate_call - def list_application_runs_v1_runs_get_with_http_info( + def list_applications_v1_applications_get_with_http_info( self, - application_id: Optional[StrictStr] = None, - application_version_id: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, sort: Optional[List[StrictStr]] = None, @@ -1518,16 +1593,11 @@ def list_application_runs_v1_runs_get_with_http_info( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[RunReadResponse]]: - """List Application Runs + ) -> ApiResponse[List[ApplicationReadResponse]]: + """List Applications + Returns the list of the applications, available to the caller. The application is available if any of the version of the application is assigned to the user organization. To switch between organizations, the user should re-login and choose the needed organization. - :param application_id: - :type application_id: str - :param application_version_id: - :type application_version_id: str - :param include: - :type include: List[object] :param page: :type page: int :param page_size: @@ -1556,10 +1626,7 @@ def list_application_runs_v1_runs_get_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._list_application_runs_v1_runs_get_serialize( - application_id=application_id, - application_version_id=application_version_id, - include=include, + _param = self._list_applications_v1_applications_get_serialize( page=page, page_size=page_size, sort=sort, @@ -1570,8 +1637,7 @@ def list_application_runs_v1_runs_get_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[RunReadResponse]", - '404': None, + '200': "List[ApplicationReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -1586,11 +1652,8 @@ def list_application_runs_v1_runs_get_with_http_info( @validate_call - def list_application_runs_v1_runs_get_without_preload_content( + def list_applications_v1_applications_get_without_preload_content( self, - application_id: Optional[StrictStr] = None, - application_version_id: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, sort: Optional[List[StrictStr]] = None, @@ -1607,15 +1670,10 @@ def list_application_runs_v1_runs_get_without_preload_content( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """List Application Runs + """List Applications + Returns the list of the applications, available to the caller. The application is available if any of the version of the application is assigned to the user organization. To switch between organizations, the user should re-login and choose the needed organization. - :param application_id: - :type application_id: str - :param application_version_id: - :type application_version_id: str - :param include: - :type include: List[object] :param page: :type page: int :param page_size: @@ -1644,10 +1702,7 @@ def list_application_runs_v1_runs_get_without_preload_content( :return: Returns the result object. """ # noqa: E501 - _param = self._list_application_runs_v1_runs_get_serialize( - application_id=application_id, - application_version_id=application_version_id, - include=include, + _param = self._list_applications_v1_applications_get_serialize( page=page, page_size=page_size, sort=sort, @@ -1658,8 +1713,7 @@ def list_application_runs_v1_runs_get_without_preload_content( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[RunReadResponse]", - '404': None, + '200': "List[ApplicationReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -1669,11 +1723,8 @@ def list_application_runs_v1_runs_get_without_preload_content( return response_data.response - def _list_application_runs_v1_runs_get_serialize( + def _list_applications_v1_applications_get_serialize( self, - application_id, - application_version_id, - include, page, page_size, sort, @@ -1686,7 +1737,6 @@ def _list_application_runs_v1_runs_get_serialize( _host = None _collection_formats: Dict[str, str] = { - 'include': 'multi', 'sort': 'multi', } @@ -1701,18 +1751,6 @@ def _list_application_runs_v1_runs_get_serialize( # process the path parameters # process the query parameters - if application_id is not None: - - _query_params.append(('application_id', application_id)) - - if application_version_id is not None: - - _query_params.append(('application_version_id', application_version_id)) - - if include is not None: - - _query_params.append(('include', include)) - if page is not None: _query_params.append(('page', page)) @@ -1741,11 +1779,12 @@ def _list_application_runs_v1_runs_get_serialize( # authentication setting _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( method='GET', - resource_path='/v1/runs', + resource_path='/v1/applications', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -1762,8 +1801,12 @@ def _list_application_runs_v1_runs_get_serialize( @validate_call - def list_applications_v1_applications_get( + def list_run_results_v1_runs_application_run_id_results_get( self, + application_run_id: Annotated[StrictStr, Field(description="Application run id, returned by `POST /runs/` endpoint")], + item_id__in: Annotated[Optional[List[StrictStr]], Field(description="Filter for items ids")] = None, + reference__in: Annotated[Optional[List[StrictStr]], Field(description="Filter for items by their reference from the input payload")] = None, + status__in: Annotated[Optional[List[ItemStatus]], Field(description="Filter for items in certain statuses")] = None, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, sort: Optional[List[StrictStr]] = None, @@ -1779,10 +1822,19 @@ def list_applications_v1_applications_get( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[ApplicationReadResponse]: - """List Applications + ) -> List[ItemResultReadResponse]: + """List Run Results + Get the list of the results for the run items + :param application_run_id: Application run id, returned by `POST /runs/` endpoint (required) + :type application_run_id: str + :param item_id__in: Filter for items ids + :type item_id__in: List[str] + :param reference__in: Filter for items by their reference from the input payload + :type reference__in: List[str] + :param status__in: Filter for items in certain statuses + :type status__in: List[ItemStatus] :param page: :type page: int :param page_size: @@ -1811,7 +1863,11 @@ def list_applications_v1_applications_get( :return: Returns the result object. """ # noqa: E501 - _param = self._list_applications_v1_applications_get_serialize( + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( + application_run_id=application_run_id, + item_id__in=item_id__in, + reference__in=reference__in, + status__in=status__in, page=page, page_size=page_size, sort=sort, @@ -1822,7 +1878,8 @@ def list_applications_v1_applications_get( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationReadResponse]", + '200': "List[ItemResultReadResponse]", + '404': None, '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -1837,8 +1894,12 @@ def list_applications_v1_applications_get( @validate_call - def list_applications_v1_applications_get_with_http_info( + def list_run_results_v1_runs_application_run_id_results_get_with_http_info( self, + application_run_id: Annotated[StrictStr, Field(description="Application run id, returned by `POST /runs/` endpoint")], + item_id__in: Annotated[Optional[List[StrictStr]], Field(description="Filter for items ids")] = None, + reference__in: Annotated[Optional[List[StrictStr]], Field(description="Filter for items by their reference from the input payload")] = None, + status__in: Annotated[Optional[List[ItemStatus]], Field(description="Filter for items in certain statuses")] = None, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, sort: Optional[List[StrictStr]] = None, @@ -1854,10 +1915,19 @@ def list_applications_v1_applications_get_with_http_info( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[ApplicationReadResponse]]: - """List Applications + ) -> ApiResponse[List[ItemResultReadResponse]]: + """List Run Results + Get the list of the results for the run items + :param application_run_id: Application run id, returned by `POST /runs/` endpoint (required) + :type application_run_id: str + :param item_id__in: Filter for items ids + :type item_id__in: List[str] + :param reference__in: Filter for items by their reference from the input payload + :type reference__in: List[str] + :param status__in: Filter for items in certain statuses + :type status__in: List[ItemStatus] :param page: :type page: int :param page_size: @@ -1886,7 +1956,11 @@ def list_applications_v1_applications_get_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._list_applications_v1_applications_get_serialize( + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( + application_run_id=application_run_id, + item_id__in=item_id__in, + reference__in=reference__in, + status__in=status__in, page=page, page_size=page_size, sort=sort, @@ -1897,7 +1971,8 @@ def list_applications_v1_applications_get_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationReadResponse]", + '200': "List[ItemResultReadResponse]", + '404': None, '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -1912,8 +1987,12 @@ def list_applications_v1_applications_get_with_http_info( @validate_call - def list_applications_v1_applications_get_without_preload_content( + def list_run_results_v1_runs_application_run_id_results_get_without_preload_content( self, + application_run_id: Annotated[StrictStr, Field(description="Application run id, returned by `POST /runs/` endpoint")], + item_id__in: Annotated[Optional[List[StrictStr]], Field(description="Filter for items ids")] = None, + reference__in: Annotated[Optional[List[StrictStr]], Field(description="Filter for items by their reference from the input payload")] = None, + status__in: Annotated[Optional[List[ItemStatus]], Field(description="Filter for items in certain statuses")] = None, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, sort: Optional[List[StrictStr]] = None, @@ -1930,9 +2009,18 @@ def list_applications_v1_applications_get_without_preload_content( _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """List Applications + """List Run Results + Get the list of the results for the run items + :param application_run_id: Application run id, returned by `POST /runs/` endpoint (required) + :type application_run_id: str + :param item_id__in: Filter for items ids + :type item_id__in: List[str] + :param reference__in: Filter for items by their reference from the input payload + :type reference__in: List[str] + :param status__in: Filter for items in certain statuses + :type status__in: List[ItemStatus] :param page: :type page: int :param page_size: @@ -1961,7 +2049,11 @@ def list_applications_v1_applications_get_without_preload_content( :return: Returns the result object. """ # noqa: E501 - _param = self._list_applications_v1_applications_get_serialize( + _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( + application_run_id=application_run_id, + item_id__in=item_id__in, + reference__in=reference__in, + status__in=status__in, page=page, page_size=page_size, sort=sort, @@ -1972,7 +2064,8 @@ def list_applications_v1_applications_get_without_preload_content( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationReadResponse]", + '200': "List[ItemResultReadResponse]", + '404': None, '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -1982,8 +2075,12 @@ def list_applications_v1_applications_get_without_preload_content( return response_data.response - def _list_applications_v1_applications_get_serialize( + def _list_run_results_v1_runs_application_run_id_results_get_serialize( self, + application_run_id, + item_id__in, + reference__in, + status__in, page, page_size, sort, @@ -1996,6 +2093,9 @@ def _list_applications_v1_applications_get_serialize( _host = None _collection_formats: Dict[str, str] = { + 'item_id__in': 'multi', + 'reference__in': 'multi', + 'status__in': 'multi', 'sort': 'multi', } @@ -2009,7 +2109,21 @@ def _list_applications_v1_applications_get_serialize( _body_params: Optional[bytes] = None # process the path parameters + if application_run_id is not None: + _path_params['application_run_id'] = application_run_id # process the query parameters + if item_id__in is not None: + + _query_params.append(('item_id__in', item_id__in)) + + if reference__in is not None: + + _query_params.append(('reference__in', reference__in)) + + if status__in is not None: + + _query_params.append(('status__in', status__in)) + if page is not None: _query_params.append(('page', page)) @@ -2038,11 +2152,12 @@ def _list_applications_v1_applications_get_serialize( # authentication setting _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( method='GET', - resource_path='/v1/applications', + resource_path='/v1/runs/{application_run_id}/results', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -2059,14 +2174,13 @@ def _list_applications_v1_applications_get_serialize( @validate_call - def list_run_results_v1_runs_application_run_id_results_get( + def list_versions_by_application_id_v1_applications_application_id_versions_get( self, - application_run_id: StrictStr, - item_id__in: Optional[List[Optional[StrictStr]]] = None, + application_id: StrictStr, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - reference__in: Optional[List[StrictStr]] = None, - status__in: Optional[List[ItemStatus]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, @@ -2080,22 +2194,21 @@ def list_run_results_v1_runs_application_run_id_results_get( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[ItemResultReadResponse]: - """List Run Results + ) -> List[ApplicationVersionReadResponse]: + """List Versions By Application Id + Returns the list of the application versions for this application, available to the caller. The application version is available if it is assigned to the user's organization. The application versions are assigned to the organization by the Aignostics admin. To assign or unassign a version from your organization, please contact Aignostics support team. - :param application_run_id: (required) - :type application_run_id: str - :param item_id__in: - :type item_id__in: List[Optional[str]] + :param application_id: (required) + :type application_id: str :param page: :type page: int :param page_size: :type page_size: int - :param reference__in: - :type reference__in: List[str] - :param status__in: - :type status__in: List[ItemStatus] + :param version: + :type version: str + :param include: + :type include: List[object] :param sort: :type sort: List[str] :param _request_timeout: timeout setting for this request. If one @@ -2120,13 +2233,12 @@ def list_run_results_v1_runs_application_run_id_results_get( :return: Returns the result object. """ # noqa: E501 - _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( - application_run_id=application_run_id, - item_id__in=item_id__in, + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( + application_id=application_id, page=page, page_size=page_size, - reference__in=reference__in, - status__in=status__in, + version=version, + include=include, sort=sort, _request_auth=_request_auth, _content_type=_content_type, @@ -2135,8 +2247,7 @@ def list_run_results_v1_runs_application_run_id_results_get( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ItemResultReadResponse]", - '404': None, + '200': "List[ApplicationVersionReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -2151,14 +2262,13 @@ def list_run_results_v1_runs_application_run_id_results_get( @validate_call - def list_run_results_v1_runs_application_run_id_results_get_with_http_info( + def list_versions_by_application_id_v1_applications_application_id_versions_get_with_http_info( self, - application_run_id: StrictStr, - item_id__in: Optional[List[Optional[StrictStr]]] = None, + application_id: StrictStr, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - reference__in: Optional[List[StrictStr]] = None, - status__in: Optional[List[ItemStatus]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, @@ -2172,22 +2282,21 @@ def list_run_results_v1_runs_application_run_id_results_get_with_http_info( _content_type: Optional[StrictStr] = None, _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[ItemResultReadResponse]]: - """List Run Results + ) -> ApiResponse[List[ApplicationVersionReadResponse]]: + """List Versions By Application Id + Returns the list of the application versions for this application, available to the caller. The application version is available if it is assigned to the user's organization. The application versions are assigned to the organization by the Aignostics admin. To assign or unassign a version from your organization, please contact Aignostics support team. - :param application_run_id: (required) - :type application_run_id: str - :param item_id__in: - :type item_id__in: List[Optional[str]] + :param application_id: (required) + :type application_id: str :param page: :type page: int :param page_size: :type page_size: int - :param reference__in: - :type reference__in: List[str] - :param status__in: - :type status__in: List[ItemStatus] + :param version: + :type version: str + :param include: + :type include: List[object] :param sort: :type sort: List[str] :param _request_timeout: timeout setting for this request. If one @@ -2212,13 +2321,12 @@ def list_run_results_v1_runs_application_run_id_results_get_with_http_info( :return: Returns the result object. """ # noqa: E501 - _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( - application_run_id=application_run_id, - item_id__in=item_id__in, + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( + application_id=application_id, page=page, page_size=page_size, - reference__in=reference__in, - status__in=status__in, + version=version, + include=include, sort=sort, _request_auth=_request_auth, _content_type=_content_type, @@ -2227,8 +2335,7 @@ def list_run_results_v1_runs_application_run_id_results_get_with_http_info( ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ItemResultReadResponse]", - '404': None, + '200': "List[ApplicationVersionReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -2243,14 +2350,13 @@ def list_run_results_v1_runs_application_run_id_results_get_with_http_info( @validate_call - def list_run_results_v1_runs_application_run_id_results_get_without_preload_content( + def list_versions_by_application_id_v1_applications_application_id_versions_get_without_preload_content( self, - application_run_id: StrictStr, - item_id__in: Optional[List[Optional[StrictStr]]] = None, + application_id: StrictStr, page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - reference__in: Optional[List[StrictStr]] = None, - status__in: Optional[List[ItemStatus]] = None, + version: Optional[StrictStr] = None, + include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, sort: Optional[List[StrictStr]] = None, _request_timeout: Union[ None, @@ -2265,21 +2371,20 @@ def list_run_results_v1_runs_application_run_id_results_get_without_preload_cont _headers: Optional[Dict[StrictStr, Any]] = None, _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, ) -> RESTResponseType: - """List Run Results + """List Versions By Application Id + Returns the list of the application versions for this application, available to the caller. The application version is available if it is assigned to the user's organization. The application versions are assigned to the organization by the Aignostics admin. To assign or unassign a version from your organization, please contact Aignostics support team. - :param application_run_id: (required) - :type application_run_id: str - :param item_id__in: - :type item_id__in: List[Optional[str]] + :param application_id: (required) + :type application_id: str :param page: :type page: int :param page_size: :type page_size: int - :param reference__in: - :type reference__in: List[str] - :param status__in: - :type status__in: List[ItemStatus] + :param version: + :type version: str + :param include: + :type include: List[object] :param sort: :type sort: List[str] :param _request_timeout: timeout setting for this request. If one @@ -2304,13 +2409,12 @@ def list_run_results_v1_runs_application_run_id_results_get_without_preload_cont :return: Returns the result object. """ # noqa: E501 - _param = self._list_run_results_v1_runs_application_run_id_results_get_serialize( - application_run_id=application_run_id, - item_id__in=item_id__in, + _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( + application_id=application_id, page=page, page_size=page_size, - reference__in=reference__in, - status__in=status__in, + version=version, + include=include, sort=sort, _request_auth=_request_auth, _content_type=_content_type, @@ -2319,8 +2423,7 @@ def list_run_results_v1_runs_application_run_id_results_get_without_preload_cont ) _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ItemResultReadResponse]", - '404': None, + '200': "List[ApplicationVersionReadResponse]", '422': "HTTPValidationError", } response_data = self.api_client.call_api( @@ -2330,14 +2433,13 @@ def list_run_results_v1_runs_application_run_id_results_get_without_preload_cont return response_data.response - def _list_run_results_v1_runs_application_run_id_results_get_serialize( + def _list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( self, - application_run_id, - item_id__in, + application_id, page, page_size, - reference__in, - status__in, + version, + include, sort, _request_auth, _content_type, @@ -2348,9 +2450,7 @@ def _list_run_results_v1_runs_application_run_id_results_get_serialize( _host = None _collection_formats: Dict[str, str] = { - 'item_id__in': 'multi', - 'reference__in': 'multi', - 'status__in': 'multi', + 'include': 'multi', 'sort': 'multi', } @@ -2364,13 +2464,9 @@ def _list_run_results_v1_runs_application_run_id_results_get_serialize( _body_params: Optional[bytes] = None # process the path parameters - if application_run_id is not None: - _path_params['application_run_id'] = application_run_id + if application_id is not None: + _path_params['application_id'] = application_id # process the query parameters - if item_id__in is not None: - - _query_params.append(('item_id__in', item_id__in)) - if page is not None: _query_params.append(('page', page)) @@ -2379,13 +2475,13 @@ def _list_run_results_v1_runs_application_run_id_results_get_serialize( _query_params.append(('page_size', page_size)) - if reference__in is not None: + if version is not None: - _query_params.append(('reference__in', reference__in)) + _query_params.append(('version', version)) - if status__in is not None: + if include is not None: - _query_params.append(('status__in', status__in)) + _query_params.append(('include', include)) if sort is not None: @@ -2407,11 +2503,12 @@ def _list_run_results_v1_runs_application_run_id_results_get_serialize( # authentication setting _auth_settings: List[str] = [ + 'OAuth2AuthorizationCodeBearer' ] return self.api_client.param_serialize( method='GET', - resource_path='/v1/runs/{application_run_id}/results', + resource_path='/v1/applications/{application_id}/versions', path_params=_path_params, query_params=_query_params, header_params=_header_params, @@ -2423,1232 +2520,3 @@ def _list_run_results_v1_runs_application_run_id_results_get_serialize( _host=_host, _request_auth=_request_auth ) - - - - - @validate_call - def list_versions_by_application_id_v1_applications_application_id_versions_get( - self, - application_id: StrictStr, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[ApplicationVersionReadResponse]: - """List Versions By Application Id - - - :param application_id: (required) - :type application_id: str - :param page: - :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( - application_id=application_id, - page=page, - page_size=page_size, - version=version, - include=include, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def list_versions_by_application_id_v1_applications_application_id_versions_get_with_http_info( - self, - application_id: StrictStr, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[ApplicationVersionReadResponse]]: - """List Versions By Application Id - - - :param application_id: (required) - :type application_id: str - :param page: - :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( - application_id=application_id, - page=page, - page_size=page_size, - version=version, - include=include, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def list_versions_by_application_id_v1_applications_application_id_versions_get_without_preload_content( - self, - application_id: StrictStr, - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """List Versions By Application Id - - - :param application_id: (required) - :type application_id: str - :param page: - :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( - application_id=application_id, - page=page, - page_size=page_size, - version=version, - include=include, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _list_versions_by_application_id_v1_applications_application_id_versions_get_serialize( - self, - application_id, - page, - page_size, - version, - include, - sort, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'include': 'multi', - 'sort': 'multi', - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_id is not None: - _path_params['application_id'] = application_id - # process the query parameters - if page is not None: - - _query_params.append(('page', page)) - - if page_size is not None: - - _query_params.append(('page_size', page_size)) - - if version is not None: - - _query_params.append(('version', version)) - - if include is not None: - - _query_params.append(('include', include)) - - if sort is not None: - - _query_params.append(('sort', sort)) - - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/applications/{application_id}/versions', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def list_versions_by_application_slug_v1_applications_application_slug_versions_get( - self, - application_slug: Annotated[str, Field(strict=True)], - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> List[ApplicationVersionReadResponse]: - """List Versions By Application Slug - - - :param application_slug: (required) - :type application_slug: str - :param page: - :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( - application_slug=application_slug, - page=page, - page_size=page_size, - version=version, - include=include, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def list_versions_by_application_slug_v1_applications_application_slug_versions_get_with_http_info( - self, - application_slug: Annotated[str, Field(strict=True)], - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[List[ApplicationVersionReadResponse]]: - """List Versions By Application Slug - - - :param application_slug: (required) - :type application_slug: str - :param page: - :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( - application_slug=application_slug, - page=page, - page_size=page_size, - version=version, - include=include, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def list_versions_by_application_slug_v1_applications_application_slug_versions_get_without_preload_content( - self, - application_slug: Annotated[str, Field(strict=True)], - page: Optional[Annotated[int, Field(strict=True, ge=1)]] = None, - page_size: Optional[Annotated[int, Field(le=100, strict=True, ge=5)]] = None, - version: Optional[StrictStr] = None, - include: Optional[Annotated[List[Any], Field(min_length=1, max_length=1)]] = None, - sort: Optional[List[StrictStr]] = None, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """List Versions By Application Slug - - - :param application_slug: (required) - :type application_slug: str - :param page: - :type page: int - :param page_size: - :type page_size: int - :param version: - :type version: str - :param include: - :type include: List[object] - :param sort: - :type sort: List[str] - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( - application_slug=application_slug, - page=page, - page_size=page_size, - version=version, - include=include, - sort=sort, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "List[ApplicationVersionReadResponse]", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _list_versions_by_application_slug_v1_applications_application_slug_versions_get_serialize( - self, - application_slug, - page, - page_size, - version, - include, - sort, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - 'include': 'multi', - 'sort': 'multi', - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_slug is not None: - _path_params['application_slug'] = application_slug - # process the query parameters - if page is not None: - - _query_params.append(('page', page)) - - if page_size is not None: - - _query_params.append(('page_size', page_size)) - - if version is not None: - - _query_params.append(('version', version)) - - if include is not None: - - _query_params.append(('include', include)) - - if sort is not None: - - _query_params.append(('sort', sort)) - - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/applications/{application_slug}/versions', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def read_application_by_slug_v1_applications_application_slug_get( - self, - application_slug: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApplicationReadResponse: - """Read Application By Slug - - - :param application_slug: (required) - :type application_slug: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( - application_slug=application_slug, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def read_application_by_slug_v1_applications_application_slug_get_with_http_info( - self, - application_slug: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[ApplicationReadResponse]: - """Read Application By Slug - - - :param application_slug: (required) - :type application_slug: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( - application_slug=application_slug, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def read_application_by_slug_v1_applications_application_slug_get_without_preload_content( - self, - application_slug: StrictStr, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Read Application By Slug - - - :param application_slug: (required) - :type application_slug: str - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._read_application_by_slug_v1_applications_application_slug_get_serialize( - application_slug=application_slug, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '200': "ApplicationReadResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _read_application_by_slug_v1_applications_application_slug_get_serialize( - self, - application_slug, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - if application_slug is not None: - _path_params['application_slug'] = application_slug - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - - # authentication setting - _auth_settings: List[str] = [ - ] - - return self.api_client.param_serialize( - method='GET', - resource_path='/v1/applications/{application_slug}', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - - - - @validate_call - def register_version_v1_versions_post( - self, - version_creation_request: VersionCreationRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> VersionCreationResponse: - """Register Version - - - :param version_creation_request: (required) - :type version_creation_request: VersionCreationRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._register_version_v1_versions_post_serialize( - version_creation_request=version_creation_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '201': "VersionCreationResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ).data - - - @validate_call - def register_version_v1_versions_post_with_http_info( - self, - version_creation_request: VersionCreationRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> ApiResponse[VersionCreationResponse]: - """Register Version - - - :param version_creation_request: (required) - :type version_creation_request: VersionCreationRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._register_version_v1_versions_post_serialize( - version_creation_request=version_creation_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '201': "VersionCreationResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - response_data.read() - return self.api_client.response_deserialize( - response_data=response_data, - response_types_map=_response_types_map, - ) - - - @validate_call - def register_version_v1_versions_post_without_preload_content( - self, - version_creation_request: VersionCreationRequest, - _request_timeout: Union[ - None, - Annotated[StrictFloat, Field(gt=0)], - Tuple[ - Annotated[StrictFloat, Field(gt=0)], - Annotated[StrictFloat, Field(gt=0)] - ] - ] = None, - _request_auth: Optional[Dict[StrictStr, Any]] = None, - _content_type: Optional[StrictStr] = None, - _headers: Optional[Dict[StrictStr, Any]] = None, - _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, - ) -> RESTResponseType: - """Register Version - - - :param version_creation_request: (required) - :type version_creation_request: VersionCreationRequest - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :type _request_timeout: int, tuple(int, int), optional - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the - authentication in the spec for a single request. - :type _request_auth: dict, optional - :param _content_type: force content-type for the request. - :type _content_type: str, Optional - :param _headers: set to override the headers for a single - request; this effectively ignores the headers - in the spec for a single request. - :type _headers: dict, optional - :param _host_index: set to override the host_index for a single - request; this effectively ignores the host_index - in the spec for a single request. - :type _host_index: int, optional - :return: Returns the result object. - """ # noqa: E501 - - _param = self._register_version_v1_versions_post_serialize( - version_creation_request=version_creation_request, - _request_auth=_request_auth, - _content_type=_content_type, - _headers=_headers, - _host_index=_host_index - ) - - _response_types_map: Dict[str, Optional[str]] = { - '201': "VersionCreationResponse", - '422': "HTTPValidationError", - } - response_data = self.api_client.call_api( - *_param, - _request_timeout=_request_timeout - ) - return response_data.response - - - def _register_version_v1_versions_post_serialize( - self, - version_creation_request, - _request_auth, - _content_type, - _headers, - _host_index, - ) -> RequestSerialized: - - _host = None - - _collection_formats: Dict[str, str] = { - } - - _path_params: Dict[str, str] = {} - _query_params: List[Tuple[str, str]] = [] - _header_params: Dict[str, Optional[str]] = _headers or {} - _form_params: List[Tuple[str, str]] = [] - _files: Dict[ - str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] - ] = {} - _body_params: Optional[bytes] = None - - # process the path parameters - # process the query parameters - # process the header parameters - # process the form parameters - # process the body parameter - if version_creation_request is not None: - _body_params = version_creation_request - - - # set the HTTP header `Accept` - if 'Accept' not in _header_params: - _header_params['Accept'] = self.api_client.select_header_accept( - [ - 'application/json' - ] - ) - - # set the HTTP header `Content-Type` - if _content_type: - _header_params['Content-Type'] = _content_type - else: - _default_content_type = ( - self.api_client.select_header_content_type( - [ - 'application/json' - ] - ) - ) - if _default_content_type is not None: - _header_params['Content-Type'] = _default_content_type - - # authentication setting - _auth_settings: List[str] = [ - ] - - return self.api_client.param_serialize( - method='POST', - resource_path='/v1/versions', - path_params=_path_params, - query_params=_query_params, - header_params=_header_params, - body=_body_params, - post_params=_form_params, - files=_files, - auth_settings=_auth_settings, - collection_formats=_collection_formats, - _host=_host, - _request_auth=_request_auth - ) - - diff --git a/codegen/out/aignx/codegen/api_client.py b/codegen/out/aignx/codegen/api_client.py index 5cfc4b77..9a681e2f 100644 --- a/codegen/out/aignx/codegen/api_client.py +++ b/codegen/out/aignx/codegen/api_client.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) diff --git a/codegen/out/aignx/codegen/configuration.py b/codegen/out/aignx/codegen/configuration.py index 07635c4c..fb94f454 100644 --- a/codegen/out/aignx/codegen/configuration.py +++ b/codegen/out/aignx/codegen/configuration.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -113,6 +112,7 @@ AuthSettings = TypedDict( "AuthSettings", { + "OAuth2AuthorizationCodeBearer": OAuth2AuthSetting, }, total=False, ) @@ -161,6 +161,7 @@ class Configuration: in PEM format. :param retries: Number of retries for API requests. + :Example: """ _default: ClassVar[Optional[Self]] = None @@ -185,7 +186,7 @@ def __init__( ) -> None: """Constructor """ - self._base_path = "http://localhost" if host is None else host + self._base_path = "/api" if host is None else host """Default Base url """ self.server_index = 0 if server_index is None and host is None else server_index @@ -483,6 +484,13 @@ def auth_settings(self)-> AuthSettings: :return: The Auth Settings information dict. """ auth: AuthSettings = {} + if self.access_token is not None: + auth['OAuth2AuthorizationCodeBearer'] = { + 'type': 'oauth2', + 'in': 'header', + 'key': 'Authorization', + 'value': 'Bearer ' + self.access_token + } return auth def to_debug_report(self) -> str: @@ -504,7 +512,7 @@ def get_host_settings(self) -> List[HostSetting]: """ return [ { - 'url': "", + 'url': "/api", 'description': "No description provided", } ] diff --git a/codegen/out/aignx/codegen/exceptions.py b/codegen/out/aignx/codegen/exceptions.py index c5e6b23d..4077b472 100644 --- a/codegen/out/aignx/codegen/exceptions.py +++ b/codegen/out/aignx/codegen/exceptions.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) diff --git a/codegen/out/aignx/codegen/models/__init__.py b/codegen/out/aignx/codegen/models/__init__.py index 884ff678..bdf08296 100644 --- a/codegen/out/aignx/codegen/models/__init__.py +++ b/codegen/out/aignx/codegen/models/__init__.py @@ -1,32 +1,22 @@ from .item_result_read_response import * -from .input_artifact_schema_creation_request import * from .validation_error_loc_inner import * from .application_version_read_response import * from .item_status import * from .run_creation_response import * from .input_artifact_read_response import * -from .version_creation_request import * from .user_payload import * from .validation_error import * from .application_read_response import * from .output_artifact_scope import * -from .version_creation_response import * from .input_artifact_creation_request import * from .item_creation_request import * -from .application_version import * from .http_validation_error import * from .transfer_urls import * -from .slug_version_request import * -from .input_artifact import * from .output_artifact_result_read_response import * -from .version_read_response import * -from .output_artifact_schema_creation_request import * from .run_read_response import * from .application_run_status import * from .run_creation_request import * from .payload_output_artifact import * from .payload_input_artifact import * -from .output_artifact_visibility import * from .payload_item import * from .output_artifact_read_response import * -from .output_artifact import * diff --git a/codegen/out/aignx/codegen/models/application_read_response.py b/codegen/out/aignx/codegen/models/application_read_response.py index 6bd4c16e..809640ba 100644 --- a/codegen/out/aignx/codegen/models/application_read_response.py +++ b/codegen/out/aignx/codegen/models/application_read_response.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -17,7 +16,7 @@ import re # noqa: F401 import json -from pydantic import BaseModel, ConfigDict, StrictStr +from pydantic import BaseModel, ConfigDict, Field, StrictStr from typing import Any, ClassVar, Dict, List from typing import Optional, Set from typing_extensions import Self @@ -26,12 +25,11 @@ class ApplicationReadResponse(BaseModel): """ ApplicationReadResponse """ # noqa: E501 - application_id: StrictStr - name: StrictStr - slug: StrictStr - regulatory_classes: List[StrictStr] - description: StrictStr - __properties: ClassVar[List[str]] = ["application_id", "name", "slug", "regulatory_classes", "description"] + application_id: StrictStr = Field(description="Application ID") + name: StrictStr = Field(description="Application display name") + regulatory_classes: List[StrictStr] = Field(description="Regulatory class, to which the applications compliance") + description: StrictStr = Field(description="Application documentations") + __properties: ClassVar[List[str]] = ["application_id", "name", "regulatory_classes", "description"] model_config = ConfigDict( populate_by_name=True, @@ -86,10 +84,7 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: _obj = cls.model_validate({ "application_id": obj.get("application_id"), "name": obj.get("name"), - "slug": obj.get("slug"), "regulatory_classes": obj.get("regulatory_classes"), "description": obj.get("description") }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/application_run_status.py b/codegen/out/aignx/codegen/models/application_run_status.py index 7c165877..c7206aa7 100644 --- a/codegen/out/aignx/codegen/models/application_run_status.py +++ b/codegen/out/aignx/codegen/models/application_run_status.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -39,5 +38,3 @@ class ApplicationRunStatus(str, Enum): def from_json(cls, json_str: str) -> Self: """Create an instance of ApplicationRunStatus from a JSON string""" return cls(json.loads(json_str)) - - diff --git a/codegen/out/aignx/codegen/models/application_version.py b/codegen/out/aignx/codegen/models/application_version.py deleted file mode 100644 index e8a56270..00000000 --- a/codegen/out/aignx/codegen/models/application_version.py +++ /dev/null @@ -1,136 +0,0 @@ -# coding: utf-8 - -""" - PAPI API Reference - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 1.0.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -from inspect import getfullargspec -import json -import pprint -import re # noqa: F401 -from pydantic import BaseModel, ConfigDict, Field, StrictStr, ValidationError, field_validator -from typing import Optional -from aignx.codegen.models.slug_version_request import SlugVersionRequest -from typing import Union, Any, List, Set, TYPE_CHECKING, Optional, Dict -from typing_extensions import Literal, Self -from pydantic import Field - -APPLICATIONVERSION_ANY_OF_SCHEMAS = ["SlugVersionRequest", "str"] - -class ApplicationVersion(BaseModel): - """ - ApplicationVersion - """ - - # data type: str - anyof_schema_1_validator: Optional[StrictStr] = None - # data type: SlugVersionRequest - anyof_schema_2_validator: Optional[SlugVersionRequest] = None - if TYPE_CHECKING: - actual_instance: Optional[Union[SlugVersionRequest, str]] = None - else: - actual_instance: Any = None - any_of_schemas: Set[str] = { "SlugVersionRequest", "str" } - - model_config = { - "validate_assignment": True, - "protected_namespaces": (), - } - - def __init__(self, *args, **kwargs) -> None: - if args: - if len(args) > 1: - raise ValueError("If a position argument is used, only 1 is allowed to set `actual_instance`") - if kwargs: - raise ValueError("If a position argument is used, keyword arguments cannot be used.") - super().__init__(actual_instance=args[0]) - else: - super().__init__(**kwargs) - - @field_validator('actual_instance') - def actual_instance_must_validate_anyof(cls, v): - instance = ApplicationVersion.model_construct() - error_messages = [] - # validate data type: str - try: - instance.anyof_schema_1_validator = v - return v - except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - # validate data type: SlugVersionRequest - if not isinstance(v, SlugVersionRequest): - error_messages.append(f"Error! Input type `{type(v)}` is not `SlugVersionRequest`") - else: - return v - - if error_messages: - # no match - raise ValueError("No match found when setting the actual_instance in ApplicationVersion with anyOf schemas: SlugVersionRequest, str. Details: " + ", ".join(error_messages)) - else: - return v - - @classmethod - def from_dict(cls, obj: Dict[str, Any]) -> Self: - return cls.from_json(json.dumps(obj)) - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Returns the object represented by the json string""" - instance = cls.model_construct() - error_messages = [] - # deserialize data into str - try: - # validation - instance.anyof_schema_1_validator = json.loads(json_str) - # assign value to actual_instance - instance.actual_instance = instance.anyof_schema_1_validator - return instance - except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - # anyof_schema_2_validator: Optional[SlugVersionRequest] = None - try: - instance.actual_instance = SlugVersionRequest.from_json(json_str) - return instance - except (ValidationError, ValueError) as e: - error_messages.append(str(e)) - - if error_messages: - # no match - raise ValueError("No match found when deserializing the JSON string into ApplicationVersion with anyOf schemas: SlugVersionRequest, str. Details: " + ", ".join(error_messages)) - else: - return instance - - def to_json(self) -> str: - """Returns the JSON representation of the actual instance""" - if self.actual_instance is None: - return "null" - - if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): - return self.actual_instance.to_json() - else: - return json.dumps(self.actual_instance) - - def to_dict(self) -> Optional[Union[Dict[str, Any], SlugVersionRequest, str]]: - """Returns the dict representation of the actual instance""" - if self.actual_instance is None: - return None - - if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): - return self.actual_instance.to_dict() - else: - return self.actual_instance - - def to_str(self) -> str: - """Returns the string representation of the actual instance""" - return pprint.pformat(self.model_dump()) - - diff --git a/codegen/out/aignx/codegen/models/application_version_read_response.py b/codegen/out/aignx/codegen/models/application_version_read_response.py index bac87039..34e686af 100644 --- a/codegen/out/aignx/codegen/models/application_version_read_response.py +++ b/codegen/out/aignx/codegen/models/application_version_read_response.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -17,9 +16,8 @@ import re # noqa: F401 import json -from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from pydantic import BaseModel, ConfigDict, Field, StrictStr from typing import Any, ClassVar, Dict, List, Optional -from typing_extensions import Annotated from aignx.codegen.models.input_artifact_read_response import InputArtifactReadResponse from aignx.codegen.models.output_artifact_read_response import OutputArtifactReadResponse from typing import Optional, Set @@ -29,22 +27,14 @@ class ApplicationVersionReadResponse(BaseModel): """ ApplicationVersionReadResponse """ # noqa: E501 - application_version_id: StrictStr - application_version_slug: Annotated[str, Field(strict=True)] - version: StrictStr - application_id: StrictStr + application_version_id: StrictStr = Field(description="Application version ID") + version: StrictStr = Field(description="Semantic version of the application") + application_id: StrictStr = Field(description="Application ID") flow_id: Optional[StrictStr] = None - changelog: StrictStr - input_artifacts: List[InputArtifactReadResponse] - output_artifacts: List[OutputArtifactReadResponse] - __properties: ClassVar[List[str]] = ["application_version_id", "application_version_slug", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] - - @field_validator('application_version_slug') - def application_version_slug_validate_regular_expression(cls, value): - """Validates the regular expression""" - if not re.match(r"^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$", value): - raise ValueError(r"must validate the regular expression /^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/") - return value + changelog: StrictStr = Field(description="Description of the changes relative to the previous version") + input_artifacts: List[InputArtifactReadResponse] = Field(description="List of the input fields, provided by the User") + output_artifacts: List[OutputArtifactReadResponse] = Field(description="List of the output fields, generated by the application") + __properties: ClassVar[List[str]] = ["application_version_id", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] model_config = ConfigDict( populate_by_name=True, @@ -117,7 +107,6 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: _obj = cls.model_validate({ "application_version_id": obj.get("application_version_id"), - "application_version_slug": obj.get("application_version_slug"), "version": obj.get("version"), "application_id": obj.get("application_id"), "flow_id": obj.get("flow_id"), @@ -126,5 +115,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "output_artifacts": [OutputArtifactReadResponse.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/http_validation_error.py b/codegen/out/aignx/codegen/models/http_validation_error.py index 009df7c1..d1e19453 100644 --- a/codegen/out/aignx/codegen/models/http_validation_error.py +++ b/codegen/out/aignx/codegen/models/http_validation_error.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -91,5 +90,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "detail": [ValidationError.from_dict(_item) for _item in obj["detail"]] if obj.get("detail") is not None else None }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/input_artifact.py b/codegen/out/aignx/codegen/models/input_artifact.py deleted file mode 100644 index 646b7289..00000000 --- a/codegen/out/aignx/codegen/models/input_artifact.py +++ /dev/null @@ -1,99 +0,0 @@ -# coding: utf-8 - -""" - PAPI API Reference - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 1.0.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator -from typing import Any, ClassVar, Dict, List -from typing_extensions import Annotated -from typing import Optional, Set -from typing_extensions import Self - -class InputArtifact(BaseModel): - """ - InputArtifact - """ # noqa: E501 - name: StrictStr - mime_type: Annotated[str, Field(strict=True)] - metadata_schema: Dict[str, Any] - __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema"] - - @field_validator('mime_type') - def mime_type_validate_regular_expression(cls, value): - """Validates the regular expression""" - if not re.match(r"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", value): - raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$/") - return value - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of InputArtifact from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of InputArtifact from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "mime_type": obj.get("mime_type"), - "metadata_schema": obj.get("metadata_schema") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/input_artifact_creation_request.py b/codegen/out/aignx/codegen/models/input_artifact_creation_request.py index c97cf129..9c3862f8 100644 --- a/codegen/out/aignx/codegen/models/input_artifact_creation_request.py +++ b/codegen/out/aignx/codegen/models/input_artifact_creation_request.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -27,9 +26,9 @@ class InputArtifactCreationRequest(BaseModel): """ InputArtifactCreationRequest """ # noqa: E501 - name: StrictStr - download_url: Annotated[str, Field(min_length=1, strict=True, max_length=2083)] - metadata: Dict[str, Any] + name: StrictStr = Field(description="The artifact name according to the application version. List of required artifacts is returned by `/v1/versions/{application_version_id}`. The artifact names are located in the `input_artifacts.[].name` value") + download_url: Annotated[str, Field(min_length=1, strict=True, max_length=2083)] = Field(description="[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) to the input artifact file. The URL should be valid for at least 6 days from the payload submission time.") + metadata: Dict[str, Any] = Field(description="The metadata of the artifact, required by the application version. The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. The schema is located in `input_artifacts.[].metadata_schema`") __properties: ClassVar[List[str]] = ["name", "download_url", "metadata"] model_config = ConfigDict( @@ -88,5 +87,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "metadata": obj.get("metadata") }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/input_artifact_read_response.py b/codegen/out/aignx/codegen/models/input_artifact_read_response.py index 2f95578a..dc7cf387 100644 --- a/codegen/out/aignx/codegen/models/input_artifact_read_response.py +++ b/codegen/out/aignx/codegen/models/input_artifact_read_response.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -35,8 +34,8 @@ class InputArtifactReadResponse(BaseModel): @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", value): - raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$/") + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") return value model_config = ConfigDict( @@ -95,5 +94,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "metadata_schema": obj.get("metadata_schema") }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py b/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py deleted file mode 100644 index ac0ebb60..00000000 --- a/codegen/out/aignx/codegen/models/input_artifact_schema_creation_request.py +++ /dev/null @@ -1,91 +0,0 @@ -# coding: utf-8 - -""" - PAPI API Reference - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 1.0.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from typing import Optional, Set -from typing_extensions import Self - -class InputArtifactSchemaCreationRequest(BaseModel): - """ - InputArtifactSchemaCreationRequest - """ # noqa: E501 - name: StrictStr - mime_type: StrictStr - metadata_schema: Dict[str, Any] - __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of InputArtifactSchemaCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of InputArtifactSchemaCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "mime_type": obj.get("mime_type"), - "metadata_schema": obj.get("metadata_schema") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/item_creation_request.py b/codegen/out/aignx/codegen/models/item_creation_request.py index 2e77ef0e..3aa66235 100644 --- a/codegen/out/aignx/codegen/models/item_creation_request.py +++ b/codegen/out/aignx/codegen/models/item_creation_request.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -17,7 +16,7 @@ import re # noqa: F401 import json -from pydantic import BaseModel, ConfigDict, StrictStr +from pydantic import BaseModel, ConfigDict, Field, StrictStr from typing import Any, ClassVar, Dict, List from aignx.codegen.models.input_artifact_creation_request import InputArtifactCreationRequest from typing import Optional, Set @@ -27,8 +26,8 @@ class ItemCreationRequest(BaseModel): """ ItemCreationRequest """ # noqa: E501 - reference: StrictStr - input_artifacts: List[InputArtifactCreationRequest] + reference: StrictStr = Field(description="The ID of the slide provided by the caller. The reference should be unique across all items of the application run") + input_artifacts: List[InputArtifactCreationRequest] = Field(description="All the input files of the item, required by the application version") __properties: ClassVar[List[str]] = ["reference", "input_artifacts"] model_config = ConfigDict( @@ -93,5 +92,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "input_artifacts": [InputArtifactCreationRequest.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/item_result_read_response.py b/codegen/out/aignx/codegen/models/item_result_read_response.py index a6e3093e..2462de5a 100644 --- a/codegen/out/aignx/codegen/models/item_result_read_response.py +++ b/codegen/out/aignx/codegen/models/item_result_read_response.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -17,7 +16,7 @@ import re # noqa: F401 import json -from pydantic import BaseModel, ConfigDict, StrictStr +from pydantic import BaseModel, ConfigDict, Field, StrictStr from typing import Any, ClassVar, Dict, List, Optional from aignx.codegen.models.item_status import ItemStatus from aignx.codegen.models.output_artifact_result_read_response import OutputArtifactResultReadResponse @@ -28,12 +27,12 @@ class ItemResultReadResponse(BaseModel): """ ItemResultReadResponse """ # noqa: E501 - item_id: StrictStr - application_run_id: StrictStr - reference: StrictStr - status: ItemStatus + item_id: StrictStr = Field(description="Item UUID generated by the Platform") + application_run_id: StrictStr = Field(description="Application run UUID to which the item belongs") + reference: StrictStr = Field(description="The reference of the item from the user payload") + status: ItemStatus = Field(description=" When the item is not processed yet, the status is set to `pending`. When the item is successfully finished, status is set to `succeeded`, and the processing results become available for download in `output_artifacts` field. When the item processing is failed because the provided item is invalid, the status is set to `error_user`. When the item processing failed because of the error in the model or platform, the status is set to `error_system`. When the application_run is canceled, the status of all pending items is set to either `cancelled_user` or `cancelled_system`. ") error: Optional[StrictStr] - output_artifacts: List[OutputArtifactResultReadResponse] + output_artifacts: List[OutputArtifactResultReadResponse] = Field(description=" The list of the results generated by the application algorithm. The number of files and their types depend on the particular application version, call `/v1/versions/{version_id}` to get the details. ") __properties: ClassVar[List[str]] = ["item_id", "application_run_id", "reference", "status", "error", "output_artifacts"] model_config = ConfigDict( @@ -107,5 +106,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "output_artifacts": [OutputArtifactResultReadResponse.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/item_status.py b/codegen/out/aignx/codegen/models/item_status.py index 3a12d81f..3a1f6874 100644 --- a/codegen/out/aignx/codegen/models/item_status.py +++ b/codegen/out/aignx/codegen/models/item_status.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -37,5 +36,3 @@ class ItemStatus(str, Enum): def from_json(cls, json_str: str) -> Self: """Create an instance of ItemStatus from a JSON string""" return cls(json.loads(json_str)) - - diff --git a/codegen/out/aignx/codegen/models/output_artifact.py b/codegen/out/aignx/codegen/models/output_artifact.py deleted file mode 100644 index 7df90d2f..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact.py +++ /dev/null @@ -1,105 +0,0 @@ -# coding: utf-8 - -""" - PAPI API Reference - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 1.0.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator -from typing import Any, ClassVar, Dict, List -from typing_extensions import Annotated -from aignx.codegen.models.output_artifact_scope import OutputArtifactScope -from aignx.codegen.models.output_artifact_visibility import OutputArtifactVisibility -from typing import Optional, Set -from typing_extensions import Self - -class OutputArtifact(BaseModel): - """ - OutputArtifact - """ # noqa: E501 - name: StrictStr - mime_type: Annotated[str, Field(strict=True)] - metadata_schema: Dict[str, Any] - scope: OutputArtifactScope - visibility: OutputArtifactVisibility - __properties: ClassVar[List[str]] = ["name", "mime_type", "metadata_schema", "scope", "visibility"] - - @field_validator('mime_type') - def mime_type_validate_regular_expression(cls, value): - """Validates the regular expression""" - if not re.match(r"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", value): - raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$/") - return value - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OutputArtifact from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OutputArtifact from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "mime_type": obj.get("mime_type"), - "metadata_schema": obj.get("metadata_schema"), - "scope": obj.get("scope"), - "visibility": obj.get("visibility") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/output_artifact_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_read_response.py index 3a1cf86a..f561c335 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_read_response.py +++ b/codegen/out/aignx/codegen/models/output_artifact_read_response.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -37,8 +36,8 @@ class OutputArtifactReadResponse(BaseModel): @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", value): - raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$/") + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") return value model_config = ConfigDict( @@ -98,5 +97,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "scope": obj.get("scope") }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py index 5507cfcc..5ccb73b8 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py +++ b/codegen/out/aignx/codegen/models/output_artifact_result_read_response.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -27,18 +26,18 @@ class OutputArtifactResultReadResponse(BaseModel): """ OutputArtifactResultReadResponse """ # noqa: E501 - output_artifact_id: StrictStr - name: StrictStr - mime_type: Annotated[str, Field(strict=True)] - metadata: Dict[str, Any] + output_artifact_id: StrictStr = Field(description="The Id of the artifact. Used internally") + name: StrictStr = Field(description=" Name of the output from the output schema from the `/v1/versions/{version_id}` endpoint. ") + mime_type: Annotated[str, Field(strict=True)] = Field(description="The mime type of the output file") + metadata: Dict[str, Any] = Field(description="The metadata of the output artifact, provided by the application") download_url: Optional[Annotated[str, Field(min_length=1, strict=True, max_length=2083)]] __properties: ClassVar[List[str]] = ["output_artifact_id", "name", "mime_type", "metadata", "download_url"] @field_validator('mime_type') def mime_type_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", value): - raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}\/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$/") + if not re.match(r"^\w+\/\w+[-+.|\w+]+\w+$", value): + raise ValueError(r"must validate the regular expression /^\w+\/\w+[-+.|\w+]+\w+$/") return value model_config = ConfigDict( @@ -104,5 +103,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "download_url": obj.get("download_url") }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py b/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py deleted file mode 100644 index 4c948652..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact_schema_creation_request.py +++ /dev/null @@ -1,97 +0,0 @@ -# coding: utf-8 - -""" - PAPI API Reference - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 1.0.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.output_artifact_scope import OutputArtifactScope -from aignx.codegen.models.output_artifact_visibility import OutputArtifactVisibility -from typing import Optional, Set -from typing_extensions import Self - -class OutputArtifactSchemaCreationRequest(BaseModel): - """ - OutputArtifactSchemaCreationRequest - """ # noqa: E501 - name: StrictStr - mime_type: StrictStr - scope: OutputArtifactScope - visibility: OutputArtifactVisibility - metadata_schema: Dict[str, Any] - __properties: ClassVar[List[str]] = ["name", "mime_type", "scope", "visibility", "metadata_schema"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of OutputArtifactSchemaCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of OutputArtifactSchemaCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "name": obj.get("name"), - "mime_type": obj.get("mime_type"), - "scope": obj.get("scope"), - "visibility": obj.get("visibility"), - "metadata_schema": obj.get("metadata_schema") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/output_artifact_scope.py b/codegen/out/aignx/codegen/models/output_artifact_scope.py index 9aa4591c..d962dac9 100644 --- a/codegen/out/aignx/codegen/models/output_artifact_scope.py +++ b/codegen/out/aignx/codegen/models/output_artifact_scope.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -33,5 +32,3 @@ class OutputArtifactScope(str, Enum): def from_json(cls, json_str: str) -> Self: """Create an instance of OutputArtifactScope from a JSON string""" return cls(json.loads(json_str)) - - diff --git a/codegen/out/aignx/codegen/models/output_artifact_visibility.py b/codegen/out/aignx/codegen/models/output_artifact_visibility.py deleted file mode 100644 index 531a9789..00000000 --- a/codegen/out/aignx/codegen/models/output_artifact_visibility.py +++ /dev/null @@ -1,37 +0,0 @@ -# coding: utf-8 - -""" - PAPI API Reference - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 1.0.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import json -from enum import Enum -from typing_extensions import Self - - -class OutputArtifactVisibility(str, Enum): - """ - OutputArtifactVisibility - """ - - """ - allowed enum values - """ - INTERNAL = 'internal' - EXTERNAL = 'external' - - @classmethod - def from_json(cls, json_str: str) -> Self: - """Create an instance of OutputArtifactVisibility from a JSON string""" - return cls(json.loads(json_str)) - - diff --git a/codegen/out/aignx/codegen/models/payload_input_artifact.py b/codegen/out/aignx/codegen/models/payload_input_artifact.py index 24cd013a..53c22073 100644 --- a/codegen/out/aignx/codegen/models/payload_input_artifact.py +++ b/codegen/out/aignx/codegen/models/payload_input_artifact.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -88,5 +87,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "download_url": obj.get("download_url") }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/payload_item.py b/codegen/out/aignx/codegen/models/payload_item.py index 93fbcbae..56c23786 100644 --- a/codegen/out/aignx/codegen/models/payload_item.py +++ b/codegen/out/aignx/codegen/models/payload_item.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -113,5 +112,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: else None }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/payload_output_artifact.py b/codegen/out/aignx/codegen/models/payload_output_artifact.py index 90a07f79..b5592fe1 100644 --- a/codegen/out/aignx/codegen/models/payload_output_artifact.py +++ b/codegen/out/aignx/codegen/models/payload_output_artifact.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -94,5 +93,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "metadata": TransferUrls.from_dict(obj["metadata"]) if obj.get("metadata") is not None else None }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/run_creation_request.py b/codegen/out/aignx/codegen/models/run_creation_request.py index b1565284..a669a5a4 100644 --- a/codegen/out/aignx/codegen/models/run_creation_request.py +++ b/codegen/out/aignx/codegen/models/run_creation_request.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -17,20 +16,19 @@ import re # noqa: F401 import json -from pydantic import BaseModel, ConfigDict +from pydantic import BaseModel, ConfigDict, Field, StrictStr from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.application_version import ApplicationVersion from aignx.codegen.models.item_creation_request import ItemCreationRequest from typing import Optional, Set from typing_extensions import Self class RunCreationRequest(BaseModel): """ - RunCreationRequest + Application run payload. It describes which application version is chosen, and which user data should be processed. """ # noqa: E501 - application_version: ApplicationVersion - items: List[ItemCreationRequest] - __properties: ClassVar[List[str]] = ["application_version", "items"] + application_version_id: StrictStr = Field(description="Application version ID") + items: List[ItemCreationRequest] = Field(description="List of the items to process by the application") + __properties: ClassVar[List[str]] = ["application_version_id", "items"] model_config = ConfigDict( populate_by_name=True, @@ -71,9 +69,6 @@ def to_dict(self) -> Dict[str, Any]: exclude=excluded_fields, exclude_none=True, ) - # override the default output from pydantic by calling `to_dict()` of application_version - if self.application_version: - _dict['application_version'] = self.application_version.to_dict() # override the default output from pydantic by calling `to_dict()` of each item in items (list) _items = [] if self.items: @@ -93,9 +88,7 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: return cls.model_validate(obj) _obj = cls.model_validate({ - "application_version": ApplicationVersion.from_dict(obj["application_version"]) if obj.get("application_version") is not None else None, + "application_version_id": obj.get("application_version_id"), "items": [ItemCreationRequest.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/run_creation_response.py b/codegen/out/aignx/codegen/models/run_creation_response.py index 2772483c..1e7775d0 100644 --- a/codegen/out/aignx/codegen/models/run_creation_response.py +++ b/codegen/out/aignx/codegen/models/run_creation_response.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -18,7 +17,7 @@ import json from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List +from typing import Any, ClassVar, Dict, List, Optional from typing import Optional, Set from typing_extensions import Self @@ -26,7 +25,7 @@ class RunCreationResponse(BaseModel): """ RunCreationResponse """ # noqa: E501 - application_run_id: StrictStr + application_run_id: Optional[StrictStr] = 'Application run id' __properties: ClassVar[List[str]] = ["application_run_id"] model_config = ConfigDict( @@ -80,8 +79,6 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: return cls.model_validate(obj) _obj = cls.model_validate({ - "application_run_id": obj.get("application_run_id") + "application_run_id": obj.get("application_run_id") if obj.get("application_run_id") is not None else 'Application run id' }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/run_read_response.py b/codegen/out/aignx/codegen/models/run_read_response.py index 7e8df261..79bbcf80 100644 --- a/codegen/out/aignx/codegen/models/run_read_response.py +++ b/codegen/out/aignx/codegen/models/run_read_response.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -18,7 +17,7 @@ import json from datetime import datetime -from pydantic import BaseModel, ConfigDict, StrictStr +from pydantic import BaseModel, ConfigDict, Field, StrictStr from typing import Any, ClassVar, Dict, List, Optional from aignx.codegen.models.application_run_status import ApplicationRunStatus from aignx.codegen.models.user_payload import UserPayload @@ -29,13 +28,13 @@ class RunReadResponse(BaseModel): """ RunReadResponse """ # noqa: E501 - application_run_id: StrictStr - application_version_id: StrictStr - organization_id: StrictStr + application_run_id: StrictStr = Field(description="UUID of the application") + application_version_id: StrictStr = Field(description="ID of the application version") + organization_id: StrictStr = Field(description="Organization of the owner of the application run") user_payload: Optional[UserPayload] = None - status: ApplicationRunStatus - triggered_at: datetime - triggered_by: StrictStr + status: ApplicationRunStatus = Field(description=" When the application run request is received by the Platform, the `status` of it is set to `received`. Then it is transitioned to `scheduled`, when it is scheduled for the processing. When the application run is scheduled, it will process the input items and generate the result incrementally. As soon as the first result is generated, the state is changed to `running`. The results can be downloaded via `/v1/runs/{run_id}/results` endpoint. When all items are processed and all results are generated, the application status is set to `completed`. If the processing is done, but some items fail, the status is set to `completed_with_error`. When the application run request is rejected by the Platform before scheduling, it is transferred to `rejected`. When the application run reaches the threshold of number of failed items, the whole application run is set to `canceled_system` and the remaining pending items are not processed. When the application run fails, the finished item results are available for download. If the application run is canceled by calling `POST /v1/runs/{run_id}/cancel` endpoint, the processing of the items is stopped, and the application status is set to `cancelled_user` ") + triggered_at: datetime = Field(description="Timestamp showing when the application run was triggered") + triggered_by: StrictStr = Field(description="Id of the user who triggered the application run") __properties: ClassVar[List[str]] = ["application_run_id", "application_version_id", "organization_id", "user_payload", "status", "triggered_at", "triggered_by"] model_config = ConfigDict( @@ -106,5 +105,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "triggered_by": obj.get("triggered_by") }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/slug_version_request.py b/codegen/out/aignx/codegen/models/slug_version_request.py deleted file mode 100644 index 78d45d67..00000000 --- a/codegen/out/aignx/codegen/models/slug_version_request.py +++ /dev/null @@ -1,97 +0,0 @@ -# coding: utf-8 - -""" - PAPI API Reference - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 1.0.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator -from typing import Any, ClassVar, Dict, List -from typing_extensions import Annotated -from typing import Optional, Set -from typing_extensions import Self - -class SlugVersionRequest(BaseModel): - """ - SlugVersionRequest - """ # noqa: E501 - application_slug: Annotated[str, Field(strict=True)] - version: StrictStr - __properties: ClassVar[List[str]] = ["application_slug", "version"] - - @field_validator('application_slug') - def application_slug_validate_regular_expression(cls, value): - """Validates the regular expression""" - if not re.match(r"^[a-z](-?[a-z])*$", value): - raise ValueError(r"must validate the regular expression /^[a-z](-?[a-z])*$/") - return value - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of SlugVersionRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of SlugVersionRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_slug": obj.get("application_slug"), - "version": obj.get("version") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/transfer_urls.py b/codegen/out/aignx/codegen/models/transfer_urls.py index f7c2e90c..ef04c0e0 100644 --- a/codegen/out/aignx/codegen/models/transfer_urls.py +++ b/codegen/out/aignx/codegen/models/transfer_urls.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -86,5 +85,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "download_url": obj.get("download_url") }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/user_payload.py b/codegen/out/aignx/codegen/models/user_payload.py index e6b58e13..1ecb0ab9 100644 --- a/codegen/out/aignx/codegen/models/user_payload.py +++ b/codegen/out/aignx/codegen/models/user_payload.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -115,5 +114,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "items": [PayloadItem.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/validation_error.py b/codegen/out/aignx/codegen/models/validation_error.py index c2d41de2..e7366b27 100644 --- a/codegen/out/aignx/codegen/models/validation_error.py +++ b/codegen/out/aignx/codegen/models/validation_error.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -95,5 +94,3 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "type": obj.get("type") }) return _obj - - diff --git a/codegen/out/aignx/codegen/models/validation_error_loc_inner.py b/codegen/out/aignx/codegen/models/validation_error_loc_inner.py index b2c780be..d823b933 100644 --- a/codegen/out/aignx/codegen/models/validation_error_loc_inner.py +++ b/codegen/out/aignx/codegen/models/validation_error_loc_inner.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) @@ -134,5 +133,3 @@ def to_dict(self) -> Optional[Union[Dict[str, Any], int, str]]: def to_str(self) -> str: """Returns the string representation of the actual instance""" return pprint.pformat(self.model_dump()) - - diff --git a/codegen/out/aignx/codegen/models/version_creation_request.py b/codegen/out/aignx/codegen/models/version_creation_request.py deleted file mode 100644 index 2dfc7257..00000000 --- a/codegen/out/aignx/codegen/models/version_creation_request.py +++ /dev/null @@ -1,113 +0,0 @@ -# coding: utf-8 - -""" - PAPI API Reference - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 1.0.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from aignx.codegen.models.input_artifact_schema_creation_request import InputArtifactSchemaCreationRequest -from aignx.codegen.models.output_artifact_schema_creation_request import OutputArtifactSchemaCreationRequest -from typing import Optional, Set -from typing_extensions import Self - -class VersionCreationRequest(BaseModel): - """ - VersionCreationRequest - """ # noqa: E501 - version: StrictStr - application_id: StrictStr - flow_id: StrictStr - changelog: StrictStr - input_artifacts: List[InputArtifactSchemaCreationRequest] - output_artifacts: List[OutputArtifactSchemaCreationRequest] - __properties: ClassVar[List[str]] = ["version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of VersionCreationRequest from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) - _items = [] - if self.input_artifacts: - for _item_input_artifacts in self.input_artifacts: - if _item_input_artifacts: - _items.append(_item_input_artifacts.to_dict()) - _dict['input_artifacts'] = _items - # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) - _items = [] - if self.output_artifacts: - for _item_output_artifacts in self.output_artifacts: - if _item_output_artifacts: - _items.append(_item_output_artifacts.to_dict()) - _dict['output_artifacts'] = _items - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of VersionCreationRequest from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "version": obj.get("version"), - "application_id": obj.get("application_id"), - "flow_id": obj.get("flow_id"), - "changelog": obj.get("changelog"), - "input_artifacts": [InputArtifactSchemaCreationRequest.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None, - "output_artifacts": [OutputArtifactSchemaCreationRequest.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/version_creation_response.py b/codegen/out/aignx/codegen/models/version_creation_response.py deleted file mode 100644 index c84ea15f..00000000 --- a/codegen/out/aignx/codegen/models/version_creation_response.py +++ /dev/null @@ -1,87 +0,0 @@ -# coding: utf-8 - -""" - PAPI API Reference - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 1.0.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List -from typing import Optional, Set -from typing_extensions import Self - -class VersionCreationResponse(BaseModel): - """ - VersionCreationResponse - """ # noqa: E501 - application_version_id: StrictStr - __properties: ClassVar[List[str]] = ["application_version_id"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of VersionCreationResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of VersionCreationResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_version_id": obj.get("application_version_id") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/models/version_read_response.py b/codegen/out/aignx/codegen/models/version_read_response.py deleted file mode 100644 index 52f01af2..00000000 --- a/codegen/out/aignx/codegen/models/version_read_response.py +++ /dev/null @@ -1,123 +0,0 @@ -# coding: utf-8 - -""" - PAPI API Reference - - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) - - The version of the OpenAPI document: 1.0.0 - Generated by OpenAPI Generator (https://openapi-generator.tech) - - Do not edit the class manually. -""" # noqa: E501 - - -from __future__ import annotations -import pprint -import re # noqa: F401 -import json - -from datetime import datetime -from pydantic import BaseModel, ConfigDict, StrictStr -from typing import Any, ClassVar, Dict, List, Optional -from aignx.codegen.models.input_artifact import InputArtifact -from aignx.codegen.models.output_artifact import OutputArtifact -from typing import Optional, Set -from typing_extensions import Self - -class VersionReadResponse(BaseModel): - """ - VersionReadResponse - """ # noqa: E501 - application_version_id: StrictStr - version: StrictStr - application_id: StrictStr - flow_id: Optional[StrictStr] = None - changelog: StrictStr - input_artifacts: List[InputArtifact] - output_artifacts: List[OutputArtifact] - created_at: datetime - __properties: ClassVar[List[str]] = ["application_version_id", "version", "application_id", "flow_id", "changelog", "input_artifacts", "output_artifacts", "created_at"] - - model_config = ConfigDict( - populate_by_name=True, - validate_assignment=True, - protected_namespaces=(), - ) - - - def to_str(self) -> str: - """Returns the string representation of the model using alias""" - return pprint.pformat(self.model_dump(by_alias=True)) - - def to_json(self) -> str: - """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) - - @classmethod - def from_json(cls, json_str: str) -> Optional[Self]: - """Create an instance of VersionReadResponse from a JSON string""" - return cls.from_dict(json.loads(json_str)) - - def to_dict(self) -> Dict[str, Any]: - """Return the dictionary representation of the model using alias. - - This has the following differences from calling pydantic's - `self.model_dump(by_alias=True)`: - - * `None` is only added to the output dict for nullable fields that - were set at model initialization. Other fields with value `None` - are ignored. - """ - excluded_fields: Set[str] = set([ - ]) - - _dict = self.model_dump( - by_alias=True, - exclude=excluded_fields, - exclude_none=True, - ) - # override the default output from pydantic by calling `to_dict()` of each item in input_artifacts (list) - _items = [] - if self.input_artifacts: - for _item_input_artifacts in self.input_artifacts: - if _item_input_artifacts: - _items.append(_item_input_artifacts.to_dict()) - _dict['input_artifacts'] = _items - # override the default output from pydantic by calling `to_dict()` of each item in output_artifacts (list) - _items = [] - if self.output_artifacts: - for _item_output_artifacts in self.output_artifacts: - if _item_output_artifacts: - _items.append(_item_output_artifacts.to_dict()) - _dict['output_artifacts'] = _items - # set to None if flow_id (nullable) is None - # and model_fields_set contains the field - if self.flow_id is None and "flow_id" in self.model_fields_set: - _dict['flow_id'] = None - - return _dict - - @classmethod - def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: - """Create an instance of VersionReadResponse from a dict""" - if obj is None: - return None - - if not isinstance(obj, dict): - return cls.model_validate(obj) - - _obj = cls.model_validate({ - "application_version_id": obj.get("application_version_id"), - "version": obj.get("version"), - "application_id": obj.get("application_id"), - "flow_id": obj.get("flow_id"), - "changelog": obj.get("changelog"), - "input_artifacts": [InputArtifact.from_dict(_item) for _item in obj["input_artifacts"]] if obj.get("input_artifacts") is not None else None, - "output_artifacts": [OutputArtifact.from_dict(_item) for _item in obj["output_artifacts"]] if obj.get("output_artifacts") is not None else None, - "created_at": obj.get("created_at") - }) - return _obj - - diff --git a/codegen/out/aignx/codegen/rest.py b/codegen/out/aignx/codegen/rest.py index 401902fb..7cf7f672 100644 --- a/codegen/out/aignx/codegen/rest.py +++ b/codegen/out/aignx/codegen/rest.py @@ -1,9 +1,8 @@ -# coding: utf-8 """ - PAPI API Reference + Aignostics Platform API reference - No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. The version of the OpenAPI document: 1.0.0 Generated by OpenAPI Generator (https://openapi-generator.tech) diff --git a/codegen/out/docs/ExternalsApi.md b/codegen/out/docs/ExternalsApi.md deleted file mode 100644 index 59e61f75..00000000 --- a/codegen/out/docs/ExternalsApi.md +++ /dev/null @@ -1,879 +0,0 @@ -# aignx.codegen.ExternalsApi - -All URIs are relative to *http://localhost* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**cancel_run_v1_runs_application_run_id_cancel_post**](ExternalsApi.md#cancel_run_v1_runs_application_run_id_cancel_post) | **POST** /v1/runs/{application_run_id}/cancel | Cancel Run -[**create_application_run_v1_runs_post**](ExternalsApi.md#create_application_run_v1_runs_post) | **POST** /v1/runs | Create Application Run -[**delete_run_results_v1_runs_application_run_id_results_delete**](ExternalsApi.md#delete_run_results_v1_runs_application_run_id_results_delete) | **DELETE** /v1/runs/{application_run_id}/results | Delete Run Results -[**get_run_v1_runs_application_run_id_get**](ExternalsApi.md#get_run_v1_runs_application_run_id_get) | **GET** /v1/runs/{application_run_id} | Get Run -[**get_version_v1_versions_application_version_id_get**](ExternalsApi.md#get_version_v1_versions_application_version_id_get) | **GET** /v1/versions/{application_version_id} | Get Version -[**list_application_runs_v1_runs_get**](ExternalsApi.md#list_application_runs_v1_runs_get) | **GET** /v1/runs | List Application Runs -[**list_applications_v1_applications_get**](ExternalsApi.md#list_applications_v1_applications_get) | **GET** /v1/applications | List Applications -[**list_run_results_v1_runs_application_run_id_results_get**](ExternalsApi.md#list_run_results_v1_runs_application_run_id_results_get) | **GET** /v1/runs/{application_run_id}/results | List Run Results -[**list_versions_by_application_id_v1_applications_application_id_versions_get**](ExternalsApi.md#list_versions_by_application_id_v1_applications_application_id_versions_get) | **GET** /v1/applications/{application_id}/versions | List Versions By Application Id -[**list_versions_by_application_slug_v1_applications_application_slug_versions_get**](ExternalsApi.md#list_versions_by_application_slug_v1_applications_application_slug_versions_get) | **GET** /v1/applications/{application_slug}/versions | List Versions By Application Slug -[**read_application_by_slug_v1_applications_application_slug_get**](ExternalsApi.md#read_application_by_slug_v1_applications_application_slug_get) | **GET** /v1/applications/{application_slug} | Read Application By Slug -[**register_version_v1_versions_post**](ExternalsApi.md#register_version_v1_versions_post) | **POST** /v1/versions | Register Version - - -# **cancel_run_v1_runs_application_run_id_cancel_post** -> object cancel_run_v1_runs_application_run_id_cancel_post(application_run_id) - -Cancel Run - -### Example - - -```python -import aignx.codegen -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | - - try: - # Cancel Run - api_response = api_instance.cancel_run_v1_runs_application_run_id_cancel_post(application_run_id) - print("The response of ExternalsApi->cancel_run_v1_runs_application_run_id_cancel_post:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->cancel_run_v1_runs_application_run_id_cancel_post: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | - -### Return type - -**object** - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**202** | Successful Response | - | -**404** | Application run not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **create_application_run_v1_runs_post** -> RunCreationResponse create_application_run_v1_runs_post(run_creation_request) - -Create Application Run - -### Example - - -```python -import aignx.codegen -from aignx.codegen.models.run_creation_request import RunCreationRequest -from aignx.codegen.models.run_creation_response import RunCreationResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - run_creation_request = aignx.codegen.RunCreationRequest() # RunCreationRequest | - - try: - # Create Application Run - api_response = api_instance.create_application_run_v1_runs_post(run_creation_request) - print("The response of ExternalsApi->create_application_run_v1_runs_post:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->create_application_run_v1_runs_post: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **run_creation_request** | [**RunCreationRequest**](RunCreationRequest.md)| | - -### Return type - -[**RunCreationResponse**](RunCreationResponse.md) - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**201** | Successful Response | - | -**404** | Application run not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **delete_run_results_v1_runs_application_run_id_results_delete** -> delete_run_results_v1_runs_application_run_id_results_delete(application_run_id) - -Delete Run Results - -### Example - - -```python -import aignx.codegen -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | - - try: - # Delete Run Results - api_instance.delete_run_results_v1_runs_application_run_id_results_delete(application_run_id) - except Exception as e: - print("Exception when calling ExternalsApi->delete_run_results_v1_runs_application_run_id_results_delete: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | - -### Return type - -void (empty response body) - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**204** | Successful Response | - | -**404** | Application run not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **get_run_v1_runs_application_run_id_get** -> RunReadResponse get_run_v1_runs_application_run_id_get(application_run_id, include=include) - -Get Run - -### Example - - -```python -import aignx.codegen -from aignx.codegen.models.run_read_response import RunReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | - include = None # List[object] | (optional) - - try: - # Get Run - api_response = api_instance.get_run_v1_runs_application_run_id_get(application_run_id, include=include) - print("The response of ExternalsApi->get_run_v1_runs_application_run_id_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->get_run_v1_runs_application_run_id_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | - **include** | [**List[object]**](object.md)| | [optional] - -### Return type - -[**RunReadResponse**](RunReadResponse.md) - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**404** | Application run not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **get_version_v1_versions_application_version_id_get** -> VersionReadResponse get_version_v1_versions_application_version_id_get(application_version_id, include=include) - -Get Version - -### Example - - -```python -import aignx.codegen -from aignx.codegen.models.version_read_response import VersionReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_version_id = 'application_version_id_example' # str | - include = None # List[object] | (optional) - - try: - # Get Version - api_response = api_instance.get_version_v1_versions_application_version_id_get(application_version_id, include=include) - print("The response of ExternalsApi->get_version_v1_versions_application_version_id_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->get_version_v1_versions_application_version_id_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_version_id** | **str**| | - **include** | [**List[object]**](object.md)| | [optional] - -### Return type - -[**VersionReadResponse**](VersionReadResponse.md) - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **list_application_runs_v1_runs_get** -> List[RunReadResponse] list_application_runs_v1_runs_get(application_id=application_id, application_version_id=application_version_id, include=include, page=page, page_size=page_size, sort=sort) - -List Application Runs - -### Example - - -```python -import aignx.codegen -from aignx.codegen.models.run_read_response import RunReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_id = 'application_id_example' # str | (optional) - application_version_id = 'application_version_id_example' # str | (optional) - include = None # List[object] | (optional) - page = 1 # int | (optional) (default to 1) - page_size = 50 # int | (optional) (default to 50) - sort = ['sort_example'] # List[str] | (optional) - - try: - # List Application Runs - api_response = api_instance.list_application_runs_v1_runs_get(application_id=application_id, application_version_id=application_version_id, include=include, page=page, page_size=page_size, sort=sort) - print("The response of ExternalsApi->list_application_runs_v1_runs_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->list_application_runs_v1_runs_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_id** | **str**| | [optional] - **application_version_id** | **str**| | [optional] - **include** | [**List[object]**](object.md)| | [optional] - **page** | **int**| | [optional] [default to 1] - **page_size** | **int**| | [optional] [default to 50] - **sort** | [**List[str]**](str.md)| | [optional] - -### Return type - -[**List[RunReadResponse]**](RunReadResponse.md) - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**404** | Application run not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **list_applications_v1_applications_get** -> List[ApplicationReadResponse] list_applications_v1_applications_get(page=page, page_size=page_size, sort=sort) - -List Applications - -### Example - - -```python -import aignx.codegen -from aignx.codegen.models.application_read_response import ApplicationReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - page = 1 # int | (optional) (default to 1) - page_size = 50 # int | (optional) (default to 50) - sort = ['sort_example'] # List[str] | (optional) - - try: - # List Applications - api_response = api_instance.list_applications_v1_applications_get(page=page, page_size=page_size, sort=sort) - print("The response of ExternalsApi->list_applications_v1_applications_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->list_applications_v1_applications_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **page** | **int**| | [optional] [default to 1] - **page_size** | **int**| | [optional] [default to 50] - **sort** | [**List[str]**](str.md)| | [optional] - -### Return type - -[**List[ApplicationReadResponse]**](ApplicationReadResponse.md) - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **list_run_results_v1_runs_application_run_id_results_get** -> List[ItemResultReadResponse] list_run_results_v1_runs_application_run_id_results_get(application_run_id, item_id__in=item_id__in, page=page, page_size=page_size, reference__in=reference__in, status__in=status__in, sort=sort) - -List Run Results - -### Example - - -```python -import aignx.codegen -from aignx.codegen.models.item_result_read_response import ItemResultReadResponse -from aignx.codegen.models.item_status import ItemStatus -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_run_id = 'application_run_id_example' # str | - item_id__in = ['item_id__in_example'] # List[Optional[str]] | (optional) - page = 1 # int | (optional) (default to 1) - page_size = 50 # int | (optional) (default to 50) - reference__in = ['reference__in_example'] # List[str] | (optional) - status__in = [aignx.codegen.ItemStatus()] # List[ItemStatus] | (optional) - sort = ['sort_example'] # List[str] | (optional) - - try: - # List Run Results - api_response = api_instance.list_run_results_v1_runs_application_run_id_results_get(application_run_id, item_id__in=item_id__in, page=page, page_size=page_size, reference__in=reference__in, status__in=status__in, sort=sort) - print("The response of ExternalsApi->list_run_results_v1_runs_application_run_id_results_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->list_run_results_v1_runs_application_run_id_results_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_run_id** | **str**| | - **item_id__in** | [**List[Optional[str]]**](str.md)| | [optional] - **page** | **int**| | [optional] [default to 1] - **page_size** | **int**| | [optional] [default to 50] - **reference__in** | [**List[str]**](str.md)| | [optional] - **status__in** | [**List[ItemStatus]**](ItemStatus.md)| | [optional] - **sort** | [**List[str]**](str.md)| | [optional] - -### Return type - -[**List[ItemResultReadResponse]**](ItemResultReadResponse.md) - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**404** | Application run not found | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **list_versions_by_application_id_v1_applications_application_id_versions_get** -> List[ApplicationVersionReadResponse] list_versions_by_application_id_v1_applications_application_id_versions_get(application_id, page=page, page_size=page_size, version=version, include=include, sort=sort) - -List Versions By Application Id - -### Example - - -```python -import aignx.codegen -from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_id = 'application_id_example' # str | - page = 1 # int | (optional) (default to 1) - page_size = 50 # int | (optional) (default to 50) - version = 'version_example' # str | (optional) - include = None # List[object] | (optional) - sort = ['sort_example'] # List[str] | (optional) - - try: - # List Versions By Application Id - api_response = api_instance.list_versions_by_application_id_v1_applications_application_id_versions_get(application_id, page=page, page_size=page_size, version=version, include=include, sort=sort) - print("The response of ExternalsApi->list_versions_by_application_id_v1_applications_application_id_versions_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->list_versions_by_application_id_v1_applications_application_id_versions_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_id** | **str**| | - **page** | **int**| | [optional] [default to 1] - **page_size** | **int**| | [optional] [default to 50] - **version** | **str**| | [optional] - **include** | [**List[object]**](object.md)| | [optional] - **sort** | [**List[str]**](str.md)| | [optional] - -### Return type - -[**List[ApplicationVersionReadResponse]**](ApplicationVersionReadResponse.md) - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **list_versions_by_application_slug_v1_applications_application_slug_versions_get** -> List[ApplicationVersionReadResponse] list_versions_by_application_slug_v1_applications_application_slug_versions_get(application_slug, page=page, page_size=page_size, version=version, include=include, sort=sort) - -List Versions By Application Slug - -### Example - - -```python -import aignx.codegen -from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_slug = 'application_slug_example' # str | - page = 1 # int | (optional) (default to 1) - page_size = 50 # int | (optional) (default to 50) - version = 'version_example' # str | (optional) - include = None # List[object] | (optional) - sort = ['sort_example'] # List[str] | (optional) - - try: - # List Versions By Application Slug - api_response = api_instance.list_versions_by_application_slug_v1_applications_application_slug_versions_get(application_slug, page=page, page_size=page_size, version=version, include=include, sort=sort) - print("The response of ExternalsApi->list_versions_by_application_slug_v1_applications_application_slug_versions_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->list_versions_by_application_slug_v1_applications_application_slug_versions_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_slug** | **str**| | - **page** | **int**| | [optional] [default to 1] - **page_size** | **int**| | [optional] [default to 50] - **version** | **str**| | [optional] - **include** | [**List[object]**](object.md)| | [optional] - **sort** | [**List[str]**](str.md)| | [optional] - -### Return type - -[**List[ApplicationVersionReadResponse]**](ApplicationVersionReadResponse.md) - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **read_application_by_slug_v1_applications_application_slug_get** -> ApplicationReadResponse read_application_by_slug_v1_applications_application_slug_get(application_slug) - -Read Application By Slug - -### Example - - -```python -import aignx.codegen -from aignx.codegen.models.application_read_response import ApplicationReadResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - application_slug = 'application_slug_example' # str | - - try: - # Read Application By Slug - api_response = api_instance.read_application_by_slug_v1_applications_application_slug_get(application_slug) - print("The response of ExternalsApi->read_application_by_slug_v1_applications_application_slug_get:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->read_application_by_slug_v1_applications_application_slug_get: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **application_slug** | **str**| | - -### Return type - -[**ApplicationReadResponse**](ApplicationReadResponse.md) - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**200** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - -# **register_version_v1_versions_post** -> VersionCreationResponse register_version_v1_versions_post(version_creation_request) - -Register Version - -### Example - - -```python -import aignx.codegen -from aignx.codegen.models.version_creation_request import VersionCreationRequest -from aignx.codegen.models.version_creation_response import VersionCreationResponse -from aignx.codegen.rest import ApiException -from pprint import pprint - -# Defining the host is optional and defaults to http://localhost -# See configuration.py for a list of all supported configuration parameters. -configuration = aignx.codegen.Configuration( - host = "http://localhost" -) - - -# Enter a context with an instance of the API client -with aignx.codegen.ApiClient(configuration) as api_client: - # Create an instance of the API class - api_instance = aignx.codegen.ExternalsApi(api_client) - version_creation_request = aignx.codegen.VersionCreationRequest() # VersionCreationRequest | - - try: - # Register Version - api_response = api_instance.register_version_v1_versions_post(version_creation_request) - print("The response of ExternalsApi->register_version_v1_versions_post:\n") - pprint(api_response) - except Exception as e: - print("Exception when calling ExternalsApi->register_version_v1_versions_post: %s\n" % e) -``` - - - -### Parameters - - -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **version_creation_request** | [**VersionCreationRequest**](VersionCreationRequest.md)| | - -### Return type - -[**VersionCreationResponse**](VersionCreationResponse.md) - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: application/json - - **Accept**: application/json - -### HTTP response details - -| Status code | Description | Response headers | -|-------------|-------------|------------------| -**201** | Successful Response | - | -**422** | Validation Error | - | - -[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) - diff --git a/codegen/out/docs/PublicApi.md b/codegen/out/docs/PublicApi.md new file mode 100644 index 00000000..c37c0f62 --- /dev/null +++ b/codegen/out/docs/PublicApi.md @@ -0,0 +1,665 @@ +# aignx.codegen.PublicApi + +All URIs are relative to */api* + +Method | HTTP request | Description +------------- | ------------- | ------------- +[**cancel_application_run_v1_runs_application_run_id_cancel_post**](PublicApi.md#cancel_application_run_v1_runs_application_run_id_cancel_post) | **POST** /v1/runs/{application_run_id}/cancel | Cancel Application Run +[**create_application_run_v1_runs_post**](PublicApi.md#create_application_run_v1_runs_post) | **POST** /v1/runs | Create Application Run +[**delete_application_run_results_v1_runs_application_run_id_results_delete**](PublicApi.md#delete_application_run_results_v1_runs_application_run_id_results_delete) | **DELETE** /v1/runs/{application_run_id}/results | Delete Application Run Results +[**get_run_v1_runs_application_run_id_get**](PublicApi.md#get_run_v1_runs_application_run_id_get) | **GET** /v1/runs/{application_run_id} | Get Run +[**list_application_runs_v1_runs_get**](PublicApi.md#list_application_runs_v1_runs_get) | **GET** /v1/runs | List Application Runs +[**list_applications_v1_applications_get**](PublicApi.md#list_applications_v1_applications_get) | **GET** /v1/applications | List Applications +[**list_run_results_v1_runs_application_run_id_results_get**](PublicApi.md#list_run_results_v1_runs_application_run_id_results_get) | **GET** /v1/runs/{application_run_id}/results | List Run Results +[**list_versions_by_application_id_v1_applications_application_id_versions_get**](PublicApi.md#list_versions_by_application_id_v1_applications_application_id_versions_get) | **GET** /v1/applications/{application_id}/versions | List Versions By Application Id + + +# **cancel_application_run_v1_runs_application_run_id_cancel_post** +> object cancel_application_run_v1_runs_application_run_id_cancel_post(application_run_id) + +Cancel Application Run + +The application run can be canceled by the user who created the application run. The execution can be canceled any time while the application is not in a final state. The pending items will not be processed and will not add to the cost. When the application is canceled, the already completed items stay available for download. + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to /api +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "/api" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.PublicApi(api_client) + application_run_id = 'application_run_id_example' # str | Application run id, returned by `POST /runs/` endpoint + + try: + # Cancel Application Run + api_response = api_instance.cancel_application_run_v1_runs_application_run_id_cancel_post(application_run_id) + print("The response of PublicApi->cancel_application_run_v1_runs_application_run_id_cancel_post:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling PublicApi->cancel_application_run_v1_runs_application_run_id_cancel_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_run_id** | **str**| Application run id, returned by `POST /runs/` endpoint | + +### Return type + +**object** + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**202** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **create_application_run_v1_runs_post** +> RunCreationResponse create_application_run_v1_runs_post(run_creation_request) + +Create Application Run + +The endpoint is used to process the input items by the chosen application version. The endpoint returns the `application_run_id`. The processing fo the items is done asynchronously. To check the status or cancel the execution, use the /v1/runs/{application_run_id} endpoint. ### Payload The payload includes `application_version_id` and `items` base fields. `application_version_id` is the id used for `/v1/versions/{application_id}` endpoint. `items` includes the list of the items to process (slides, in case of HETA application). Every item has a set of standard fields defined by the API, plus the metadata, specific to the chosen application. Example payload structure with the comments: ``` { application_version_id: \"heta:v1.0.0\", items: [{ \"reference\": \"slide_1\" <-- Input ID to connect the input and the output artifact \"input_artifacts\": [{ \"name\": \"input_slide\" <-- Name of the artifact defined by the application (For HETA it is\"input_slide\") \"download_url\": \"https://...\" <-- signed URL to the input file in the S3 or GCS. Should be valid for more than 6 days \"metadata\": { <-- The metadata fields defined by the application. (The example fields set for a slide files are provided) \"checksum_crc32c\": \"abc12==\", \"mime_type\": \"image/tiff\", \"height\": 100, \"weight\": 500, \"mpp\": 0.543 } }] }] } ``` ### Response The endpoint returns the application run UUID. After that the job is scheduled for the execution in the background. To check the status of the run call `v1/runs/{application_run_id}`. ### Rejection Apart from the authentication, authorization and malformed input error, the request can be rejected when the quota limit is exceeded. More details on quotas is described in the documentation + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.run_creation_request import RunCreationRequest +from aignx.codegen.models.run_creation_response import RunCreationResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to /api +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "/api" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.PublicApi(api_client) + run_creation_request = aignx.codegen.RunCreationRequest() # RunCreationRequest | + + try: + # Create Application Run + api_response = api_instance.create_application_run_v1_runs_post(run_creation_request) + print("The response of PublicApi->create_application_run_v1_runs_post:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling PublicApi->create_application_run_v1_runs_post: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **run_creation_request** | [**RunCreationRequest**](RunCreationRequest.md)| | + +### Return type + +[**RunCreationResponse**](RunCreationResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**201** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **delete_application_run_results_v1_runs_application_run_id_results_delete** +> delete_application_run_results_v1_runs_application_run_id_results_delete(application_run_id) + +Delete Application Run Results + +Delete the application run results. It can only be called when the application is in a final state (meaning it's not in `received` or `pending` states). To delete the results of the running artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel the application run. The output results are deleted automatically 30 days after the application run is finished. + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to /api +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "/api" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.PublicApi(api_client) + application_run_id = 'application_run_id_example' # str | Application run id, returned by `POST /runs/` endpoint + + try: + # Delete Application Run Results + api_instance.delete_application_run_results_v1_runs_application_run_id_results_delete(application_run_id) + except Exception as e: + print("Exception when calling PublicApi->delete_application_run_results_v1_runs_application_run_id_results_delete: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_run_id** | **str**| Application run id, returned by `POST /runs/` endpoint | + +### Return type + +void (empty response body) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**204** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **get_run_v1_runs_application_run_id_get** +> RunReadResponse get_run_v1_runs_application_run_id_get(application_run_id, include=include) + +Get Run + +Returns the details of the application run. The application run is available as soon as it is created via `POST /runs/` endpoint. To download the items results, call `/runs/{application_run_id}/results`. The application is only available to the user who triggered it, regardless of the role. + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.run_read_response import RunReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to /api +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "/api" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.PublicApi(api_client) + application_run_id = 'application_run_id_example' # str | Application run id, returned by `POST /runs/` endpoint + include = None # List[object] | (optional) + + try: + # Get Run + api_response = api_instance.get_run_v1_runs_application_run_id_get(application_run_id, include=include) + print("The response of PublicApi->get_run_v1_runs_application_run_id_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling PublicApi->get_run_v1_runs_application_run_id_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_run_id** | **str**| Application run id, returned by `POST /runs/` endpoint | + **include** | [**List[object]**](object.md)| | [optional] + +### Return type + +[**RunReadResponse**](RunReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_application_runs_v1_runs_get** +> List[RunReadResponse] list_application_runs_v1_runs_get(application_id=application_id, application_version=application_version, include=include, page=page, page_size=page_size, sort=sort) + +List Application Runs + +The endpoint returns the application runs triggered by the caller. After the application run is created by POST /v1/runs, it becomes available for the current endpoint + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.run_read_response import RunReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to /api +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "/api" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.PublicApi(api_client) + application_id = 'application_id_example' # str | Optional application ID filter (optional) + application_version = 'application_version_example' # str | Optional application version filter (optional) + include = None # List[object] | Request optional output values. Used internally by the platform (optional) + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Application Runs + api_response = api_instance.list_application_runs_v1_runs_get(application_id=application_id, application_version=application_version, include=include, page=page, page_size=page_size, sort=sort) + print("The response of PublicApi->list_application_runs_v1_runs_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling PublicApi->list_application_runs_v1_runs_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_id** | **str**| Optional application ID filter | [optional] + **application_version** | **str**| Optional application version filter | [optional] + **include** | [**List[object]**](object.md)| Request optional output values. Used internally by the platform | [optional] + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[RunReadResponse]**](RunReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_applications_v1_applications_get** +> List[ApplicationReadResponse] list_applications_v1_applications_get(page=page, page_size=page_size, sort=sort) + +List Applications + +Returns the list of the applications, available to the caller. The application is available if any of the version of the application is assigned to the user organization. To switch between organizations, the user should re-login and choose the needed organization. + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.application_read_response import ApplicationReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to /api +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "/api" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.PublicApi(api_client) + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Applications + api_response = api_instance.list_applications_v1_applications_get(page=page, page_size=page_size, sort=sort) + print("The response of PublicApi->list_applications_v1_applications_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling PublicApi->list_applications_v1_applications_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[ApplicationReadResponse]**](ApplicationReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_run_results_v1_runs_application_run_id_results_get** +> List[ItemResultReadResponse] list_run_results_v1_runs_application_run_id_results_get(application_run_id, item_id__in=item_id__in, reference__in=reference__in, status__in=status__in, page=page, page_size=page_size, sort=sort) + +List Run Results + +Get the list of the results for the run items + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.item_result_read_response import ItemResultReadResponse +from aignx.codegen.models.item_status import ItemStatus +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to /api +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "/api" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.PublicApi(api_client) + application_run_id = 'application_run_id_example' # str | Application run id, returned by `POST /runs/` endpoint + item_id__in = ['item_id__in_example'] # List[str] | Filter for items ids (optional) + reference__in = ['reference__in_example'] # List[str] | Filter for items by their reference from the input payload (optional) + status__in = [aignx.codegen.ItemStatus()] # List[ItemStatus] | Filter for items in certain statuses (optional) + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Run Results + api_response = api_instance.list_run_results_v1_runs_application_run_id_results_get(application_run_id, item_id__in=item_id__in, reference__in=reference__in, status__in=status__in, page=page, page_size=page_size, sort=sort) + print("The response of PublicApi->list_run_results_v1_runs_application_run_id_results_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling PublicApi->list_run_results_v1_runs_application_run_id_results_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_run_id** | **str**| Application run id, returned by `POST /runs/` endpoint | + **item_id__in** | [**List[str]**](str.md)| Filter for items ids | [optional] + **reference__in** | [**List[str]**](str.md)| Filter for items by their reference from the input payload | [optional] + **status__in** | [**List[ItemStatus]**](ItemStatus.md)| Filter for items in certain statuses | [optional] + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[ItemResultReadResponse]**](ItemResultReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**404** | Application run not found | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **list_versions_by_application_id_v1_applications_application_id_versions_get** +> List[ApplicationVersionReadResponse] list_versions_by_application_id_v1_applications_application_id_versions_get(application_id, page=page, page_size=page_size, version=version, include=include, sort=sort) + +List Versions By Application Id + +Returns the list of the application versions for this application, available to the caller. The application version is available if it is assigned to the user's organization. The application versions are assigned to the organization by the Aignostics admin. To assign or unassign a version from your organization, please contact Aignostics support team. + +### Example + +* OAuth Authentication (OAuth2AuthorizationCodeBearer): + +```python +import aignx.codegen +from aignx.codegen.models.application_version_read_response import ApplicationVersionReadResponse +from aignx.codegen.rest import ApiException +from pprint import pprint + +# Defining the host is optional and defaults to /api +# See configuration.py for a list of all supported configuration parameters. +configuration = aignx.codegen.Configuration( + host = "/api" +) + +# The client must configure the authentication and authorization parameters +# in accordance with the API server security policy. +# Examples for each auth method are provided below, use the example that +# satisfies your auth use case. + +configuration.access_token = os.environ["ACCESS_TOKEN"] + +# Enter a context with an instance of the API client +with aignx.codegen.ApiClient(configuration) as api_client: + # Create an instance of the API class + api_instance = aignx.codegen.PublicApi(api_client) + application_id = 'application_id_example' # str | + page = 1 # int | (optional) (default to 1) + page_size = 50 # int | (optional) (default to 50) + version = 'version_example' # str | (optional) + include = None # List[object] | (optional) + sort = ['sort_example'] # List[str] | (optional) + + try: + # List Versions By Application Id + api_response = api_instance.list_versions_by_application_id_v1_applications_application_id_versions_get(application_id, page=page, page_size=page_size, version=version, include=include, sort=sort) + print("The response of PublicApi->list_versions_by_application_id_v1_applications_application_id_versions_get:\n") + pprint(api_response) + except Exception as e: + print("Exception when calling PublicApi->list_versions_by_application_id_v1_applications_application_id_versions_get: %s\n" % e) +``` + + + +### Parameters + + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **application_id** | **str**| | + **page** | **int**| | [optional] [default to 1] + **page_size** | **int**| | [optional] [default to 50] + **version** | **str**| | [optional] + **include** | [**List[object]**](object.md)| | [optional] + **sort** | [**List[str]**](str.md)| | [optional] + +### Return type + +[**List[ApplicationVersionReadResponse]**](ApplicationVersionReadResponse.md) + +### Authorization + +[OAuth2AuthorizationCodeBearer](../README.md#OAuth2AuthorizationCodeBearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +### HTTP response details + +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**200** | Successful Response | - | +**422** | Validation Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/partials/README_main.md b/docs/partials/README_main.md index 4e358b22..f12f6d3a 100644 --- a/docs/partials/README_main.md +++ b/docs/partials/README_main.md @@ -1,6 +1,3 @@ -from aignx.codegen.models import ItemCreationRequestfrom aignx.codegen.models -import ItemCreationRequestfrom aignx.codegen.models import RunCreationRequest - ## Introduction The aignostics Python SDK opens multiple pathways to interact with the @@ -141,23 +138,30 @@ pip install aignostics The following snippet shows how to use the Python SDK to trigger an application run: ```python -import aignostics.client -from aignx.codegen.models import ( - ApplicationVersion, - RunCreationRequest, - ItemCreationRequest -) +import aignostics.client as platform # initialize the client -client = aignostics.client.Client() +client = platform.Client() # trigger an application run application_run = client.runs.create( - RunCreationRequest( - application_version=ApplicationVersion("..."), - items=[ - ItemCreationRequest(...) - ], - ) + application_version="two-task-dummy:v0.35.0", + items=[ + platform.Item( + reference="slide-1", + input_artifacts=[ + platform.InputArtifact( + name="user_slide", + download_url="", + metadata={ + "checksum_crc32c": "AAAAAA==", + "base_mpp": 0.25, + "width": 1000, + "height": 1000, + }, + ) + ], + ), + ], ) # wait for the results and download incrementally as they become available application_run.download_to_folder("path/to/download/folder") diff --git a/docs/source/_static/openapi_v1.json b/docs/source/_static/openapi_v1.json index 5c30db4f..0fc1004e 100644 --- a/docs/source/_static/openapi_v1.json +++ b/docs/source/_static/openapi_v1.json @@ -1,22 +1,29 @@ { "openapi": "3.1.0", "info": { - "title": "PAPI API Reference", + "title": "Aignostics Platform API reference", + "description": "\nPagination is done via `page` and `page_size`. Sorting via `sort` query parameter.\nThe `sort` query parameter can be provided multiple times. The sorting direction can be indicated via\n`+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`.", "version": "1.0.0" }, "servers": [ { - "url": "" + "url": "/api" } ], "paths": { "/v1/applications": { "get": { "tags": [ - "Externals" + "Public" ], "summary": "List Applications", + "description": "Returns the list of the applications, available to the caller.\n\nThe application is available if any of the version of the application is assigned to the\nuser organization. To switch between organizations, the user should re-login and choose the\nneeded organization.", "operationId": "list_applications_v1_applications_get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], "parameters": [ { "name": "page", @@ -89,21 +96,108 @@ } } }, - "/v1/applications/{application_slug}": { + "/v1/applications/{application_id}/versions": { "get": { "tags": [ - "Externals" + "Public" + ], + "summary": "List Versions By Application Id", + "description": "Returns the list of the application versions for this application, available to the caller.\n\nThe application version is available if it is assigned to the user's organization.\n\nThe application versions are assigned to the organization by the Aignostics admin. To\nassign or unassign a version from your organization, please contact Aignostics support team.", + "operationId": "list_versions_by_application_id_v1_applications__application_id__versions_get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } ], - "summary": "Read Application By Slug", - "operationId": "read_application_by_slug_v1_applications__application_slug__get", "parameters": [ { - "name": "application_slug", + "name": "application_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Application Slug" + "title": "Application Id" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "default": 1, + "title": "Page" + } + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 5, + "default": 50, + "title": "Page Size" + } + }, + { + "name": "version", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Version" + } + }, + { + "name": "include", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "prefixItems": [ + { + "type": "string" + } + ], + "minItems": 1, + "maxItems": 1 + }, + { + "type": "null" + } + ], + "title": "Include" + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "title": "Sort" } } ], @@ -113,7 +207,11 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ApplicationReadResponse" + "type": "array", + "items": { + "$ref": "#/components/schemas/ApplicationVersionReadResponse" + }, + "title": "Response List Versions By Application Id V1 Applications Application Id Versions Get" } } } @@ -134,10 +232,16 @@ "/v1/runs": { "get": { "tags": [ - "Externals" + "Public" ], "summary": "List Application Runs", + "description": "The endpoint returns the application runs triggered by the caller. After the application run\nis created by POST /v1/runs, it becomes available for the current endpoint", "operationId": "list_application_runs_v1_runs_get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], "parameters": [ { "name": "application_id", @@ -146,32 +250,34 @@ "schema": { "anyOf": [ { - "type": "string", - "format": "uuid" + "type": "string" }, { "type": "null" } ], + "description": "Optional application ID filter", "title": "Application Id" - } + }, + "description": "Optional application ID filter" }, { - "name": "application_version_id", + "name": "application_version", "in": "query", "required": false, "schema": { "anyOf": [ { - "type": "string", - "format": "uuid" + "type": "string" }, { "type": "null" } ], - "title": "Application Version Id" - } + "description": "Optional application version filter", + "title": "Application Version" + }, + "description": "Optional application version filter" }, { "name": "include", @@ -193,8 +299,10 @@ "type": "null" } ], + "description": "Request optional output values. Used internally by the platform", "title": "Include" - } + }, + "description": "Request optional output values. Used internally by the platform" }, { "name": "page", @@ -271,10 +379,16 @@ }, "post": { "tags": [ - "Externals" + "Public" ], "summary": "Create Application Run", + "description": "The endpoint is used to process the input items by the chosen application version. The endpoint\nreturns the `application_run_id`. The processing fo the items is done asynchronously.\n\nTo check the status or cancel the execution, use the /v1/runs/{application_run_id} endpoint.\n\n### Payload\n\nThe payload includes `application_version_id` and `items` base fields.\n\n`application_version_id` is the id used for `/v1/versions/{application_id}` endpoint.\n\n`items` includes the list of the items to process (slides, in case of HETA application).\nEvery item has a set of standard fields defined by the API, plus the metadata, specific to the\nchosen application.\n\nExample payload structure with the comments:\n```\n{\n application_version_id: \"heta:v1.0.0\",\n items: [{\n \"reference\": \"slide_1\" <-- Input ID to connect the input and the output artifact\n \"input_artifacts\": [{\n \"name\": \"input_slide\" <-- Name of the artifact defined by the application (For HETA it is\"input_slide\")\n \"download_url\": \"https://...\" <-- signed URL to the input file in the S3 or GCS. Should be valid for more than 6 days\n \"metadata\": { <-- The metadata fields defined by the application. (The example fields set for a slide files are provided)\n \"checksum_crc32c\": \"abc12==\",\n \"mime_type\": \"image/tiff\",\n \"height\": 100,\n \"weight\": 500,\n \"mpp\": 0.543\n }\n }]\n }]\n}\n```\n\n### Response\n\nThe endpoint returns the application run UUID. After that the job is scheduled for the\nexecution in the background.\n\nTo check the status of the run call `v1/runs/{application_run_id}`.\n\n### Rejection\n\nApart from the authentication, authorization and malformed input error, the request can be\nrejected when the quota limit is exceeded. More details on quotas is described in the\ndocumentation", "operationId": "create_application_run_v1_runs_post", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], "requestBody": { "required": true, "content": { @@ -315,10 +429,16 @@ "/v1/runs/{application_run_id}": { "get": { "tags": [ - "Externals" + "Public" ], "summary": "Get Run", + "description": "Returns the details of the application run. The application run is available as soon as it is\ncreated via `POST /runs/` endpoint. To download the items results, call\n`/runs/{application_run_id}/results`.\n\nThe application is only available to the user who triggered it, regardless of the role.", "operationId": "get_run_v1_runs__application_run_id__get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], "parameters": [ { "name": "application_run_id", @@ -327,8 +447,10 @@ "schema": { "type": "string", "format": "uuid", + "description": "Application run id, returned by `POST /runs/` endpoint", "title": "Application Run Id" - } + }, + "description": "Application run id, returned by `POST /runs/` endpoint" }, { "name": "include", @@ -384,10 +506,16 @@ "/v1/runs/{application_run_id}/cancel": { "post": { "tags": [ - "Externals" + "Public" + ], + "summary": "Cancel Application Run", + "description": "The application run can be canceled by the user who created the application run.\n\nThe execution can be canceled any time while the application is not in a final state. The\npending items will not be processed and will not add to the cost.\n\nWhen the application is canceled, the already completed items stay available for download.", + "operationId": "cancel_application_run_v1_runs__application_run_id__cancel_post", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } ], - "summary": "Cancel Run", - "operationId": "cancel_run_v1_runs__application_run_id__cancel_post", "parameters": [ { "name": "application_run_id", @@ -396,8 +524,10 @@ "schema": { "type": "string", "format": "uuid", + "description": "Application run id, returned by `POST /runs/` endpoint", "title": "Application Run Id" - } + }, + "description": "Application run id, returned by `POST /runs/` endpoint" } ], "responses": { @@ -428,10 +558,16 @@ "/v1/runs/{application_run_id}/results": { "get": { "tags": [ - "Externals" + "Public" ], "summary": "List Run Results", + "description": "Get the list of the results for the run items", "operationId": "list_run_results_v1_runs__application_run_id__results_get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } + ], "parameters": [ { "name": "application_run_id", @@ -440,8 +576,10 @@ "schema": { "type": "string", "format": "uuid", + "description": "Application run id, returned by `POST /runs/` endpoint", "title": "Application Run Id" - } + }, + "description": "Application run id, returned by `POST /runs/` endpoint" }, { "name": "item_id__in", @@ -460,31 +598,10 @@ "type": "null" } ], + "description": "Filter for items ids", "title": "Item Id In" - } - }, - { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "minimum": 1, - "default": 1, - "title": "Page" - } - }, - { - "name": "page_size", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 5, - "default": 50, - "title": "Page Size" - } + }, + "description": "Filter for items ids" }, { "name": "reference__in", @@ -502,8 +619,10 @@ "type": "null" } ], + "description": "Filter for items by their reference from the input payload", "title": "Reference In" - } + }, + "description": "Filter for items by their reference from the input payload" }, { "name": "status__in", @@ -521,7 +640,32 @@ "type": "null" } ], + "description": "Filter for items in certain statuses", "title": "Status In" + }, + "description": "Filter for items in certain statuses" + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "default": 1, + "title": "Page" + } + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 100, + "minimum": 5, + "default": 50, + "title": "Page Size" } }, { @@ -576,10 +720,16 @@ }, "delete": { "tags": [ - "Externals" + "Public" + ], + "summary": "Delete Application Run Results", + "description": "Delete the application run results. It can only be called when the application is in a final\nstate (meaning it's not in `received` or `pending` states). To delete the results of the running\nartifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel the application run.\n\nThe output results are deleted automatically 30 days after the application run is finished.", + "operationId": "delete_application_run_results_v1_runs__application_run_id__results_delete", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + } ], - "summary": "Delete Run Results", - "operationId": "delete_run_results_v1_runs__application_run_id__results_delete", "parameters": [ { "name": "application_run_id", @@ -588,8 +738,10 @@ "schema": { "type": "string", "format": "uuid", + "description": "Application run id, returned by `POST /runs/` endpoint", "title": "Application Run Id" - } + }, + "description": "Application run id, returned by `POST /runs/` endpoint" } ], "responses": { @@ -611,421 +763,53 @@ } } } - }, - "/v1/versions": { - "post": { - "tags": [ - "Externals" - ], - "summary": "Register Version", - "operationId": "register_version_v1_versions_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/VersionCreationRequest" - } - } + } + }, + "components": { + "schemas": { + "ApplicationReadResponse": { + "properties": { + "application_id": { + "type": "string", + "title": "Application Id", + "description": "Application ID", + "examples": [ + "h-e-tme" + ] }, - "required": true - }, - "responses": { - "201": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/VersionCreationResponse" - } - } - } + "name": { + "type": "string", + "title": "Name", + "description": "Application display name", + "examples": [ + "HETA" + ] }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } + "regulatory_classes": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Regulatory Classes", + "description": "Regulatory class, to which the applications compliance", + "examples": [ + [ + "RuO" + ] + ] + }, + "description": { + "type": "string", + "title": "Description", + "description": "Application documentations" } - } - } - }, - "/v1/applications/{application_id}/versions": { - "get": { - "tags": [ - "Externals" - ], - "summary": "List Versions By Application Id", - "operationId": "list_versions_by_application_id_v1_applications__application_id__versions_get", - "parameters": [ - { - "name": "application_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Application Id" - } - }, - { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "minimum": 1, - "default": 1, - "title": "Page" - } - }, - { - "name": "page_size", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 5, - "default": 50, - "title": "Page Size" - } - }, - { - "name": "version", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Version" - } - }, - { - "name": "include", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "array", - "prefixItems": [ - { - "type": "string" - } - ], - "minItems": 1, - "maxItems": 1 - }, - { - "type": "null" - } - ], - "title": "Include" - } - }, - { - "name": "sort", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "null" - } - ], - "title": "Sort" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationVersionReadResponse" - }, - "title": "Response List Versions By Application Id V1 Applications Application Id Versions Get" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/applications/{application_slug}/versions": { - "get": { - "tags": [ - "Externals" - ], - "summary": "List Versions By Application Slug", - "operationId": "list_versions_by_application_slug_v1_applications__application_slug__versions_get", - "parameters": [ - { - "name": "application_slug", - "in": "path", - "required": true, - "schema": { - "type": "string", - "pattern": "^[a-z](-?[a-z])*$", - "title": "Application Slug" - } - }, - { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "minimum": 1, - "default": 1, - "title": "Page" - } - }, - { - "name": "page_size", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "maximum": 100, - "minimum": 5, - "default": 50, - "title": "Page Size" - } - }, - { - "name": "version", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Version" - } - }, - { - "name": "include", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "array", - "prefixItems": [ - { - "type": "string" - } - ], - "minItems": 1, - "maxItems": 1 - }, - { - "type": "null" - } - ], - "title": "Include" - } - }, - { - "name": "sort", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "null" - } - ], - "title": "Sort" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ApplicationVersionReadResponse" - }, - "title": "Response List Versions By Application Slug V1 Applications Application Slug Versions Get" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/v1/versions/{application_version_id}": { - "get": { - "tags": [ - "Externals" - ], - "summary": "Get Version", - "operationId": "get_version_v1_versions__application_version_id__get", - "parameters": [ - { - "name": "application_version_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "format": "uuid", - "title": "Application Version Id" - } - }, - { - "name": "include", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "array", - "prefixItems": [ - { - "type": "string" - } - ], - "minItems": 1, - "maxItems": 1 - }, - { - "type": "null" - } - ], - "title": "Include" - } - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/VersionReadResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "ApplicationReadResponse": { - "properties": { - "application_id": { - "type": "string", - "format": "uuid", - "title": "Application Id" - }, - "name": { - "type": "string", - "title": "Name", - "examples": [ - "HETA" - ] - }, - "slug": { - "type": "string", - "title": "Slug", - "examples": [ - "heta" - ] - }, - "regulatory_classes": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Regulatory Classes", - "examples": [ - [ - "RuO" - ] - ] - }, - "description": { - "type": "string", - "title": "Description", - "examples": [ - "Aignostics H&E TME application" - ] - } - }, - "type": "object", - "required": [ - "application_id", - "name", - "slug", - "regulatory_classes", - "description" + }, + "type": "object", + "required": [ + "application_id", + "name", + "regulatory_classes", + "description" ], "title": "ApplicationReadResponse" }, @@ -1047,25 +831,21 @@ "properties": { "application_version_id": { "type": "string", - "format": "uuid", - "title": "Application Version Id" - }, - "application_version_slug": { - "type": "string", - "pattern": "^[a-z](?:[a-z]|-[a-z])*:v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$", - "title": "Application Version Slug", + "title": "Application Version Id", + "description": "Application version ID", "examples": [ - "tissue-segmentation-qc:v0.0.1" + "h-e-tme:v0.0.1" ] }, "version": { "type": "string", - "title": "Version" + "title": "Version", + "description": "Semantic version of the application" }, "application_id": { - "type": "string", - "format": "uuid", - "title": "Application Id" + "type": "string", + "title": "Application Id", + "description": "Application ID" }, "flow_id": { "anyOf": [ @@ -1077,31 +857,34 @@ "type": "null" } ], - "title": "Flow Id" + "title": "Flow Id", + "description": "Flow ID, used internally by the platform" }, "changelog": { "type": "string", - "title": "Changelog" + "title": "Changelog", + "description": "Description of the changes relative to the previous version" }, "input_artifacts": { "items": { "$ref": "#/components/schemas/InputArtifactReadResponse" }, "type": "array", - "title": "Input Artifacts" + "title": "Input Artifacts", + "description": "List of the input fields, provided by the User" }, "output_artifacts": { "items": { "$ref": "#/components/schemas/OutputArtifactReadResponse" }, "type": "array", - "title": "Output Artifacts" + "title": "Output Artifacts", + "description": "List of the output fields, generated by the application" } }, "type": "object", "required": [ "application_version_id", - "application_version_slug", "version", "application_id", "changelog", @@ -1123,38 +906,12 @@ "type": "object", "title": "HTTPValidationError" }, - "InputArtifact": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "mime_type": { - "type": "string", - "pattern": "^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", - "title": "Mime Type", - "examples": [ - "image/tiff" - ] - }, - "metadata_schema": { - "type": "object", - "title": "Metadata Schema" - } - }, - "type": "object", - "required": [ - "name", - "mime_type", - "metadata_schema" - ], - "title": "InputArtifact" - }, "InputArtifactCreationRequest": { "properties": { "name": { "type": "string", "title": "Name", + "description": "The artifact name according to the application version. List of required artifacts is returned by `/v1/versions/{application_version_id}`. The artifact names are located in the `input_artifacts.[].name` value", "examples": [ "slide" ] @@ -1165,6 +922,7 @@ "minLength": 1, "format": "uri", "title": "Download Url", + "description": "[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) to the input artifact file. The URL should be valid for at least 6 days from the payload submission time.", "examples": [ "https://example.com/case-no-1-slide.tiff" ] @@ -1172,6 +930,7 @@ "metadata": { "type": "object", "title": "Metadata", + "description": "The metadata of the artifact, required by the application version. The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. The schema is located in `input_artifacts.[].metadata_schema`", "examples": [ { "checksum_crc32c": "752f9554", @@ -1199,7 +958,7 @@ }, "mime_type": { "type": "string", - "pattern": "^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", + "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", "title": "Mime Type", "examples": [ "image/tiff" @@ -1218,37 +977,12 @@ ], "title": "InputArtifactReadResponse" }, - "InputArtifactSchemaCreationRequest": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "mime_type": { - "type": "string", - "title": "Mime Type", - "examples": [ - "application/vnd.apache.parquet" - ] - }, - "metadata_schema": { - "type": "object", - "title": "Metadata Schema" - } - }, - "type": "object", - "required": [ - "name", - "mime_type", - "metadata_schema" - ], - "title": "InputArtifactSchemaCreationRequest" - }, "ItemCreationRequest": { "properties": { "reference": { "type": "string", "title": "Reference", + "description": "The ID of the slide provided by the caller. The reference should be unique across all items of the application run", "examples": [ "case-no-1" ] @@ -1258,7 +992,8 @@ "$ref": "#/components/schemas/InputArtifactCreationRequest" }, "type": "array", - "title": "Input Artifacts" + "title": "Input Artifacts", + "description": "All the input files of the item, required by the application version" } }, "type": "object", @@ -1273,19 +1008,23 @@ "item_id": { "type": "string", "format": "uuid", - "title": "Item Id" + "title": "Item Id", + "description": "Item UUID generated by the Platform" }, "application_run_id": { "type": "string", "format": "uuid", - "title": "Application Run Id" + "title": "Application Run Id", + "description": "Application run UUID to which the item belongs" }, "reference": { "type": "string", - "title": "Reference" + "title": "Reference", + "description": "The reference of the item from the user payload" }, "status": { - "$ref": "#/components/schemas/ItemStatus" + "$ref": "#/components/schemas/ItemStatus", + "description": "\nWhen the item is not processed yet, the status is set to `pending`.\n\nWhen the item is successfully finished, status is set to `succeeded`, and the processing results\nbecome available for download in `output_artifacts` field.\n\nWhen the item processing is failed because the provided item is invalid, the status is set to\n`error_user`. When the item processing failed because of the error in the model or platform,\nthe status is set to `error_system`. When the application_run is canceled, the status of all\npending items is set to either `cancelled_user` or `cancelled_system`.\n " }, "error": { "anyOf": [ @@ -1296,14 +1035,16 @@ "type": "null" } ], - "title": "Error" + "title": "Error", + "description": "\nThe error message in case the item is in `error_system` or `error_user` state\n " }, "output_artifacts": { "items": { "$ref": "#/components/schemas/OutputArtifactResultReadResponse" }, "type": "array", - "title": "Output Artifacts" + "title": "Output Artifacts", + "description": "\nThe list of the results generated by the application algorithm. The number of files and their\ntypes depend on the particular application version, call `/v1/versions/{version_id}` to get\nthe details.\n " } }, "type": "object", @@ -1329,41 +1070,6 @@ ], "title": "ItemStatus" }, - "OutputArtifact": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "mime_type": { - "type": "string", - "pattern": "^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", - "title": "Mime Type", - "examples": [ - "application/vnd.apache.parquet" - ] - }, - "metadata_schema": { - "type": "object", - "title": "Metadata Schema" - }, - "scope": { - "$ref": "#/components/schemas/OutputArtifactScope" - }, - "visibility": { - "$ref": "#/components/schemas/OutputArtifactVisibility" - } - }, - "type": "object", - "required": [ - "name", - "mime_type", - "metadata_schema", - "scope", - "visibility" - ], - "title": "OutputArtifact" - }, "OutputArtifactReadResponse": { "properties": { "name": { @@ -1372,7 +1078,7 @@ }, "mime_type": { "type": "string", - "pattern": "^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", + "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", "title": "Mime Type", "examples": [ "application/vnd.apache.parquet" @@ -1400,23 +1106,27 @@ "output_artifact_id": { "type": "string", "format": "uuid", - "title": "Output Artifact Id" + "title": "Output Artifact Id", + "description": "The Id of the artifact. Used internally" }, "name": { "type": "string", - "title": "Name" + "title": "Name", + "description": "\nName of the output from the output schema from the `/v1/versions/{version_id}` endpoint.\n " }, "mime_type": { "type": "string", - "pattern": "^[a-zA-Z0-9][a-zA-Z0-9!#$&^_.-]{0,126}/[a-zA-Z0-9][a-zA-Z0-9!#$&^_+.-]{0,126}$", + "pattern": "^\\w+\\/\\w+[-+.|\\w+]+\\w+$", "title": "Mime Type", + "description": "The mime type of the output file", "examples": [ "application/vnd.apache.parquet" ] }, "metadata": { "type": "object", - "title": "Metadata" + "title": "Metadata", + "description": "The metadata of the output artifact, provided by the application" }, "download_url": { "anyOf": [ @@ -1430,7 +1140,8 @@ "type": "null" } ], - "title": "Download Url" + "title": "Download Url", + "description": "\nThe download URL to the output file. The URL is valid for 1 hour after the endpoint is called.\nA new URL is generated every time the endpoint is called.\n " } }, "type": "object", @@ -1443,40 +1154,6 @@ ], "title": "OutputArtifactResultReadResponse" }, - "OutputArtifactSchemaCreationRequest": { - "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "mime_type": { - "type": "string", - "title": "Mime Type", - "examples": [ - "application/vnd.apache.parquet" - ] - }, - "scope": { - "$ref": "#/components/schemas/OutputArtifactScope" - }, - "visibility": { - "$ref": "#/components/schemas/OutputArtifactVisibility" - }, - "metadata_schema": { - "type": "object", - "title": "Metadata Schema" - } - }, - "type": "object", - "required": [ - "name", - "mime_type", - "scope", - "visibility", - "metadata_schema" - ], - "title": "OutputArtifactSchemaCreationRequest" - }, "OutputArtifactScope": { "type": "string", "enum": [ @@ -1485,14 +1162,6 @@ ], "title": "OutputArtifactScope" }, - "OutputArtifactVisibility": { - "type": "string", - "enum": [ - "internal", - "external" - ], - "title": "OutputArtifactVisibility" - }, "PayloadInputArtifact": { "properties": { "input_artifact_id": { @@ -1572,19 +1241,12 @@ }, "RunCreationRequest": { "properties": { - "application_version": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "$ref": "#/components/schemas/SlugVersionRequest" - } - ], - "title": "Application Version", + "application_version_id": { + "type": "string", + "title": "Application Version Id", + "description": "Application version ID", "examples": [ - "efbf9822-a1e5-4045-a283-dbf26e8064a9" + "h-e-tme:v1.2.3" ] }, "items": { @@ -1592,28 +1254,28 @@ "$ref": "#/components/schemas/ItemCreationRequest" }, "type": "array", - "title": "Items" + "title": "Items", + "description": "List of the items to process by the application" } }, "type": "object", "required": [ - "application_version", + "application_version_id", "items" ], - "title": "RunCreationRequest" + "title": "RunCreationRequest", + "description": "Application run payload. It describes which application version is chosen, and which user data\nshould be processed." }, "RunCreationResponse": { "properties": { "application_run_id": { "type": "string", "format": "uuid", - "title": "Application Run Id" + "title": "Application Run Id", + "default": "Application run id" } }, "type": "object", - "required": [ - "application_run_id" - ], "title": "RunCreationResponse" }, "RunReadResponse": { @@ -1621,16 +1283,18 @@ "application_run_id": { "type": "string", "format": "uuid", - "title": "Application Run Id" + "title": "Application Run Id", + "description": "UUID of the application" }, "application_version_id": { "type": "string", - "format": "uuid", - "title": "Application Version Id" + "title": "Application Version Id", + "description": "ID of the application version" }, "organization_id": { "type": "string", - "title": "Organization Id" + "title": "Organization Id", + "description": "Organization of the owner of the application run" }, "user_payload": { "anyOf": [ @@ -1640,19 +1304,23 @@ { "type": "null" } - ] + ], + "description": "Field used internally by the Platform" }, "status": { - "$ref": "#/components/schemas/ApplicationRunStatus" + "$ref": "#/components/schemas/ApplicationRunStatus", + "description": "\nWhen the application run request is received by the Platform, the `status` of it is set to\n`received`. Then it is transitioned to `scheduled`, when it is scheduled for the processing.\nWhen the application run is scheduled, it will process the input items and generate the result\nincrementally. As soon as the first result is generated, the state is changed to `running`.\nThe results can be downloaded via `/v1/runs/{run_id}/results` endpoint.\nWhen all items are processed and all results are generated, the application status is set to\n`completed`. If the processing is done, but some items fail, the status is set to\n`completed_with_error`.\n\nWhen the application run request is rejected by the Platform before scheduling, it is transferred\nto `rejected`. When the application run reaches the threshold of number of failed items, the whole\napplication run is set to `canceled_system` and the remaining pending items are not processed.\nWhen the application run fails, the finished item results are available for download.\n\nIf the application run is canceled by calling `POST /v1/runs/{run_id}/cancel` endpoint, the\nprocessing of the items is stopped, and the application status is set to `cancelled_user`\n " }, "triggered_at": { "type": "string", "format": "date-time", - "title": "Triggered At" + "title": "Triggered At", + "description": "Timestamp showing when the application run was triggered" }, "triggered_by": { "type": "string", - "title": "Triggered By" + "title": "Triggered By", + "description": "Id of the user who triggered the application run" } }, "type": "object", @@ -1666,25 +1334,6 @@ ], "title": "RunReadResponse" }, - "SlugVersionRequest": { - "properties": { - "application_slug": { - "type": "string", - "pattern": "^[a-z](-?[a-z])*$", - "title": "Application Slug" - }, - "version": { - "type": "string", - "title": "Version" - } - }, - "type": "object", - "required": [ - "application_slug", - "version" - ], - "title": "SlugVersionRequest" - }, "TransferUrls": { "properties": { "upload_url": { @@ -1711,7 +1360,6 @@ "properties": { "application_id": { "type": "string", - "format": "uuid", "title": "Application Id" }, "application_run_id": { @@ -1782,130 +1430,18 @@ "type" ], "title": "ValidationError" - }, - "VersionCreationRequest": { - "properties": { - "version": { - "type": "string", - "title": "Version" - }, - "application_id": { - "type": "string", - "format": "uuid", - "title": "Application Id" - }, - "flow_id": { - "type": "string", - "format": "uuid", - "title": "Flow Id" - }, - "changelog": { - "type": "string", - "title": "Changelog" - }, - "input_artifacts": { - "items": { - "$ref": "#/components/schemas/InputArtifactSchemaCreationRequest" - }, - "type": "array", - "title": "Input Artifacts" - }, - "output_artifacts": { - "items": { - "$ref": "#/components/schemas/OutputArtifactSchemaCreationRequest" - }, - "type": "array", - "title": "Output Artifacts" - } - }, - "type": "object", - "required": [ - "version", - "application_id", - "flow_id", - "changelog", - "input_artifacts", - "output_artifacts" - ], - "title": "VersionCreationRequest" - }, - "VersionCreationResponse": { - "properties": { - "application_version_id": { - "type": "string", - "format": "uuid", - "title": "Application Version Id" - } - }, - "type": "object", - "required": [ - "application_version_id" - ], - "title": "VersionCreationResponse" - }, - "VersionReadResponse": { - "properties": { - "application_version_id": { - "type": "string", - "format": "uuid", - "title": "Application Version Id" - }, - "version": { - "type": "string", - "title": "Version" - }, - "application_id": { - "type": "string", - "format": "uuid", - "title": "Application Id" - }, - "flow_id": { - "anyOf": [ - { - "type": "string", - "format": "uuid" - }, - { - "type": "null" - } - ], - "title": "Flow Id" - }, - "changelog": { - "type": "string", - "title": "Changelog" - }, - "input_artifacts": { - "items": { - "$ref": "#/components/schemas/InputArtifact" - }, - "type": "array", - "title": "Input Artifacts" - }, - "output_artifacts": { - "items": { - "$ref": "#/components/schemas/OutputArtifact" - }, - "type": "array", - "title": "Output Artifacts" - }, - "created_at": { - "type": "string", - "format": "date-time", - "title": "Created At" + } + }, + "securitySchemes": { + "OAuth2AuthorizationCodeBearer": { + "type": "oauth2", + "flows": { + "authorizationCode": { + "scopes": {}, + "authorizationUrl": "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize", + "tokenUrl": "https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token" } - }, - "type": "object", - "required": [ - "application_version_id", - "version", - "application_id", - "changelog", - "input_artifacts", - "output_artifacts", - "created_at" - ], - "title": "VersionReadResponse" + } } } } diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index 470f21a5..27e46245 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -3,35 +3,32 @@ components: ApplicationReadResponse: properties: application_id: - format: uuid + description: Application ID + examples: + - h-e-tme title: Application Id type: string description: - examples: - - Aignostics H&E TME application + description: Application documentations title: Description type: string name: + description: Application display name examples: - HETA title: Name type: string regulatory_classes: + description: Regulatory class, to which the applications compliance examples: - - RuO items: type: string title: Regulatory Classes type: array - slug: - examples: - - heta - title: Slug - type: string required: - application_id - name - - slug - regulatory_classes - description title: ApplicationReadResponse @@ -51,20 +48,17 @@ components: ApplicationVersionReadResponse: properties: application_id: - format: uuid + description: Application ID title: Application Id type: string application_version_id: - format: uuid - title: Application Version Id - type: string - application_version_slug: + description: Application version ID examples: - - tissue-segmentation-qc:v0.0.1 - pattern: ^(?:|-)*:v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$ - title: Application Version Slug + - h-e-tme:v0.0.1 + title: Application Version Id type: string changelog: + description: Description of the changes relative to the previous version title: Changelog type: string flow_id: @@ -72,23 +66,26 @@ components: - format: uuid type: string - type: 'null' + description: Flow ID, used internally by the platform title: Flow Id input_artifacts: + description: List of the input fields, provided by the User items: $ref: '#/components/schemas/InputArtifactReadResponse' title: Input Artifacts type: array output_artifacts: + description: List of the output fields, generated by the application items: $ref: '#/components/schemas/OutputArtifactReadResponse' title: Output Artifacts type: array version: + description: Semantic version of the application title: Version type: string required: - application_version_id - - application_version_slug - version - application_id - changelog @@ -105,29 +102,12 @@ components: type: array title: HTTPValidationError type: object - InputArtifact: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^{0,126}/{0,126}$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifact - type: object InputArtifactCreationRequest: properties: download_url: + description: '[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) + to the input artifact file. The URL should be valid for at least 6 days + from the payload submission time.' examples: - https://example.com/case-no-1-slide.tiff format: uri @@ -136,6 +116,9 @@ components: title: Download Url type: string metadata: + description: The metadata of the artifact, required by the application version. + The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. + The schema is located in `input_artifacts.[].metadata_schema` examples: - checksum_crc32c: 752f9554 height: 2000 @@ -145,6 +128,9 @@ components: title: Metadata type: object name: + description: The artifact name according to the application version. List + of required artifacts is returned by `/v1/versions/{application_version_id}`. + The artifact names are located in the `input_artifacts.[].name` value examples: - slide title: Name @@ -163,7 +149,7 @@ components: mime_type: examples: - image/tiff - pattern: ^{0,126}/{0,126}$ + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ title: Mime Type type: string name: @@ -175,33 +161,18 @@ components: - metadata_schema title: InputArtifactReadResponse type: object - InputArtifactSchemaCreationRequest: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactSchemaCreationRequest - type: object ItemCreationRequest: properties: input_artifacts: + description: All the input files of the item, required by the application + version items: $ref: '#/components/schemas/InputArtifactCreationRequest' title: Input Artifacts type: array reference: + description: The ID of the slide provided by the caller. The reference should + be unique across all items of the application run examples: - case-no-1 title: Reference @@ -214,6 +185,7 @@ components: ItemResultReadResponse: properties: application_run_id: + description: Application run UUID to which the item belongs format: uuid title: Application Run Id type: string @@ -221,21 +193,37 @@ components: anyOf: - type: string - type: 'null' + description: "\nThe error message in case the item is in `error_system`\ + \ or `error_user` state\n " title: Error item_id: + description: Item UUID generated by the Platform format: uuid title: Item Id type: string output_artifacts: + description: "\nThe list of the results generated by the application algorithm.\ + \ The number of files and their\ntypes depend on the particular application\ + \ version, call `/v1/versions/{version_id}` to get\nthe details.\n " items: $ref: '#/components/schemas/OutputArtifactResultReadResponse' title: Output Artifacts type: array reference: + description: The reference of the item from the user payload title: Reference type: string status: $ref: '#/components/schemas/ItemStatus' + description: "\nWhen the item is not processed yet, the status is set to\ + \ `pending`.\n\nWhen the item is successfully finished, status is set\ + \ to `succeeded`, and the processing results\nbecome available for download\ + \ in `output_artifacts` field.\n\nWhen the item processing is failed because\ + \ the provided item is invalid, the status is set to\n`error_user`. When\ + \ the item processing failed because of the error in the model or platform,\n\ + the status is set to `error_system`. When the application_run is canceled,\ + \ the status of all\npending items is set to either `cancelled_user` or\ + \ `cancelled_system`.\n " required: - item_id - application_run_id @@ -255,32 +243,6 @@ components: - succeeded title: ItemStatus type: string - OutputArtifact: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^{0,126}/{0,126}$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - visibility: - $ref: '#/components/schemas/OutputArtifactVisibility' - required: - - name - - mime_type - - metadata_schema - - scope - - visibility - title: OutputArtifact - type: object OutputArtifactReadResponse: properties: metadata_schema: @@ -289,7 +251,7 @@ components: mime_type: examples: - application/vnd.apache.parquet - pattern: ^{0,126}/{0,126}$ + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ title: Mime Type type: string name: @@ -313,20 +275,28 @@ components: minLength: 1 type: string - type: 'null' + description: "\nThe download URL to the output file. The URL is valid for\ + \ 1 hour after the endpoint is called.\nA new URL is generated every time\ + \ the endpoint is called.\n " title: Download Url metadata: + description: The metadata of the output artifact, provided by the application title: Metadata type: object mime_type: + description: The mime type of the output file examples: - application/vnd.apache.parquet - pattern: ^{0,126}/{0,126}$ + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ title: Mime Type type: string name: + description: "\nName of the output from the output schema from the `/v1/versions/{version_id}`\ + \ endpoint.\n " title: Name type: string output_artifact_id: + description: The Id of the artifact. Used internally format: uuid title: Output Artifact Id type: string @@ -338,43 +308,12 @@ components: - download_url title: OutputArtifactResultReadResponse type: object - OutputArtifactSchemaCreationRequest: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - visibility: - $ref: '#/components/schemas/OutputArtifactVisibility' - required: - - name - - mime_type - - scope - - visibility - - metadata_schema - title: OutputArtifactSchemaCreationRequest - type: object OutputArtifactScope: enum: - item - global title: OutputArtifactScope type: string - OutputArtifactVisibility: - enum: - - internal - - external - title: OutputArtifactVisibility - type: string PayloadInputArtifact: properties: download_url: @@ -433,61 +372,86 @@ components: title: PayloadOutputArtifact type: object RunCreationRequest: + description: 'Application run payload. It describes which application version + is chosen, and which user data + + should be processed.' properties: - application_version: - anyOf: - - format: uuid - type: string - - $ref: '#/components/schemas/SlugVersionRequest' + application_version_id: + description: Application version ID examples: - - efbf9822-a1e5-4045-a283-dbf26e8064a9 - title: Application Version + - h-e-tme:v1.2.3 + title: Application Version Id + type: string items: + description: List of the items to process by the application items: $ref: '#/components/schemas/ItemCreationRequest' title: Items type: array required: - - application_version + - application_version_id - items title: RunCreationRequest type: object RunCreationResponse: properties: application_run_id: + default: Application run id format: uuid title: Application Run Id type: string - required: - - application_run_id title: RunCreationResponse type: object RunReadResponse: properties: application_run_id: + description: UUID of the application format: uuid title: Application Run Id type: string application_version_id: - format: uuid + description: ID of the application version title: Application Version Id type: string organization_id: + description: Organization of the owner of the application run title: Organization Id type: string status: $ref: '#/components/schemas/ApplicationRunStatus' + description: "\nWhen the application run request is received by the Platform,\ + \ the `status` of it is set to\n`received`. Then it is transitioned to\ + \ `scheduled`, when it is scheduled for the processing.\nWhen the application\ + \ run is scheduled, it will process the input items and generate the result\n\ + incrementally. As soon as the first result is generated, the state is\ + \ changed to `running`.\nThe results can be downloaded via `/v1/runs/{run_id}/results`\ + \ endpoint.\nWhen all items are processed and all results are generated,\ + \ the application status is set to\n`completed`. If the processing is\ + \ done, but some items fail, the status is set to\n`completed_with_error`.\n\ + \nWhen the application run request is rejected by the Platform before\ + \ scheduling, it is transferred\nto `rejected`. When the application run\ + \ reaches the threshold of number of failed items, the whole\napplication\ + \ run is set to `canceled_system` and the remaining pending items are\ + \ not processed.\nWhen the application run fails, the finished item results\ + \ are available for download.\n\nIf the application run is canceled by\ + \ calling `POST /v1/runs/{run_id}/cancel` endpoint, the\nprocessing of\ + \ the items is stopped, and the application status is set to `cancelled_user`\n\ + \ " triggered_at: + description: Timestamp showing when the application run was triggered format: date-time title: Triggered At type: string triggered_by: + description: Id of the user who triggered the application run title: Triggered By type: string user_payload: anyOf: - $ref: '#/components/schemas/UserPayload' - type: 'null' + description: Field used internally by the Platform required: - application_run_id - application_version_id @@ -497,20 +461,6 @@ components: - triggered_by title: RunReadResponse type: object - SlugVersionRequest: - properties: - application_slug: - pattern: ^(-?)*$ - title: Application Slug - type: string - version: - title: Version - type: string - required: - - application_slug - - version - title: SlugVersionRequest - type: object TransferUrls: properties: download_url: @@ -531,7 +481,6 @@ components: UserPayload: properties: application_id: - format: uuid title: Application Id type: string application_run_id: @@ -578,104 +527,39 @@ components: - type title: ValidationError type: object - VersionCreationRequest: - properties: - application_id: - format: uuid - title: Application Id - type: string - changelog: - title: Changelog - type: string - flow_id: - format: uuid - title: Flow Id - type: string - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifactSchemaCreationRequest' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifactSchemaCreationRequest' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - version - - application_id - - flow_id - - changelog - - input_artifacts - - output_artifacts - title: VersionCreationRequest - type: object - VersionCreationResponse: - properties: - application_version_id: - format: uuid - title: Application Version Id - type: string - required: - - application_version_id - title: VersionCreationResponse - type: object - VersionReadResponse: - properties: - application_id: - format: uuid - title: Application Id - type: string - application_version_id: - format: uuid - title: Application Version Id - type: string - changelog: - title: Changelog - type: string - created_at: - format: date-time - title: Created At - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - title: Flow Id - input_artifacts: - items: - $ref: '#/components/schemas/InputArtifact' - title: Input Artifacts - type: array - output_artifacts: - items: - $ref: '#/components/schemas/OutputArtifact' - title: Output Artifacts - type: array - version: - title: Version - type: string - required: - - application_version_id - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - - created_at - title: VersionReadResponse - type: object + securitySchemes: + OAuth2AuthorizationCodeBearer: + flows: + authorizationCode: + authorizationUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize + scopes: {} + tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token + type: oauth2 info: - title: PAPI API Reference + description: ' + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. + + The `sort` query parameter can be provided multiple times. The sorting direction + can be indicated via + + `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`.' + title: Aignostics Platform API reference version: 1.0.0 openapi: 3.1.0 paths: /v1/applications: get: + description: 'Returns the list of the applications, available to the caller. + + + The application is available if any of the version of the application is assigned + to the + + user organization. To switch between organizations, the user should re-login + and choose the + + needed organization.' operationId: list_applications_v1_applications_get parameters: - in: query @@ -721,18 +605,31 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] summary: List Applications tags: - - Externals + - Public /v1/applications/{application_id}/versions: get: + description: 'Returns the list of the application versions for this application, + available to the caller. + + + The application version is available if it is assigned to the user''s organization. + + + The application versions are assigned to the organization by the Aignostics + admin. To + + assign or unassign a version from your organization, please contact Aignostics + support team.' operationId: list_versions_by_application_id_v1_applications__application_id__versions_get parameters: - in: path name: application_id required: true schema: - format: uuid title: Application Id type: string - in: query @@ -799,136 +696,41 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] summary: List Versions By Application Id tags: - - Externals - /v1/applications/{application_slug}: - get: - operationId: read_application_by_slug_v1_applications__application_slug__get - parameters: - - in: path - name: application_slug - required: true - schema: - title: Application Slug - type: string - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/ApplicationReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Read Application By Slug - tags: - - Externals - /v1/applications/{application_slug}/versions: - get: - operationId: list_versions_by_application_slug_v1_applications__application_slug__versions_get - parameters: - - in: path - name: application_slug - required: true - schema: - pattern: ^(-?)*$ - title: Application Slug - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Slug V1 Applications Application - Slug Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: List Versions By Application Slug - tags: - - Externals + - Public /v1/runs: get: + description: 'The endpoint returns the application runs triggered by the caller. + After the application run + + is created by POST /v1/runs, it becomes available for the current endpoint' operationId: list_application_runs_v1_runs_get parameters: - - in: query + - description: Optional application ID filter + in: query name: application_id required: false schema: anyOf: - - format: uuid - type: string + - type: string - type: 'null' + description: Optional application ID filter title: Application Id - - in: query - name: application_version_id + - description: Optional application version filter + in: query + name: application_version required: false schema: anyOf: - - format: uuid - type: string + - type: string - type: 'null' - title: Application Version Id - - in: query + description: Optional application version filter + title: Application Version + - description: Request optional output values. Used internally by the platform + in: query name: include required: false schema: @@ -939,6 +741,7 @@ paths: - type: string type: array - type: 'null' + description: Request optional output values. Used internally by the platform title: Include - in: query name: page @@ -985,10 +788,38 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] summary: List Application Runs tags: - - Externals + - Public post: + description: "The endpoint is used to process the input items by the chosen\ + \ application version. The endpoint\nreturns the `application_run_id`. The\ + \ processing fo the items is done asynchronously.\n\nTo check the status or\ + \ cancel the execution, use the /v1/runs/{application_run_id} endpoint.\n\n\ + ### Payload\n\nThe payload includes `application_version_id` and `items` base\ + \ fields.\n\n`application_version_id` is the id used for `/v1/versions/{application_id}`\ + \ endpoint.\n\n`items` includes the list of the items to process (slides,\ + \ in case of HETA application).\nEvery item has a set of standard fields defined\ + \ by the API, plus the metadata, specific to the\nchosen application.\n\n\ + Example payload structure with the comments:\n```\n{\n application_version_id:\ + \ \"heta:v1.0.0\",\n items: [{\n \"reference\": \"slide_1\" <--\ + \ Input ID to connect the input and the output artifact\n \"input_artifacts\"\ + : [{\n \"name\": \"input_slide\" <-- Name of the artifact defined\ + \ by the application (For HETA it is\"input_slide\")\n \"download_url\"\ + : \"https://...\" <-- signed URL to the input file in the S3 or GCS. Should\ + \ be valid for more than 6 days\n \"metadata\": { <-- The metadata\ + \ fields defined by the application. (The example fields set for a slide files\ + \ are provided)\n \"checksum_crc32c\": \"abc12==\",\n \ + \ \"mime_type\": \"image/tiff\",\n \"height\": 100,\n\ + \ \"weight\": 500,\n \"mpp\": 0.543\n \ + \ }\n }]\n }]\n}\n```\n\n### Response\n\nThe endpoint returns\ + \ the application run UUID. After that the job is scheduled for the\nexecution\ + \ in the background.\n\nTo check the status of the run call `v1/runs/{application_run_id}`.\n\ + \n### Rejection\n\nApart from the authentication, authorization and malformed\ + \ input error, the request can be\nrejected when the quota limit is exceeded.\ + \ More details on quotas is described in the\ndocumentation" operationId: create_application_run_v1_runs_post requestBody: content: @@ -1011,17 +842,31 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] summary: Create Application Run tags: - - Externals + - Public /v1/runs/{application_run_id}: get: + description: 'Returns the details of the application run. The application run + is available as soon as it is + + created via `POST /runs/` endpoint. To download the items results, call + + `/runs/{application_run_id}/results`. + + + The application is only available to the user who triggered it, regardless + of the role.' operationId: get_run_v1_runs__application_run_id__get parameters: - - in: path + - description: Application run id, returned by `POST /runs/` endpoint + in: path name: application_run_id required: true schema: + description: Application run id, returned by `POST /runs/` endpoint format: uuid title: Application Run Id type: string @@ -1052,17 +897,33 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] summary: Get Run tags: - - Externals + - Public /v1/runs/{application_run_id}/cancel: post: - operationId: cancel_run_v1_runs__application_run_id__cancel_post + description: 'The application run can be canceled by the user who created the + application run. + + + The execution can be canceled any time while the application is not in a final + state. The + + pending items will not be processed and will not add to the cost. + + + When the application is canceled, the already completed items stay available + for download.' + operationId: cancel_application_run_v1_runs__application_run_id__cancel_post parameters: - - in: path + - description: Application run id, returned by `POST /runs/` endpoint + in: path name: application_run_id required: true schema: + description: Application run id, returned by `POST /runs/` endpoint format: uuid title: Application Run Id type: string @@ -1080,17 +941,33 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - summary: Cancel Run + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Cancel Application Run tags: - - Externals + - Public /v1/runs/{application_run_id}/results: delete: - operationId: delete_run_results_v1_runs__application_run_id__results_delete + description: 'Delete the application run results. It can only be called when + the application is in a final + + state (meaning it''s not in `received` or `pending` states). To delete the + results of the running + + artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel + the application run. + + + The output results are deleted automatically 30 days after the application + run is finished.' + operationId: delete_application_run_results_v1_runs__application_run_id__results_delete parameters: - - in: path + - description: Application run id, returned by `POST /runs/` endpoint + in: path name: application_run_id required: true schema: + description: Application run id, returned by `POST /runs/` endpoint format: uuid title: Application Run Id type: string @@ -1105,20 +982,26 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error - summary: Delete Run Results + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Delete Application Run Results tags: - - Externals + - Public get: + description: Get the list of the results for the run items operationId: list_run_results_v1_runs__application_run_id__results_get parameters: - - in: path + - description: Application run id, returned by `POST /runs/` endpoint + in: path name: application_run_id required: true schema: + description: Application run id, returned by `POST /runs/` endpoint format: uuid title: Application Run Id type: string - - in: query + - description: Filter for items ids + in: query name: item_id__in required: false schema: @@ -1128,25 +1011,10 @@ paths: type: string type: array - type: 'null' + description: Filter for items ids title: Item Id In - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query + - description: Filter for items by their reference from the input payload + in: query name: reference__in required: false schema: @@ -1155,8 +1023,10 @@ paths: type: string type: array - type: 'null' + description: Filter for items by their reference from the input payload title: Reference In - - in: query + - description: Filter for items in certain statuses + in: query name: status__in required: false schema: @@ -1165,7 +1035,25 @@ paths: $ref: '#/components/schemas/ItemStatus' type: array - type: 'null' + description: Filter for items in certain statuses title: Status In + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer - in: query name: sort required: false @@ -1195,72 +1083,10 @@ paths: schema: $ref: '#/components/schemas/HTTPValidationError' description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] summary: List Run Results tags: - - Externals - /v1/versions: - post: - operationId: register_version_v1_versions_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/VersionCreationResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Register Version - tags: - - Externals - /v1/versions/{application_version_id}: - get: - operationId: get_version_v1_versions__application_version_id__get - parameters: - - in: path - name: application_version_id - required: true - schema: - format: uuid - title: Application Version Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/VersionReadResponse' - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - summary: Get Version - tags: - - Externals + - Public servers: -- url: '' +- url: /api diff --git a/examples/notebook.ipynb b/examples/notebook.ipynb index b6c9051d..7518a108 100644 --- a/examples/notebook.ipynb +++ b/examples/notebook.ipynb @@ -13,16 +13,16 @@ "**NOTE:** By default, the client caches the access token in your operation systems application cache folder. If you do not want to store the access token, please initialize the client like this:\n", "\n", "```python\n", - "client = aignostics.client.Client(cache_token=False)\n", + "import aignostics.client as platform\n", + "# initialize the client\n", + "client = platform.Client(cache_token=False)\n", "```\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "from collections.abc import Iterator\n", "\n", @@ -39,19 +39,21 @@ " \"\"\"\n", " items = [models.model_dump()] if isinstance(models, BaseModel) else (a.model_dump() for a in models)\n", " return pd.DataFrame(items)" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ - "import aignostics.client\n", + "import aignostics.client as platform\n", "\n", "# initialize the client\n", - "client = aignostics.client.Client()" - ] + "client = platform.Client(cache_token=False)" + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -64,14 +66,14 @@ }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "applications = client.applications.list()\n", "# visualize\n", "show(applications)" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -84,14 +86,14 @@ }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ - "application_versions = client.applications.versions.list(for_application=\"ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed\")\n", + "application_versions = client.applications.versions.list(application=\"two-task-dummy\")\n", "# visualize\n", "show(application_versions)" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -104,18 +106,18 @@ }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "from IPython.display import JSON\n", "\n", "# get the application version details\n", - "two_task_app = client.applications.versions.details(for_application_version_id=\"60e7b441-307a-4b41-8a97-5b02e7bc73a4\")\n", + "two_task_app = client.applications.versions.details(application_version=\"two-task-dummy:v0.35.0\")\n", "\n", "# view the `input_artifacts` to get insights in the required fields of the application version payload\n", "JSON(two_task_app.input_artifacts[0].to_json())" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -123,17 +125,17 @@ "source": [ "# Trigger an application run\n", "\n", - "Now, let's trigger an application run for the `TwoTask Dummy Application`. We will use the `application_version_id` that we retrieved in the previous step. To create an application run, we need to provide a payload that consists of 1 or more `Items`. We provide the Pydantic model `ItemCreationRequest` an item and the data that comes with it:\n", + "Now, let's trigger an application run for the `TwoTask Dummy Application`. We will use the `application_version_id` that we retrieved in the previous step. To create an application run, we need to provide a payload that consists of 1 or more items. We provide the Pydantic model `Item` an item and the data that comes with it:\n", "```python\n", - "ItemCreationRequest(\n", + "Item(\n", " reference=\"\",\n", " input_artifacts=[InputArtifactCreationRequest]\n", ")\n", "```\n", - "The `InputArtifactCreationRequest` defines the actual data that you provide aka. in this case the image that you want to be processed. The expected values are defined by the application version and have to align with the `input_artifacts` schema of the application version. In the case of the two task dummy application, we only require a single artifact per item, which is the image to process on. The artifact name is defined as `user_slide`. The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. In addition to the image data itself, you have to provide the metadata defined in the input artifact schema, i.e., `checksum_crc32c`, `base_mpp`, `width`, and `height`. The metadata is used to validate the input data and is required for the processing of the image. The following example shows how to create an item with a single input artifact:\n", + "The `InputArtifact` defines the actual data that you provide aka. in this case the image that you want to be processed. The expected values are defined by the application version and have to align with the `input_artifacts` schema of the application version. In the case of the two task dummy application, we only require a single artifact per item, which is the image to process on. The artifact name is defined as `user_slide`. The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. In addition to the image data itself, you have to provide the metadata defined in the input artifact schema, i.e., `checksum_crc32c`, `base_mpp`, `width`, and `height`. The metadata is used to validate the input data and is required for the processing of the image. The following example shows how to create an item with a single input artifact:\n", "\n", "```python\n", - "InputArtifactCreationRequest(\n", + "InputArtifact(\n", " name=\"user_slide\", # as defined by the application version input_artifact schema\n", " download_url=\"\",\n", " metadata={\n", @@ -148,47 +150,34 @@ }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ - "from aignx.codegen.models import (\n", - " ApplicationVersion,\n", - " InputArtifactCreationRequest,\n", - " ItemCreationRequest,\n", - " RunCreationRequest,\n", - ")\n", - "\n", - "from aignostics.client._utils import generate_signed_url # noqa: PLC2701\n", - "\n", - "payload = [\n", - " ItemCreationRequest(\n", - " reference=\"1\",\n", - " input_artifacts=[\n", - " InputArtifactCreationRequest(\n", - " name=\"user_slide\",\n", - " download_url=generate_signed_url(\n", - " \"gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff\"\n", - " ),\n", - " metadata={\n", - " \"checksum_crc32c\": \"N+LWCg==\",\n", - " \"base_mpp\": 0.46499982,\n", - " \"width\": 3728,\n", - " \"height\": 3640,\n", - " },\n", - " )\n", - " ],\n", - " ),\n", - "]\n", - "\n", "application_run = client.runs.create(\n", - " RunCreationRequest(\n", - " application_version=ApplicationVersion(\"60e7b441-307a-4b41-8a97-5b02e7bc73a4\"),\n", - " items=payload,\n", - " )\n", + " application_version=\"two-task-dummy:v0.35.0\",\n", + " items=[\n", + " platform.Item(\n", + " reference=\"wsi-1\",\n", + " input_artifacts=[\n", + " platform.InputArtifact(\n", + " name=\"user_slide\",\n", + " download_url=platform.generate_signed_url(\n", + " \"gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff\"\n", + " ),\n", + " metadata={\n", + " \"checksum_crc32c\": \"N+LWCg==\",\n", + " \"base_mpp\": 0.46499982,\n", + " \"width\": 3728,\n", + " \"height\": 3640,\n", + " },\n", + " )\n", + " ],\n", + " ),\n", + " ],\n", ")\n", "print(application_run)" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -196,22 +185,22 @@ "source": [ "# Observe the status of the application run and download\n", "\n", - "While you can observe the status of an application run directly via the `status()` method and also retrieve the results via the `results()` method, you can also download the results directly to a folder of your choice. The `download_to_folder()` method will download all the results to the specified folder. The method will automatically create a sub-folder in the specified folder with the name of the application run. The results for each individual input item will be stored in a separate folder named after the `reference` you defined in the `ItemCreationRequest`.\n", + "While you can observe the status of an application run directly via the `status()` method and also retrieve the results via the `results()` method, you can also download the results directly to a folder of your choice. The `download_to_folder()` method will download all the results to the specified folder. The method will automatically create a sub-folder in the specified folder with the name of the application run. The results for each individual input item will be stored in a separate folder named after the `reference` you defined in the `Item`.\n", "\n", "The method downloads the results for a slide as soon as they are available. There is no need to keep the method running until all results are available. The method will automatically check for the status of the application run and download the results as soon as they are available. If you invoke the method on a run you already downloaded some results before, it will only download the missing artifacts." ] }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "import tempfile\n", "\n", "download_folder = tempfile.gettempdir()\n", "application_run.download_to_folder(download_folder)" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -224,32 +213,39 @@ }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "# list currently running applications\n", "application_runs = client.runs.list()\n", "for run in application_runs:\n", " print(run)" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": null, "metadata": {}, - "outputs": [], "source": [ "import tempfile\n", "\n", "from aignostics.client.resources.runs import ApplicationRun\n", "\n", - "application_run = ApplicationRun.for_application_run_id(\"d51def04-326b-4138-a411-47bc073bc5ac\")\n", + "application_run = ApplicationRun.for_application_run_id(\"0c1e20fe-b9f9-477a-8608-1fbd40aec723\")\n", "# download\n", "\n", "download_folder = tempfile.gettempdir()\n", "application_run.download_to_folder(download_folder)" - ] + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": {}, + "source": [], + "outputs": [], + "execution_count": null } ], "metadata": { diff --git a/examples/notebook.py b/examples/notebook.py index ba13a7df..2337eb69 100644 --- a/examples/notebook.py +++ b/examples/notebook.py @@ -23,7 +23,9 @@ def _(mo): **NOTE:** By default, the client caches the access token in your operation systems application cache folder. If you do not want to store the access token, please initialize the client like this: ```python - client = aignostics.client.Client(cache_token=False) + import aignostics.client as platform + # initialize the client + client = platform.Client(cache_token=False) ``` """ ) @@ -32,7 +34,6 @@ def _(mo): @app.cell def _(): - import aignostics.client import pandas as pd from pydantic import BaseModel @@ -43,14 +44,15 @@ def show(models: BaseModel | list[BaseModel]) -> pd.DataFrame: else: items = (a.model_dump() for a in models) return pd.DataFrame(items) - return BaseModel, aignostics, pd, show + return BaseModel, pd, show @app.cell -def _(aignostics): +def _(): + import aignostics.client as platform # initialize the client - client = aignostics.client.Client() - return (client,) + client = platform.Client(cache_token=False) + return client, platform @app.cell @@ -87,7 +89,7 @@ def _(mo): @app.cell def _(client, show): - application_versions = client.applications.versions.list(for_application="ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed") + application_versions = client.applications.versions.list(application="two-task-dummy") # visualize show(application_versions) return (application_versions,) @@ -107,7 +109,7 @@ def _(mo): @app.cell def _(client): - two_task_app = client.applications.versions.details(for_application_version_id="60e7b441-307a-4b41-8a97-5b02e7bc73a4") + two_task_app = client.applications.versions.details(application_version="two-task-dummy:v0.35.0") # view the `input_artifacts` to get insights in the required fields of the application version payload two_task_app.input_artifacts[0].to_json() @@ -120,9 +122,9 @@ def _(mo): r""" # Trigger an application run - Now, let's trigger an application run for the `TwoTask Dummy Application`. We will use the `application_version_id` that we retrieved in the previous step. To create an application run, we need to provide a payload that consists of 1 or more `Items`. We provide the Pydantic model `ItemCreationRequest` an item and the data that comes with it: + Now, let's trigger an application run for the `TwoTask Dummy Application`. We will use the `application_version_id` that we retrieved in the previous step. To create an application run, we need to provide a payload that consists of 1 or more items. We provide the Pydantic model `Item` an item and the data that comes with it: ```python - ItemCreationRequest( + Item( reference="", input_artifacts=[InputArtifactCreationRequest] ) @@ -130,7 +132,7 @@ def _(mo): The `InputArtifactCreationRequest` defines the actual data that you provide aka. in this case the image that you want to be processed. The expected values are defined by the application version and have to align with the `input_artifacts` schema of the application version. In the case of the two task dummy application, we only require a single artifact per item, which is the image to process on. The artifact name is defined as `user_slide`. The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. In addition to the image data itself, you have to provide the metadata defined in the input artifact schema, i.e., `checksum_crc32c`, `base_mpp`, `width`, and `height`. The metadata is used to validate the input data and is required for the processing of the image. The following example shows how to create an item with a single input artifact: ```python - InputArtifactCreationRequest( + InputArtifact( name="user_slide", # as defined by the application version input_artifact schema download_url="", metadata={ @@ -147,51 +149,31 @@ def _(mo): @app.cell -def _(client): - from aignostics.client._utils import generate_signed_url # noqa: PLC2701 - from aignx.codegen.models import ( - ApplicationVersion, - RunCreationRequest, - ItemCreationRequest, - InputArtifactCreationRequest - ) - - payload = [ - ItemCreationRequest( - reference="1", - input_artifacts=[ - InputArtifactCreationRequest( - name="user_slide", - download_url=generate_signed_url( - "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" - ), - metadata={ - "checksum_crc32c": "N+LWCg==", - "base_mpp": 0.46499982, - "width": 3728, - "height": 3640, - }, - ) - ], - ), - ] - +def _(client, platform): application_run = client.runs.create( - RunCreationRequest( - application_version=ApplicationVersion("60e7b441-307a-4b41-8a97-5b02e7bc73a4"), - items=payload, - ) + application_version="two-task-dummy:v0.0.5", + items=[ + platform.Item( + reference="wsi-1", + input_artifacts=[ + platform.InputArtifact( + name="user_slide", + download_url=platform.generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" + ), + metadata={ + "checksum_crc32c": "N+LWCg==", + "base_mpp": 0.46499982, + "width": 3728, + "height": 3640, + }, + ) + ], + ), + ], ) print(application_run) - return ( - ApplicationVersion, - InputArtifactCreationRequest, - ItemCreationRequest, - RunCreationRequest, - application_run, - generate_signed_url, - payload, - ) + return (application_run,) @app.cell @@ -200,7 +182,7 @@ def _(mo): r""" # Observe the status of the application run and download - While you can observe the status of an application run directly via the `status()` method and also retrieve the results via the `results()` method, you can also download the results directly to a folder of your choice. The `download_to_folder()` method will download all the results to the specified folder. The method will automatically create a sub-folder in the specified folder with the name of the application run. The results for each individual input item will be stored in a separate folder named after the `reference` you defined in the `ItemCreationRequest`. + While you can observe the status of an application run directly via the `status()` method and also retrieve the results via the `results()` method, you can also download the results directly to a folder of your choice. The `download_to_folder()` method will download all the results to the specified folder. The method will automatically create a sub-folder in the specified folder with the name of the application run. The results for each individual input item will be stored in a separate folder named after the `reference` you defined in the `Item`. The method downloads the results for a slide as soon as they are available. There is no need to keep the method running until all results are available. The method will automatically check for the status of the application run and download the results as soon as they are available. If you invoke the method on a run you already downloaded some results before, it will only download the missing artifacts. """ diff --git a/examples/script.py b/examples/script.py index 717b2eea..b8823384 100644 --- a/examples/script.py +++ b/examples/script.py @@ -2,45 +2,33 @@ import tempfile -from aignx.codegen.models import ( - ApplicationVersion, - InputArtifactCreationRequest, - ItemCreationRequest, - RunCreationRequest, -) - -import aignostics.client -from aignostics.client._utils import generate_signed_url # noqa: PLC2701 - -# please look at the IPython or Marimo notebooks for a detailed explanation of the payload -payload = [ - ItemCreationRequest( - reference="1", - input_artifacts=[ - InputArtifactCreationRequest( - name="user_slide", - download_url=generate_signed_url( - "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" - ), - metadata={ - "checksum_crc32c": "N+LWCg==", - "base_mpp": 0.46499982, - "width": 3728, - "height": 3640, - }, - ) - ], - ), -] +import aignostics.client as platform # initialize the client -client = aignostics.client.Client() +client = platform.Client() # create application run +# for details, see the IPython or Marimo notebooks for a detailed explanation of the payload application_run = client.runs.create( - RunCreationRequest( - application_version=ApplicationVersion("60e7b441-307a-4b41-8a97-5b02e7bc73a4"), - items=payload, - ) + application_version="two-task-dummy:v0.35.0", + items=[ + platform.Item( + reference="1", + input_artifacts=[ + platform.InputArtifact( + name="user_slide", + download_url=platform.generate_signed_url( + "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" + ), + metadata={ + "checksum_crc32c": "N+LWCg==", + "base_mpp": 0.46499982, + "width": 3728, + "height": 3640, + }, + ) + ], + ), + ], ) # wait for the results and download incrementally as they become available tmp_folder = tempfile.gettempdir() diff --git a/src/aignostics/client/__init__.py b/src/aignostics/client/__init__.py index 7751e43f..79c2f517 100644 --- a/src/aignostics/client/__init__.py +++ b/src/aignostics/client/__init__.py @@ -6,6 +6,15 @@ for all interactions with the Aignostics platform. """ +from aignx.codegen.models import ( + InputArtifactCreationRequest as InputArtifact, +) +from aignx.codegen.models import ( + ItemCreationRequest as Item, +) + +from aignostics.client._utils import generate_signed_url + from ._client import Client from ._constants import ( API_ROOT_DEV, @@ -61,9 +70,12 @@ "TOKEN_URL_STAGING", "UNKNOWN_ENDPOINT_URL", "Client", + "InputArtifact", + "Item", "Settings", "calculate_file_crc32c", "download_file", + "generate_signed_url", "mime_type_to_file_ending", "settings", ] diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/client/_authentication.py index cf5957f6..cbaef585 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/client/_authentication.py @@ -1,3 +1,4 @@ +import errno import socket import time import typing as t @@ -215,13 +216,21 @@ def log_message(self, _format: str, *_args) -> None: # type: ignore[no-untyped- host, port = parsed_redirect.hostname, parsed_redirect.port if not host or not port: raise RuntimeError(INVALID_REDIRECT_URI) - # TODO(Andreas): This fails if the application runs multiple times in parallel, which is quite an issue. - # At least we must fail with better info for the user, and actually block another run - with HTTPServer((host, port), OAuthCallbackHandler) as server: - # Call Auth0 with challenge and redirect to localhost with code after successful authN - webbrowser.open_new(authorization_url) - # Extract authorization_code from redirected request, see: OAuthCallbackHandler - server.handle_request() + # check if port is callback port is available + port_unavailable_msg = f"Port {port} is already in use. Free the port, or use the device flow." + if not _ensure_local_port_is_available(port): + raise RuntimeError(port_unavailable_msg) + # start the server + try: + with HTTPServer((host, port), OAuthCallbackHandler) as server: + # Call Auth0 with challenge and redirect to localhost with code after successful authN + webbrowser.open_new(authorization_url) + # Extract authorization_code from redirected request, see: OAuthCallbackHandler + server.handle_request() + except OSError as e: + if e.errno == errno.EADDRINUSE: + raise RuntimeError(port_unavailable_msg) from e + raise RuntimeError(AUTHENTICATION_FAILED) from e if authentication_result.error or not authentication_result.token: raise RuntimeError(AUTHENTICATION_FAILED) diff --git a/src/aignostics/client/_client.py b/src/aignostics/client/_client.py index c78d6b40..c7e10ea5 100644 --- a/src/aignostics/client/_client.py +++ b/src/aignostics/client/_client.py @@ -1,4 +1,4 @@ -from aignx.codegen.api.externals_api import ExternalsApi +from aignx.codegen.api.public_api import PublicApi from aignx.codegen.api_client import ApiClient from aignx.codegen.configuration import Configuration @@ -31,7 +31,7 @@ def __init__(self, cache_token: bool = True) -> None: self.runs: Runs = Runs(self._api) @staticmethod - def get_api_client(cache_token: bool = True) -> ExternalsApi: + def get_api_client(cache_token: bool = True) -> PublicApi: """Creates and configures an authenticated API client. Args: @@ -52,7 +52,7 @@ def get_api_client(cache_token: bool = True) -> ExternalsApi: header_name="Authorization", header_value=f"Bearer {token}", ) - return ExternalsApi(client) + return PublicApi(client) @staticmethod def get_info() -> dict[str, dict]: # type: ignore[type-arg] diff --git a/src/aignostics/client/resources/applications.py b/src/aignostics/client/resources/applications.py index fa4562d6..80480e32 100644 --- a/src/aignostics/client/resources/applications.py +++ b/src/aignostics/client/resources/applications.py @@ -4,10 +4,11 @@ It includes functionality for listing applications and managing application versions. """ +import re import typing as t -from aignx.codegen.api.externals_api import ExternalsApi -from aignx.codegen.models import ApplicationReadResponse, ApplicationVersionReadResponse, VersionReadResponse +from aignx.codegen.api.public_api import PublicApi +from aignx.codegen.models import ApplicationReadResponse, ApplicationVersionReadResponse from aignostics.client.resources.utils import paginate @@ -18,7 +19,9 @@ class Versions: Provides operations to list and retrieve application versions. """ - def __init__(self, api: ExternalsApi) -> None: + APPLICATION_VERSION_REGEX = re.compile(r"(?P[^:]+):v?(?P[^:]+)") + + def __init__(self, api: PublicApi) -> None: """Initializes the Versions resource with the API client. Args: @@ -26,11 +29,11 @@ def __init__(self, api: ExternalsApi) -> None: """ self._api = api - def list(self, for_application: ApplicationReadResponse | str) -> t.Iterator[ApplicationVersionReadResponse]: + def list(self, application: ApplicationReadResponse | str) -> t.Iterator[ApplicationVersionReadResponse]: """Lists all versions for a specific application. Args: - for_application: Either an ApplicationReadResponse object or + application: Either an ApplicationReadResponse object or an application ID string. Returns: @@ -39,31 +42,47 @@ def list(self, for_application: ApplicationReadResponse | str) -> t.Iterator[App Raises: Exception: If the API request fails. """ - if isinstance(for_application, ApplicationReadResponse): - application_id = for_application.application_id - else: - application_id = for_application + application_id = application.application_id if isinstance(application, ApplicationReadResponse) else application return paginate( self._api.list_versions_by_application_id_v1_applications_application_id_versions_get, application_id=application_id, ) - def details(self, for_application_version_id: str) -> VersionReadResponse: + def details(self, application_version: ApplicationVersionReadResponse | str) -> ApplicationVersionReadResponse: """Retrieves details for a specific application version. Args: - for_application_version_id: The ID of the application version. + application_version: The ID of the application version. Returns: VersionReadResponse: The version details. Raises: + RuntimeError: If the application version ID is invalid or if the API request fails. Exception: If the API request fails. """ - return self._api.get_version_v1_versions_application_version_id_get( - application_version_id=for_application_version_id + if isinstance(application_version, ApplicationVersionReadResponse): + application_id = application_version.application_id + version = application_version.version + else: + # split by colon + m = Versions.APPLICATION_VERSION_REGEX.match(application_version) + if not m: + msg = f"Invalid application_version_id: {application_version}" + raise RuntimeError(msg) + application_id = m.group("application_id") + version = m.group("version") + + application_versions = self._api.list_versions_by_application_id_v1_applications_application_id_versions_get( + application_id=application_id, + version=version, ) + if len(application_versions) != 1: + # this invariance is enforced by the system. If that error occurs, we have an internal error + msg = "Internal server error. Please contact Aignostics support." + raise RuntimeError(msg) + return application_versions[0] class Applications: @@ -72,7 +91,7 @@ class Applications: Provides operations to list applications and access version resources. """ - def __init__(self, api: ExternalsApi) -> None: + def __init__(self, api: PublicApi) -> None: """Initializes the Applications resource with the API client. Args: diff --git a/src/aignostics/client/resources/runs.py b/src/aignostics/client/resources/runs.py index 85eb31cb..e3ac6850 100644 --- a/src/aignostics/client/resources/runs.py +++ b/src/aignostics/client/resources/runs.py @@ -4,21 +4,22 @@ It includes functionality for starting runs, monitoring status, and downloading results. """ -import json import typing as t +from collections.abc import Generator from pathlib import Path from time import sleep +from typing import Any -from aignx.codegen.api.externals_api import ExternalsApi +from aignx.codegen.api.public_api import PublicApi from aignx.codegen.models import ( ApplicationRunStatus, + ItemCreationRequest, ItemResultReadResponse, ItemStatus, RunCreationRequest, RunCreationResponse, RunReadResponse, ) -from jsf import JSF from jsonschema.exceptions import ValidationError from jsonschema.validators import validate @@ -33,7 +34,7 @@ class ApplicationRun: Provides operations to check status, retrieve results, and download artifacts. """ - def __init__(self, api: ExternalsApi, application_run_id: str) -> None: + def __init__(self, api: PublicApi, application_run_id: str) -> None: """Initializes an ApplicationRun instance. Args: @@ -89,7 +90,7 @@ def cancel(self) -> None: Raises: Exception: If the API request fails. """ - self._api.cancel_run_v1_runs_application_run_id_cancel_post(self.application_run_id) + self._api.cancel_application_run_v1_runs_application_run_id_cancel_post(self.application_run_id) def results(self) -> t.Iterator[ItemResultReadResponse]: """Retrieves the results of all items in the run. @@ -214,7 +215,7 @@ class Runs: Provides operations to create, list, and retrieve runs. """ - def __init__(self, api: ExternalsApi) -> None: + def __init__(self, api: PublicApi) -> None: """Initializes the Runs resource with the API client. Args: @@ -233,11 +234,12 @@ def __call__(self, application_run_id: str) -> ApplicationRun: """ return ApplicationRun(self._api, application_run_id) - def create(self, payload: RunCreationRequest) -> ApplicationRun: + def create(self, application_version: str, items: list[ItemCreationRequest]) -> ApplicationRun: """Creates a new application run. Args: - payload: The run creation request payload. + application_version: The ID of the application version. + items: The run creation request payload. Returns: ApplicationRun: The created application run. @@ -246,26 +248,15 @@ def create(self, payload: RunCreationRequest) -> ApplicationRun: ValueError: If the payload is invalid. Exception: If the API request fails. """ + payload = RunCreationRequest( + application_version_id=application_version, + items=items, + ) self._validate_input_items(payload) res: RunCreationResponse = self._api.create_application_run_v1_runs_post(payload) return ApplicationRun(self._api, res.application_run_id) - @staticmethod - def generate_example_payload(_application_version_id: str) -> None: - """Generates an example payload for creating a run. - - Args: - _application_version_id: The ID of the application version. - - Raises: - Exception: If the API request fails. - """ - schema = RunCreationRequest.model_json_schema() - faker = JSF(schema) - example = faker.generate() - print(json.dumps(example, indent=2)) - - def list(self, for_application_version: str | None = None) -> t.Generator[ApplicationRun, t.Any, None]: + def list(self, for_application_version: str | None = None) -> Generator[ApplicationRun, Any, None]: """Lists application runs, optionally filtered by application version. Args: @@ -297,9 +288,7 @@ def _validate_input_items(self, payload: RunCreationRequest) -> None: Exception: If the API request fails. """ # validate metadata based on schema of application version - app_version = Versions(self._api).details( - for_application_version_id=payload.application_version.actual_instance - ) + app_version = Versions(self._api).details(application_version=payload.application_version_id) schema_idx = { input_artifact.name: input_artifact.metadata_schema for input_artifact in app_version.input_artifacts } diff --git a/tests/aignostics/client/resources/applications_test.py b/tests/aignostics/client/resources/applications_test.py index 0dcd8541..c4731f28 100644 --- a/tests/aignostics/client/resources/applications_test.py +++ b/tests/aignostics/client/resources/applications_test.py @@ -7,7 +7,7 @@ from unittest.mock import Mock, call import pytest -from aignx.codegen.api.externals_api import ExternalsApi +from aignx.codegen.api.public_api import PublicApi from aignx.codegen.models import ApplicationVersionReadResponse from aignx.codegen.models.application_read_response import ApplicationReadResponse @@ -24,7 +24,7 @@ def mock_api() -> Mock: Returns: Mock: A mock instance of ExternalsApi. """ - return Mock(spec=ExternalsApi) + return Mock(spec=PublicApi) @pytest.fixture @@ -89,7 +89,7 @@ def test_versions_list_with_pagination(mock_api) -> None: mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.side_effect = [page1, page2] # Act - result = list(versions.list(for_application=mock_app)) + result = list(versions.list(application=mock_app)) # Assert assert len(result) == PAGE_SIZE + 5 @@ -198,7 +198,7 @@ def test_versions_list_returns_versions_for_application(mock_api) -> None: mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.return_value = [mock_version] # Act - result = list(versions.list(for_application=mock_app)) + result = list(versions.list(application=mock_app)) # Assert assert len(result) == 1 @@ -224,7 +224,7 @@ def test_versions_list_returns_empty_list_when_no_versions(mock_api) -> None: mock_api.list_versions_by_application_id_v1_applications_application_id_versions_get.return_value = [] # Act - result = list(versions.list(for_application=mock_app)) + result = list(versions.list(application=mock_app)) # Assert assert len(result) == 0 @@ -252,4 +252,4 @@ def test_versions_list_passes_through_api_exception(mock_api) -> None: # Act & Assert with pytest.raises(Exception, match=API_ERROR): - list(versions.list(for_application=mock_app)) + list(versions.list(application=mock_app)) diff --git a/tests/aignostics/client/resources/runs_test.py b/tests/aignostics/client/resources/runs_test.py index f703c691..6266af3b 100644 --- a/tests/aignostics/client/resources/runs_test.py +++ b/tests/aignostics/client/resources/runs_test.py @@ -7,8 +7,14 @@ from unittest.mock import Mock, call import pytest -from aignx.codegen.api.externals_api import ExternalsApi -from aignx.codegen.models import ItemResultReadResponse, RunCreationResponse, RunReadResponse +from aignx.codegen.api.public_api import PublicApi +from aignx.codegen.models import ( + InputArtifactCreationRequest, + ItemCreationRequest, + ItemResultReadResponse, + RunCreationResponse, + RunReadResponse, +) from aignostics.client.resources.runs import ApplicationRun, Runs from aignostics.client.resources.utils import PAGE_SIZE @@ -21,7 +27,7 @@ def mock_api() -> Mock: Returns: Mock: A mock instance of ExternalsApi. """ - return Mock(spec=ExternalsApi) + return Mock(spec=PublicApi) @pytest.fixture @@ -159,16 +165,27 @@ def test_runs_create_returns_application_run(runs, mock_api) -> None: """ # Arrange run_id = "new-run-id" - mock_payload = Mock() + mock_items = [ + ItemCreationRequest( + reference="item-1", + input_artifacts=[ + InputArtifactCreationRequest(name="artifact-1", download_url="url", metadata={"key": "value"}) + ], + ) + ] mock_api.create_application_run_v1_runs_post.return_value = RunCreationResponse(application_run_id=run_id) # Mock the validation method to prevent it from making actual API calls runs._validate_input_items = Mock() # Act - app_run = runs.create(mock_payload) + app_run = runs.create(application_version="mock", items=mock_items) # Assert assert isinstance(app_run, ApplicationRun) assert app_run.application_run_id == run_id - mock_api.create_application_run_v1_runs_post.assert_called_once_with(mock_payload) + mock_api.create_application_run_v1_runs_post.assert_called_once() + # Check that a RunCreationRequest was passed to the API call + call_args = mock_api.create_application_run_v1_runs_post.call_args[0][0] + assert call_args.application_version_id == "mock" + assert call_args.items == mock_items diff --git a/tests/aignostics/client/scheduled_test.py b/tests/aignostics/client/scheduled_test.py index a32dfbe3..2aba7a19 100644 --- a/tests/aignostics/client/scheduled_test.py +++ b/tests/aignostics/client/scheduled_test.py @@ -11,11 +11,9 @@ import pytest from aignx.codegen.models import ( ApplicationRunStatus, - ApplicationVersion, InputArtifactCreationRequest, ItemCreationRequest, ItemStatus, - RunCreationRequest, ) import aignostics.client @@ -91,11 +89,9 @@ def test_two_task_dummy_app() -> None: Raises: AssertionError: If any of the validation checks fail. """ - application_version = "60e7b441-307a-4b41-8a97-5b02e7bc73a4" + application_version = "two-task-dummy:v0.35.0" platform = aignostics.client.Client(cache_token=False) - application_run = platform.runs.create( - RunCreationRequest(application_version=ApplicationVersion(application_version), items=three_spots_payload()) - ) + application_run = platform.runs.create(application_version, items=three_spots_payload()) with tempfile.TemporaryDirectory() as temp_dir: temp_path = Path(temp_dir) From a03f124ec6f8a65e38df96376d93d98ce754ce64 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Tue, 22 Apr 2025 13:05:02 +0200 Subject: [PATCH 099/110] fix: Adjust checksum in payload to changed image file --- examples/notebook.ipynb | 6 +++--- tests/aignostics/client/scheduled_test.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/notebook.ipynb b/examples/notebook.ipynb index 7518a108..0dad07af 100644 --- a/examples/notebook.ipynb +++ b/examples/notebook.ipynb @@ -250,7 +250,7 @@ ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -264,9 +264,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.11.9" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/tests/aignostics/client/scheduled_test.py b/tests/aignostics/client/scheduled_test.py index 2aba7a19..5e29d259 100644 --- a/tests/aignostics/client/scheduled_test.py +++ b/tests/aignostics/client/scheduled_test.py @@ -32,7 +32,7 @@ def three_spots_payload() -> list[ItemCreationRequest]: "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" ), metadata={ - "checksum_crc32c": "N+LWCg==", + "checksum_crc32c": "9l3NNQ==", "base_mpp": 0.46499982, "width": 3728, "height": 3640, From 296b8cb5d9e59b4d025b45990bbddbb5c8297c5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Helmut=20Hoffer=20von=20Ankershoffen=20n=C3=A9=20Oertel?= Date: Tue, 22 Apr 2025 21:22:49 +0200 Subject: [PATCH 100/110] Feature/idc (#17) Updating from oe-python-template, inheriting: * Preparation for GUI with auto-discovered pages, using NiceGUI * Preparation for serving notebook via uvx aignostics notebook * Multi-stage Docker image in fat and slim flavor, running as non-root in immutable container * Improved test coverage Features: * Integration of idc enabling query of and download from IDC Portal * Spike for GUI showing local DICOM image --- .copier-answers.yml | 7 +- .dockerignore | 94 + .env.example | 2 +- .../workflows/docker-image-build-publish.yml | 55 +- .github/workflows/test-and-report.yml | 2 - .github/workflows/test-scheduled.yml | 14 +- .gitignore | 9 + .license-types-allowed | 1 + .pre-commit-config.yaml | 14 +- .python-version | 2 +- .vscode/settings.json | 7 +- API_REFERENCE_v1.md | 3180 ++++-------- ATTRIBUTIONS.md | 4085 ++++++++++++++- CHANGELOG.md | 2 - CLI_REFERENCE.md | 157 +- CONTRIBUTING.md | 30 +- Dockerfile | 98 +- Makefile | 20 +- SERVICE_CONNECTIONS.md | 2 +- aignostics.spec | 38 + compose.yaml | 16 +- data/.gitkeep | 0 demo.md | 8 + docs/source/_static/openapi_v1.json | 1 + docs/source/_static/openapi_v1.yaml | 1 + docs/source/lib_reference.rst | 13 +- examples/e2e.py | 161 + examples/notebook.py | 13 +- install.sh | 2 + noxfile.py | 1 + pyproject.toml | 81 +- sonar-project.properties | 2 +- src/aignostics/application/__init__.py | 10 + src/aignostics/application/_gui.py | 56 + src/aignostics/application/_service.py | 62 + src/aignostics/application/_settings.py | 28 + src/aignostics/cli.py | 39 +- src/aignostics/constants.py | 10 +- src/aignostics/idc/__init__.py | 10 + src/aignostics/idc/_cli.py | 130 + src/aignostics/system/__init__.py | 13 +- src/aignostics/system/_cli.py | 21 + src/aignostics/system/_gui.py | 20 + src/aignostics/system/_service.py | 1 + src/aignostics/utils/.vendored/bottle.py | 4562 +++++++++++++++++ src/aignostics/utils/__init__.py | 14 + src/aignostics/utils/_constants.py | 35 +- src/aignostics/utils/_gui.py | 178 + src/aignostics/utils/_notebook.py | 61 + src/aignostics/utils/boot.py | 6 + tests/aignostics/application/gui_test.py | 24 + tests/aignostics/cli_test.py | 128 + tests/aignostics/idc/cli_test.py | 51 + tests/aignostics/system/cli_test.py | 54 +- tests/aignostics/system/gui_test.py | 13 + tests/aignostics/utils/__init__.py | 1 + tests/aignostics/utils/health_test.py | 179 + tests/conftest.py | 7 +- uv.lock | 1235 ++++- watch_gui.py | 6 + 60 files changed, 12670 insertions(+), 2402 deletions(-) create mode 100644 .dockerignore create mode 100644 aignostics.spec create mode 100644 data/.gitkeep create mode 100644 demo.md create mode 100644 examples/e2e.py create mode 100644 src/aignostics/application/_gui.py create mode 100644 src/aignostics/application/_service.py create mode 100644 src/aignostics/application/_settings.py create mode 100644 src/aignostics/idc/__init__.py create mode 100644 src/aignostics/idc/_cli.py create mode 100644 src/aignostics/system/_gui.py create mode 100644 src/aignostics/utils/.vendored/bottle.py create mode 100644 src/aignostics/utils/_gui.py create mode 100644 src/aignostics/utils/_notebook.py create mode 100644 tests/aignostics/application/gui_test.py create mode 100644 tests/aignostics/idc/cli_test.py create mode 100644 tests/aignostics/system/gui_test.py create mode 100644 tests/aignostics/utils/__init__.py create mode 100644 tests/aignostics/utils/health_test.py create mode 100644 watch_gui.py diff --git a/.copier-answers.yml b/.copier-answers.yml index cf5319c1..cdcbfe54 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.11.0 +_commit: v0.13.13 _src_path: gh:helmut-hoffer-von-ankershoffen/oe-python-template attestations_enabled: false author_email: helmut@aignostics.com @@ -24,6 +24,7 @@ readthedocs_domain: readthedocs.org readthedocs_project_key: aignostics sonarqube_key: aignostics_python-sdk streamlit_project_key: aignostics -uptime_badge_snippet: "[![Better Stack Badge](https://uptime.betterstack.com/status-badges/v1/monitor/1vtu1.svg)](https://aignostics.betteruptime.com/)" -vercel_badge_snippet: "" +uptime_badge_snippet: '[![Better Stack Badge](https://uptime.betterstack.com/status-badges/v1/monitor/1vtu1.svg)](https://aignostics.betteruptime.com/)' +vercel_badge_snippet: '' vercel_function_enabled: false + diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..a679fff3 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,94 @@ +# .dockerignore of project Aignostics Python SDK + +# .dockerfile specifics + +**/.git +**/.gitignore +Dockerfile +docker-compose.yml + +# Environment +**/.env +**/.env.backup +**/.env.bak +**/ENV/ +**/env/ +**/.envrc + +## secrets +**/.secret +**/.secrets +**/.secrets.toml +**/.secrets.yaml +**/.secrets.yml +**/.secrets.json +**/.act-env-secret + +# More secrets +**/.ssh +**/.aws + +# Python virtual environment +**/venv/ +**/.venv/ + +# Python temps +**/*.py[cdo] +**/__pycache__/ +**/*.so +**/*.egg +**/*.egg-info/ +**/*.log +**/dist/ +**/build/ +**/eggs/ +**/parts/ +**/sdist/ +**/develop-eggs/ +**/.installed.cfg +**/.Python +**/.pytest_cache/ +**/.ruff_cache/ +**/.nox +**/.dmypy.json +**/.mypy_cache/ +**/.coverage +**/.coverage.* + + +# Build Report +**/reports/* +**/!reports/.keep +**/!reports/README.md + +# IDE +**/.idea/ +**/*.swp +**/*.swo + +# macOS +**/.DS_Store + +# Other OS +**/lib/ +**/lib64/ + +# Data +**/var/ +**/tmp/ + +# Node temps +**/node_modules/ + +# AI workflow +**/.fixme + +# Copier +**/*.rej + + +# Vercel +**/.vercel + + +# Application specific diff --git a/.env.example b/.env.example index fdb19557..87081ced 100644 --- a/.env.example +++ b/.env.example @@ -16,4 +16,4 @@ AIGNOSTICS_SENTRY_PROFILES_SAMPLE_RATE=1.0 AIGNOSTICS_API_ROOT=https://platform.aignostics.com AIGNOSTICS_CLIENT_ID_DEVICE=YOUR_CLIENT_ID_DEVICE_RETRIEVED_FROM_DASHBOARD AIGNOSTICS_CLIENT_ID_INTERACTIVE=YOUR_CLIENT_ID_INTERACTIVE_RETRIEVED_FROM_DASHBOARD -GOOGLE_APPLICATION_CREDENTIALS=..../gcp-credentials.json \ No newline at end of file +GOOGLE_APPLICATION_CREDENTIALS=..../gcp-credentials.json diff --git a/.github/workflows/docker-image-build-publish.yml b/.github/workflows/docker-image-build-publish.yml index 2e63d16a..9212c06f 100644 --- a/.github/workflows/docker-image-build-publish.yml +++ b/.github/workflows/docker-image-build-publish.yml @@ -7,8 +7,9 @@ on: env: - REGISTRY: docker.io - IMAGE_NAME: helmuthva/aignostics-python-sdk + DOCKER_IO_REGISTRY: docker.io + DOCKER_IO_IMAGE_NAME_ALL: helmuthva/aignostics-python-sdk + DOCKER_IO_IMAGE_NAME_SLIM: helmuthva/aignostics-python-sdk-slim jobs: @@ -52,14 +53,14 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - - name: Extract metadata (tags, labels) for Docker - id: meta + - name: "(all target): Extract metadata (tags, labels) for Docker" + id: meta-all uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 with: images: | - ${{ env.IMAGE_NAME }} + ${{ env.DOCKER_IO_IMAGE_NAME_ALL }} ghcr.io/${{ github.repository }} @@ -73,14 +74,50 @@ jobs: type=semver,pattern={{major}} + - name: "(slim target): Extract metadata (tags, labels) for Docker" + id: meta-slim + uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0 + with: + + + images: | + ${{ env.DOCKER_IO_IMAGE_NAME_SLIM }} + ghcr.io/${{ github.repository }}-slim + + + + tags: | + # set latest tag for releases + type=raw,value=latest + # set semver tags from git tags (v1.2.3 -> 1.2.3, 1.2, 1) + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + + + + - name: "(all target): Build and push Docker image" + id: build-and-push-all + uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 + with: + context: . + file: ./Dockerfile + target: all + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta-all.outputs.tags }} + labels: ${{ steps.meta-all.outputs.labels }} + + - - name: Build and push Docker image - id: push + - name: "(slim target): Build and push Docker image" + id: build-and-push-slim uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 with: context: . file: ./Dockerfile + target: slim platforms: linux/amd64,linux/arm64 push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + tags: ${{ steps.meta-slim.outputs.tags }} + labels: ${{ steps.meta-slim.outputs.labels }} diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/test-and-report.yml index c5a2fe98..0354d983 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/test-and-report.yml @@ -57,8 +57,6 @@ jobs: envkey_ENV: "TEST" envkey_AIGNOSTICS_LOGFIRE_TOKEN: "${{ secrets.AIGNOSTICS_LOGFIRE_TOKEN }}" envkey_AIGNOSTICS_SENTRY_DSN: "${{ secrets.AIGNOSTICS_SENTRY_DSN }}" - envkey_AIGNOSTICS_LOG_LEVEL: "DEBUG" - envkey_AIGNOSTICS_LOG_FILE_ENABLED: 1 envkey_AIGNOSTICS_API_ROOT: https://platform.aignostics.com envkey_AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_ID_DEVICE }} envkey_AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index 098291ce..6b2d2fe3 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -32,8 +32,6 @@ jobs: envkey_ENV: "TEST" envkey_AIGNOSTICS_LOGFIRE_TOKEN: "${{ secrets.AIGNOSTICS_LOGFIRE_TOKEN }}" envkey_AIGNOSTICS_SENTRY_DSN: "${{ secrets.AIGNOSTICS_SENTRY_DSN }}" - envkey_AIGNOSTICS_LOG_LEVEL: "DEBUG" - envkey_AIGNOSTICS_LOG_FILE_ENABLED: 1 envkey_AIGNOSTICS_API_ROOT: https://platform.aignostics.com envkey_AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_ID_DEVICE }} envkey_AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} @@ -46,4 +44,14 @@ jobs: echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV - name: Run scheduled tests - run: make test_scheduled + id: scheduled_tests + run: | + make test_scheduled + # Provide heartbeat to bettertack for monitoring/alerting + exit_code=$? + if [ $exit_code -eq 0 ]; then + curl -s https://uptime.betterstack.com/api/v1/heartbeat/${{ secrets.BETTERUPTIME_HEARTBEAT_PYTHONSDK_SCHEDULED_E2E_TEST_ON_GITHUB_ID }} + else + curl -s https://uptime.betterstack.com/api/v1/heartbeat/${{ secrets.BETTERUPTIME_HEARTBEAT_PYTHONSDK_SCHEDULED_E2E_TEST_ON_GITHUB_ID }}/$exit_code + fi + exit $exit_code diff --git a/.gitignore b/.gitignore index b82023ea..7813293e 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,10 @@ env/ .secrets.json .act-env-secret +# More secrets +.ssh +.aws + # Python virtual environment venv/ .venv/ @@ -69,6 +73,7 @@ tmp/ # Node temps node_modules/ + # AI workflow .fixme @@ -77,7 +82,11 @@ node_modules/ + # Application specific tests/reports/**/* **/__marimo__ **/.ipynb_checkpoints + +data/* +!data/.gitkeep diff --git a/.license-types-allowed b/.license-types-allowed index 8e4ac883..10b1cfb8 100644 --- a/.license-types-allowed +++ b/.license-types-allowed @@ -5,6 +5,7 @@ Apache-2.0 Apache License, Version 2.0 Apache License 2.0 0BSD +BSD BSD License BSD-2-Clause CC0 1.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 959687ea..2ddf130c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,11 +9,9 @@ repos: - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.10.0 hooks: - - id: python-check-blanket-noqa - - id: python-check-blanket-type-ignore - exclude: "^examples/notebook.py$" - id: python-check-mock-methods - id: python-no-eval + exclude: "bottle.py" - id: python-no-log-warn - id: python-use-type-annotations - id: rst-backticks @@ -31,24 +29,16 @@ repos: args: ["--assume-in-merge"] exclude: "license.rst" - id: check-shebang-scripts-are-executable + exclude: "bottle.py" - id: check-symlinks - id: check-toml - id: check-xml - - id: check-yaml - exclude: | - (?x)^( - test.*| - mkdocs.yml - )$ - args: [--allow-multiple-documents] - id: debug-statements - id: destroyed-symlinks - id: detect-private-key - id: end-of-file-fixer exclude: "^tests/fixtures/|.json$" - id: fix-byte-order-marker - - id: fix-encoding-pragma - args: ["--remove"] - id: mixed-line-ending - id: name-tests-test - id: requirements-txt-fixer diff --git a/.python-version b/.python-version index 2c073331..24ee5b1b 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.11 +3.13 diff --git a/.vscode/settings.json b/.vscode/settings.json index 7915f364..1ad6ba12 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -71,7 +71,8 @@ "github.copilot.chat.scopeSelection": true, "github.copilot.chat.search.semanticTextResults": true, "sonarlint.connectedMode.project": { - "connectionId": "aignostics-gmbh", + "connectionId": "aignostics", "projectKey": "aignostics_python-sdk" - } -} + }, + "makefile.configureOnOpen": false +} \ No newline at end of file diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md index 8425b45f..86e425dc 100644 --- a/API_REFERENCE_v1.md +++ b/API_REFERENCE_v1.md @@ -1,2063 +1,1119 @@ # API v1 Reference -## Aignostics Platform API reference v1.0.0 - -> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. - -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. -The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via -`+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. - -Base URLs: - -* [/api](/api) - -## Authentication - -- oAuth2 authentication. - - - Flow: authorizationCode - - Authorization URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize) - - Token URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token) - -|Scope|Scope Description| -|---|---| - -## Public - -### list_applications_v1_applications_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/api/v1/applications', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/applications', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications` - -*List Applications* - -Returns the list of the applications, available to the caller. - -The application is available if any of the version of the application is assigned to the -user organization. To switch between organizations, the user should re-login and choose the -needed organization. - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "h-e-tme", - "description": "string", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ] - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Applications V1 Applications Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Applications V1 Applications Get|[[ApplicationReadResponse](#schemaapplicationreadresponse)]|false|none|none| -|» ApplicationReadResponse|[ApplicationReadResponse](#schemaapplicationreadresponse)|false|none|none| -|»» application_id|string|true|none|Application ID| -|»» description|string|true|none|Application documentations| -|»» name|string|true|none|Application display name| -|»» regulatory_classes|[string]|true|none|Regulatory class, to which the applications compliance| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### list_versions_by_application_id_v1_applications__application_id__versions_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/api/v1/applications/{application_id}/versions', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/applications/{application_id}/versions', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_id}/versions` - -*List Versions By Application Id* - -Returns the list of the application versions for this application, available to the caller. - -The application version is available if it is assigned to the user's organization. - -The application versions are assigned to the organization by the Aignostics admin. To -assign or unassign a version from your organization, please contact Aignostics support team. - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_id|path|string|true|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|version|query|any|false|none| -|include|query|any|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "string", - "application_version_id": "h-e-tme:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Versions By Application Id V1 Applications Application Id Versions Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| -|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| -|»» application_id|string|true|none|Application ID| -|»» application_version_id|string|true|none|Application version ID| -|»» changelog|string|true|none|Description of the changes relative to the previous version| -|»» flow_id|any|false|none|Flow ID, used internally by the platform| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string(uuid)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|List of the input fields, provided by the User| -|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|List of the output fields, generated by the application| -|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|»» version|string|true|none|Semantic version of the application| - -##### Enumerated Values - -|Property|Value| -|---|---| -|scope|item| -|scope|global| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### list_application_runs_v1_runs_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/api/v1/runs', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/runs', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs` - -*List Application Runs* - -The endpoint returns the application runs triggered by the caller. After the application run -is created by POST /v1/runs, it becomes available for the current endpoint - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_id|query|any|false|Optional application ID filter| -|application_version|query|any|false|Optional application version filter| -|include|query|any|false|Request optional output values. Used internally by the platform| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "string", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "string", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Application Runs V1 Runs Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Application Runs V1 Runs Get|[[RunReadResponse](#schemarunreadresponse)]|false|none|none| -|» RunReadResponse|[RunReadResponse](#schemarunreadresponse)|false|none|none| -|»» application_run_id|string(uuid)|true|none|UUID of the application| -|»» application_version_id|string|true|none|ID of the application version| -|»» organization_id|string|true|none|Organization of the owner of the application run| -|»» status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| -|»» triggered_at|string(date-time)|true|none|Timestamp showing when the application run was triggered| -|»» triggered_by|string|true|none|Id of the user who triggered the application run| -|»» user_payload|any|false|none|Field used internally by the Platform| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| -|»»»» application_id|string|true|none|none| -|»»»» application_run_id|string(uuid)|true|none|none| -|»»»» global_output_artifacts|any|true|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|object|false|none|none| -|»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| -|»»»»»»» data|[TransferUrls](#schematransferurls)|true|none|none| -|»»»»»»»» download_url|string(uri)|true|none|none| -|»»»»»»»» upload_url|string(uri)|true|none|none| -|»»»»»»» metadata|[TransferUrls](#schematransferurls)|true|none|none| -|»»»»»»» output_artifact_id|string(uuid)|true|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»» items|[[PayloadItem](#schemapayloaditem)]|true|none|none| -|»»»»» PayloadItem|[PayloadItem](#schemapayloaditem)|false|none|none| -|»»»»»» input_artifacts|object|true|none|none| -|»»»»»»» PayloadInputArtifact|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| -|»»»»»»»» download_url|string(uri)|true|none|none| -|»»»»»»»» input_artifact_id|string(uuid)|false|none|none| -|»»»»»»»» metadata|object|true|none|none| -|»»»»»» item_id|string(uuid)|true|none|none| -|»»»»»» output_artifacts|object|true|none|none| -|»»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|status|canceled_system| -|status|canceled_user| -|status|completed| -|status|completed_with_error| -|status|received| -|status|rejected| -|status|running| -|status|scheduled| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### create_application_run_v1_runs_post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.post('/api/v1/runs', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "application_version_id": "h-e-tme:v1.2.3", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/runs', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/runs` - -*Create Application Run* - -The endpoint is used to process the input items by the chosen application version. The endpoint -returns the `application_run_id`. The processing fo the items is done asynchronously. - -To check the status or cancel the execution, use the /v1/runs/{application_run_id} endpoint. - -#### Payload - -The payload includes `application_version_id` and `items` base fields. - -`application_version_id` is the id used for `/v1/versions/{application_id}` endpoint. - -`items` includes the list of the items to process (slides, in case of HETA application). -Every item has a set of standard fields defined by the API, plus the metadata, specific to the -chosen application. - -Example payload structure with the comments: -``` -{ - application_version_id: "heta:v1.0.0", - items: [{ - "reference": "slide_1" Body parameter - -```json -{ - "application_version_id": "h-e-tme:v1.2.3", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[RunCreationRequest](#schemaruncreationrequest)|true|none| - -> Example responses - -> 201 Response - -```json -{ - "application_run_id": "Application run id" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[RunCreationResponse](#schemaruncreationresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### get_run_v1_runs__application_run_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/api/v1/runs/{application_run_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/runs/{application_run_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs/{application_run_id}` - -*Get Run* - -Returns the details of the application run. The application run is available as soon as it is -created via `POST /runs/` endpoint. To download the items results, call -`/runs/{application_run_id}/results`. - -The application is only available to the user who triggered it, regardless of the role. - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| -|include|query|any|false|none| - -> Example responses - -> 200 Response - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "string", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "string", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[RunReadResponse](#schemarunreadresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### cancel_application_run_v1_runs__application_run_id__cancel_post - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.post('/api/v1/runs/{application_run_id}/cancel', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/runs/{application_run_id}/cancel', -{ - method: 'POST', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/runs/{application_run_id}/cancel` - -*Cancel Application Run* - -The application run can be canceled by the user who created the application run. - -The execution can be canceled any time while the application is not in a final state. The -pending items will not be processed and will not add to the cost. - -When the application is canceled, the already completed items stay available for download. - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| - -> Example responses - -> 202 Response - -```json -null -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### delete_application_run_results_v1_runs__application_run_id__results_delete - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.delete('/api/v1/runs/{application_run_id}/results', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/runs/{application_run_id}/results', -{ - method: 'DELETE', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`DELETE /v1/runs/{application_run_id}/results` - -*Delete Application Run Results* - -Delete the application run results. It can only be called when the application is in a final -state (meaning it's not in `received` or `pending` states). To delete the results of the running -artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel the application run. - -The output results are deleted automatically 30 days after the application run is finished. - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| - -> Example responses - -> 422 Response - -```json -{ - "detail": [ - { - "loc": [ - "string" - ], - "msg": "string", - "type": "string" - } - ] -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|Successful Response|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### list_run_results_v1_runs__application_run_id__results_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/api/v1/runs/{application_run_id}/results', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/runs/{application_run_id}/results', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs/{application_run_id}/results` - -*List Run Results* - -Get the list of the results for the run items - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| -|item_id__in|query|any|false|Filter for items ids| -|reference__in|query|any|false|Filter for items by their reference from the input payload| -|status__in|query|any|false|Filter for items in certain statuses| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "error": "string", - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": [ - { - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - ], - "reference": "string", - "status": "pending" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Run Results V1 Runs Application Run Id Results Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Run Results V1 Runs Application Run Id Results Get|[[ItemResultReadResponse](#schemaitemresultreadresponse)]|false|none|none| -|» ItemResultReadResponse|[ItemResultReadResponse](#schemaitemresultreadresponse)|false|none|none| -|»» application_run_id|string(uuid)|true|none|Application run UUID to which the item belongs| -|»» error|any|true|none|The error message in case the item is in `error_system` or `error_user` state| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» item_id|string(uuid)|true|none|Item UUID generated by the Platform| -|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|The list of the results generated by the application algorithm. The number of files and theirtypes depend on the particular application version, call `/v1/versions/{version_id}` to getthe details.| -|»»» OutputArtifactResultReadResponse|[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)|false|none|none| -|»»»» download_url|any|true|none|The download URL to the output file. The URL is valid for 1 hour after the endpoint is called.A new URL is generated every time the endpoint is called.| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|string(uri)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»» metadata|object|true|none|The metadata of the output artifact, provided by the application| -|»»»» mime_type|string|true|none|The mime type of the output file| -|»»»» name|string|true|none|Name of the output from the output schema from the `/v1/versions/{version_id}` endpoint.| -|»»»» output_artifact_id|string(uuid)|true|none|The Id of the artifact. Used internally| -|»» reference|string|true|none|The reference of the item from the user payload| -|»» status|[ItemStatus](#schemaitemstatus)|true|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|status|pending| -|status|canceled_user| -|status|canceled_system| -|status|error_user| -|status|error_system| -|status|succeeded| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -## Schemas - -### ApplicationReadResponse - - - - - - -```json -{ - "application_id": "h-e-tme", - "description": "string", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ] -} - -``` - -ApplicationReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string|true|none|Application ID| -|description|string|true|none|Application documentations| -|name|string|true|none|Application display name| -|regulatory_classes|[string]|true|none|Regulatory class, to which the applications compliance| - -### ApplicationRunStatus - - - - - - -```json -"canceled_system" - -``` - -ApplicationRunStatus - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ApplicationRunStatus|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ApplicationRunStatus|canceled_system| -|ApplicationRunStatus|canceled_user| -|ApplicationRunStatus|completed| -|ApplicationRunStatus|completed_with_error| -|ApplicationRunStatus|received| -|ApplicationRunStatus|rejected| -|ApplicationRunStatus|running| -|ApplicationRunStatus|scheduled| - -### ApplicationVersionReadResponse - - - - - - -```json -{ - "application_id": "string", - "application_version_id": "h-e-tme:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" -} - -``` - -ApplicationVersionReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string|true|none|Application ID| -|application_version_id|string|true|none|Application version ID| -|changelog|string|true|none|Description of the changes relative to the previous version| -|flow_id|any|false|none|Flow ID, used internally by the platform| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|List of the input fields, provided by the User| -|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|List of the output fields, generated by the application| -|version|string|true|none|Semantic version of the application| - -### HTTPValidationError - - - - - - -```json -{ - "detail": [ - { - "loc": [ - "string" - ], - "msg": "string", - "type": "string" - } - ] -} - -``` - -HTTPValidationError - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|detail|[[ValidationError](#schemavalidationerror)]|false|none|none| - -### InputArtifactCreationRequest - - - - - - -```json -{ - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" -} - -``` - -InputArtifactCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) to the input artifact file. The URL should be valid for at least 6 days from the payload submission time.| -|metadata|object|true|none|The metadata of the artifact, required by the application version. The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. The schema is located in `input_artifacts.[].metadata_schema`| -|name|string|true|none|The artifact name according to the application version. List of required artifacts is returned by `/v1/versions/{application_version_id}`. The artifact names are located in the `input_artifacts.[].name` value| - -### InputArtifactReadResponse - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" -} - -``` - -InputArtifactReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - -### ItemCreationRequest - - - - - - -```json -{ - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" -} - -``` - -ItemCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|All the input files of the item, required by the application version| -|reference|string|true|none|The ID of the slide provided by the caller. The reference should be unique across all items of the application run| - -### ItemResultReadResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "error": "string", - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": [ - { - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - ], - "reference": "string", - "status": "pending" -} - -``` - -ItemResultReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|Application run UUID to which the item belongs| -|error|any|true|none|The error message in case the item is in `error_system` or `error_user` state| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|item_id|string(uuid)|true|none|Item UUID generated by the Platform| -|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|The list of the results generated by the application algorithm. The number of files and theirtypes depend on the particular application version, call `/v1/versions/{version_id}` to getthe details.| -|reference|string|true|none|The reference of the item from the user payload| -|status|[ItemStatus](#schemaitemstatus)|true|none|When the item is not processed yet, the status is set to `pending`.When the item is successfully finished, status is set to `succeeded`, and the processing resultsbecome available for download in `output_artifacts` field.When the item processing is failed because the provided item is invalid, the status is set to`error_user`. When the item processing failed because of the error in the model or platform,the status is set to `error_system`. When the application_run is canceled, the status of allpending items is set to either `cancelled_user` or `cancelled_system`.| - -### ItemStatus - - - - - - -```json -"pending" - -``` - -ItemStatus - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ItemStatus|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ItemStatus|pending| -|ItemStatus|canceled_user| -|ItemStatus|canceled_system| -|ItemStatus|error_user| -|ItemStatus|error_system| -|ItemStatus|succeeded| - -### OutputArtifactReadResponse - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" -} - -``` - -OutputArtifactReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| - -### OutputArtifactResultReadResponse - - - - - - -```json -{ - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" -} - -``` - -OutputArtifactResultReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|any|true|none|The download URL to the output file. The URL is valid for 1 hour after the endpoint is called.A new URL is generated every time the endpoint is called.| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uri)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata|object|true|none|The metadata of the output artifact, provided by the application| -|mime_type|string|true|none|The mime type of the output file| -|name|string|true|none|Name of the output from the output schema from the `/v1/versions/{version_id}` endpoint.| -|output_artifact_id|string(uuid)|true|none|The Id of the artifact. Used internally| - -### OutputArtifactScope - - - - - - -```json -"item" - -``` - -OutputArtifactScope - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|OutputArtifactScope|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|OutputArtifactScope|item| -|OutputArtifactScope|global| - -### PayloadInputArtifact - - - - - - -```json -{ - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} -} - -``` - -PayloadInputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|input_artifact_id|string(uuid)|false|none|none| -|metadata|object|true|none|none| - -### PayloadItem - - - - - - -```json -{ - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } -} - -``` - -PayloadItem - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|object|true|none|none| -|» **additionalProperties**|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| -|item_id|string(uuid)|true|none|none| -|output_artifacts|object|true|none|none| -|» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -### PayloadOutputArtifact - - - - - - -```json -{ - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" -} - -``` - -PayloadOutputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|data|[TransferUrls](#schematransferurls)|true|none|none| -|metadata|[TransferUrls](#schematransferurls)|true|none|none| -|output_artifact_id|string(uuid)|true|none|none| - -### RunCreationRequest - - - - - - -```json -{ - "application_version_id": "h-e-tme:v1.2.3", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -} - -``` - -RunCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_version_id|string|true|none|Application version ID| -|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|List of the items to process by the application| - -### RunCreationResponse - - - - - - -```json -{ - "application_run_id": "Application run id" -} - -``` - -RunCreationResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|false|none|none| - -### RunReadResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "string", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "string", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } -} - -``` - -RunReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|UUID of the application| -|application_version_id|string|true|none|ID of the application version| -|organization_id|string|true|none|Organization of the owner of the application run| -|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|When the application run request is received by the Platform, the `status` of it is set to`received`. Then it is transitioned to `scheduled`, when it is scheduled for the processing.When the application run is scheduled, it will process the input items and generate the resultincrementally. As soon as the first result is generated, the state is changed to `running`.The results can be downloaded via `/v1/runs/{run_id}/results` endpoint.When all items are processed and all results are generated, the application status is set to`completed`. If the processing is done, but some items fail, the status is set to`completed_with_error`.When the application run request is rejected by the Platform before scheduling, it is transferredto `rejected`. When the application run reaches the threshold of number of failed items, the wholeapplication run is set to `canceled_system` and the remaining pending items are not processed.When the application run fails, the finished item results are available for download.If the application run is canceled by calling `POST /v1/runs/{run_id}/cancel` endpoint, theprocessing of the items is stopped, and the application status is set to `cancelled_user`| -|triggered_at|string(date-time)|true|none|Timestamp showing when the application run was triggered| -|triggered_by|string|true|none|Id of the user who triggered the application run| -|user_payload|any|false|none|Field used internally by the Platform| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -### TransferUrls - - - - - - -```json -{ - "download_url": "http://example.com", - "upload_url": "http://example.com" -} - -``` - -TransferUrls - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|upload_url|string(uri)|true|none|none| - -### UserPayload - - - - - - -```json -{ - "application_id": "string", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] -} - -``` - -UserPayload - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string|true|none|none| -|application_run_id|string(uuid)|true|none|none| -|global_output_artifacts|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|object|false|none|none| -|»» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|items|[[PayloadItem](#schemapayloaditem)]|true|none|none| - -### ValidationError - - - - - - -```json -{ - "loc": [ - "string" - ], - "msg": "string", - "type": "string" -} - -``` - -ValidationError - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|loc|[anyOf]|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|integer|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|msg|string|true|none|none| -|type|string|true|none|none| +--- +title: is chosen, and which user data +language_tabs: +toc_footers: [] +includes: [] +search: true +highlight_theme: darkula +--- + + + + + + + + + + - h-e-tme + title: Application Id + type: string + description: + description: Application documentations + title: Description + type: string + name: + description: Application display name + examples: + - HETA + title: Name + type: string + regulatory_classes: + description: Regulatory class, to which the applications compliance + examples: + - - RuO + items: + type: string + title: Regulatory Classes + type: array + required: + - application_id + - name + - regulatory_classes + - description + title: ApplicationReadResponse + type: object + ApplicationRunStatus: + enum: + - canceled_system + - canceled_user + - completed + - completed_with_error + - received + - rejected + - running + - scheduled + title: ApplicationRunStatus + type: string + ApplicationVersionReadResponse: + properties: + application_id: + description: Application ID + title: Application Id + type: string + application_version_id: + description: Application version ID + examples: + - h-e-tme:v0.0.1 + title: Application Version Id + type: string + changelog: + description: Description of the changes relative to the previous version + title: Changelog + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + description: Flow ID, used internally by the platform + title: Flow Id + input_artifacts: + description: List of the input fields, provided by the User + items: + $ref: '#/components/schemas/InputArtifactReadResponse' + title: Input Artifacts + type: array + output_artifacts: + description: List of the output fields, generated by the application + items: + $ref: '#/components/schemas/OutputArtifactReadResponse' + title: Output Artifacts + type: array + version: + description: Semantic version of the application + title: Version + type: string + required: + - application_version_id + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + title: ApplicationVersionReadResponse + type: object + HTTPValidationError: + properties: + detail: + items: + $ref: '#/components/schemas/ValidationError' + title: Detail + type: array + title: HTTPValidationError + type: object + InputArtifactCreationRequest: + properties: + download_url: + description: '[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) + to the input artifact file. The URL should be valid for at least 6 days + from the payload submission time.' + examples: + - https://example.com/case-no-1-slide.tiff + format: uri + maxLength: 2083 + minLength: 1 + title: Download Url + type: string + metadata: + description: The metadata of the artifact, required by the application version. + The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. + The schema is located in `input_artifacts.[].metadata_schema` + examples: + - checksum_crc32c: 752f9554 + height: 2000 + height_mpp: 0.5 + width: 10000 + width_mpp: 0.5 + title: Metadata + type: object + name: + description: The artifact name according to the application version. List + of required artifacts is returned by `/v1/versions/{application_version_id}`. + The artifact names are located in the `input_artifacts.[].name` value + examples: + - slide + title: Name + type: string + required: + - name + - download_url + - metadata + title: InputArtifactCreationRequest + type: object + InputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactReadResponse + type: object + ItemCreationRequest: + properties: + input_artifacts: + description: All the input files of the item, required by the application + version + items: + $ref: '#/components/schemas/InputArtifactCreationRequest' + title: Input Artifacts + type: array + reference: + description: The ID of the slide provided by the caller. The reference should + be unique across all items of the application run + examples: + - case-no-1 + title: Reference + type: string + required: + - reference + - input_artifacts + title: ItemCreationRequest + type: object + ItemResultReadResponse: + properties: + application_run_id: + description: Application run UUID to which the item belongs + format: uuid + title: Application Run Id + type: string + error: + anyOf: + - type: string + - type: 'null' + description: "\nThe error message in case the item is in `error_system`\ + \ or `error_user` state\n " + title: Error + item_id: + description: Item UUID generated by the Platform + format: uuid + title: Item Id + type: string + output_artifacts: + description: "\nThe list of the results generated by the application algorithm.\ + \ The number of files and their\ntypes depend on the particular application\ + \ version, call `/v1/versions/{version_id}` to get\nthe details.\n " + items: + $ref: '#/components/schemas/OutputArtifactResultReadResponse' + title: Output Artifacts + type: array + reference: + description: The reference of the item from the user payload + title: Reference + type: string + status: + $ref: '#/components/schemas/ItemStatus' + description: "\nWhen the item is not processed yet, the status is set to\ + \ `pending`.\n\nWhen the item is successfully finished, status is set\ + \ to `succeeded`, and the processing results\nbecome available for download\ + \ in `output_artifacts` field.\n\nWhen the item processing is failed because\ + \ the provided item is invalid, the status is set to\n`error_user`. When\ + \ the item processing failed because of the error in the model or platform,\n\ + the status is set to `error_system`. When the application_run is canceled,\ + \ the status of all\npending items is set to either `cancelled_user` or\ + \ `cancelled_system`.\n " + required: + - item_id + - application_run_id + - reference + - status + - error + - output_artifacts + title: ItemResultReadResponse + type: object + ItemStatus: + enum: + - pending + - canceled_user + - canceled_system + - error_user + - error_system + - succeeded + title: ItemStatus + type: string + OutputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + required: + - name + - mime_type + - metadata_schema + - scope + title: OutputArtifactReadResponse + type: object + OutputArtifactResultReadResponse: + properties: + download_url: + anyOf: + - format: uri + maxLength: 2083 + minLength: 1 + type: string + - type: 'null' + description: "\nThe download URL to the output file. The URL is valid for\ + \ 1 hour after the endpoint is called.\nA new URL is generated every time\ + \ the endpoint is called.\n " + title: Download Url + metadata: + description: The metadata of the output artifact, provided by the application + title: Metadata + type: object + mime_type: + description: The mime type of the output file + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + description: "\nName of the output from the output schema from the `/v1/versions/{version_id}`\ + \ endpoint.\n " + title: Name + type: string + output_artifact_id: + description: The Id of the artifact. Used internally + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - name + - mime_type + - metadata + - download_url + title: OutputArtifactResultReadResponse + type: object + OutputArtifactScope: + enum: + - item + - global + title: OutputArtifactScope + type: string + PayloadInputArtifact: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + input_artifact_id: + format: uuid + title: Input Artifact Id + type: string + metadata: + title: Metadata + type: object + required: + - metadata + - download_url + title: PayloadInputArtifact + type: object + PayloadItem: + properties: + input_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadInputArtifact' + title: Input Artifacts + type: object + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + title: Output Artifacts + type: object + required: + - item_id + - input_artifacts + - output_artifacts + title: PayloadItem + type: object + PayloadOutputArtifact: + properties: + data: + $ref: '#/components/schemas/TransferUrls' + metadata: + $ref: '#/components/schemas/TransferUrls' + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - data + - metadata + title: PayloadOutputArtifact + type: object + RunCreationRequest: + description: 'Application run payload. It describes which application version + is chosen, and which user data + +> 2025-04-22 08:54:57 INFO aignostics.aignostics.utils.boot ⭐ Booting aignostics v0.0.10 (project root /Users/helmut/Code/python-sdk, pid 13186), parent 'python3.13' (pid 11950) boot.py:84 + +> components: + +> schemas: + +> ApplicationReadResponse: + +> properties: + +> application_id: + +> description: Application ID + +> examples: + + should be processed.' + properties: + application_version_id: + description: Application version ID + examples: + - h-e-tme:v1.2.3 + title: Application Version Id + type: string + items: + description: List of the items to process by the application + items: + $ref: '#/components/schemas/ItemCreationRequest' + title: Items + type: array + required: + - application_version_id + - items + title: RunCreationRequest + type: object + RunCreationResponse: + properties: + application_run_id: + default: Application run id + format: uuid + title: Application Run Id + type: string + title: RunCreationResponse + type: object + RunReadResponse: + properties: + application_run_id: + description: UUID of the application + format: uuid + title: Application Run Id + type: string + application_version_id: + description: ID of the application version + title: Application Version Id + type: string + organization_id: + description: Organization of the owner of the application run + title: Organization Id + type: string + status: + $ref: '#/components/schemas/ApplicationRunStatus' + description: "\nWhen the application run request is received by the Platform,\ + \ the `status` of it is set to\n`received`. Then it is transitioned to\ + \ `scheduled`, when it is scheduled for the processing.\nWhen the application\ + \ run is scheduled, it will process the input items and generate the result\n\ + incrementally. As soon as the first result is generated, the state is\ + \ changed to `running`.\nThe results can be downloaded via `/v1/runs/{run_id}/results`\ + \ endpoint.\nWhen all items are processed and all results are generated,\ + \ the application status is set to\n`completed`. If the processing is\ + \ done, but some items fail, the status is set to\n`completed_with_error`.\n\ + \nWhen the application run request is rejected by the Platform before\ + \ scheduling, it is transferred\nto `rejected`. When the application run\ + \ reaches the threshold of number of failed items, the whole\napplication\ + \ run is set to `canceled_system` and the remaining pending items are\ + \ not processed.\nWhen the application run fails, the finished item results\ + \ are available for download.\n\nIf the application run is canceled by\ + \ calling `POST /v1/runs/{run_id}/cancel` endpoint, the\nprocessing of\ + \ the items is stopped, and the application status is set to `cancelled_user`\n\ + \ " + triggered_at: + description: Timestamp showing when the application run was triggered + format: date-time + title: Triggered At + type: string + triggered_by: + description: Id of the user who triggered the application run + title: Triggered By + type: string + user_payload: + anyOf: + - $ref: '#/components/schemas/UserPayload' + - type: 'null' + description: Field used internally by the Platform + required: + - application_run_id + - application_version_id + - organization_id + - status + - triggered_at + - triggered_by + title: RunReadResponse + type: object + TransferUrls: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + upload_url: + format: uri + minLength: 1 + title: Upload Url + type: string + required: + - upload_url + - download_url + title: TransferUrls + type: object + UserPayload: + properties: + application_id: + title: Application Id + type: string + application_run_id: + format: uuid + title: Application Run Id + type: string + global_output_artifacts: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + type: object + - type: 'null' + title: Global Output Artifacts + items: + items: + $ref: '#/components/schemas/PayloadItem' + title: Items + type: array + required: + - application_id + - application_run_id + - global_output_artifacts + - items + title: UserPayload + type: object + ValidationError: + properties: + loc: + items: + anyOf: + - type: string + - type: integer + title: Location + type: array + msg: + title: Message + type: string + type: + title: Error Type + type: string + required: + - loc + - msg + - type + title: ValidationError + type: object + securitySchemes: + OAuth2AuthorizationCodeBearer: + flows: + authorizationCode: + authorizationUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize + scopes: {} + tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token + type: oauth2 +info: + description: ' + + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. + + The `sort` query parameter can be provided multiple times. The sorting direction + can be indicated via + + `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`.' + title: Aignostics Platform API reference + version: 1.0.0 +openapi: 3.1.0 +paths: + /v1/applications: + get: + description: 'Returns the list of the applications, available to the caller. + + + The application is available if any of the version of the application is assigned + to the + + user organization. To switch between organizations, the user should re-login + and choose the + + needed organization.' + operationId: list_applications_v1_applications_get + parameters: + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationReadResponse' + title: Response List Applications V1 Applications Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Applications + tags: + - Public + /v1/applications/{application_id}/versions: + get: + description: 'Returns the list of the application versions for this application, + available to the caller. + + + The application version is available if it is assigned to the user''s organization. + + + The application versions are assigned to the organization by the Aignostics + admin. To + + assign or unassign a version from your organization, please contact Aignostics + support team.' + operationId: list_versions_by_application_id_v1_applications__application_id__versions_get + parameters: + - in: path + name: application_id + required: true + schema: + title: Application Id + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Id V1 Applications Application + Id Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Versions By Application Id + tags: + - Public + /v1/runs: + get: + description: 'The endpoint returns the application runs triggered by the caller. + After the application run + + is created by POST /v1/runs, it becomes available for the current endpoint' + operationId: list_application_runs_v1_runs_get + parameters: + - description: Optional application ID filter + in: query + name: application_id + required: false + schema: + anyOf: + - type: string + - type: 'null' + description: Optional application ID filter + title: Application Id + - description: Optional application version filter + in: query + name: application_version + required: false + schema: + anyOf: + - type: string + - type: 'null' + description: Optional application version filter + title: Application Version + - description: Request optional output values. Used internally by the platform + in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + description: Request optional output values. Used internally by the platform + title: Include + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/RunReadResponse' + title: Response List Application Runs V1 Runs Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Application Runs + tags: + - Public + post: + description: "The endpoint is used to process the input items by the chosen\ + \ application version. The endpoint\nreturns the `application_run_id`. The\ + \ processing fo the items is done asynchronously.\n\nTo check the status or\ + \ cancel the execution, use the /v1/runs/{application_run_id} endpoint.\n\n\ + ### Payload\n\nThe payload includes `application_version_id` and `items` base\ + \ fields.\n\n`application_version_id` is the id used for `/v1/versions/{application_id}`\ + \ endpoint.\n\n`items` includes the list of the items to process (slides,\ + \ in case of HETA application).\nEvery item has a set of standard fields defined\ + \ by the API, plus the metadata, specific to the\nchosen application.\n\n\ + Example payload structure with the comments:\n```\n{\n application_version_id:\ + \ \"heta:v1.0.0\",\n items: [{\n \"reference\": \"slide_1\" <--\ + \ Input ID to connect the input and the output artifact\n \"input_artifacts\"\ + : [{\n \"name\": \"input_slide\" <-- Name of the artifact defined\ + \ by the application (For HETA it is\"input_slide\")\n \"download_url\"\ + : \"https://...\" <-- signed URL to the input file in the S3 or GCS. Should\ + \ be valid for more than 6 days\n \"metadata\": { <-- The metadata\ + \ fields defined by the application. (The example fields set for a slide files\ + \ are provided)\n \"checksum_crc32c\": \"abc12==\",\n \ + \ \"mime_type\": \"image/tiff\",\n \"height\": 100,\n\ + \ \"weight\": 500,\n \"mpp\": 0.543\n \ + \ }\n }]\n }]\n}\n```\n\n### Response\n\nThe endpoint returns\ + \ the application run UUID. After that the job is scheduled for the\nexecution\ + \ in the background.\n\nTo check the status of the run call `v1/runs/{application_run_id}`.\n\ + \n### Rejection\n\nApart from the authentication, authorization and malformed\ + \ input error, the request can be\nrejected when the quota limit is exceeded.\ + \ More details on quotas is described in the\ndocumentation" + operationId: create_application_run_v1_runs_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Create Application Run + tags: + - Public + /v1/runs/{application_run_id}: + get: + description: 'Returns the details of the application run. The application run + is available as soon as it is + + created via `POST /runs/` endpoint. To download the items results, call + + `/runs/{application_run_id}/results`. + + + The application is only available to the user who triggered it, regardless + of the role.' + operationId: get_run_v1_runs__application_run_id__get + parameters: + - description: Application run id, returned by `POST /runs/` endpoint + in: path + name: application_run_id + required: true + schema: + description: Application run id, returned by `POST /runs/` endpoint + format: uuid + title: Application Run Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RunReadResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Run + tags: + - Public + /v1/runs/{application_run_id}/cancel: + post: + description: 'The application run can be canceled by the user who created the + application run. + + + The execution can be canceled any time while the application is not in a final + state. The + + pending items will not be processed and will not add to the cost. + + + When the application is canceled, the already completed items stay available + for download.' + operationId: cancel_application_run_v1_runs__application_run_id__cancel_post + parameters: + - description: Application run id, returned by `POST /runs/` endpoint + in: path + name: application_run_id + required: true + schema: + description: Application run id, returned by `POST /runs/` endpoint + format: uuid + title: Application Run Id + type: string + responses: + '202': + content: + application/json: + schema: {} + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Cancel Application Run + tags: + - Public + /v1/runs/{application_run_id}/results: + delete: + description: 'Delete the application run results. It can only be called when + the application is in a final + + state (meaning it''s not in `received` or `pending` states). To delete the + results of the running + + artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel + the application run. + + + The output results are deleted automatically 30 days after the application + run is finished.' + operationId: delete_application_run_results_v1_runs__application_run_id__results_delete + parameters: + - description: Application run id, returned by `POST /runs/` endpoint + in: path + name: application_run_id + required: true + schema: + description: Application run id, returned by `POST /runs/` endpoint + format: uuid + title: Application Run Id + type: string + responses: + '204': + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Delete Application Run Results + tags: + - Public + get: + description: Get the list of the results for the run items + operationId: list_run_results_v1_runs__application_run_id__results_get + parameters: + - description: Application run id, returned by `POST /runs/` endpoint + in: path + name: application_run_id + required: true + schema: + description: Application run id, returned by `POST /runs/` endpoint + format: uuid + title: Application Run Id + type: string + - description: Filter for items ids + in: query + name: item_id__in + required: false + schema: + anyOf: + - items: + format: uuid + type: string + type: array + - type: 'null' + description: Filter for items ids + title: Item Id In + - description: Filter for items by their reference from the input payload + in: query + name: reference__in + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + description: Filter for items by their reference from the input payload + title: Reference In + - description: Filter for items in certain statuses + in: query + name: status__in + required: false + schema: + anyOf: + - items: + $ref: '#/components/schemas/ItemStatus' + type: array + - type: 'null' + description: Filter for items in certain statuses + title: Status In + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ItemResultReadResponse' + title: Response List Run Results V1 Runs Application Run Id Results + Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Run Results + tags: + - Public +servers: +- url: /api diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index 9c820085..9d5b7d66 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -297,6 +297,41 @@ SOFTWARE. ``` +## PySocks (1.7.1) - BSD + +A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. + +* URL: https://github.com/Anorov/PySocks +* Author(s): Anorov + +### License Text + +``` +Copyright 2006 Dan-Haim. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +3. Neither the name of Dan Haim nor the names of his contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY DAN HAIM "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL DAN HAIM OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMANGE. + +``` + ## PyYAML (6.0.2) - MIT License YAML parser and emitter for Python @@ -470,6 +505,761 @@ SOFTWARE. ``` +## aiofiles (24.1.0) - Apache Software License + +File support for asyncio. + +* URL: https://github.com/Tinche/aiofiles +* Author(s): Tin Tvrtkovic + +### License Text + +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +``` + +### Notice + +``` +Asyncio support for files +Copyright 2016 Tin Tvrtkovic + +``` + +## aiohappyeyeballs (2.6.1) - Python Software Foundation License + +Happy Eyeballs for asyncio + +* URL: https://github.com/aio-libs/aiohappyeyeballs +* Author(s): J. Nick Koston + +### License Text + +``` +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see https://opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +``` + +## aiohttp (3.11.16) - Apache Software License + +Async http client/server framework (asyncio) + +* URL: https://github.com/aio-libs/aiohttp +* Maintainer(s): aiohttp team + +### License Text + +``` + Copyright aio-libs contributors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## aiosignal (1.3.2) - Apache Software License + +aiosignal: a list of registered asynchronous callbacks + +* URL: https://github.com/aio-libs/aiosignal +* Maintainer(s): aiohttp team + +### License Text + +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013-2019 Nikolay Kim and Andrew Svetlov + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + ## alabaster (1.0.0) - BSD License A light, configurable Sphinx theme @@ -2044,6 +2834,395 @@ Isaac Muse ``` +## bidict (0.23.1) - Mozilla Public License 2.0 (MPL 2.0) + +The bidirectional mapping library for Python. + +* URL: https://github.com/jab/bidict +* Author(s): Joshua Bronson + +### License Text + +``` +Mozilla Public License Version 2.0 +================================== + +Copyright 2009-2024 Joshua Bronson. All rights reserved. + + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + +``` + ## bleach (6.2.0) - Apache Software License An easy safelist-based HTML-sanitizing tool. @@ -2594,6 +3773,38 @@ one at http://mozilla.org/MPL/2.0/. ``` +## bottle (0.13.2) - MIT License + +Fast and simple WSGI-framework for small web-applications. + +* URL: http://bottlepy.org/ +* Author(s): Marcel Hellkamp + +### License Text + +``` +Copyright (c) 2009-2024, Marcel Hellkamp. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## bracex (2.5.post1) - MIT License Bash style brace expander. @@ -2628,7 +3839,7 @@ SOFTWARE. ``` -## bump-my-version (1.1.1) - MIT License +## bump-my-version (1.1.2) - MIT License Version bump your Python project @@ -3391,6 +4602,40 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## cloudpathlib (0.21.0) - MIT License + +pathlib-style classes for cloud storage services. + +* URL: https://github.com/drivendataorg/cloudpathlib +* Author(s): DrivenData + +### License Text + +``` +MIT License + +Copyright (c) 2020 DrivenData Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## colorama (0.4.6) - BSD License Cross-platform colored terminal text. @@ -4806,6 +6051,27 @@ limitations under the License. ``` +## dicomweb-client (0.59.3) - MIT License + +Client for DICOMweb RESTful services. + +* URL: https://github.com/ImagingDataCommons/dicomweb-client +* Author(s): Markus D. Herrmann +* Maintainer(s): Markus D. Herrmann, Christopher P. Bridge, Steve Pieper + +### License Text + +``` +Copyright 2020 MGH Computational Pathology + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + ## dict2css (0.3.0.post1) - MIT License A μ-library for constructing cascading style sheets from Python dictionaries. @@ -5388,6 +6654,278 @@ OR OTHER DEALINGS IN THE SOFTWARE. ``` +## duckdb (1.2.1) - MIT License + +DuckDB in-process database + +* URL: https://www.duckdb.org +* Maintainer(s): Hannes Muehleisen + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +------------------------------------------------------------------------------------ +This product bundles various third-party components under other open source licenses. +This section summarizes those components and their licenses. See licenses/ +for text of these licenses. + + +Apache Software Foundation License 2.0 +-------------------------------------- + +common/network-common/src/main/java/org/apache/spark/network/util/LimitedInputStream.java +core/src/main/java/org/apache/spark/util/collection/TimSort.java +core/src/main/resources/org/apache/spark/ui/static/bootstrap* +core/src/main/resources/org/apache/spark/ui/static/vis* +docs/js/vendor/bootstrap.js +connector/spark-ganglia-lgpl/src/main/java/com/codahale/metrics/ganglia/GangliaReporter.java + + +Python Software Foundation License +---------------------------------- + +python/docs/source/_static/copybutton.js + +BSD 3-Clause +------------ + +python/lib/py4j-*-src.zip +python/pyspark/cloudpickle/*.py +python/pyspark/join.py +core/src/main/resources/org/apache/spark/ui/static/d3.min.js + +The CSS style for the navigation sidebar of the documentation was originally +submitted by Óscar Nájera for the scikit-learn project. The scikit-learn project +is distributed under the 3-Clause BSD license. + + +MIT License +----------- + +core/src/main/resources/org/apache/spark/ui/static/dagre-d3.min.js +core/src/main/resources/org/apache/spark/ui/static/*dataTables* +core/src/main/resources/org/apache/spark/ui/static/graphlib-dot.min.js +core/src/main/resources/org/apache/spark/ui/static/jquery* +core/src/main/resources/org/apache/spark/ui/static/sorttable.js +docs/js/vendor/anchor.min.js +docs/js/vendor/jquery* +docs/js/vendor/modernizer* + + +Creative Commons CC0 1.0 Universal Public Domain Dedication +----------------------------------------------------------- +(see LICENSE-CC0.txt) + +data/mllib/images/kittens/29.5.a_b_EGDP022204.jpg +data/mllib/images/kittens/54893.jpg +data/mllib/images/kittens/DP153539.jpg +data/mllib/images/kittens/DP802813.jpg +data/mllib/images/multi-channel/chr30.4.184.jpg +``` + ## email_validator (2.2.0) - The Unlicense (Unlicense) A robust email address syntax and deliverability validation library. @@ -5428,7 +6966,7 @@ For more information, please refer to ``` -## enum-tools (0.12.0) - GNU Lesser General Public License v3 or later (LGPLv3+) +## enum-tools (0.13.0) - GNU Lesser General Public License v3 or later (LGPLv3+) Tools to expand Python's enum module. @@ -6237,6 +7775,262 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice ``` +## frozenlist (1.6.0) - Apache-2.0 + +A list-like structure which implements collections.abc.MutableSequence + +* URL: https://github.com/aio-libs/frozenlist +* Maintainer(s): aiohttp team + +### License Text + +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013-2019 Nikolay Kim and Andrew Svetlov + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## fsspec (2024.12.0) - BSD License + +File-system specification + +* URL: https://github.com/fsspec/filesystem_spec +* Maintainer(s): Martin Durant + +### License Text + +``` +BSD 3-Clause License + +Copyright (c) 2018, Martin Durant +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + ## furo (2024.8.6) - MIT License A clean customisable Sphinx documentation theme. @@ -7870,6 +9664,27 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` +## highdicom (0.25.1) - MIT License + +High-level DICOM abstractions. + +* URL: https://github.com/imagingdatacommons/highdicom +* Author(s): Markus D. Herrmann, Christopher P. Bridge +* Maintainer(s): Markus D. Herrmann, Christopher P. Bridge + +### License Text + +``` +Copyright 2020 MGH Computational Pathology + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + ## html5lib (1.1) - MIT License HTML parser based on the WHATWG HTML specification @@ -8002,6 +9817,72 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ``` +## idc-index (0.8.6) - MIT License + +Package to query and download data from an index of ImagingDataCommons + +* URL: https://github.com/ImagingDataCommons/idc-index +* Author(s): Andrey Fedorov , Vamsi Thiriveedhi + +### License Text + +``` +MIT License + +Copyright (c) 2023 Imaging Data Commons + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## idc-index-data (20.0.3) - MIT License + +ImagingDataCommons index to query and download data. + +* URL: https://github.com/ImagingDataCommons/idc-index-data +* Author(s): Andrey Fedorov , Vamsi Thiriveedhi , Jean-Christophe Fillion-Robin + +### License Text + +``` +Copyright 2024 Andrey Fedorov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## identify (2.6.9) - MIT License File identification library for Python @@ -8078,6 +9959,40 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## ifaddr (0.2.0) - MIT License + +Cross-platform network interface and IP address enumeration library + +* URL: https://github.com/pydron/ifaddr +* Author(s): Stefan C. Mueller + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2014 Stefan C. Mueller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## imagesize (1.4.1) - MIT License Getting image size from png/jpeg/jpeg2000/gif file @@ -10096,7 +12011,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## marimo (0.12.8) - Apache Software License +## marimo (0.13.0) - Apache Software License A library for making reactive notebooks and apps @@ -10344,6 +12259,112 @@ SOFTWARE. ``` +## markdown2 (2.5.3) - MIT License + +A fast and complete Python implementation of Markdown + +* URL: https://github.com/trentm/python-markdown2 +* Author(s): Trent Mick +* Maintainer(s): Trent Mick + +### License Text + +``` +This implementation of Markdown is licensed under the MIT License: + + The MIT License + + Copyright (c) 2012 Trent Mick + Copyright (c) 2010 ActiveState Software Inc. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to permit + persons to whom the Software is furnished to do so, subject to the + following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +All files in a *source package* of markdown2 (i.e. those available on +pypi.python.org and the Google Code project "downloads" page) are under the +MIT license. However, in the *subversion repository* there are some files +(used for performance and testing purposes) that are under different licenses +as follows: + +- perf/recipes.pprint + + Python License. This file includes a number of real-world examples of + Markdown from the ActiveState Python Cookbook, used for doing some + performance testing of markdown2.py. + +- test/php-markdown-cases/... + test/php-markdown-extra-cases/... + + GPL. These are from the MDTest package announced here: + http://six.pairlist.net/pipermail/markdown-discuss/2007-July/000674.html + +- test/markdown.py + + GPL 2 or BSD. A copy (currently old) of Python-Markdown -- the other + Python Markdown implementation. + +- test/markdown.php + + BSD-style. This is PHP Markdown + (http://michelf.com/projects/php-markdown/). + +- test/Markdown.pl: BSD-style + + A copy of Perl Markdown (http://daringfireball.net/projects/markdown/). + + +``` + +## marshmallow (3.26.1) - MIT License + +A lightweight library for converting complex datatypes to and from native Python datatypes. + +* URL: https://github.com/marshmallow-code/marshmallow +* Author(s): Steven Loria +* Maintainer(s): Steven Loria , Jérôme Lafréchoux , Jared Deckard + +### License Text + +``` +Copyright Steven Loria and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## matplotlib (3.10.1) - Python Software Foundation License Python plotting package @@ -10642,6 +12663,32 @@ Copyright (C) 2008-2011 INADA Naoki ``` +## multidict (6.4.3) - Apache Software License + +multidict implementation + +* URL: https://github.com/aio-libs/multidict +* Author(s): Andrew Svetlov + +### License Text + +``` + Copyright 2016 Andrew Svetlov and aio-libs contributors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + ## mypy (1.15.0) - MIT License Optional static typing for Python @@ -11159,6 +13206,40 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## nicegui (2.15.0) - MIT License + +Create web-based user interfaces with Python. The nice way. + +* URL: https://github.com/zauberzeug/nicegui +* Author(s): Zauberzeug GmbH + +### License Text + +``` +MIT License + +Copyright (c) 2021 Zauberzeug GmbH + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## nodeenv (1.9.1) - BSD License Node.js virtual environment builder @@ -16602,6 +18683,22 @@ limitations under the License. ``` +## outcome (1.3.0.post0) - Apache Software License; MIT License + +Capture the outcome of Python function calls. + +* URL: https://github.com/python-trio/outcome +* Author(s): Frazer McLean + +### License Text + +``` +This software is made available under the terms of *either* of the +licenses found in LICENSE.APACHE2 or LICENSE.MIT. Contributions to are +made under the terms of *both* these licenses. + +``` + ## overrides (7.7.0) - Apache License, Version 2.0 A decorator to automatically detect mismatch when overriding a method. @@ -20080,162 +22177,429 @@ A tool for scanning Python environments for known vulnerabilities END OF TERMS AND CONDITIONS -``` - -## platformdirs (4.3.7) - MIT License - -A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. - -* URL: https://github.com/tox-dev/platformdirs -* Maintainer(s): Bernát Gábor , Julian Berman , Ofek Lev , Ronny Pfannschmidt - -### License Text +``` + +## platformdirs (4.3.7) - MIT License + +A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. + +* URL: https://github.com/tox-dev/platformdirs +* Maintainer(s): Bernát Gábor , Julian Berman , Ofek Lev , Ronny Pfannschmidt + +### License Text + +``` +MIT License + +Copyright (c) 2010-202x The platformdirs developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## pluggy (1.5.0) - MIT License + +plugin and hook calling mechanisms for python + +* URL: https://github.com/pytest-dev/pluggy +* Author(s): Holger Krekel + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2015 holger krekel (rather uses bitbucket/hpk42) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## pre_commit (4.2.0) - MIT License + +A framework for managing and maintaining multi-language pre-commit hooks. + +* URL: https://github.com/pre-commit/pre-commit +* Author(s): Anthony Sottile + +### License Text + +``` +Copyright (c) 2014 pre-commit dev team: Anthony Sottile, Ken Struys + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + +## prettytable (3.16.0) - UNKNOWN + +A simple Python library for easily displaying tabular data in a visually appealing ASCII table format + +* URL: https://github.com/prettytable/prettytable +* Author(s): Luke Maurits +* Maintainer(s): Hugo van Kemenade + +### License Text + +``` +# Copyright (c) 2009-2014 Luke Maurits +# All rights reserved. +# With contributions from: +# * Chris Clark +# * Klein Stephane +# * John Filleau +# * Vladimir Vrzić +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +``` + +## prometheus_client (0.21.1) - Apache Software License + +Python client for the Prometheus monitoring system. + +* URL: https://github.com/prometheus/client_python +* Author(s): Brian Brazil + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. -``` -MIT License + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright (c) 2010-202x The platformdirs developers + Copyright [yyyy] [name of copyright owner] -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## pluggy (1.5.0) - MIT License - -plugin and hook calling mechanisms for python - -* URL: https://github.com/pytest-dev/pluggy -* Author(s): Holger Krekel - -### License Text +### Notice ``` -The MIT License (MIT) - -Copyright (c) 2015 holger krekel (rather uses bitbucket/hpk42) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Prometheus instrumentation library for Python applications +Copyright 2015 The Prometheus Authors -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +This product bundles decorator 4.0.10 which is available under a "2-clause BSD" +license. For details, see prometheus_client/decorator.py. ``` -## pre_commit (4.2.0) - MIT License +## prompt_toolkit (3.0.50) - BSD License -A framework for managing and maintaining multi-language pre-commit hooks. +Library for building powerful interactive command lines in Python -* URL: https://github.com/pre-commit/pre-commit -* Author(s): Anthony Sottile +* URL: https://github.com/prompt-toolkit/python-prompt-toolkit +* Author(s): Jonathan Slenders ### License Text ``` -Copyright (c) 2014 pre-commit dev team: Anthony Sottile, Ken Struys - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -``` +Copyright (c) 2014, Jonathan Slenders +All rights reserved. -## prettytable (3.16.0) - UNKNOWN +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: -A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -* URL: https://github.com/prettytable/prettytable -* Author(s): Luke Maurits -* Maintainer(s): Hugo van Kemenade +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. -### License Text +* Neither the name of the {organization} nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. -``` -# Copyright (c) 2009-2014 Luke Maurits -# All rights reserved. -# With contributions from: -# * Chris Clark -# * Klein Stephane -# * John Filleau -# * Vladimir Vrzić -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * The name of the author may not be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## prometheus_client (0.21.1) - Apache Software License +## propcache (0.3.1) - Apache Software License -Python client for the Prometheus monitoring system. +Accelerated property cache -* URL: https://github.com/prometheus/client_python -* Author(s): Brian Brazil +* URL: https://github.com/aio-libs/propcache +* Author(s): Andrew Svetlov +* Maintainer(s): aiohttp team ### License Text ``` + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -20443,51 +22807,19 @@ Python client for the Prometheus monitoring system. ### Notice ``` -Prometheus instrumentation library for Python applications -Copyright 2015 The Prometheus Authors - -This product bundles decorator 4.0.10 which is available under a "2-clause BSD" -license. For details, see prometheus_client/decorator.py. - -``` - -## prompt_toolkit (3.0.50) - BSD License - -Library for building powerful interactive command lines in Python - -* URL: https://github.com/prompt-toolkit/python-prompt-toolkit -* Author(s): Jonathan Slenders - -### License Text - -``` -Copyright (c) 2014, Jonathan Slenders -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: + Copyright 2016-2021, Andrew Svetlov and aio-libs team -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -* Neither the name of the {organization} nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + http://www.apache.org/licenses/LICENSE-2.0 -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` @@ -20749,6 +23081,50 @@ of the input file used when generating it. This code is not standalone and requires a support library to be linked with it. This support library is itself covered by the above license. +``` + +## proxy_tools (0.1.0) - MIT License + +Proxy Implementation + +* URL: http://github.com/jtushman/proxy_tools +* Author(s): Jonathan Tushman + +## pscript (0.7.7) - BSD License + +Python to JavaScript compiler. + +* URL: http://pscript.readthedocs.io +* Author(s): Almar Klein and contributors + +### License Text + +``` +Copyright (c) 2015-2020, PScript developers +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ``` ## psutil (7.0.0) - BSD License @@ -23654,7 +26030,7 @@ SOFTWARE. ``` -## pydantic-settings (2.8.1) - MIT License +## pydantic-settings (2.9.1) - MIT License Settings management using Pydantic @@ -23748,6 +26124,85 @@ Widget for deck.gl maps ``` +## pydicom (3.0.1) - MIT License + +A pure Python package for reading and writing DICOM data + +* URL: https://github.com/pydicom/pydicom +* Author(s): Darcy Mason and contributors + +### License Text + +``` +License file for pydicom, a pure-python DICOM library + +Copyright (c) 2008-2020 Darcy Mason and pydicom contributors + +Except for portions outlined below, pydicom is released under an MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Portions of pydicom (private dictionary file(s)) were generated from the +private dictionary of the GDCM library, released under the following license: + + Program: GDCM (Grassroots DICOM). A DICOM library + +Copyright (c) 2006-2016 Mathieu Malaterre +Copyright (c) 1993-2005 CREATIS +(CREATIS = Centre de Recherche et d'Applications en Traitement de l'Image) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither name of Mathieu Malaterre, or CREATIS, nor the names of any + contributors (CNRS, INSERM, UCB, Universite Lyon I), may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## pyjpegls (1.5.1) - MIT License + +JPEG-LS for Python via CharLS C++ Library + +* URL: https://github.com/pydicom/pyjpegls +* Author(s): pydicom contributors + ## pymdown-extensions (10.14.3) - MIT License Extension pack for Python Markdown. @@ -23874,6 +26329,90 @@ Complete Legal Terms: http://opensource.org/licenses/MIT ``` +## pyobjc-core (11.0) - MIT License + +Python<->ObjC Interoperability Module + +* URL: https://github.com/ronaldoussoren/pyobjc +* Author(s): Ronald Oussoren, bbum, SteveM, LeleG, many others stretching back through the reaches of time... +* Maintainer(s): Ronald Oussoren + +## pyobjc-framework-Cocoa (11.0) - MIT License + +Wrappers for the Cocoa frameworks on macOS + +* URL: https://github.com/ronaldoussoren/pyobjc +* Author(s): Ronald Oussoren + +### License Text + +``` +(This is the MIT license, note that libffi-src is a separate product with its own license) + +Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al. +Copyright 2003-2024 - Ronald Oussoren + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + +## pyobjc-framework-Quartz (11.0) - MIT License + +Wrappers for the Quartz frameworks on macOS + +* URL: https://github.com/ronaldoussoren/pyobjc +* Author(s): Ronald Oussoren + +### License Text + +``` +(This is the MIT license, note that libffi-src is a separate product with its own license) + +Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al. +Copyright 2003-2024 - Ronald Oussoren + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + +## pyobjc-framework-Security (11.0) - MIT License + +Wrappers for the framework Security on macOS + +* URL: https://github.com/ronaldoussoren/pyobjc +* Author(s): Ronald Oussoren + +## pyobjc-framework-WebKit (11.0) - MIT License + +Wrappers for the framework WebKit on macOS + +* URL: https://github.com/ronaldoussoren/pyobjc +* Author(s): Ronald Oussoren + +### License Text + +``` +(This is the MIT license, note that libffi-src is a separate product with its own license) + +Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al. +Copyright 2003-2024 - Ronald Oussoren + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + ## pyparsing (3.2.3) - MIT License pyparsing module - Classes and methods to define and execute parsing grammars @@ -24188,6 +26727,22 @@ Apache License ``` +## pytest-base-url (2.1.0) - Mozilla Public License 2.0 (MPL 2.0) + +pytest plugin for URL based testing + +* URL: https://github.com/pytest-dev/pytest-base-url +* Author(s): Dave Hunt , Jim Brannlund + +### License Text + +``` +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +``` + ## pytest-cov (6.1.1) - MIT License Pytest plugin for measuring coverage. @@ -24320,6 +26875,38 @@ SOFTWARE. ``` +## pytest-html (4.1.1) - MIT License + +pytest plugin for generating HTML reports + +* URL: https://github.com/pytest-dev/pytest-html +* Author(s): Dave Hunt , Jim Brannlund + +### License Text + +``` +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +``` + +## pytest-metadata (3.1.1) - Mozilla Public License 2.0 (MPL 2.0) + +pytest plugin for test session metadata + +* URL: https://github.com/pytest-dev/pytest-metadata +* Author(s): Dave Hunt , Jim Brannlund + +### License Text + +``` +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +``` + ## pytest-regressions (2.7.0) - MIT License Easy to use fixtures to write regression tests. @@ -24356,6 +26943,22 @@ THE SOFTWARE. ``` +## pytest-selenium (4.1.0) - Mozilla Public License 2.0 (MPL 2.0) + +pytest plugin for Selenium + +* URL: https://github.com/pytest-dev/pytest-selenium +* Author(s): Dave Hunt , Jim Brannlund + +### License Text + +``` +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +``` + ## pytest-subprocess (1.5.3) - MIT License A plugin to fake subprocess for pytest @@ -24427,6 +27030,56 @@ THE SOFTWARE. ``` +## pytest-variables (3.1.0) - Mozilla Public License 2.0 (MPL 2.0) + +pytest plugin for providing variables to tests/fixtures + +* URL: https://github.com/pytest-dev/pytest-variables +* Author(s): Dave Hunt , Jim Brannlund + +### License Text + +``` +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +``` + +## pytest-watcher (0.4.3) - MIT License + +Automatically rerun your tests on file modifications + +* URL: https://github.com/olzhasar/pytest-watcher +* Author(s): Olzhas Arystanov + +### License Text + +``` +MIT License + +Copyright (c) 2021 Olzhas Arystanov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## pytest-xdist (3.6.1) - MIT License pytest xdist plugin for distributed testing, most importantly across multiple CPUs @@ -24568,6 +27221,39 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## python-engineio (4.12.0) - MIT License + +Engine.IO server and client for Python + +* URL: https://github.com/miguelgrinberg/python-engineio +* Author(s): Miguel Grinberg + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2015 Miguel Grinberg + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + ## python-json-logger (3.3.0) - BSD License JSON Log Formatter for the Python Logging Package @@ -24627,6 +27313,39 @@ See the License for the specific language governing permissions and limitations under the License. +``` + +## python-socketio (5.13.0) - MIT License + +Socket.IO server and client for Python + +* URL: https://github.com/miguelgrinberg/python-socketio +* Author(s): Miguel Grinberg + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2015 Miguel Grinberg + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ``` ## pytz (2025.2) - MIT License @@ -24662,6 +27381,48 @@ DEALINGS IN THE SOFTWARE. ``` +## pywebview (5.4) - BSD License + +Build GUI for your Python program with JavaScript, HTML, and CSS + +* URL: https://pywebview.flowrl.com/ +* Author(s): Roman Sirokov + +### License Text + +``` +BSD 3-Clause License + +Copyright (c) 2014-2017, Roman Sirokov +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + ## pyzmq (26.4.0) - BSD License Python bindings for 0MQ @@ -25043,6 +27804,239 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` +## retrying (1.3.4) - Apache Software License + +Retrying + +* URL: https://github.com/groodt/retrying +* Author(s): Greg Roodt + +### License Text + +``` + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### Notice + +``` +Copyright 2013 Ray Holder + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +``` + ## rfc3339-validator (0.1.4) - MIT License A pure python RFC3339 validator @@ -25505,7 +28499,7 @@ ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of com ``` -## ruff (0.11.5) - MIT License +## ruff (0.11.6) - MIT License An extremely fast Python linter and code formatter, written in Rust. @@ -27139,7 +30133,253 @@ Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. ``` -## sentry-sdk (2.25.1) - BSD License +## s5cmd (0.2.0) - MIT License + +This project provides the infrastructure to build s5cmd Python wheels. + +* URL: https://github.com/jcfr/s5cmd-python-distributions +* Author(s): Jean-Christophe Fillion-Robin + +### License Text + +``` +Copyright 2024 Jean-Christophe Fillion-Robin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## selenium (4.31.0) - Apache Software License + +Official Python bindings for Selenium WebDriver + +* URL: https://www.selenium.dev + +### License Text + +``` + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2025 Software Freedom Conservancy (SFC) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## sentry-sdk (2.26.1) - BSD License Python client for Sentry (https://sentry.io) @@ -27219,6 +30459,49 @@ The following files include code from opensource projects ``` +## shapely (2.1.0) - BSD License + +Manipulation and analysis of geometric objects + +* URL: https://github.com/shapely/shapely +* Author(s): Sean Gillies +* Maintainer(s): Shapely contributors + +### License Text + +``` +BSD 3-Clause License + +Copyright (c) 2007, Sean C. Gillies. 2019, Casper van der Wel. 2007-2022, Shapely Contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + ## shellingham (1.5.4) - ISC License (ISCL) Tool to Detect Surrounding Shell @@ -27245,6 +30528,40 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` +## simple-websocket (1.1.0) - MIT License + +Simple WebSocket server and client for Python + +* URL: https://github.com/miguelgrinberg/simple-websocket +* Author(s): Miguel Grinberg + +### License Text + +``` +MIT License + +Copyright (c) 2021 Miguel Grinberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## six (1.17.0) - MIT License Python 2 and 3 compatibility utilities @@ -27576,6 +30893,40 @@ IN THE SOFTWARE. ``` +## sphinx-click (6.0.0) - MIT License + +Sphinx extension that automatically documents click applications + +* URL: https://github.com/click-contrib/sphinx-click +* Author(s): Stephen Finucane + +### License Text + +``` +The MIT License + +Copyright (c) 2017 Stephen Finucane http://that.guru/ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## sphinx-copybutton (0.5.2) - MIT License Add a copy button to each of your code cells. @@ -29121,6 +32472,56 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## trio (0.30.0) - UNKNOWN + +A friendly Python library for async concurrency and I/O + +* URL: https://github.com/python-trio/trio +* Author(s): "Nathaniel J. Smith" + +### License Text + +``` +This software is made available under the terms of *either* of the +licenses found in LICENSE.APACHE2 or LICENSE.MIT. Contributions to +Trio are made under the terms of *both* these licenses. + +``` + +## trio-websocket (0.12.2) - MIT License + +WebSocket library for Trio + +* URL: https://github.com/python-trio/trio-websocket +* Author(s): Mark E. Haase + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2018 Hyperion Gray + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## typer (0.15.2) - MIT License Typer, build great CLIs. Easy to code. Based on Python type hints. @@ -30383,6 +33784,41 @@ https://opensource.apple.com/source/tcl/tcl-14/tcl/license.terms ``` +## universal_pathlib (0.2.6) - MIT License + +pathlib api extended to use fsspec backends + +* URL: https://github.com/fsspec/universal_pathlib +* Author(s): Andrew Fulton +* Maintainer(s): Norman Rzepka + +### License Text + +``` +MIT License + +Copyright (c) 2022, Andrew Fulton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## uptime (3.0.1) - BSD License Cross-platform uptime library @@ -30957,6 +34393,40 @@ Copyright (C) 2016-present the uvloop authors and contributors. ``` +## vbuild (0.8.2) - MIT License + +A simple module to extract html/script/style from a vuejs '.vue' file (can minimize/es2015 compliant js) ... just py2 or py3, NO nodejs ! + +* URL: https://github.com/manatlan/vbuild +* Author(s): manatlan + +### License Text + +``` +MIT License + +Copyright (c) 2018 manatlan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## virtualenv (20.30.0) - MIT License Virtual Python Environment builder @@ -31506,6 +34976,281 @@ POSSIBILITY OF SUCH DAMAGE. ``` +## wsidicom (0.26.0) - Apache Software License + +Tools for handling DICOM based whole scan images + +* URL: https://github.com/imi-bigpicture/wsidicom +* Author(s): Erik O Gabrielsson + +## wsproto (1.2.0) - MIT License + +WebSockets state-machine based protocol implementation + +* URL: https://github.com/python-hyper/wsproto/ +* Author(s): Benno Rice + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2017 Benno Rice and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +## yarl (1.20.0) - Apache Software License + +Yet another URL library + +* URL: https://github.com/aio-libs/yarl +* Author(s): Andrew Svetlov +* Maintainer(s): aiohttp team + +### License Text + +``` + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +### Notice + +``` + Copyright 2016-2021, Andrew Svetlov and aio-libs team + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + ## zipp (3.21.0) - MIT License Backport of pathlib-compatible object wrapper for zip files diff --git a/CHANGELOG.md b/CHANGELOG.md index a7a5f0b6..40e83074 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,5 +27,3 @@ ## New Contributors ❤️ * @helmut-hoffer-von-ankershoffen made their first contribution - - diff --git a/CLI_REFERENCE.md b/CLI_REFERENCE.md index ec74078c..a49655d3 100644 --- a/CLI_REFERENCE.md +++ b/CLI_REFERENCE.md @@ -1,6 +1,6 @@ # CLI Reference -Command Line Interface of +Command Line Interface of Aignostics Python SDK **Usage**: @@ -14,13 +14,46 @@ $ aignostics [OPTIONS] COMMAND [ARGS]... * `--show-completion`: Show completion for the current shell, to copy it or customize the installation. * `--help`: Show this message and exit. -🧠 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 +🔬 Aignostics Python SDK v0.0.10 - built with love in Berlin 🐻 **Commands**: +* `gui`: Start graphical user interface (GUI) in... +* `notebook`: Start notebook in web browser. * `application`: Application commands +* `idc`: Commands to query and download... * `system`: System commands +## `aignostics gui` + +Start graphical user interface (GUI) in native window. + +**Usage**: + +```console +$ aignostics gui [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +## `aignostics notebook` + +Start notebook in web browser. + +**Usage**: + +```console +$ aignostics notebook [OPTIONS] +``` + +**Options**: + +* `--host TEXT`: Host to bind the server to [default: 127.0.0.1] +* `--port INTEGER`: Port to bind the server to [default: 8001] +* `--help`: Show this message and exit. + ## `aignostics application` Application commands @@ -323,6 +356,103 @@ $ aignostics application run result delete [OPTIONS] * `--help`: Show this message and exit. +## `aignostics idc` + +Commands to query and download collections, cases, studies and series of Image Data Commons (IDC) Portal of the National Institute of Cancer (NIC) + +**Usage**: + +```console +$ aignostics idc [OPTIONS] COMMAND [ARGS]... +``` + +**Options**: + +* `--help`: Show this message and exit. + +**Commands**: + +* `browse`: Open browser to explore IDC portal. +* `columns`: List available columns in IDC index. +* `query`: Query IDC index. +* `download`: Download from manifest file, identifier,... + +### `aignostics idc browse` + +Open browser to explore IDC portal. + +**Usage**: + +```console +$ aignostics idc browse [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +### `aignostics idc columns` + +List available columns in IDC index. + +**Usage**: + +```console +$ aignostics idc columns [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + +### `aignostics idc query` + +Query IDC index. For example queries see https://github.com/ImagingDataCommons/IDC-Tutorials/blob/master/notebooks/labs/idc_rsna2023.ipynb. + +**Usage**: + +```console +$ aignostics idc query [OPTIONS] [QUERY] +``` + +**Arguments**: + +* `[QUERY]`: SQL Query [default: SELECT + SeriesInstanceUID +FROM + index +WHERE + Modality = 'MR' +] + +**Options**: + +* `--help`: Show this message and exit. + +### `aignostics idc download` + +Download from manifest file, identifier, or comma-separate set of identifiers. + +Raises: + typer.Exit: If the target directory does not exist. + +**Usage**: + +```console +$ aignostics idc download [OPTIONS] SOURCE [TARGET] +``` + +**Arguments**: + +* `SOURCE`: Filename of manifest, identifier, or comma-separate set of identifiers [required] +* `[TARGET]`: target directory for download [default: /Users/helmut/Code/python-sdk] + +**Options**: + +* `--target-layout TEXT`: layout of the target directory. See default for available elements for use [default: %collection_id/%PatientID/%StudyInstanceUID/%Modality_%SeriesInstanceUID] +* `--dry-run / --no-dry-run`: dry run [default: no-dry-run] +* `--help`: Show this message and exit. + ## `aignostics system` System commands @@ -341,6 +471,7 @@ $ aignostics system [OPTIONS] COMMAND [ARGS]... * `health`: Determine and print system health. * `info`: Determine and print system info. +* `serve`: Start the web server, hosting the... * `openapi`: Dump the OpenAPI specification. * `install`: Complete installation. * `whoami`: Print user info. @@ -385,6 +516,28 @@ $ aignostics system info [OPTIONS] * `--output-format [yaml|json]`: Output format [default: json] * `--help`: Show this message and exit. +### `aignostics system serve` + +Start the web server, hosting the graphical web application and/or webservice API. + +Args: + host (str): Host to bind the server to. + port (int): Port to bind the server to. + open_browser (bool): Open app in browser after starting the server. + +**Usage**: + +```console +$ aignostics system serve [OPTIONS] +``` + +**Options**: + +* `--host TEXT`: Host to bind the server to [default: 127.0.0.1] +* `--port INTEGER`: Port to bind the server to [default: 8000] +* `--open-browser / --no-open-browser`: Open app in browser after starting the server [default: no-open-browser] +* `--help`: Show this message and exit. + ### `aignostics system openapi` Dump the OpenAPI specification. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b09fbc7c..df8acd1d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,20 +2,16 @@ Thank you for considering contributing to Aignostics Python SDK! - ## Setup -Install or update tools required for development: - -```shell -# Install Homebrew, uv package manager, copier and further dev tools -curl -LsSf https://raw.githubusercontent.com/aignostics/python-sdk/HEAD/install.sh | sh -``` - [Create a fork](https://github.com/aignostics/python-sdk/fork) and clone your fork using ```git clone URL_OF_YOUR_CLONE```. Then change into the directory of your local Aignostics Python SDK repository with ```cd python-sdk```. If you are one of the committers of https://github.com/aignostics/python-sdk you can directly clone via ```git clone git@github.com:aignostics/python-sdk.git``` and ```cd python-sdk```. +Install or update development dependencies using +```shell +make install +``` ## Directory Layout @@ -129,6 +125,14 @@ Notes: ## Advanced usage +### Developing the GUI + +To run the GUI in the browser with hot reloading, use the following command: + +```shell +make watch_gui +``` + ### Running GitHub CI Workflow locally ```shell @@ -145,9 +149,11 @@ Build and run the Docker image with plain Docker ```shell # Build from Dockerimage -make docker_build +make docker_build # builds targets all and slim + # Run the CLI -docker run --env THE_VAR=THE_VALUE aignostics --help +docker run --env THE_VAR=THE_VALUE -t aignostics --target all --help # target with all extras +docker run --env THE_VAR=THE_VALUE -t aignostics --target slim --help # slim flavor, no extras ``` Build and run the Docker image with docker compose: @@ -181,6 +187,10 @@ echo "Shutting down the API container ..." docker compose down ``` +Notes: +1. The API service is run based on the slim Docker image. Change in compose.yaml if you need the API service to run on the fat image. + + ### Pinning GitHub Actions ```shell diff --git a/Dockerfile b/Dockerfile index ed6acd17..73465366 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,14 @@ -# Use a Python image with uv pre-installed -FROM ghcr.io/astral-sh/uv:python3.13-bookworm-slim +# We share the base in the builder and targets +FROM python:3.13-slim-bookworm AS base -# Install the project into `/app` -WORKDIR /app +# The base of our builder +FROM base AS builder + +# Copy in UV +COPY --from=ghcr.io/astral-sh/uv:0.6.14 /uv /bin/uv + +# We use the system interpreter managed by uv +ENV UV_PYTHON_DOWNLOADS=0 # Enable bytecode compilation ENV UV_COMPILE_BYTECODE=1 @@ -10,8 +16,41 @@ ENV UV_COMPILE_BYTECODE=1 # Copy from the cache instead of linking since it's a mounted volume ENV UV_LINK_MODE=copy -# Place executables in the environment at the front of the path -ENV PATH="/app/.venv/bin:$PATH" +# Create and set workdir +WORKDIR /app + + +# The slim builder does not take in the extras +FROM builder AS builder-slim + +# Install the project's dependencies using the lockfile and settings +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=bind,source=uv.lock,target=uv.lock \ + --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ + uv sync --frozen --no-install-project --no-dev --no-editable + +# Then, add the rest of the project source code and install it +# Installing separately from its dependencies allows optimal layer caching +COPY pyproject.toml /app +COPY .python-version /app +COPY uv.lock /app +COPY src /app/src +COPY LICENSE /app +COPY *.md /app + +COPY .env.example /app/.env.example +COPY tests /app/tests +COPY examples /app/examples + +# Install project specifics +# Nothing yet + +RUN --mount=type=cache,target=/root/.cache/uv \ + uv sync --frozen --no-dev --no-editable + + +# The all builder takes in all extras +FROM builder AS builder-all # Install the project's dependencies using the lockfile and settings RUN --mount=type=cache,target=/root/.cache/uv \ @@ -30,6 +69,7 @@ COPY *.md /app COPY .env.example /app/.env.example COPY tests /app/tests +COPY examples /app/examples # Install project specifics COPY codegen/out/aignx /app/codegen/out/aignx @@ -37,10 +77,52 @@ COPY codegen/out/aignx /app/codegen/out/aignx RUN --mount=type=cache,target=/root/.cache/uv \ uv sync --frozen --all-extras --no-dev --no-editable + +# Base of our build targets +FROM base AS target + ENV AIGNOSTICS_PYTHON_SDK_RUNNING_IN_CONTAINER=1 +# We don't want to run the app as root +RUN < codegen/out/aignx/codegen/models/__init__.py # ls codegen/out/aignx/codegen/models/ | awk -F . '/[a-z].py/ {print "from ."$1" import *"}' > codegen/out/aignx/codegen/models/__init__.py + # Special rule to catch any arguments (like patch, minor, major, pdf, Python versions, or x.y.z) # This prevents "No rule to make target" errors when passing arguments to make commands .PHONY: % @@ -90,11 +103,14 @@ help: @echo " docs [pdf] - Build documentation (add pdf for PDF format)" @echo " docker_build - Build Docker image aignostics" + @echo " install - Install or update development dependencies inc. pre-commit hooks" @echo " lint - Run linting and formatting checks" + @echo " pre_commit_run_all - Run pre-commit hooks on all files" @echo " setup - Setup development environment" @echo " test [3.11|3.12|3.13] - Run tests (for specific Python version)" @echo " test_scheduled - Run tests marked as scheduled with Python 3.11" @echo " test_long_running - Run tests marked as long running with Python 3.11" @echo " update_from_template - Update from template using copier" + @echo " watch_gui - Open GUI in browser and watch for changes" @echo "" @echo "Built with love in Berlin 🐻" diff --git a/SERVICE_CONNECTIONS.md b/SERVICE_CONNECTIONS.md index 4ffcf025..9bf543b0 100644 --- a/SERVICE_CONNECTIONS.md +++ b/SERVICE_CONNECTIONS.md @@ -135,7 +135,7 @@ and create a new repository secret called `VERCEL_PROJECT_ID`, copy and pasting from the output of step 6 10. Goto `https://vercel.com/account/tokens` and create a new token called - `oe-python-template`. Copy the value of the token into your clipboard. + `aignostics`. Copy the value of the token into your clipboard. 11. Goto https://github.com/aignostics/python-sdk/settings/secrets/actions/new and create a new repository secret called `VERCEL_TOKEN`, pasting from your diff --git a/aignostics.spec b/aignostics.spec new file mode 100644 index 00000000..9075a9a4 --- /dev/null +++ b/aignostics.spec @@ -0,0 +1,38 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ['src/aignostics/gui.py'], + pathex=[], + binaries=[], + datas=[('/Users/helmut/Code/python-sdk/.venv/lib/python3.11/site-packages/nicegui', 'nicegui')], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas, + [], + name='aignostics', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) diff --git a/compose.yaml b/compose.yaml index 204084ca..95f1b5df 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,6 +1,8 @@ services: aignostics: - build: . + build: + context: . + target: all env_file: - path: .env required: false @@ -13,8 +15,10 @@ services: - manual tty: true stdin_open: true - aignostics-api: - build: . + aignostics-notebook: + build: + context: . + target: all env_file: - path: .env required: false @@ -22,12 +26,12 @@ services: watch: - path: src action: rebuild - command: serve --host=0.0.0.0 --port=8000 --no-watch + command: notebook --host=0.0.0.0 --port=8001 restart: always ports: - - "8000:8000" + - "8001:8001" healthcheck: - test: [ "CMD", "curl", "-f", "http://127.0.0.1:8000/healthz" ] + test: [ "CMD", "curl", "-f", "http://127.0.0.1:8001/healthz" ] interval: 5s timeout: 2s retries: 3 diff --git a/data/.gitkeep b/data/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/demo.md b/demo.md new file mode 100644 index 00000000..21af85c9 --- /dev/null +++ b/demo.md @@ -0,0 +1,8 @@ +```shell +open https://colab.research.google.com/github/ImagingDataCommons/IDC-Tutorials/blob/master/notebooks/pathomics/microscopy_dicom_ann_intro.ipynb#scrollTo=PHwHpMxyPq0W + +marimo edit examples/e2e.py + +# from CLI with GUI +uv run aignostics idc download "1.3.6.1.4.1.5962.99.1.1069745200.1645485340.1637452317744.2.0" data --target-layout="%SeriesInstanceUID" +``` diff --git a/docs/source/_static/openapi_v1.json b/docs/source/_static/openapi_v1.json index 0fc1004e..a208b229 100644 --- a/docs/source/_static/openapi_v1.json +++ b/docs/source/_static/openapi_v1.json @@ -1,3 +1,4 @@ +2025-04-22 08:55:00 INFO aignostics.aignostics.utils.boot ⭐ Booting aignostics v0.0.10 (project root /Users/helmut/Code/python-sdk, pid 13261), parent 'python3.13' (pid 11950) boot.py:84 { "openapi": "3.1.0", "info": { diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index 27e46245..ad9003e0 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -1,3 +1,4 @@ +2025-04-22 08:54:57 INFO aignostics.aignostics.utils.boot ⭐ Booting aignostics v0.0.10 (project root /Users/helmut/Code/python-sdk, pid 13186), parent 'python3.13' (pid 11950) boot.py:84 components: schemas: ApplicationReadResponse: diff --git a/docs/source/lib_reference.rst b/docs/source/lib_reference.rst index 6d9857bf..9f0a1872 100644 --- a/docs/source/lib_reference.rst +++ b/docs/source/lib_reference.rst @@ -2,16 +2,19 @@ Library Reference ================= .. automodule:: aignostics.client -:members: + :members: .. automodule:: aignostics.application -:members: + :members: + +.. automodule:: aignostics.idc + :members: .. automodule:: aignostics.system -:members: + :members: .. automodule:: aignostics.utils -:members: + :members: .. automodule:: aignostics -:members: \ No newline at end of file + :members: diff --git a/examples/e2e.py b/examples/e2e.py new file mode 100644 index 00000000..edfa9c74 --- /dev/null +++ b/examples/e2e.py @@ -0,0 +1,161 @@ +# /// script +# requires-python = ">=3.13" +# dependencies = [ +# "marimo", +# "aignostics", +# ] +# /// + +import marimo + +__generated_with = "0.12.8" +app = marimo.App(app_title=f"🔬 Aignostics Python SDK v{__version__} - E2E", width="full") + + +@app.cell +def _(): + """E2E Demo using DICOM data from National Cancer Institute + + Notes: + - See https://colab.research.google.com/github/ImagingDataCommons/IDC-Tutorials/blob/master/notebooks/pathomics/microscopy_dicom_ann_intro.ipynb#scrollTo=fMRsnFlzinO5 + + """ + import os + import random + import subprocess + from pathlib import Path + from typing import Union + + import highdicom as hd + import marimo as mo + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import shapely + from cloudpathlib import GSPath + from dotenv import load_dotenv + from idc_index import index + from PIL import Image, ImageDraw + from shapely.affinity import translate + from shapely.geometry import Polygon, box + from shapely.strtree import STRtree + from wsidicom import WsiDicom + + load_dotenv() + + os.environ + + print(os.environ["GOOGLE_APPLICATION_CREDENTIALS"]) + + print(Path.cwd()) + + mo.sidebar( + [ + mo.md("# aignostics"), + mo.nav_menu( + { + "#/home": f"{mo.icon('lucide:home')} Home", + "#/about": f"{mo.icon('lucide:user')} Help", + "Links": { + "https://platform.aignostics.com": "Platform", + "https://github.com/aignotics/python-sdk": "GitHub", + }, + }, + orientation="vertical", + ), + ] + ) + + mo.vstack([mo.ui.file_browser(GSPath("gs://aignx-storage-service-dev/sample_data_formatted"), filetypes=[".dcm", ".tif", ".tiff", ".svs", ".json"], multiple=True, restrict_navigation=True)]) + + return ( + GSPath, + Image, + ImageDraw, + list, + Path, + Polygon, + STRtree, + tuple, + Union, + WsiDicom, + box, + hd, + index, + load_dotenv, + mo, + np, + os, + pd, + plt, + random, + shapely, + subprocess, + translate, + ) + + +@app.cell +def _(Path, mo): + mo.vstack([mo.ui.file_browser(Path("tmp"), filetypes=[".dcm", ".tif", ".tiff", ".svs"], multiple=True, restrict_navigation=True)]) + + +@app.cell +def _(index): + idc_client = index.IDCClient() # set-up idc_client + idc_client.fetch_index("sm_instance_index") + return (idc_client,) + + +@app.cell +def _(idc_client): + query_sr = """ + SELECT + SeriesInstanceUID, + StudyInstanceUID, + PatientID, + collection_id + FROM + index + WHERE + analysis_result_id = 'Pan-Cancer-Nuclei-Seg-DICOM' AND Modality = 'ANN' AND collection_id = 'tcga_luad' + ORDER BY + crdc_series_uuid + LIMIT 1 + """ + pan_ann = idc_client.sql_query(query_sr) + return pan_ann, query_sr + + +@app.cell +def _(idc_client, pan_ann): + study_instance_id = pan_ann["StudyInstanceUID"].iloc[0] + viewer_url = idc_client.get_viewer_URL(studyInstanceUID=study_instance_id, viewer_selector="slim") + from IPython.display import IFrame + IFrame(viewer_url, width=1260, height=900) + return IFrame, study_instance_id, viewer_url + + +@app.cell +def _(Path, WsiDicom, idc_client, plt): + series_instance_uid = "1.3.6.1.4.1.5962.99.1.1069745200.1645485340.1637452317744.2.0" # copied from slimviewer info box + idc_client.download_from_selection(seriesInstanceUID=series_instance_uid, downloadDir="tmp/", dirTemplate="%SeriesInstanceUID", use_s5cmd_sync=True) + print(Path(f"tmp/{series_instance_uid}").exists()) + slide = WsiDicom.open(f"tmp/{series_instance_uid}") + + fig, axes = plt.subplots(1, 1, figsize=(12, 6)) + thumbnail = slide.read_thumbnail() + print(axes) + axes.imshow(thumbnail) + axes.axis("off") + plt.show() + return axes, fig, series_instance_uid, slide, thumbnail + + +@app.cell +def _(): + return + + +if __name__ == "__main__": + app.run() diff --git a/examples/notebook.py b/examples/notebook.py index 2337eb69..5d37eaeb 100644 --- a/examples/notebook.py +++ b/examples/notebook.py @@ -1,7 +1,18 @@ +# /// script +# requires-python = ">=3.13" +# dependencies = [ +# "marimo", +# "aignostics==0.0.10", +# ] +# /// + + import marimo +from aignostics.utils import __version__ __generated_with = "0.12.8" -app = marimo.App(width="medium") +app = marimo.App(app_title=f"🔬 Aignostics Python SDK v{__version__}", width="full") + @app.cell diff --git a/install.sh b/install.sh index 16b05a52..a098685b 100755 --- a/install.sh +++ b/install.sh @@ -19,7 +19,9 @@ BREW_TOOLS=( "trivy;trivy;https://trivy.dev/latest/" "pnpm;pnpm;https://pnpm.io/" "magick;imagemagick;https://imagemagick.org/" + "nixpacks;nixpacks;https://nixpacks.com/" "openapi-generator;openapi-generator;https://github.com/OpenAPITools/openapi-generator" + ) MAC_BREW_TOOLS=( diff --git a/noxfile.py b/noxfile.py index 3b2ca886..cb7c6760 100644 --- a/noxfile.py +++ b/noxfile.py @@ -20,6 +20,7 @@ JUNIT_XML = "--junitxml=reports/junit.xml" CLI_MODULE = "cli" API_VERSIONS = ["v1"] +UTF8 = "utf-8" def _setup_venv(session: nox.Session, all_extras: bool = True) -> None: diff --git a/pyproject.toml b/pyproject.toml index de98508a..022dbcc3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,6 +65,7 @@ dependencies = [ # From Template "fastapi[standard,all]>=0.115.12", "logfire[system-metrics]>=3.13.1", + "nicegui[native]>=2.15.0", "opentelemetry-instrumentation-fastapi>=0.53b0", "opentelemetry-instrumentation-httpx>=0.53b0", "opentelemetry-instrumentation-jinja2>=0.53b0", @@ -74,9 +75,8 @@ dependencies = [ "opentelemetry-instrumentation-urllib>=0.53b0", "opentelemetry-instrumentation-urllib3>=0.53b0", "psutil>=7.0.0", - "pydantic>=2.11.3", - "pydantic-settings>=2.8.1", - "sentry-sdk>=2.25.1", + "pydantic-settings>=2.9.1", + "sentry-sdk>=2.26.1", "typer>=0.15.1", "uptime>=3.0.1", # Custom @@ -95,44 +95,29 @@ dependencies = [ "urllib3>=2.2.3", ] -[project.scripts] -aignostics = "aignostics.cli:cli" - -[project.urls] -Homepage = "https://aignostics.readthedocs.io/en/latest/" -Documentation = "https://aignostics.readthedocs.io/en/latest/" -Source = "https://github.com/aignostics/python-sdk" -Changelog = "https://github.com/aignostics/python-sdk/releases" -Issues = "https://github.com/aignostics/python-sdk/issues" - -[build-system] -requires = ["hatchling==1.27.0"] -build-backend = "hatchling.build" - - -[tool.hatch.build] -include = ["src/*", "codegen/out/*"] - -[tool.hatch.build.targets.wheel] -packages = ["src/aignostics", "codegen/out/aignx"] - [project.optional-dependencies] examples = [ - "streamlit>=1.44.1", - "marimo>=0.12.8", - "jupyter>=1.1.1", + "cloudpathlib>=0.21.0", + "highdicom>=0.25.1", + "marimo>=0.13.0", + "matplotlib>=3.10.1", "jinja2>=3.1.6", + "jupyter>=1.1.1", + "shapely>=2.1.0", + "streamlit>=1.44.1", + "wsidicom>=0.26.0", ] aws = ["boto3>=1.37.27"] +idc = ["idc-index>=0.8.6"] # formats = ["openslide-python>=1.4.1", "openslide-bin>=4.0.0.6"] [dependency-groups] dev = [ "autodoc-pydantic>=2.2.0", - "bump-my-version>=1.1.1", + "bump-my-version>=1.1.2", "cyclonedx-py>=1.0.1", "detect-secrets>=1.5.0", - "enum-tools>=0.12.0", + "enum-tools>=0.13.0", "furo>=2024.8.6", "git-cliff>=2.8.0", "matplotlib>=3.10.1", @@ -148,10 +133,12 @@ dev = [ "pytest-docker>=3.2.1", "pytest-env>=1.1.5", "pytest-regressions>=2.7.0", + "pytest-selenium>=4.1.0", "pytest-subprocess>=1.5.3", "pytest-timeout>=2.3.1", + "pytest-watcher>=0.4.3", "pytest-xdist[psutil]>=3.6.1", - "ruff>=0.11.5", + "ruff>=0.11.6", "sphinx>=8.2.3", "sphinx-autobuild>=2024.10.3", "sphinx-copybutton>=0.5.2", @@ -168,12 +155,31 @@ dev = [ "watchdog>=6.0.0", ] +[project.scripts] +aignostics = "aignostics.cli:cli" + +[project.urls] +Homepage = "https://aignostics.readthedocs.io/en/latest/" +Documentation = "https://aignostics.readthedocs.io/en/latest/" +Source = "https://github.com/aignostics/python-sdk" +Changelog = "https://github.com/aignostics/python-sdk/releases" +Issues = "https://github.com/aignostics/python-sdk/issues" + +[build-system] +requires = ["hatchling==1.27.0"] +build-backend = "hatchling.build" + +[tool.hatch.build] +include = ["src/*", "codegen/out/*"] + +[tool.hatch.build.targets.wheel] +packages = ["src/aignostics", "codegen/out/aignx"] + [tool.uv] override-dependencies = [ # https://github.com/astral-sh/uv/issues/4422 "rfc3987; sys_platform == 'never'", # GPLv3 ] - [tool.ruff] target-version = "py311" preview = true @@ -183,7 +189,8 @@ extend-exclude = [ ".fixme", "notebook.py", "template/*.py", - "playbook.py", # TODO (Andreas): refactor and reenable, + "bottle.py", + "examples/*.py", "codegen", ] @@ -237,12 +244,6 @@ ignore = [ "S607", # subprocess with partial path ] -[tool.ruff.lint.extend-per-file-ignores] -"examples/notebook.py" = [ - # we are more relaxed in notebooks, while sill applying hundreds of rules - "B018", # notebooks surface variable without print -] - [tool.ruff.format] docstring-code-format = true @@ -250,6 +251,7 @@ docstring-code-format = true convention = "google" [tool.mypy] # https://mypy.readthedocs.io/en/latest/config_file.html +exclude = ["bottle.py"] junit_xml = "reports/mypy_junit.xml" plugins = "pydantic.mypy" strict = true @@ -340,6 +342,9 @@ filename = "sonar-project.properties" [[tool.bumpversion.files]] filename = "docs/source/conf.py" +[[tool.bumpversion.files]] +filename = "examples/notebook.py" + [tool.git-cliff.remote.github] owner = "aignostics" repo = "python-sdk" diff --git a/sonar-project.properties b/sonar-project.properties index cbda81b8..6a6ab4d5 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -9,4 +9,4 @@ sonar.links.issues=https://github.com/aignostics/python-sdk/issues sonar.python.coverage.reportPaths=reports/coverage.xml sonar.python.version=3.11, 3.12, 3.13 sonar.coverage.exclusions=noxfile.py, template/**, tests/**, examples/**, docs/**, dist/**, dist_vercel/**, codegen/** -sonar.exclusions=template/**, examples/**, docs/**, dist/**, dist_vercel/**, codegen/** \ No newline at end of file +sonar.exclusions=template/**, examples/**, docs/**, dist/**, dist_vercel/**, codegen/** diff --git a/src/aignostics/application/__init__.py b/src/aignostics/application/__init__.py index 7a274f1c..fbd4f711 100644 --- a/src/aignostics/application/__init__.py +++ b/src/aignostics/application/__init__.py @@ -5,3 +5,13 @@ __all__ = [ "cli", ] + +from importlib.util import find_spec + +# advertise PageBuuilder to enable auto-discovery +if find_spec("nicegui"): + from ._gui import PageBuilder + + __all__ += [ + "PageBuilder", + ] diff --git a/src/aignostics/application/_gui.py b/src/aignostics/application/_gui.py new file mode 100644 index 00000000..48090909 --- /dev/null +++ b/src/aignostics/application/_gui.py @@ -0,0 +1,56 @@ +"""Homepage (index) of GUI.""" + +from pathlib import Path + +from nicegui import ui + +from aignostics.utils import BasePageBuilder, GUILocalFilePicker + +from ._service import Service + +SERIES_INSTANCE_ID = "1.3.6.1.4.1.5962.99.1.1069745200.1645485340.1637452317744.2.0" + + +async def pick_file() -> None: + """Open a file picker dialog and show notifier when closed again.""" + result = await GUILocalFilePicker(str(Path.cwd() / "examples"), multiple=True) + ui.notify(f"You chose {result}") + + +class PageBuilder(BasePageBuilder): + @staticmethod + def register_pages() -> None: + @ui.page("/") + def page_index() -> None: + """Homepage of GUI.""" + service = Service() + ui.button("Choose file", on_click=pick_file, icon="folder").mark("BUTTON_CHOOSE_FILE") + + ui.button("Click me", on_click=lambda: ui.notify("Hello, world!"), icon="check").mark("BUTTON_CLICK_ME") + + from importlib.util import find_spec # noqa: PLC0415 + + if find_spec("matplotlib") and find_spec("numpy"): + import numpy as np # noqa: PLC0415 + + with ui.card().tight().mark("CARD_PLOT"): # noqa: SIM117 + with ui.matplotlib(figsize=(4, 3)).figure as fig: + x = np.linspace(0.0, 5.0) + y = np.cos(2 * np.pi * x) * np.exp(-x) + ax = fig.gca() + ax.plot(x, y, "-") + + if find_spec("matplotlib") and find_spec("wsidicom"): + from wsidicom import WsiDicom # noqa: PLC0415 + + if (service.get_data_directory() / SERIES_INSTANCE_ID).exists(): + slide = WsiDicom.open(service.get_data_directory() / SERIES_INSTANCE_ID) + + with ui.card().tight().mark("DICOM_PLOT"): # noqa: SIM117 + with ui.matplotlib(figsize=(4, 3)).figure as fig: + ax = fig.gca() + thumbnail = slide.read_thumbnail() + ax.imshow(thumbnail) + ax.axis("off") + + ui.link("Info", "/info").mark("LINK_INFO") diff --git a/src/aignostics/application/_service.py b/src/aignostics/application/_service.py new file mode 100644 index 00000000..10ed9083 --- /dev/null +++ b/src/aignostics/application/_service.py @@ -0,0 +1,62 @@ +"""Service of the application module.""" + +from pathlib import Path +from typing import Any + +from aignostics.utils import BaseService, Health + +from ._settings import Settings + + +# Services derived from BaseService and exported by modules via their __init__.py are automatically registered +# with the system module, enabling for dynamic discovery of health, info and further functionality. +class Service(BaseService): + """Service of the application module.""" + + _settings: Settings + + def __init__(self) -> None: + """Initialize service.""" + super().__init__(Settings) # automatically loads and validates the settings + + def info(self) -> dict[str, Any]: # noqa: PLR6301 + """Determine info of this service. + + Returns: + dict[str,Any]: The info of this service. + """ + return {} + + def _determine_data_storage_health(self) -> Health: + """Determine healthiness of data storage. + + - Checks if configured data directory is a directory + + Returns: + Health: The healthiness of data storage. + """ + data_directory = Path(self._settings.data_directory) + if data_directory.is_dir(): + return Health(status=Health.Code.UP) + return Health(status=Health.Code.DOWN, reason=f"Data directory {data_directory} is not accessible") + + def health(self) -> Health: + """Determine health of hello service. + + Returns: + Health: The health of the service. + """ + return Health( + status=Health.Code.UP, + components={ + "data_storage": self._determine_data_storage_health(), + }, + ) + + def get_data_directory(self) -> Path: + """Get the data directory. + + Returns: + Path: The data directory. + """ + return Path(self._settings.data_directory) diff --git a/src/aignostics/application/_settings.py b/src/aignostics/application/_settings.py new file mode 100644 index 00000000..c962cf2b --- /dev/null +++ b/src/aignostics/application/_settings.py @@ -0,0 +1,28 @@ +"""Settings of the application module.""" + +from pathlib import Path +from typing import Annotated + +from pydantic import Field +from pydantic_settings import SettingsConfigDict + +from ..utils import OpaqueSettings, __env_file__, __project_name__ # noqa: TID252 + + +class Settings(OpaqueSettings): + """Settings.""" + + model_config = SettingsConfigDict( + env_prefix=f"{__project_name__.upper()}_APPLICATION_", + extra="ignore", + env_file=__env_file__, + env_file_encoding="utf-8", + ) + + data_directory: Annotated[ + str, + Field( + description=("Data directory"), + default=str(Path.cwd() / "data"), + ), + ] diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index df05e0b4..c2d81f69 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -1,17 +1,50 @@ """CLI (Command Line Interface) of Aignostics Python SDK.""" import sys +from importlib.util import find_spec import typer from .constants import MODULES_TO_INSTRUMENT -from .utils import __version__, boot, console, get_logger, prepare_cli +from .utils import __is_running_in_container__, __version__, boot, console, get_logger, prepare_cli boot(MODULES_TO_INSTRUMENT) logger = get_logger(__name__) -cli = typer.Typer(help="Command Line Interface of ") -prepare_cli(cli, f"🧠 Aignostics Python SDK v{__version__} - built with love in Berlin 🐻") +cli = typer.Typer(help="Command Line Interface of Aignostics Python SDK") +prepare_cli(cli, f"🔬 Aignostics Python SDK v{__version__} - built with love in Berlin 🐻") + + +if find_spec("nicegui") and find_spec("webview") and not __is_running_in_container__: + + @cli.command() + def gui() -> None: + """Start graphical user interface (GUI) in native window.""" + from .utils import gui_run # noqa: PLC0415 + + gui_run(native=True, with_api=False, title="Aignostics Python SDK", icon="🔬") + + +if find_spec("marimo"): + from typing import Annotated + + import uvicorn + + from .utils import create_marimo_app + + @cli.command() + def notebook( + host: Annotated[str, typer.Option(help="Host to bind the server to")] = "127.0.0.1", + port: Annotated[int, typer.Option(help="Port to bind the server to")] = 8001, + ) -> None: + """Start notebook in web browser.""" + console.print(f"Starting marimo notebook server at http://{host}:{port}") + uvicorn.run( + create_marimo_app(), + host=host, + port=port, + ) + if __name__ == "__main__": # pragma: no cover try: diff --git a/src/aignostics/constants.py b/src/aignostics/constants.py index 02a51cb7..c8b691a6 100644 --- a/src/aignostics/constants.py +++ b/src/aignostics/constants.py @@ -1,4 +1,12 @@ """Constants for the Aignostics Python SDK.""" -API_VERSIONS = {"v1": "1.0.0"} +from pathlib import Path + MODULES_TO_INSTRUMENT = ["aignostics.client", "aignostics.application"] + +API_VERSIONS = { + "v1": "1.0.0", +} + +NOTEBOOK_FOLDER = Path(__file__).parent.parent.parent / "examples" +NOTEBOOK_APP = Path(__file__).parent.parent.parent / "examples" / "notebook.py" diff --git a/src/aignostics/idc/__init__.py b/src/aignostics/idc/__init__.py new file mode 100644 index 00000000..2b7c94a5 --- /dev/null +++ b/src/aignostics/idc/__init__.py @@ -0,0 +1,10 @@ +"""National Institute of Cancer (NIC) Image Data Commons (IDC) module.""" + +from importlib.util import find_spec + +if find_spec("idc_index"): + from ._cli import cli + + __all__ = [ + "cli", + ] diff --git a/src/aignostics/idc/_cli.py b/src/aignostics/idc/_cli.py new file mode 100644 index 00000000..f5f7a197 --- /dev/null +++ b/src/aignostics/idc/_cli.py @@ -0,0 +1,130 @@ +"""CLI of Image Data Commons Group (IDC) module.""" + +import webbrowser +from pathlib import Path +from typing import Annotated + +import typer + +from aignostics.utils import console, get_logger + +logger = get_logger(__name__) + +PATH_LENFTH_MAX = 260 +TARGET_LAYOUT_DEFAULT = "%collection_id/%PatientID/%StudyInstanceUID/%Modality_%SeriesInstanceUID" + +cli = typer.Typer( + name="idc", + help="Commands to query and download collections, cases, studies and series " + "of Image Data Commons (IDC) Portal of the National Institute of Cancer (NIC)", +) + + +@cli.command() +def browse() -> None: + """Open browser to explore IDC portal.""" + webbrowser.open("https://portal.imaging.datacommons.cancer.gov/explore/") + + +@cli.command("columns") +def columns() -> None: + """List available columns in IDC index.""" + from idc_index.index import IDCClient # noqa: PLC0415 + + client = IDCClient.client() + console.print(list(client.index.columns)) + client.fetch_index("sm_instance_index") + console.print(list(client.index.columns)) + + +@cli.command() +def query( + query: Annotated[str, typer.Argument(help="SQL Query")] = """SELECT + SeriesInstanceUID +FROM + index +WHERE + Modality = 'MR' +""", +) -> None: + """Query IDC index. For example queries see https://github.com/ImagingDataCommons/IDC-Tutorials/blob/master/notebooks/labs/idc_rsna2023.ipynb.""" + from idc_index.index import IDCClient # noqa: PLC0415 + + client = IDCClient.client() + console.print(client.sql_query(sql_query=query)) # type: ignore[no-untyped-call] + + +@cli.command() +def download( + source: Annotated[ + str, typer.Argument(help="Filename of manifest, identifier, or comma-separate set of identifiers") + ], + target: Annotated[str, typer.Argument(help="target directory for download")] = str(Path.cwd()), + target_layout: Annotated[ + str, typer.Option(help="layout of the target directory. See default for available elements for use") + ] = TARGET_LAYOUT_DEFAULT, + dry_run: Annotated[bool, typer.Option(help="dry run")] = False, +) -> None: + """Download from manifest file, identifier, or comma-separate set of identifiers. + + Raises: + typer.Exit: If the target directory does not exist. + """ + from idc_index.index import IDCClient # noqa: PLC0415 + + client = IDCClient.client() + logger.info("Downloading instance index from IDC version: %s", client.get_idc_version()) # type: ignore[no-untyped-call] + + client.fetch_index("sm_instance_index") + logger.info("Downloaded instance index") + + target_directory = Path(target) + if not target_directory.is_dir(): + logger.error("Target directory does not exist: %s", target_directory) + raise typer.Exit(code=1) + + if len(source) < PATH_LENFTH_MAX and Path(source).is_file(): + # Parse the input parameters and pass them to IDC + logger.info("Detected manifest file, downloading from manifest.") + client.download_from_manifest(source, downloadDir=target, dirTemplate=target_layout) + # this is not a file manifest + else: + # Split the input string and filter out any empty values + item_ids = [item for item in source.split(",") if item] + + if not item_ids: + logger.error("No valid IDs provided.") + + index_df = client.index + + def check_and_download(column_name: str, item_ids: list[str], target_directory: Path, kwarg_name: str) -> bool: + matches = index_df[column_name].isin(item_ids) + matched_ids = index_df[column_name][matches].unique().tolist() + if not matched_ids: + return False + unmatched_ids = list(set(item_ids) - set(matched_ids)) + if unmatched_ids: + logger.debug("Partial match for %s: matched %s, unmatched %s", column_name, matched_ids, unmatched_ids) + logger.info("Identified matching %s: %s", column_name, matched_ids) + client.download_from_selection(**{ # type: ignore[no-untyped-call] + kwarg_name: matched_ids, + "downloadDir": target_directory, + "dirTemplate": target_layout, + "quiet": False, + "show_progress_bar": True, + "use_s5cmd_sync": True, + "dry_run": dry_run, + }) + return True + + matches_found = 0 + matches_found += check_and_download("collection_id", item_ids, target_directory, "collection_id") + matches_found += check_and_download("PatientID", item_ids, target_directory, "patientId") + matches_found += check_and_download("StudyInstanceUID", item_ids, target_directory, "studyInstanceUID") + matches_found += check_and_download("SeriesInstanceUID", item_ids, target_directory, "seriesInstanceUID") + matches_found += check_and_download("crdc_series_uuid", item_ids, target_directory, "crdc_series_uuid") + if not matches_found: + logger.error( + "None of the values passed matched any of the identifiers: " + "collection_id, PatientID, StudyInstanceUID, SeriesInstanceUID, crdc_series_uuid." + ) diff --git a/src/aignostics/system/__init__.py b/src/aignostics/system/__init__.py index fe20ef16..462250f3 100644 --- a/src/aignostics/system/__init__.py +++ b/src/aignostics/system/__init__.py @@ -1,4 +1,4 @@ -"""Hello module.""" +"""System module.""" from ._cli import cli from ._service import Service @@ -9,3 +9,14 @@ "Settings", "cli", ] + + +from importlib.util import find_spec + +# advertise PageBuuilder to enable auto-discovery +if find_spec("nicegui"): + from ._gui import PageBuilder + + __all__ += [ + "PageBuilder", + ] diff --git a/src/aignostics/system/_cli.py b/src/aignostics/system/_cli.py index c9c60ca5..f8a2a8f0 100644 --- a/src/aignostics/system/_cli.py +++ b/src/aignostics/system/_cli.py @@ -2,6 +2,7 @@ import json from enum import StrEnum +from importlib.util import find_spec from typing import Annotated import typer @@ -79,6 +80,26 @@ def info( console.print(yaml.dump(info, width=80, default_flow_style=False), end="") +if find_spec("nicegui"): + from ..utils import gui_run # noqa: TID252 + + @cli.command() + def serve( + host: Annotated[str, typer.Option(help="Host to bind the server to")] = "127.0.0.1", + port: Annotated[int, typer.Option(help="Port to bind the server to")] = 8000, + open_browser: Annotated[bool, typer.Option(help="Open app in browser after starting the server")] = False, + ) -> None: + """Start the web server, hosting the graphical web application and/or webservice API. + + Args: + host (str): Host to bind the server to. + port (int): Port to bind the server to. + open_browser (bool): Open app in browser after starting the server. + """ + console.print(f"Starting web application server at http://{host}:{port}") + gui_run(native=False, host=host, port=port, with_api=False, show=open_browser) + + @cli.command() def openapi( api_version: Annotated[ diff --git a/src/aignostics/system/_gui.py b/src/aignostics/system/_gui.py new file mode 100644 index 00000000..2f82ebc2 --- /dev/null +++ b/src/aignostics/system/_gui.py @@ -0,0 +1,20 @@ +"""Homepage (index) of GUI.""" + +from nicegui import ui + +from ..utils import BasePageBuilder, __project_name__, __version__ # noqa: TID252 +from ._service import Service + + +class PageBuilder(BasePageBuilder): + @staticmethod + def register_pages() -> None: + @ui.page("/info") + def page_info() -> None: + """Homepage of GUI.""" + ui.label(f"{__project_name__} v{__version__}").mark("LABEL_VERSION") + ui.json_editor({ + "content": {"json": Service().info(True, True)}, + "readOnly": True, + }).mark("JSON_EDITOR_INFO") + ui.link("Home", "/").mark("LINK_HOME") diff --git a/src/aignostics/system/_service.py b/src/aignostics/system/_service.py index f79da622..24569a27 100644 --- a/src/aignostics/system/_service.py +++ b/src/aignostics/system/_service.py @@ -113,6 +113,7 @@ def info(include_environ: bool = False, filter_secrets: bool = True) -> dict[str "version": platform.python_version(), "compiler": platform.python_compiler(), "implementation": platform.python_implementation(), + "sys.path": sys.path, }, "interpreter_path": sys.executable, "command_line": " ".join(sys.argv), diff --git a/src/aignostics/utils/.vendored/bottle.py b/src/aignostics/utils/.vendored/bottle.py new file mode 100644 index 00000000..3d5d7b9f --- /dev/null +++ b/src/aignostics/utils/.vendored/bottle.py @@ -0,0 +1,4562 @@ +#!/usr/bin/env python +""" +Bottle is a fast and simple micro-framework for small web applications. It +offers request dispatching (Routes) with URL parameter support, templates, +a built-in HTTP Server and adapters for many third party WSGI/HTTP-server and +template engines - all in a single file and with no dependencies other than the +Python Standard Library. + +Homepage and documentation: http://bottlepy.org/ + +Copyright (c) 2009-2024, Marcel Hellkamp. +License: MIT (see LICENSE for details) +""" + +import sys + +__author__ = 'Marcel Hellkamp' +__version__ = '0.14-dev' +__license__ = 'MIT' + +############################################################################### +# Command-line interface ###################################################### +############################################################################### +# INFO: Some server adapters need to monkey-patch std-lib modules before they +# are imported. This is why some of the command-line handling is done here, but +# the actual call to _main() is at the end of the file. + + +def _cli_parse(args): # pragma: no coverage + from argparse import ArgumentParser + + parser = ArgumentParser(prog=args[0], usage="%(prog)s [options] package.module:app") + opt = parser.add_argument + opt("--version", action="store_true", help="show version number.") + opt("-b", "--bind", metavar="ADDRESS", help="bind socket to ADDRESS.") + opt("-s", "--server", default='wsgiref', help="use SERVER as backend.") + opt("-p", "--plugin", action="append", help="install additional plugin/s.") + opt("-c", "--conf", action="append", metavar="FILE", + help="load config values from FILE.") + opt("-C", "--param", action="append", metavar="NAME=VALUE", + help="override config values.") + opt("--debug", action="store_true", help="start server in debug mode.") + opt("--reload", action="store_true", help="auto-reload on file changes.") + opt('app', help='WSGI app entry point.', nargs='?') + + cli_args = parser.parse_args(args[1:]) + + return cli_args, parser + + +def _cli_patch(cli_args): # pragma: no coverage + parsed_args, _ = _cli_parse(cli_args) + opts = parsed_args + if opts.server: + if opts.server.startswith('gevent'): + import gevent.monkey + gevent.monkey.patch_all() + elif opts.server.startswith('eventlet'): + import eventlet + eventlet.monkey_patch() + + +if __name__ == '__main__': + _cli_patch(sys.argv) + +############################################################################### +# Imports and Helpers used everywhere else ##################################### +############################################################################### + +import base64, calendar, email.utils, functools, hmac, itertools, \ + mimetypes, os, re, tempfile, threading, time, warnings, weakref, hashlib + +from types import FunctionType +from datetime import date as datedate, datetime, timedelta +from tempfile import NamedTemporaryFile +from traceback import format_exc, print_exc +from unicodedata import normalize + +try: + from ujson import dumps as json_dumps, loads as json_lds +except ImportError: + from json import dumps as json_dumps, loads as json_lds + +py = sys.version_info + +import http.client as httplib +import _thread as thread +from urllib.parse import urljoin, SplitResult as UrlSplitResult +from urllib.parse import urlencode, quote as urlquote, unquote as urlunquote +from http.cookies import SimpleCookie, Morsel, CookieError +from collections.abc import MutableMapping as DictMixin +from types import ModuleType as new_module +import pickle +from io import BytesIO +import configparser +from datetime import timezone +UTC = timezone.utc +import inspect + +json_loads = lambda s: json_lds(touni(s)) +callable = lambda x: hasattr(x, '__call__') + +def _wsgi_recode(src): + """ Translate a PEP-3333 latin1-string to utf8+surrogateescape """ + if src.isascii(): + return src + return src.encode('latin1').decode('utf8', 'surrogateescape') + + +def _raise(*a): + raise a[0](a[1]).with_traceback(a[2]) + + +# Some helpers for string/byte handling +def tob(s, enc='utf8'): + if isinstance(s, str): + return s.encode(enc) + return b'' if s is None else bytes(s) + + +def touni(s, enc='utf8', err='strict'): + if isinstance(s, (bytes, bytearray)): + return str(s, enc, err) + return "" if s is None else str(s) + + +def _stderr(*args): + try: + print(*args, file=sys.stderr) + except (IOError, AttributeError): + pass # Some environments do not allow printing (mod_wsgi) + + +# A bug in functools causes it to break if the wrapper is an instance method +def update_wrapper(wrapper, wrapped, *a, **ka): + try: + functools.update_wrapper(wrapper, wrapped, *a, **ka) + except AttributeError: + pass + +# These helpers are used at module level and need to be defined first. +# And yes, I know PEP-8, but sometimes a lower-case classname makes more sense. + + +def depr(major, minor, cause, fix, stacklevel=3): + text = "Warning: Use of deprecated feature or API. (Deprecated in Bottle-%d.%d)\n"\ + "Cause: %s\n"\ + "Fix: %s\n" % (major, minor, cause, fix) + if DEBUG == 'strict': + raise DeprecationWarning(text) + warnings.warn(text, DeprecationWarning, stacklevel=stacklevel) + return DeprecationWarning(text) + + +def makelist(data): # This is just too handy + if isinstance(data, (tuple, list, set, dict)): + return list(data) + elif data: + return [data] + else: + return [] + + +class DictProperty(object): + """ Property that maps to a key in a local dict-like attribute. """ + + def __init__(self, attr, key=None, read_only=False): + self.attr, self.key, self.read_only = attr, key, read_only + + def __call__(self, func): + functools.update_wrapper(self, func, updated=[]) + self.getter, self.key = func, self.key or func.__name__ + return self + + def __get__(self, obj, cls): + if obj is None: return self + key, storage = self.key, getattr(obj, self.attr) + if key not in storage: storage[key] = self.getter(obj) + return storage[key] + + def __set__(self, obj, value): + if self.read_only: raise AttributeError("Read-Only property.") + getattr(obj, self.attr)[self.key] = value + + def __delete__(self, obj): + if self.read_only: raise AttributeError("Read-Only property.") + del getattr(obj, self.attr)[self.key] + + +class cached_property(object): + """ A property that is only computed once per instance and then replaces + itself with an ordinary attribute. Deleting the attribute resets the + property. """ + + def __init__(self, func): + update_wrapper(self, func) + self.func = func + + def __get__(self, obj, cls): + if obj is None: return self + value = obj.__dict__[self.func.__name__] = self.func(obj) + return value + + +class lazy_attribute(object): + """ A property that caches itself to the class object. """ + + def __init__(self, func): + functools.update_wrapper(self, func, updated=[]) + self.getter = func + + def __get__(self, obj, cls): + value = self.getter(cls) + setattr(cls, self.__name__, value) + return value + + +############################################################################### +# Exceptions and Events ####################################################### +############################################################################### + + +class BottleException(Exception): + """ A base class for exceptions used by bottle. """ + pass + +############################################################################### +# Routing ###################################################################### +############################################################################### + + +class RouteError(BottleException): + """ This is a base class for all routing related exceptions """ + + +class RouterUnknownModeError(RouteError): + pass + + +class RouteSyntaxError(RouteError): + """ The route parser found something not supported by this router. """ + + +class RouteBuildError(RouteError): + """ The route could not be built. """ + + +def _re_flatten(p): + """ Turn all capturing groups in a regular expression pattern into + non-capturing groups. """ + if '(' not in p: + return p + return re.sub(r'(\\*)(\(\?P<[^>]+>|\((?!\?))', lambda m: m.group(0) if + len(m.group(1)) % 2 else m.group(1) + '(?:', p) + + +class Router(object): + """ A Router is an ordered collection of route->target pairs. It is used to + efficiently match WSGI requests against a number of routes and return + the first target that satisfies the request. The target may be anything, + usually a string, ID or callable object. A route consists of a path-rule + and a HTTP method. + + The path-rule is either a static path (e.g. `/contact`) or a dynamic + path that contains wildcards (e.g. `/wiki/`). The wildcard syntax + and details on the matching order are described in docs:`routing`. + """ + + default_pattern = '[^/]+' + default_filter = 're' + + #: The current CPython regexp implementation does not allow more + #: than 99 matching groups per regular expression. + _MAX_GROUPS_PER_PATTERN = 99 + + def __init__(self, strict=False): + self.rules = [] # All rules in order + self._groups = {} # index of regexes to find them in dyna_routes + self.builder = {} # Data structure for the url builder + self.static = {} # Search structure for static routes + self.dyna_routes = {} + self.dyna_regexes = {} # Search structure for dynamic routes + #: If true, static routes are no longer checked first. + self.strict_order = strict + self.filters = { + 're': lambda conf: (_re_flatten(conf or self.default_pattern), + None, None), + 'int': lambda conf: (r'-?\d+', int, lambda x: str(int(x))), + 'float': lambda conf: (r'-?[\d.]+', float, lambda x: str(float(x))), + 'path': lambda conf: (r'.+?', None, None) + } + + def add_filter(self, name, func): + """ Add a filter. The provided function is called with the configuration + string as parameter and must return a (regexp, to_python, to_url) tuple. + The first element is a string, the last two are callables or None. """ + self.filters[name] = func + + rule_syntax = re.compile('(\\\\*)' + '(?:(?::([a-zA-Z_][a-zA-Z_0-9]*)?()(?:#(.*?)#)?)' + '|(?:<([a-zA-Z_][a-zA-Z_0-9]*)?(?::([a-zA-Z_]*)' + '(?::((?:\\\\.|[^\\\\>])+)?)?)?>))') + + def _itertokens(self, rule): + offset, prefix = 0, '' + for match in self.rule_syntax.finditer(rule): + prefix += rule[offset:match.start()] + g = match.groups() + if g[2] is not None: + depr(0, 13, "Use of old route syntax.", + "Use instead of :name in routes.", + stacklevel=4) + if len(g[0]) % 2: # Escaped wildcard + prefix += match.group(0)[len(g[0]):] + offset = match.end() + continue + if prefix: + yield prefix, None, None + name, filtr, conf = g[4:7] if g[2] is None else g[1:4] + yield name, filtr or 'default', conf or None + offset, prefix = match.end(), '' + if offset <= len(rule) or prefix: + yield prefix + rule[offset:], None, None + + def add(self, rule, method, target, name=None): + """ Add a new rule or replace the target for an existing rule. """ + anons = 0 # Number of anonymous wildcards found + keys = [] # Names of keys + pattern = '' # Regular expression pattern with named groups + filters = [] # Lists of wildcard input filters + builder = [] # Data structure for the URL builder + is_static = True + + for key, mode, conf in self._itertokens(rule): + if mode: + is_static = False + if mode == 'default': mode = self.default_filter + mask, in_filter, out_filter = self.filters[mode](conf) + if not key: + pattern += '(?:%s)' % mask + key = 'anon%d' % anons + anons += 1 + else: + pattern += '(?P<%s>%s)' % (key, mask) + keys.append(key) + if in_filter: filters.append((key, in_filter)) + builder.append((key, out_filter or str)) + elif key: + pattern += re.escape(key) + builder.append((None, key)) + + self.builder[rule] = builder + if name: self.builder[name] = builder + + if is_static and not self.strict_order: + self.static.setdefault(method, {}) + self.static[method][self.build(rule)] = (target, None) + return + + try: + re_pattern = re.compile('^(%s)$' % pattern) + re_match = re_pattern.match + except re.error as e: + raise RouteSyntaxError("Could not add Route: %s (%s)" % (rule, e)) + + if filters: + + def getargs(path): + url_args = re_match(path).groupdict() + for name, wildcard_filter in filters: + try: + url_args[name] = wildcard_filter(url_args[name]) + except ValueError: + raise HTTPError(400, 'Path has wrong format.') + return url_args + elif re_pattern.groupindex: + + def getargs(path): + return re_match(path).groupdict() + else: + getargs = None + + flatpat = _re_flatten(pattern) + whole_rule = (rule, flatpat, target, getargs) + + if (flatpat, method) in self._groups: + if DEBUG: + msg = 'Route <%s %s> overwrites a previously defined route' + warnings.warn(msg % (method, rule), RuntimeWarning, stacklevel=3) + self.dyna_routes[method][ + self._groups[flatpat, method]] = whole_rule + else: + self.dyna_routes.setdefault(method, []).append(whole_rule) + self._groups[flatpat, method] = len(self.dyna_routes[method]) - 1 + + self._compile(method) + + def _compile(self, method): + all_rules = self.dyna_routes[method] + comborules = self.dyna_regexes[method] = [] + maxgroups = self._MAX_GROUPS_PER_PATTERN + for x in range(0, len(all_rules), maxgroups): + some = all_rules[x:x + maxgroups] + combined = (flatpat for (_, flatpat, _, _) in some) + combined = '|'.join('(^%s$)' % flatpat for flatpat in combined) + combined = re.compile(combined).match + rules = [(target, getargs) for (_, _, target, getargs) in some] + comborules.append((combined, rules)) + + def build(self, _name, *anons, **query): + """ Build an URL by filling the wildcards in a rule. """ + builder = self.builder.get(_name) + if not builder: + raise RouteBuildError("No route with that name.", _name) + try: + for i, value in enumerate(anons): + query['anon%d' % i] = value + url = ''.join([f(query.pop(n)) if n else f for (n, f) in builder]) + return url if not query else url + '?' + urlencode(query) + except KeyError as E: + raise RouteBuildError('Missing URL argument: %r' % E.args[0]) + + def match(self, environ): + """ Return a (target, url_args) tuple or raise HTTPError(400/404/405). """ + verb = environ['REQUEST_METHOD'].upper() + path = environ['PATH_INFO'] or '/' + + methods = ('PROXY', 'HEAD', 'GET', 'ANY') if verb == 'HEAD' else ('PROXY', verb, 'ANY') + + for method in methods: + if method in self.static and path in self.static[method]: + target, getargs = self.static[method][path] + return target, getargs(path) if getargs else {} + elif method in self.dyna_regexes: + for combined, rules in self.dyna_regexes[method]: + match = combined(path) + if match: + target, getargs = rules[match.lastindex - 1] + return target, getargs(path) if getargs else {} + + # No matching route found. Collect alternative methods for 405 response + allowed = set([]) + nocheck = set(methods) + for method in set(self.static) - nocheck: + if path in self.static[method]: + allowed.add(method) + for method in set(self.dyna_regexes) - allowed - nocheck: + for combined, rules in self.dyna_regexes[method]: + match = combined(path) + if match: + allowed.add(method) + if allowed: + allow_header = ",".join(sorted(allowed)) + raise HTTPError(405, "Method not allowed.", Allow=allow_header) + + # No matching route and no alternative method found. We give up + raise HTTPError(404, "Not found: " + repr(path)) + + +class Route(object): + """ This class wraps a route callback along with route specific metadata and + configuration and applies Plugins on demand. It is also responsible for + turning an URL path rule into a regular expression usable by the Router. + """ + + def __init__(self, app, rule, method, callback, + name=None, + plugins=None, + skiplist=None, **config): + #: The application this route is installed to. + self.app = app + #: The path-rule string (e.g. ``/wiki/``). + self.rule = rule + #: The HTTP method as a string (e.g. ``GET``). + self.method = method + #: The original callback with no plugins applied. Useful for introspection. + self.callback = callback + #: The name of the route (if specified) or ``None``. + self.name = name or None + #: A list of route-specific plugins (see :meth:`Bottle.route`). + self.plugins = plugins or [] + #: A list of plugins to not apply to this route (see :meth:`Bottle.route`). + self.skiplist = skiplist or [] + #: Additional keyword arguments passed to the :meth:`Bottle.route` + #: decorator are stored in this dictionary. Used for route-specific + #: plugin configuration and meta-data. + self.config = app.config._make_overlay() + self.config.load_dict(config) + + @cached_property + def call(self): + """ The route callback with all plugins applied. This property is + created on demand and then cached to speed up subsequent requests.""" + return self._make_callback() + + def reset(self): + """ Forget any cached values. The next time :attr:`call` is accessed, + all plugins are re-applied. """ + self.__dict__.pop('call', None) + + def prepare(self): + """ Do all on-demand work immediately (useful for debugging).""" + self.call + + def all_plugins(self): + """ Yield all Plugins affecting this route. """ + unique = set() + for p in reversed(self.app.plugins + self.plugins): + if True in self.skiplist: break + name = getattr(p, 'name', False) + if name and (name in self.skiplist or name in unique): continue + if p in self.skiplist or type(p) in self.skiplist: continue + if name: unique.add(name) + yield p + + def _make_callback(self): + callback = self.callback + for plugin in self.all_plugins(): + if hasattr(plugin, 'apply'): + callback = plugin.apply(callback, self) + else: + callback = plugin(callback) + if callback is not self.callback: + update_wrapper(callback, self.callback) + return callback + + def get_undecorated_callback(self): + """ Return the callback. If the callback is a decorated function, try to + recover the original function. """ + func = self.callback + func = getattr(func, '__func__', func) + while hasattr(func, '__closure__') and getattr(func, '__closure__'): + attributes = getattr(func, '__closure__') + func = attributes[0].cell_contents + + # in case of decorators with multiple arguments + if not isinstance(func, FunctionType): + # pick first FunctionType instance from multiple arguments + func = filter(lambda x: isinstance(x, FunctionType), + map(lambda x: x.cell_contents, attributes)) + func = list(func)[0] # py3 support + return func + + def get_callback_args(self): + """ Return a list of argument names the callback (most likely) accepts + as keyword arguments. If the callback is a decorated function, try + to recover the original function before inspection. """ + sig = inspect.signature(self.get_undecorated_callback()) + return [p.name for p in sig.parameters.values() if p.kind in ( + p.POSITIONAL_OR_KEYWORD, p.KEYWORD_ONLY + )] + + def get_config(self, key, default=None): + """ Lookup a config field and return its value, first checking the + route.config, then route.app.config.""" + depr(0, 13, "Route.get_config() is deprecated.", + "The Route.config property already includes values from the" + " application config for missing keys. Access it directly.") + return self.config.get(key, default) + + def __repr__(self): + cb = self.get_undecorated_callback() + return '<%s %s -> %s:%s>' % (self.method, self.rule, cb.__module__, cb.__name__) + +############################################################################### +# Application Object ########################################################### +############################################################################### + + +class Bottle(object): + """ Each Bottle object represents a single, distinct web application and + consists of routes, callbacks, plugins, resources and configuration. + Instances are callable WSGI applications. + + :param catchall: If true (default), handle all exceptions. Turn off to + let debugging middleware handle exceptions. + """ + + @lazy_attribute + def _global_config(cls): + cfg = ConfigDict() + cfg.meta_set('catchall', 'validate', bool) + return cfg + + def __init__(self, **kwargs): + #: A :class:`ConfigDict` for app specific configuration. + self.config = self._global_config._make_overlay() + self.config._add_change_listener( + functools.partial(self.trigger_hook, 'config')) + + self.config.update({ + "catchall": True + }) + + if kwargs.get('catchall') is False: + depr(0, 13, "Bottle(catchall) keyword argument.", + "The 'catchall' setting is now part of the app " + "configuration. Fix: `app.config['catchall'] = False`") + self.config['catchall'] = False + if kwargs.get('autojson') is False: + depr(0, 13, "Bottle(autojson) keyword argument.", + "The 'autojson' setting is now part of the app " + "configuration. Fix: `app.config['json.enable'] = False`") + self.config['json.enable'] = False + + self._mounts = [] + + #: A :class:`ResourceManager` for application files + self.resources = ResourceManager() + + self.routes = [] # List of installed :class:`Route` instances. + self.router = Router() # Maps requests to :class:`Route` instances. + self.error_handler = {} + + # Core plugins + self.plugins = [] # List of installed plugins. + self.install(JSONPlugin()) + self.install(TemplatePlugin()) + + #: If true, most exceptions are caught and returned as :exc:`HTTPError` + catchall = DictProperty('config', 'catchall') + + __hook_names = 'before_request', 'after_request', 'app_reset', 'config' + __hook_reversed = {'after_request'} + + @cached_property + def _hooks(self): + return dict((name, []) for name in self.__hook_names) + + def add_hook(self, name, func): + """ Attach a callback to a hook. Three hooks are currently implemented: + + before_request + Executed once before each request. The request context is + available, but no routing has happened yet. + after_request + Executed once after each request regardless of its outcome. + app_reset + Called whenever :meth:`Bottle.reset` is called. + """ + if name in self.__hook_reversed: + self._hooks[name].insert(0, func) + else: + self._hooks[name].append(func) + + def remove_hook(self, name, func): + """ Remove a callback from a hook. """ + if name in self._hooks and func in self._hooks[name]: + self._hooks[name].remove(func) + return True + + def trigger_hook(self, __name, *args, **kwargs): + """ Trigger a hook and return a list of results. """ + return [hook(*args, **kwargs) for hook in self._hooks[__name][:]] + + def hook(self, name): + """ Return a decorator that attaches a callback to a hook. See + :meth:`add_hook` for details.""" + + def decorator(func): + self.add_hook(name, func) + return func + + return decorator + + def _mount_wsgi(self, prefix, app, **options): + segments = [p for p in prefix.split('/') if p] + if not segments: + raise ValueError('WSGI applications cannot be mounted to "/".') + path_depth = len(segments) + + def mountpoint_wrapper(): + try: + request.path_shift(path_depth) + rs = HTTPResponse([]) + + def start_response(status, headerlist, exc_info=None): + if exc_info: + _raise(*exc_info) + status = _wsgi_recode(status) + headerlist = [(k, _wsgi_recode(v)) + for (k, v) in headerlist] + rs.status = status + for name, value in headerlist: + rs.add_header(name, value) + return rs.body.append + + body = app(request.environ, start_response) + rs.body = itertools.chain(rs.body, body) if rs.body else body + return rs + finally: + request.path_shift(-path_depth) + + options.setdefault('skip', True) + options.setdefault('method', 'PROXY') + options.setdefault('mountpoint', {'prefix': prefix, 'target': app}) + options['callback'] = mountpoint_wrapper + + self.route('/%s/<:re:.*>' % '/'.join(segments), **options) + if not prefix.endswith('/'): + self.route('/' + '/'.join(segments), **options) + + def _mount_app(self, prefix, app, **options): + if app in self._mounts or '_mount.app' in app.config: + depr(0, 13, "Application mounted multiple times. Falling back to WSGI mount.", + "Clone application before mounting to a different location.") + return self._mount_wsgi(prefix, app, **options) + + if options: + depr(0, 13, "Unsupported mount options. Falling back to WSGI mount.", + "Do not specify any route options when mounting bottle application.") + return self._mount_wsgi(prefix, app, **options) + + if not prefix.endswith("/"): + depr(0, 13, "Prefix must end in '/'. Falling back to WSGI mount.", + "Consider adding an explicit redirect from '/prefix' to '/prefix/' in the parent application.") + return self._mount_wsgi(prefix, app, **options) + + self._mounts.append(app) + app.config['_mount.prefix'] = prefix + app.config['_mount.app'] = self + for route in app.routes: + route.rule = prefix + route.rule.lstrip('/') + self.add_route(route) + + def mount(self, prefix, app, **options): + """ Mount an application (:class:`Bottle` or plain WSGI) to a specific + URL prefix. Example:: + + parent_app.mount('/prefix/', child_app) + + :param prefix: path prefix or `mount-point`. + :param app: an instance of :class:`Bottle` or a WSGI application. + + Plugins from the parent application are not applied to the routes + of the mounted child application. If you need plugins in the child + application, install them separately. + + While it is possible to use path wildcards within the prefix path + (:class:`Bottle` childs only), it is highly discouraged. + + The prefix path must end with a slash. If you want to access the + root of the child application via `/prefix` in addition to + `/prefix/`, consider adding a route with a 307 redirect to the + parent application. + """ + + if not prefix.startswith('/'): + raise ValueError("Prefix must start with '/'") + + if isinstance(app, Bottle): + return self._mount_app(prefix, app, **options) + else: + return self._mount_wsgi(prefix, app, **options) + + def merge(self, routes): + """ Merge the routes of another :class:`Bottle` application or a list of + :class:`Route` objects into this application. The routes keep their + 'owner', meaning that the :data:`Route.app` attribute is not + changed. """ + if isinstance(routes, Bottle): + routes = routes.routes + for route in routes: + self.add_route(route) + + def install(self, plugin): + """ Add a plugin to the list of plugins and prepare it for being + applied to all routes of this application. A plugin may be a simple + decorator or an object that implements the :class:`Plugin` API. + """ + if hasattr(plugin, 'setup'): plugin.setup(self) + if not callable(plugin) and not hasattr(plugin, 'apply'): + raise TypeError("Plugins must be callable or implement .apply()") + self.plugins.append(plugin) + self.reset() + return plugin + + def uninstall(self, plugin): + """ Uninstall plugins. Pass an instance to remove a specific plugin, a type + object to remove all plugins that match that type, a string to remove + all plugins with a matching ``name`` attribute or ``True`` to remove all + plugins. Return the list of removed plugins. """ + removed, remove = [], plugin + for i, plugin in list(enumerate(self.plugins))[::-1]: + if remove is True or remove is plugin or remove is type(plugin) \ + or getattr(plugin, 'name', True) == remove: + removed.append(plugin) + del self.plugins[i] + if hasattr(plugin, 'close'): plugin.close() + if removed: self.reset() + return removed + + def reset(self, route=None): + """ Reset all routes (force plugins to be re-applied) and clear all + caches. If an ID or route object is given, only that specific route + is affected. """ + if route is None: routes = self.routes + elif isinstance(route, Route): routes = [route] + else: routes = [self.routes[route]] + for route in routes: + route.reset() + if DEBUG: + for route in routes: + route.prepare() + self.trigger_hook('app_reset') + + def close(self): + """ Close the application and all installed plugins. """ + for plugin in self.plugins: + if hasattr(plugin, 'close'): plugin.close() + + def run(self, **kwargs): + """ Calls :func:`run` with the same parameters. """ + run(self, **kwargs) + + def match(self, environ): + """ Search for a matching route and return a (:class:`Route`, urlargs) + tuple. The second value is a dictionary with parameters extracted + from the URL. Raise :exc:`HTTPError` (404/405) on a non-match.""" + return self.router.match(environ) + + def get_url(self, routename, **kargs): + """ Return a string that matches a named route """ + scriptname = request.environ.get('SCRIPT_NAME', '').strip('/') + '/' + location = self.router.build(routename, **kargs).lstrip('/') + return urljoin(urljoin('/', scriptname), location) + + def add_route(self, route): + """ Add a route object, but do not change the :data:`Route.app` + attribute.""" + self.routes.append(route) + self.router.add(route.rule, route.method, route, name=route.name) + if DEBUG: route.prepare() + + def route(self, + path=None, + method='GET', + callback=None, + name=None, + apply=None, + skip=None, **config): + """ A decorator to bind a function to a request URL. Example:: + + @app.route('/hello/') + def hello(name): + return 'Hello %s' % name + + The ```` part is a wildcard. See :class:`Router` for syntax + details. + + :param path: Request path or a list of paths to listen to. If no + path is specified, it is automatically generated from the + signature of the function. + :param method: HTTP method (`GET`, `POST`, `PUT`, ...) or a list of + methods to listen to. (default: `GET`) + :param callback: An optional shortcut to avoid the decorator + syntax. ``route(..., callback=func)`` equals ``route(...)(func)`` + :param name: The name for this route. (default: None) + :param apply: A decorator or plugin or a list of plugins. These are + applied to the route callback in addition to installed plugins. + :param skip: A list of plugins, plugin classes or names. Matching + plugins are not installed to this route. ``True`` skips all. + + Any additional keyword arguments are stored as route-specific + configuration and passed to plugins (see :meth:`Plugin.apply`). + """ + if callable(path): path, callback = None, path + plugins = makelist(apply) + skiplist = makelist(skip) + + def decorator(callback): + if isinstance(callback, str): callback = load(callback) + for rule in makelist(path) or yieldroutes(callback): + for verb in makelist(method): + verb = verb.upper() + route = Route(self, rule, verb, callback, + name=name, + plugins=plugins, + skiplist=skiplist, **config) + self.add_route(route) + return callback + + return decorator(callback) if callback else decorator + + def get(self, path=None, method='GET', **options): + """ Equals :meth:`route`. """ + return self.route(path, method, **options) + + def post(self, path=None, method='POST', **options): + """ Equals :meth:`route` with a ``POST`` method parameter. """ + return self.route(path, method, **options) + + def put(self, path=None, method='PUT', **options): + """ Equals :meth:`route` with a ``PUT`` method parameter. """ + return self.route(path, method, **options) + + def delete(self, path=None, method='DELETE', **options): + """ Equals :meth:`route` with a ``DELETE`` method parameter. """ + return self.route(path, method, **options) + + def patch(self, path=None, method='PATCH', **options): + """ Equals :meth:`route` with a ``PATCH`` method parameter. """ + return self.route(path, method, **options) + + def error(self, code=500, callback=None): + """ Register an output handler for a HTTP error code. Can + be used as a decorator or called directly :: + + def error_handler_500(error): + return 'error_handler_500' + + app.error(code=500, callback=error_handler_500) + + @app.error(404) + def error_handler_404(error): + return 'error_handler_404' + + """ + + def decorator(callback): + if isinstance(callback, str): callback = load(callback) + self.error_handler[int(code)] = callback + return callback + + return decorator(callback) if callback else decorator + + def default_error_handler(self, res): + return tob(template(ERROR_PAGE_TEMPLATE, e=res, template_settings=dict(name='__ERROR_PAGE_TEMPLATE'))) + + def _handle(self, environ): + path = environ['bottle.raw_path'] = environ['PATH_INFO'] + environ['PATH_INFO'] = _wsgi_recode(path) + + environ['bottle.app'] = self + request.bind(environ) + response.bind() + + try: + out = None + try: + self.trigger_hook('before_request') + route, args = self.router.match(environ) + environ['route.handle'] = route + environ['bottle.route'] = route + environ['route.url_args'] = args + out = route.call(**args) + except HTTPResponse as E: + out = E + finally: + if isinstance(out, HTTPResponse): + out.apply(response) + try: + self.trigger_hook('after_request') + except HTTPResponse as E: + out = E + out.apply(response) + except (KeyboardInterrupt, SystemExit, MemoryError): + raise + except Exception as E: + if not self.catchall: raise + stacktrace = format_exc() + environ['wsgi.errors'].write(stacktrace) + environ['wsgi.errors'].flush() + environ['bottle.exc_info'] = sys.exc_info() + out = HTTPError(500, "Internal Server Error", E, stacktrace) + out.apply(response) + + return out + + def _cast(self, out, peek=None): + """ Try to convert the parameter into something WSGI compatible and set + correct HTTP headers when possible. + Support: False, bytes/bytearray, str, dict, HTTPResponse, HTTPError, file-like, + iterable of bytes/bytearray or str instances. + """ + + # Empty output is done here + if not out: + if 'Content-Length' not in response: + response['Content-Length'] = 0 + return [] + # Join lists of byte or unicode strings. Mixed lists are NOT supported + if isinstance(out, (tuple, list))\ + and isinstance(out[0], (bytes, str)): + out = out[0][0:0].join(out) # b'abc'[0:0] -> b'' + # Encode unicode strings + if isinstance(out, str): + out = out.encode(response.charset) + # Byte Strings are just returned + if isinstance(out, bytes): + if 'Content-Length' not in response: + response['Content-Length'] = len(out) + return [out] + # HTTPError or HTTPException (recursive, because they may wrap anything) + # TODO: Handle these explicitly in handle() or make them iterable. + if isinstance(out, HTTPError): + out.apply(response) + out = self.error_handler.get(out.status_code, + self.default_error_handler)(out) + return self._cast(out) + if isinstance(out, HTTPResponse): + out.apply(response) + return self._cast(out.body) + + # File-like objects. + if hasattr(out, 'read'): + if 'wsgi.file_wrapper' in request.environ: + return request.environ['wsgi.file_wrapper'](out) + elif hasattr(out, 'close') or not hasattr(out, '__iter__'): + return WSGIFileWrapper(out) + + # Handle Iterables. We peek into them to detect their inner type. + try: + iout = iter(out) + first = next(iout) + while not first: + first = next(iout) + except StopIteration: + return self._cast('') + except HTTPResponse as E: + first = E + except (KeyboardInterrupt, SystemExit, MemoryError): + raise + except Exception as error: + if not self.catchall: raise + first = HTTPError(500, 'Unhandled exception', error, format_exc()) + + # These are the inner types allowed in iterator or generator objects. + if isinstance(first, HTTPResponse): + return self._cast(first) + elif isinstance(first, bytes): + new_iter = itertools.chain([first], iout) + elif isinstance(first, str): + encoder = lambda x: x.encode(response.charset) + new_iter = map(encoder, itertools.chain([first], iout)) + else: + msg = 'Unsupported response type: %s' % type(first) + return self._cast(HTTPError(500, msg)) + if hasattr(out, 'close'): + new_iter = _closeiter(new_iter, out.close) + return new_iter + + def wsgi(self, environ, start_response): + """ The bottle WSGI-interface. """ + try: + out = self._cast(self._handle(environ)) + # rfc2616 section 4.3 + if response._status_code in (100, 101, 204, 304)\ + or environ['REQUEST_METHOD'] == 'HEAD': + if hasattr(out, 'close'): out.close() + out = [] + exc_info = environ.get('bottle.exc_info') + if exc_info is not None: + del environ['bottle.exc_info'] + start_response(response._wsgi_status_line(), response.headerlist, exc_info) + return out + except (KeyboardInterrupt, SystemExit, MemoryError): + raise + except Exception as E: + if not self.catchall: raise + err = '

Critical error while processing request: %s

' \ + % html_escape(environ.get('PATH_INFO', '/')) + if DEBUG: + err += '

Error:

\n
\n%s\n
\n' \ + '

Traceback:

\n
\n%s\n
\n' \ + % (html_escape(repr(E)), html_escape(format_exc())) + environ['wsgi.errors'].write(err) + environ['wsgi.errors'].flush() + headers = [('Content-Type', 'text/html; charset=UTF-8')] + start_response('500 INTERNAL SERVER ERROR', headers, sys.exc_info()) + return [tob(err)] + + def __call__(self, environ, start_response): + """ Each instance of :class:'Bottle' is a WSGI application. """ + return self.wsgi(environ, start_response) + + def __enter__(self): + """ Use this application as default for all module-level shortcuts. """ + default_app.push(self) + return self + + def __exit__(self, exc_type, exc_value, traceback): + default_app.pop() + + def __setattr__(self, name, value): + if name in self.__dict__: + raise AttributeError("Attribute %s already defined. Plugin conflict?" % name) + object.__setattr__(self, name, value) + +############################################################################### +# HTTP and WSGI Tools ########################################################## +############################################################################### + + +class BaseRequest(object): + """ A wrapper for WSGI environment dictionaries that adds a lot of + convenient access methods and properties. Most of them are read-only. + + Adding new attributes to a request actually adds them to the environ + dictionary (as 'bottle.request.ext.'). This is the recommended + way to store and access request-specific data. + """ + + __slots__ = ('environ', ) + + #: Maximum size of memory buffer for :attr:`body` in bytes. + MEMFILE_MAX = 102400 + + def __init__(self, environ=None): + """ Wrap a WSGI environ dictionary. """ + #: The wrapped WSGI environ dictionary. This is the only real attribute. + #: All other attributes actually are read-only properties. + self.environ = {} if environ is None else environ + self.environ['bottle.request'] = self + + @DictProperty('environ', 'bottle.app', read_only=True) + def app(self): + """ Bottle application handling this request. """ + raise RuntimeError('This request is not connected to an application.') + + @DictProperty('environ', 'bottle.route', read_only=True) + def route(self): + """ The bottle :class:`Route` object that matches this request. """ + raise RuntimeError('This request is not connected to a route.') + + @DictProperty('environ', 'route.url_args', read_only=True) + def url_args(self): + """ The arguments extracted from the URL. """ + raise RuntimeError('This request is not connected to a route.') + + @property + def path(self): + """ The value of ``PATH_INFO`` with exactly one prefixed slash (to fix + broken clients and avoid the "empty path" edge case). """ + return '/' + self.environ.get('PATH_INFO', '').lstrip('/') + + @property + def method(self): + """ The ``REQUEST_METHOD`` value as an uppercase string. """ + return self.environ.get('REQUEST_METHOD', 'GET').upper() + + @DictProperty('environ', 'bottle.request.headers', read_only=True) + def headers(self): + """ A :class:`WSGIHeaderDict` that provides case-insensitive access to + HTTP request headers. """ + return WSGIHeaderDict(self.environ) + + def get_header(self, name, default=None): + """ Return the value of a request header, or a given default value. """ + return self.headers.get(name, default) + + @DictProperty('environ', 'bottle.request.cookies', read_only=True) + def cookies(self): + """ Cookies parsed into a :class:`FormsDict`. Signed cookies are NOT + decoded. Use :meth:`get_cookie` if you expect signed cookies. """ + cookie_header = _wsgi_recode(self.environ.get('HTTP_COOKIE', '')) + cookies = SimpleCookie(cookie_header).values() + return FormsDict((c.key, c.value) for c in cookies) + + def get_cookie(self, key, default=None, secret=None, digestmod=hashlib.sha256): + """ Return the content of a cookie. To read a `Signed Cookie`, the + `secret` must match the one used to create the cookie (see + :meth:`Response.set_cookie `). If anything goes wrong (missing + cookie or wrong signature), return a default value. """ + value = self.cookies.get(key) + if secret: + # See BaseResponse.set_cookie for details on signed cookies. + if value and value.startswith('!') and '?' in value: + sig, msg = map(tob, value[1:].split('?', 1)) + hash = hmac.new(tob(secret), msg, digestmod=digestmod).digest() + if _lscmp(sig, base64.b64encode(hash)): + dst = pickle.loads(base64.b64decode(msg)) + if dst and dst[0] == key: + return dst[1] + return default + return value or default + + @DictProperty('environ', 'bottle.request.query', read_only=True) + def query(self): + """ The :attr:`query_string` parsed into a :class:`FormsDict`. These + values are sometimes called "URL arguments" or "GET parameters", but + not to be confused with "URL wildcards" as they are provided by the + :class:`Router`. """ + get = self.environ['bottle.get'] = FormsDict() + pairs = _parse_qsl(self.environ.get('QUERY_STRING', ''), 'utf8') + for key, value in pairs: + get[key] = value + return get + + @DictProperty('environ', 'bottle.request.forms', read_only=True) + def forms(self): + """ Form values parsed from an `url-encoded` or `multipart/form-data` + encoded POST or PUT request body. The result is returned as a + :class:`FormsDict`. All keys and values are strings. File uploads + are stored separately in :attr:`files`. """ + forms = FormsDict() + for name, item in self.POST.allitems(): + if not isinstance(item, FileUpload): + forms[name] = item + return forms + + @DictProperty('environ', 'bottle.request.params', read_only=True) + def params(self): + """ A :class:`FormsDict` with the combined values of :attr:`query` and + :attr:`forms`. File uploads are stored in :attr:`files`. """ + params = FormsDict() + for key, value in self.query.allitems(): + params[key] = value + for key, value in self.forms.allitems(): + params[key] = value + return params + + @DictProperty('environ', 'bottle.request.files', read_only=True) + def files(self): + """ File uploads parsed from `multipart/form-data` encoded POST or PUT + request body. The values are instances of :class:`FileUpload`. + + """ + files = FormsDict() + for name, item in self.POST.allitems(): + if isinstance(item, FileUpload): + files[name] = item + return files + + @DictProperty('environ', 'bottle.request.json', read_only=True) + def json(self): + """ If the ``Content-Type`` header is ``application/json`` or + ``application/json-rpc``, this property holds the parsed content + of the request body. Only requests smaller than :attr:`MEMFILE_MAX` + are processed to avoid memory exhaustion. + Invalid JSON raises a 400 error response. + """ + ctype = self.environ.get('CONTENT_TYPE', '').lower().split(';')[0] + if ctype in ('application/json', 'application/json-rpc'): + b = self._get_body_string(self.MEMFILE_MAX) + if not b: + return None + try: + return json_loads(b) + except (ValueError, TypeError) as err: + raise HTTPError(400, 'Invalid JSON', exception=err) + return None + + def _iter_body(self, read, bufsize): + maxread = max(0, self.content_length) + while maxread: + part = read(min(maxread, bufsize)) + if not part: break + yield part + maxread -= len(part) + + @staticmethod + def _iter_chunked(read, bufsize): + err = HTTPError(400, 'Error while parsing chunked transfer body.') + rn, sem, bs = b'\r\n', b';', b'' + while True: + header = read(1) + while header[-2:] != rn: + c = read(1) + header += c + if not c: raise err + if len(header) > bufsize: raise err + size, _, _ = header.partition(sem) + try: + maxread = int(size.strip(), 16) + except ValueError: + raise err + if maxread == 0: break + buff = bs + while maxread > 0: + if not buff: + buff = read(min(maxread, bufsize)) + part, buff = buff[:maxread], buff[maxread:] + if not part: raise err + yield part + maxread -= len(part) + if read(2) != rn: + raise err + + @DictProperty('environ', 'bottle.request.body', read_only=True) + def _body(self): + try: + read_func = self.environ['wsgi.input'].read + except KeyError: + self.environ['wsgi.input'] = BytesIO() + return self.environ['wsgi.input'] + body_iter = self._iter_chunked if self.chunked else self._iter_body + body, body_size, is_temp_file = BytesIO(), 0, False + for part in body_iter(read_func, self.MEMFILE_MAX): + body.write(part) + body_size += len(part) + if not is_temp_file and body_size > self.MEMFILE_MAX: + body, tmp = NamedTemporaryFile(mode='w+b'), body + body.write(tmp.getvalue()) + del tmp + is_temp_file = True + self.environ['wsgi.input'] = body + body.seek(0) + return body + + def _get_body_string(self, maxread): + """ Read body into a string. Raise HTTPError(413) on requests that are + too large. """ + if self.content_length > maxread: + raise HTTPError(413, 'Request entity too large') + data = self.body.read(maxread + 1) + if len(data) > maxread: + raise HTTPError(413, 'Request entity too large') + return data + + @property + def body(self): + """ The HTTP request body as a seek-able file-like object. Depending on + :attr:`MEMFILE_MAX`, this is either a temporary file or a + :class:`io.BytesIO` instance. Accessing this property for the first + time reads and replaces the ``wsgi.input`` environ variable. + Subsequent accesses just do a `seek(0)` on the file object. """ + self._body.seek(0) + return self._body + + @property + def chunked(self): + """ True if Chunked transfer encoding was. """ + return 'chunked' in self.environ.get( + 'HTTP_TRANSFER_ENCODING', '').lower() + + #: An alias for :attr:`query`. + GET = query + + @DictProperty('environ', 'bottle.request.post', read_only=True) + def POST(self): + """ The values of :attr:`forms` and :attr:`files` combined into a single + :class:`FormsDict`. Values are either strings (form values) or + instances of :class:`FileUpload`. + """ + post = FormsDict() + content_type = self.environ.get('CONTENT_TYPE', '') + content_type, options = _parse_http_header(content_type)[0] + # We default to application/x-www-form-urlencoded for everything that + # is not multipart and take the fast path (also: 3.1 workaround) + if not content_type.startswith('multipart/'): + body = self._get_body_string(self.MEMFILE_MAX).decode('utf8', 'surrogateescape') + for key, value in _parse_qsl(body, 'utf8'): + post[key] = value + return post + + charset = options.get("charset", "utf8") + boundary = options.get("boundary") + if not boundary: + raise MultipartError("Invalid content type header, missing boundary") + parser = _MultipartParser(self.body, boundary, self.content_length, + mem_limit=self.MEMFILE_MAX, memfile_limit=self.MEMFILE_MAX, + charset=charset) + + for part in parser.parse(): + if not part.filename and part.is_buffered(): + post[part.name] = part.value + else: + post[part.name] = FileUpload(part.file, part.name, + part.filename, part.headerlist) + + return post + + @property + def url(self): + """ The full request URI including hostname and scheme. If your app + lives behind a reverse proxy or load balancer and you get confusing + results, make sure that the ``X-Forwarded-Host`` header is set + correctly. """ + return self.urlparts.geturl() + + @DictProperty('environ', 'bottle.request.urlparts', read_only=True) + def urlparts(self): + """ The :attr:`url` string as an :class:`urlparse.SplitResult` tuple. + The tuple contains (scheme, host, path, query_string and fragment), + but the fragment is always empty because it is not visible to the + server. """ + env = self.environ + http = env.get('HTTP_X_FORWARDED_PROTO') \ + or env.get('wsgi.url_scheme', 'http') + host = env.get('HTTP_X_FORWARDED_HOST') or env.get('HTTP_HOST') + if not host: + # HTTP 1.1 requires a Host-header. This is for HTTP/1.0 clients. + host = env.get('SERVER_NAME', '127.0.0.1') + port = env.get('SERVER_PORT') + if port and port != ('80' if http == 'http' else '443'): + host += ':' + port + path = urlquote(self.fullpath) + return UrlSplitResult(http, host, path, env.get('QUERY_STRING'), '') + + @property + def fullpath(self): + """ Request path including :attr:`script_name` (if present). """ + return urljoin(self.script_name, self.path.lstrip('/')) + + @property + def query_string(self): + """ The raw :attr:`query` part of the URL (everything in between ``?`` + and ``#``) as a string. """ + return self.environ.get('QUERY_STRING', '') + + @property + def script_name(self): + """ The initial portion of the URL's `path` that was removed by a higher + level (server or routing middleware) before the application was + called. This script path is returned with leading and tailing + slashes. """ + script_name = self.environ.get('SCRIPT_NAME', '').strip('/') + return '/' + script_name + '/' if script_name else '/' + + def path_shift(self, shift=1): + """ Shift path segments from :attr:`path` to :attr:`script_name` and + vice versa. + + :param shift: The number of path segments to shift. May be negative + to change the shift direction. (default: 1) + """ + script, path = path_shift(self.environ.get('SCRIPT_NAME', '/'), self.path, shift) + self['SCRIPT_NAME'], self['PATH_INFO'] = script, path + + @property + def content_length(self): + """ The request body length as an integer. The client is responsible to + set this header. Otherwise, the real length of the body is unknown + and -1 is returned. In this case, :attr:`body` will be empty. """ + return int(self.environ.get('CONTENT_LENGTH') or -1) + + @property + def content_type(self): + """ The Content-Type header as a lowercase-string (default: empty). """ + return self.environ.get('CONTENT_TYPE', '').lower() + + @property + def is_xhr(self): + """ True if the request was triggered by a XMLHttpRequest. This only + works with JavaScript libraries that support the `X-Requested-With` + header (most of the popular libraries do). """ + requested_with = self.environ.get('HTTP_X_REQUESTED_WITH', '') + return requested_with.lower() == 'xmlhttprequest' + + @property + def is_ajax(self): + """ Alias for :attr:`is_xhr`. "Ajax" is not the right term. """ + return self.is_xhr + + @property + def auth(self): + """ HTTP authentication data as a (user, password) tuple. This + implementation currently supports basic (not digest) authentication + only. If the authentication happened at a higher level (e.g. in the + front web-server or a middleware), the password field is None, but + the user field is looked up from the ``REMOTE_USER`` environ + variable. On any errors, None is returned. """ + basic = parse_auth(self.environ.get('HTTP_AUTHORIZATION', '')) + if basic: return basic + ruser = self.environ.get('REMOTE_USER') + if ruser: return (ruser, None) + return None + + @property + def remote_route(self): + """ A list of all IPs that were involved in this request, starting with + the client IP and followed by zero or more proxies. This does only + work if all proxies support the ```X-Forwarded-For`` header. Note + that this information can be forged by malicious clients. """ + proxy = self.environ.get('HTTP_X_FORWARDED_FOR') + if proxy: return [ip.strip() for ip in proxy.split(',')] + remote = self.environ.get('REMOTE_ADDR') + return [remote] if remote else [] + + @property + def remote_addr(self): + """ The client IP as a string. Note that this information can be forged + by malicious clients. """ + route = self.remote_route + return route[0] if route else None + + def copy(self): + """ Return a new :class:`Request` with a shallow :attr:`environ` copy. """ + return Request(self.environ.copy()) + + def get(self, key, default=None): + return self.environ.get(key, default) + + def __getitem__(self, key): + return self.environ[key] + + def __delitem__(self, key): + self[key] = "" + del (self.environ[key]) + + def __iter__(self): + return iter(self.environ) + + def __len__(self): + return len(self.environ) + + def keys(self): + return self.environ.keys() + + def __setitem__(self, key, value): + """ Change an environ value and clear all caches that depend on it. """ + + if self.environ.get('bottle.request.readonly'): + raise KeyError('The environ dictionary is read-only.') + + self.environ[key] = value + todelete = () + + if key == 'wsgi.input': + todelete = ('body', 'forms', 'files', 'params', 'post', 'json') + elif key == 'QUERY_STRING': + todelete = ('query', 'params') + elif key.startswith('HTTP_'): + todelete = ('headers', 'cookies') + + for key in todelete: + self.environ.pop('bottle.request.' + key, None) + + def __repr__(self): + return '<%s: %s %s>' % (self.__class__.__name__, self.method, self.url) + + def __getattr__(self, name): + """ Search in self.environ for additional user defined attributes. """ + try: + var = self.environ['bottle.request.ext.%s' % name] + return var.__get__(self) if hasattr(var, '__get__') else var + except KeyError: + raise AttributeError('Attribute %r not defined.' % name) + + def __setattr__(self, name, value): + """ Define new attributes that are local to the bound request environment. """ + if name == 'environ': return object.__setattr__(self, name, value) + key = 'bottle.request.ext.%s' % name + if hasattr(self, name): + raise AttributeError("Attribute already defined: %s" % name) + self.environ[key] = value + + def __delattr__(self, name): + try: + del self.environ['bottle.request.ext.%s' % name] + except KeyError: + raise AttributeError("Attribute not defined: %s" % name) + + +def _hkey(key): + key = touni(key) + if '\n' in key or '\r' in key or '\0' in key: + raise ValueError("Header names must not contain control characters: %r" % key) + return key.title().replace('_', '-') + + +def _hval(value): + value = touni(value) + if '\n' in value or '\r' in value or '\0' in value: + raise ValueError("Header value must not contain control characters: %r" % value) + return value + + +class HeaderProperty(object): + def __init__(self, name, reader=None, writer=None, default=''): + self.name, self.default = name, default + self.reader, self.writer = reader, writer + self.__doc__ = 'Current value of the %r header.' % name.title() + + def __get__(self, obj, _): + if obj is None: return self + value = obj.get_header(self.name, self.default) + return self.reader(value) if self.reader else value + + def __set__(self, obj, value): + obj[self.name] = self.writer(value) if self.writer else value + + def __delete__(self, obj): + del obj[self.name] + + +class BaseResponse(object): + """ Storage class for a response body as well as headers and cookies. + + This class does support dict-like case-insensitive item-access to + headers, but is NOT a dict. Most notably, iterating over a response + yields parts of the body and not the headers. + """ + + default_status = 200 + default_content_type = 'text/html; charset=UTF-8' + + # Header denylist for specific response codes + # (rfc2616 section 10.2.3 and 10.3.5) + bad_headers = { + 204: frozenset(('Content-Type', 'Content-Length')), + 304: frozenset(('Allow', 'Content-Encoding', 'Content-Language', + 'Content-Length', 'Content-Range', 'Content-Type', + 'Content-Md5', 'Last-Modified')) + } + + def __init__(self, body='', status=None, headers=None, **more_headers): + """ Create a new response object. + + :param body: The response body as one of the supported types. + :param status: Either an HTTP status code (e.g. 200) or a status line + including the reason phrase (e.g. '200 OK'). + :param headers: A dictionary or a list of name-value pairs. + + Additional keyword arguments are added to the list of headers. + Underscores in the header name are replaced with dashes. + """ + self._cookies = None + self._headers = {} + self.body = body + self.status = status or self.default_status + if headers: + if isinstance(headers, dict): + headers = headers.items() + for name, value in headers: + self.add_header(name, value) + if more_headers: + for name, value in more_headers.items(): + self.add_header(name, value) + + def copy(self, cls=None): + """ Returns a copy of self. """ + cls = cls or BaseResponse + assert issubclass(cls, BaseResponse) + copy = cls() + copy.status = self.status + copy._headers = dict((k, v[:]) for (k, v) in self._headers.items()) + if self._cookies: + cookies = copy._cookies = SimpleCookie() + for k,v in self._cookies.items(): + cookies[k] = v.value + cookies[k].update(v) # also copy cookie attributes + return copy + + def __iter__(self): + return iter(self.body) + + def close(self): + if hasattr(self.body, 'close'): + self.body.close() + + @property + def status_line(self): + """ The HTTP status line as a string (e.g. ``404 Not Found``).""" + return self._status_line + + @property + def status_code(self): + """ The HTTP status code as an integer (e.g. 404).""" + return self._status_code + + def _set_status(self, status): + if isinstance(status, int): + code, status = status, _HTTP_STATUS_LINES.get(status) + elif ' ' in status: + if '\n' in status or '\r' in status or '\0' in status: + raise ValueError('Status line must not include control chars.') + status = status.strip() + code = int(status.split()[0]) + else: + raise ValueError('String status line without a reason phrase.') + if not 100 <= code <= 999: + raise ValueError('Status code out of range.') + self._status_code = code + self._status_line = str(status or ('%d Unknown' % code)) + + def _get_status(self): + return self._status_line + + status = property( + _get_status, _set_status, None, + ''' A writeable property to change the HTTP response status. It accepts + either a numeric code (100-999) or a string with a custom reason + phrase (e.g. "404 Brain not found"). Both :data:`status_line` and + :data:`status_code` are updated accordingly. The return value is + always a status string. ''') + del _get_status, _set_status + + @property + def headers(self): + """ An instance of :class:`HeaderDict`, a case-insensitive dict-like + view on the response headers. """ + hdict = HeaderDict() + hdict.dict = self._headers + return hdict + + def __contains__(self, name): + return _hkey(name) in self._headers + + def __delitem__(self, name): + del self._headers[_hkey(name)] + + def __getitem__(self, name): + return self._headers[_hkey(name)][-1] + + def __setitem__(self, name, value): + self._headers[_hkey(name)] = [_hval(value)] + + def get_header(self, name, default=None): + """ Return the value of a previously defined header. If there is no + header with that name, return a default value. """ + return self._headers.get(_hkey(name), [default])[-1] + + def set_header(self, name, value): + """ Create a new response header, replacing any previously defined + headers with the same name. """ + self._headers[_hkey(name)] = [_hval(value)] + + def add_header(self, name, value): + """ Add an additional response header, not removing duplicates. """ + self._headers.setdefault(_hkey(name), []).append(_hval(value)) + + def iter_headers(self): + """ Yield (header, value) tuples, skipping headers that are not + allowed with the current response status code. """ + return self.headerlist + + def _wsgi_status_line(self): + """ WSGI conform status line (latin1-encodeable) """ + return self._status_line.encode('utf8', 'surrogateescape').decode('latin1') + + @property + def headerlist(self): + """ WSGI conform list of (header, value) tuples. """ + out = [] + headers = list(self._headers.items()) + if 'Content-Type' not in self._headers: + headers.append(('Content-Type', [self.default_content_type])) + if self._status_code in self.bad_headers: + bad_headers = self.bad_headers[self._status_code] + headers = [h for h in headers if h[0] not in bad_headers] + out += [(name, val) for (name, vals) in headers for val in vals] + if self._cookies: + for c in self._cookies.values(): + out.append(('Set-Cookie', _hval(c.OutputString()))) + out = [(k, v.encode('utf8', 'surrogateescape').decode('latin1')) for (k, v) in out] + return out + + content_type = HeaderProperty('Content-Type') + content_length = HeaderProperty('Content-Length', reader=int, default=-1) + expires = HeaderProperty( + 'Expires', + reader=lambda x: datetime.fromtimestamp(parse_date(x), UTC), + writer=lambda x: http_date(x)) + + @property + def charset(self, default='UTF-8'): + """ Return the charset specified in the content-type header (default: utf8). """ + if 'charset=' in self.content_type: + return self.content_type.split('charset=')[-1].split(';')[0].strip() + return default + + def set_cookie(self, name, value, secret=None, digestmod=hashlib.sha256, **options): + """ Create a new cookie or replace an old one. If the `secret` parameter is + set, create a `Signed Cookie` (described below). + + :param name: the name of the cookie. + :param value: the value of the cookie. + :param secret: a signature key required for signed cookies. + + Additionally, this method accepts all RFC 2109 attributes that are + supported by :class:`cookie.Morsel`, including: + + :param maxage: maximum age in seconds. (default: None) + :param expires: a datetime object or UNIX timestamp. (default: None) + :param domain: the domain that is allowed to read the cookie. + (default: current domain) + :param path: limits the cookie to a given path (default: current path) + :param secure: limit the cookie to HTTPS connections (default: off). + :param httponly: prevents client-side javascript to read this cookie + (default: off, requires Python 2.6 or newer). + :param samesite: Control or disable third-party use for this cookie. + Possible values: `lax`, `strict` or `none` (default). + + If neither `expires` nor `maxage` is set (default), the cookie will + expire at the end of the browser session (as soon as the browser + window is closed). + + Signed cookies may store any pickle-able object and are + cryptographically signed to prevent manipulation. Keep in mind that + cookies are limited to 4kb in most browsers. + + Warning: Pickle is a potentially dangerous format. If an attacker + gains access to the secret key, he could forge cookies that execute + code on server side if unpickled. Using pickle is discouraged and + support for it will be removed in later versions of bottle. + + Warning: Signed cookies are not encrypted (the client can still see + the content) and not copy-protected (the client can restore an old + cookie). The main intention is to make pickling and unpickling + save, not to store secret information at client side. + """ + if not self._cookies: + self._cookies = SimpleCookie() + + # Monkey-patch Cookie lib to support 'SameSite' parameter + # https://tools.ietf.org/html/draft-west-first-party-cookies-07#section-4.1 + if py < (3, 8, 0): + Morsel._reserved.setdefault('samesite', 'SameSite') + + if secret: + if not isinstance(value, str): + depr(0, 13, "Pickling of arbitrary objects into cookies is " + "deprecated.", "Only store strings in cookies. " + "JSON strings are fine, too.") + encoded = base64.b64encode(pickle.dumps([name, value], -1)) + sig = base64.b64encode(hmac.new(tob(secret), encoded, + digestmod=digestmod).digest()) + value = touni(b'!' + sig + b'?' + encoded) + elif not isinstance(value, str): + raise TypeError('Secret key required for non-string cookies.') + + # Cookie size plus options must not exceed 4kb. + if len(name) + len(value) > 3800: + raise ValueError('Content does not fit into a cookie.') + + self._cookies[name] = value + + for key, value in options.items(): + if key in ('max_age', 'maxage'): # 'maxage' variant added in 0.13 + key = 'max-age' + if isinstance(value, timedelta): + value = value.seconds + value.days * 24 * 3600 + if key == 'expires': + value = http_date(value) + if key in ('same_site', 'samesite'): # 'samesite' variant added in 0.13 + key, value = 'samesite', (value or "none").lower() + if value not in ('lax', 'strict', 'none'): + raise CookieError("Invalid value for SameSite") + if key in ('secure', 'httponly') and not value: + continue + self._cookies[name][key] = value + + def delete_cookie(self, key, **kwargs): + """ Delete a cookie. Be sure to use the same `domain` and `path` + settings as used to create the cookie. """ + kwargs['max_age'] = -1 + kwargs['expires'] = 0 + self.set_cookie(key, '', **kwargs) + + def __repr__(self): + out = '' + for name, value in self.headerlist: + out += '%s: %s\n' % (name.title(), value.strip()) + return out + + +def _local_property(): + ls = threading.local() + + def fget(_): + try: + return ls.var + except AttributeError: + raise RuntimeError("Request context not initialized.") + + def fset(_, value): + ls.var = value + + def fdel(_): + del ls.var + + return property(fget, fset, fdel, 'Thread-local property') + + +class LocalRequest(BaseRequest): + """ A thread-local subclass of :class:`BaseRequest` with a different + set of attributes for each thread. There is usually only one global + instance of this class (:data:`request`). If accessed during a + request/response cycle, this instance always refers to the *current* + request (even on a multithreaded server). """ + bind = BaseRequest.__init__ + environ = _local_property() + + +class LocalResponse(BaseResponse): + """ A thread-local subclass of :class:`BaseResponse` with a different + set of attributes for each thread. There is usually only one global + instance of this class (:data:`response`). Its attributes are used + to build the HTTP response at the end of the request/response cycle. + """ + bind = BaseResponse.__init__ + _status_line = _local_property() + _status_code = _local_property() + _cookies = _local_property() + _headers = _local_property() + body = _local_property() + + +Request = BaseRequest +Response = BaseResponse + + +class HTTPResponse(Response, BottleException): + """ A subclass of :class:`Response` that can be raised or returned from request + handlers to short-curcuit request processing and override changes made to the + global :data:`request` object. This bypasses error handlers, even if the status + code indicates an error. Return or raise :class:`HTTPError` to trigger error + handlers. + """ + + def __init__(self, body='', status=None, headers=None, **more_headers): + super(HTTPResponse, self).__init__(body, status, headers, **more_headers) + + def apply(self, other): + """ Copy the state of this response to a different :class:`Response` object. """ + other._status_code = self._status_code + other._status_line = self._status_line + other._headers = self._headers + other._cookies = self._cookies + other.body = self.body + + +class HTTPError(HTTPResponse): + """ A subclass of :class:`HTTPResponse` that triggers error handlers. """ + + default_status = 500 + + def __init__(self, + status=None, + body=None, + exception=None, + traceback=None, **more_headers): + self.exception = exception + self.traceback = traceback + super(HTTPError, self).__init__(body, status, **more_headers) + +############################################################################### +# Plugins ###################################################################### +############################################################################### + + +class PluginError(BottleException): + pass + + +class JSONPlugin(object): + name = 'json' + api = 2 + + def __init__(self, json_dumps=json_dumps): + self.json_dumps = json_dumps + + def setup(self, app): + app.config._define('json.enable', default=True, validate=bool, + help="Enable or disable automatic dict->json filter.") + app.config._define('json.ascii', default=False, validate=bool, + help="Use only 7-bit ASCII characters in output.") + app.config._define('json.indent', default=True, validate=bool, + help="Add whitespace to make json more readable.") + app.config._define('json.dump_func', default=None, + help="If defined, use this function to transform" + " dict into json. The other options no longer" + " apply.") + + def apply(self, callback, route): + dumps = self.json_dumps + if not self.json_dumps: return callback + + @functools.wraps(callback) + def wrapper(*a, **ka): + try: + rv = callback(*a, **ka) + except HTTPResponse as resp: + rv = resp + + if isinstance(rv, dict): + # Attempt to serialize, raises exception on failure + json_response = dumps(rv) + # Set content type only if serialization successful + response.content_type = 'application/json' + return json_response + elif isinstance(rv, HTTPResponse) and isinstance(rv.body, dict): + rv.body = dumps(rv.body) + rv.content_type = 'application/json' + return rv + + return wrapper + + +class TemplatePlugin(object): + """ This plugin applies the :func:`view` decorator to all routes with a + `template` config parameter. If the parameter is a tuple, the second + element must be a dict with additional options (e.g. `template_engine`) + or default variables for the template. """ + name = 'template' + api = 2 + + def setup(self, app): + app.tpl = self + + def apply(self, callback, route): + conf = route.config.get('template') + if isinstance(conf, (tuple, list)) and len(conf) == 2: + return view(conf[0], **conf[1])(callback) + elif isinstance(conf, str): + return view(conf)(callback) + else: + return callback + + +#: Not a plugin, but part of the plugin API. TODO: Find a better place. +class _ImportRedirect(object): + def __init__(self, name, impmask): + """ Create a virtual package that redirects imports (see PEP 302). """ + self.name = name + self.impmask = impmask + self.module = sys.modules.setdefault(name, new_module(name)) + self.module.__dict__.update({ + '__file__': __file__, + '__path__': [], + '__all__': [], + '__loader__': self + }) + sys.meta_path.append(self) + + def find_spec(self, fullname, path, target=None): + if '.' not in fullname: return + if fullname.rsplit('.', 1)[0] != self.name: return + from importlib.util import spec_from_loader + return spec_from_loader(fullname, self) + + def find_module(self, fullname, path=None): + if '.' not in fullname: return + if fullname.rsplit('.', 1)[0] != self.name: return + return self + + def create_module(self, spec): + return self.load_module(spec.name) + + def exec_module(self, module): + pass # This probably breaks importlib.reload() :/ + + def load_module(self, fullname): + if fullname in sys.modules: return sys.modules[fullname] + modname = fullname.rsplit('.', 1)[1] + realname = self.impmask % modname + __import__(realname) + module = sys.modules[fullname] = sys.modules[realname] + setattr(self.module, modname, module) + module.__loader__ = self + return module + +############################################################################### +# Common Utilities ############################################################# +############################################################################### + + +class MultiDict(DictMixin): + """ This dict stores multiple values per key, but behaves exactly like a + normal dict in that it returns only the newest value for any given key. + There are special methods available to access the full list of values. + """ + + def __init__(self, *a, **k): + self.dict = dict((k, [v]) for (k, v) in dict(*a, **k).items()) + + def __len__(self): + return len(self.dict) + + def __iter__(self): + return iter(self.dict) + + def __contains__(self, key): + return key in self.dict + + def __delitem__(self, key): + del self.dict[key] + + def __getitem__(self, key): + return self.dict[key][-1] + + def __setitem__(self, key, value): + self.append(key, value) + + def keys(self): + return self.dict.keys() + + def values(self): + return (v[-1] for v in self.dict.values()) + + def items(self): + return ((k, v[-1]) for k, v in self.dict.items()) + + def allitems(self): + return ((k, v) for k, vl in self.dict.items() for v in vl) + + iterkeys = keys + itervalues = values + iteritems = items + iterallitems = allitems + + def get(self, key, default=None, index=-1, type=None): + """ Return the most recent value for a key. + + :param default: The default value to be returned if the key is not + present or the type conversion fails. + :param index: An index for the list of available values. + :param type: If defined, this callable is used to cast the value + into a specific type. Exception are suppressed and result in + the default value to be returned. + """ + try: + val = self.dict[key][index] + return type(val) if type else val + except Exception: + pass + return default + + def append(self, key, value): + """ Add a new value to the list of values for this key. """ + self.dict.setdefault(key, []).append(value) + + def replace(self, key, value): + """ Replace the list of values with a single value. """ + self.dict[key] = [value] + + def getall(self, key): + """ Return a (possibly empty) list of values for a key. """ + return self.dict.get(key) or [] + + #: Aliases for WTForms to mimic other multi-dict APIs (Django) + getone = get + getlist = getall + + +class FormsDict(MultiDict): + """ This :class:`MultiDict` subclass is used to store request form data. + Additionally to the normal dict-like item access methods, this container + also supports attribute-like access to its values. Missing attributes + default to an empty string. + + .. versionchanged:: 0.14 + All keys and values are now decoded as utf8 by default, item and + attribute access will return the same string. + """ + + def decode(self, encoding=None): + """ (deprecated) Starting with 0.13 all keys and values are already + correctly decoded. """ + copy = FormsDict() + for key, value in self.allitems(): + copy[key] = value + return copy + + def getunicode(self, name, default=None, encoding=None): + """ (deprecated) Return the value as a unicode string, or the default. """ + return self.get(name, default) + + def __getattr__(self, name, default=str()): + # Without this guard, pickle generates a cryptic TypeError: + if name.startswith('__') and name.endswith('__'): + return super(FormsDict, self).__getattr__(name) + return self.get(name, default=default) + +class HeaderDict(MultiDict): + """ A case-insensitive version of :class:`MultiDict` that defaults to + replace the old value instead of appending it. """ + + def __init__(self, *a, **ka): + self.dict = {} + if a or ka: self.update(*a, **ka) + + def __contains__(self, key): + return _hkey(key) in self.dict + + def __delitem__(self, key): + del self.dict[_hkey(key)] + + def __getitem__(self, key): + return self.dict[_hkey(key)][-1] + + def __setitem__(self, key, value): + self.dict[_hkey(key)] = [_hval(value)] + + def append(self, key, value): + self.dict.setdefault(_hkey(key), []).append(_hval(value)) + + def replace(self, key, value): + self.dict[_hkey(key)] = [_hval(value)] + + def getall(self, key): + return self.dict.get(_hkey(key)) or [] + + def get(self, key, default=None, index=-1): + return MultiDict.get(self, _hkey(key), default, index) + + def filter(self, names): + for name in (_hkey(n) for n in names): + if name in self.dict: + del self.dict[name] + + +class WSGIHeaderDict(DictMixin): + """ This dict-like class wraps a WSGI environ dict and provides convenient + access to HTTP_* fields. Header names are case-insensitive and titled by default. + """ + #: List of keys that do not have a ``HTTP_`` prefix. + cgikeys = ('CONTENT_TYPE', 'CONTENT_LENGTH') + + def __init__(self, environ): + self.environ = environ + + def _ekey(self, key): + """ Translate header field name to CGI/WSGI environ key. """ + key = key.replace('-', '_').upper() + if key in self.cgikeys: + return key + return 'HTTP_' + key + + def raw(self, key, default=None): + """ Return the header value as is (not utf8-translated). """ + return self.environ.get(self._ekey(key), default) + + def __getitem__(self, key): + return _wsgi_recode(self.environ[self._ekey(key)]) + + def __setitem__(self, key, value): + raise TypeError("%s is read-only." % self.__class__) + + def __delitem__(self, key): + raise TypeError("%s is read-only." % self.__class__) + + def __iter__(self): + for key in self.environ: + if key[:5] == 'HTTP_': + yield _hkey(key[5:]) + elif key in self.cgikeys: + yield _hkey(key) + + def keys(self): + return [x for x in self] + + def __len__(self): + return len(self.keys()) + + def __contains__(self, key): + return self._ekey(key) in self.environ + +_UNSET = object() + +class ConfigDict(dict): + """ A dict-like configuration storage with additional support for + namespaces, validators, meta-data and overlays. + + This dict-like class is heavily optimized for read access. + Read-only methods and item access should be as fast as a native dict. + """ + + __slots__ = ('_meta', '_change_listener', '_overlays', '_virtual_keys', '_source', '__weakref__') + + def __init__(self): + self._meta = {} + self._change_listener = [] + #: Weak references of overlays that need to be kept in sync. + self._overlays = [] + #: Config that is the source for this overlay. + self._source = None + #: Keys of values copied from the source (values we do not own) + self._virtual_keys = set() + + def load_module(self, name, squash=True): + """Load values from a Python module. + + Import a python module by name and add all upper-case module-level + variables to this config dict. + + :param name: Module name to import and load. + :param squash: If true (default), nested dicts are assumed to + represent namespaces and flattened (see :meth:`load_dict`). + """ + config_obj = load(name) + obj = {key: getattr(config_obj, key) + for key in dir(config_obj) if key.isupper()} + + if squash: + self.load_dict(obj) + else: + self.update(obj) + return self + + def load_config(self, filename, **options): + """ Load values from ``*.ini`` style config files using configparser. + + INI style sections (e.g. ``[section]``) are used as namespace for + all keys within that section. Both section and key names may contain + dots as namespace separators and are converted to lower-case. + + The special sections ``[bottle]`` and ``[ROOT]`` refer to the root + namespace and the ``[DEFAULT]`` section defines default values for all + other sections. + + :param filename: The path of a config file, or a list of paths. + :param options: All keyword parameters are passed to the underlying + :class:`python:configparser.ConfigParser` constructor call. + + """ + options.setdefault('allow_no_value', True) + options.setdefault('interpolation', configparser.ExtendedInterpolation()) + conf = configparser.ConfigParser(**options) + conf.read(filename) + for section in conf.sections(): + for key in conf.options(section): + value = conf.get(section, key) + if section not in ('bottle', 'ROOT'): + key = section + '.' + key + self[key.lower()] = value + return self + + def load_dict(self, source, namespace=''): + """ Load values from a dictionary structure. Nesting can be used to + represent namespaces. + + >>> c = ConfigDict() + >>> c.load_dict({'some': {'namespace': {'key': 'value'} } }) + {'some.namespace.key': 'value'} + """ + for key, value in source.items(): + if isinstance(key, str): + nskey = (namespace + '.' + key).strip('.') + if isinstance(value, dict): + self.load_dict(value, namespace=nskey) + else: + self[nskey] = value + else: + raise TypeError('Key has type %r (not a string)' % type(key)) + return self + + def update(self, *a, **ka): + """ If the first parameter is a string, all keys are prefixed with this + namespace. Apart from that it works just as the usual dict.update(). + + >>> c = ConfigDict() + >>> c.update('some.namespace', key='value') + """ + prefix = '' + if a and isinstance(a[0], str): + prefix = a[0].strip('.') + '.' + a = a[1:] + for key, value in dict(*a, **ka).items(): + self[prefix + key] = value + + def setdefault(self, key, value=None): + if key not in self: + self[key] = value + return self[key] + + def __setitem__(self, key, value): + if not isinstance(key, str): + raise TypeError('Key has type %r (not a string)' % type(key)) + + self._virtual_keys.discard(key) + + value = self.meta_get(key, 'filter', lambda x: x)(value) + if key in self and self[key] is value: + return + + self._on_change(key, value) + dict.__setitem__(self, key, value) + + for overlay in self._iter_overlays(): + overlay._set_virtual(key, value) + + def __delitem__(self, key): + if key not in self: + raise KeyError(key) + if key in self._virtual_keys: + raise KeyError("Virtual keys cannot be deleted: %s" % key) + + if self._source and key in self._source: + # Not virtual, but present in source -> Restore virtual value + dict.__delitem__(self, key) + self._set_virtual(key, self._source[key]) + else: # not virtual, not present in source. This is OUR value + self._on_change(key, None) + dict.__delitem__(self, key) + for overlay in self._iter_overlays(): + overlay._delete_virtual(key) + + def _set_virtual(self, key, value): + """ Recursively set or update virtual keys. """ + if key in self and key not in self._virtual_keys: + return # Do nothing for non-virtual keys. + + self._virtual_keys.add(key) + if key in self and self[key] is not value: + self._on_change(key, value) + dict.__setitem__(self, key, value) + for overlay in self._iter_overlays(): + overlay._set_virtual(key, value) + + def _delete_virtual(self, key): + """ Recursively delete virtual entry. """ + if key not in self._virtual_keys: + return # Do nothing for non-virtual keys. + + if key in self: + self._on_change(key, None) + dict.__delitem__(self, key) + self._virtual_keys.discard(key) + for overlay in self._iter_overlays(): + overlay._delete_virtual(key) + + def _on_change(self, key, value): + for cb in self._change_listener: + if cb(self, key, value): + return True + + def _add_change_listener(self, func): + self._change_listener.append(func) + return func + + def meta_get(self, key, metafield, default=None): + """ Return the value of a meta field for a key. """ + return self._meta.get(key, {}).get(metafield, default) + + def meta_set(self, key, metafield, value): + """ Set the meta field for a key to a new value. + + Meta-fields are shared between all members of an overlay tree. + """ + self._meta.setdefault(key, {})[metafield] = value + + def meta_list(self, key): + """ Return an iterable of meta field names defined for a key. """ + return self._meta.get(key, {}).keys() + + def _define(self, key, default=_UNSET, help=_UNSET, validate=_UNSET): + """ (Unstable) Shortcut for plugins to define own config parameters. """ + if default is not _UNSET: + self.setdefault(key, default) + if help is not _UNSET: + self.meta_set(key, 'help', help) + if validate is not _UNSET: + self.meta_set(key, 'validate', validate) + + def _iter_overlays(self): + for ref in self._overlays: + overlay = ref() + if overlay is not None: + yield overlay + + def _make_overlay(self): + """ (Unstable) Create a new overlay that acts like a chained map: Values + missing in the overlay are copied from the source map. Both maps + share the same meta entries. + + Entries that were copied from the source are called 'virtual'. You + can not delete virtual keys, but overwrite them, which turns them + into non-virtual entries. Setting keys on an overlay never affects + its source, but may affect any number of child overlays. + + Other than collections.ChainMap or most other implementations, this + approach does not resolve missing keys on demand, but instead + actively copies all values from the source to the overlay and keeps + track of virtual and non-virtual keys internally. This removes any + lookup-overhead. Read-access is as fast as a build-in dict for both + virtual and non-virtual keys. + + Changes are propagated recursively and depth-first. A failing + on-change handler in an overlay stops the propagation of virtual + values and may result in an partly updated tree. Take extra care + here and make sure that on-change handlers never fail. + + Used by Route.config + """ + # Cleanup dead references + self._overlays[:] = [ref for ref in self._overlays if ref() is not None] + + overlay = ConfigDict() + overlay._meta = self._meta + overlay._source = self + self._overlays.append(weakref.ref(overlay)) + for key in self: + overlay._set_virtual(key, self[key]) + return overlay + + + + +class AppStack(list): + """ A stack-like list. Calling it returns the head of the stack. """ + + def __call__(self): + """ Return the current default application. """ + return self.default + + def push(self, value=None): + """ Add a new :class:`Bottle` instance to the stack """ + if not isinstance(value, Bottle): + value = Bottle() + self.append(value) + return value + new_app = push + + @property + def default(self): + try: + return self[-1] + except IndexError: + return self.push() + + +class WSGIFileWrapper(object): + def __init__(self, fp, buffer_size=1024 * 64): + self.fp, self.buffer_size = fp, buffer_size + for attr in 'fileno', 'close', 'read', 'readlines', 'tell', 'seek': + if hasattr(fp, attr): setattr(self, attr, getattr(fp, attr)) + + def __iter__(self): + buff, read = self.buffer_size, self.read + part = read(buff) + while part: + yield part + part = read(buff) + + +class _closeiter(object): + """ This only exists to be able to attach a .close method to iterators that + do not support attribute assignment (most of itertools). """ + + def __init__(self, iterator, close=None): + self.iterator = iterator + self.close_callbacks = makelist(close) + + def __iter__(self): + return iter(self.iterator) + + def close(self): + for func in self.close_callbacks: + func() + + +class ResourceManager(object): + """ This class manages a list of search paths and helps to find and open + application-bound resources (files). + + :param base: default value for :meth:`add_path` calls. + :param opener: callable used to open resources. + :param cachemode: controls which lookups are cached. One of 'all', + 'found' or 'none'. + """ + + def __init__(self, base='./', opener=open, cachemode='all'): + self.opener = opener + self.base = base + self.cachemode = cachemode + + #: A list of search paths. See :meth:`add_path` for details. + self.path = [] + #: A cache for resolved paths. ``res.cache.clear()`` clears the cache. + self.cache = {} + + def add_path(self, path, base=None, index=None, create=False): + """ Add a new path to the list of search paths. Return False if the + path does not exist. + + :param path: The new search path. Relative paths are turned into + an absolute and normalized form. If the path looks like a file + (not ending in `/`), the filename is stripped off. + :param base: Path used to absolutize relative search paths. + Defaults to :attr:`base` which defaults to ``os.getcwd()``. + :param index: Position within the list of search paths. Defaults + to last index (appends to the list). + + The `base` parameter makes it easy to reference files installed + along with a python module or package:: + + res.add_path('./resources/', __file__) + """ + base = os.path.abspath(os.path.dirname(base or self.base)) + path = os.path.abspath(os.path.join(base, os.path.dirname(path))) + path += os.sep + if path in self.path: + self.path.remove(path) + if create and not os.path.isdir(path): + os.makedirs(path) + if index is None: + self.path.append(path) + else: + self.path.insert(index, path) + self.cache.clear() + return os.path.exists(path) + + def __iter__(self): + """ Iterate over all existing files in all registered paths. """ + search = self.path[:] + while search: + path = search.pop() + if not os.path.isdir(path): continue + for name in os.listdir(path): + full = os.path.join(path, name) + if os.path.isdir(full): search.append(full) + else: yield full + + def lookup(self, name): + """ Search for a resource and return an absolute file path, or `None`. + + The :attr:`path` list is searched in order. The first match is + returned. Symlinks are followed. The result is cached to speed up + future lookups. """ + if name not in self.cache or DEBUG: + for path in self.path: + fpath = os.path.join(path, name) + if os.path.isfile(fpath): + if self.cachemode in ('all', 'found'): + self.cache[name] = fpath + return fpath + if self.cachemode == 'all': + self.cache[name] = None + return self.cache[name] + + def open(self, name, mode='r', *args, **kwargs): + """ Find a resource and return a file object, or raise IOError. """ + fname = self.lookup(name) + if not fname: raise IOError("Resource %r not found." % name) + return self.opener(fname, mode=mode, *args, **kwargs) + + +class FileUpload(object): + def __init__(self, fileobj, name, filename, headers=None): + """ Wrapper for a single file uploaded via ``multipart/form-data``. """ + #: Open file(-like) object (BytesIO buffer or temporary file) + self.file = fileobj + #: Name of the upload form field + self.name = name + #: Raw filename as sent by the client (may contain unsafe characters) + self.raw_filename = filename + #: A :class:`HeaderDict` with additional headers (e.g. content-type) + self.headers = HeaderDict(headers) if headers else HeaderDict() + + content_type = HeaderProperty('Content-Type') + content_length = HeaderProperty('Content-Length', reader=int, default=-1) + + def get_header(self, name, default=None): + """ Return the value of a header within the multipart part. """ + return self.headers.get(name, default) + + @cached_property + def filename(self): + """ Name of the file on the client file system, but normalized to ensure + file system compatibility. An empty filename is returned as 'empty'. + + Only ASCII letters, digits, dashes, underscores and dots are + allowed in the final filename. Accents are removed, if possible. + Whitespace is replaced by a single dash. Leading or tailing dots + or dashes are removed. The filename is limited to 255 characters. + """ + fname = self.raw_filename + fname = normalize('NFKD', fname) + fname = fname.encode('ASCII', 'ignore').decode('ASCII') + fname = os.path.basename(fname.replace('\\', os.path.sep)) + fname = re.sub(r'[^a-zA-Z0-9-_.\s]', '', fname).strip() + fname = re.sub(r'[-\s]+', '-', fname).strip('.-') + return fname[:255] or 'empty' + + def _copy_file(self, fp, chunk_size=2 ** 16): + read, write, offset = self.file.read, fp.write, self.file.tell() + while 1: + buf = read(chunk_size) + if not buf: break + write(buf) + self.file.seek(offset) + + def save(self, destination, overwrite=False, chunk_size=2 ** 16): + """ Save file to disk or copy its content to an open file(-like) object. + If *destination* is a directory, :attr:`filename` is added to the + path. Existing files are not overwritten by default (IOError). + + :param destination: File path, directory or file(-like) object. + :param overwrite: If True, replace existing files. (default: False) + :param chunk_size: Bytes to read at a time. (default: 64kb) + """ + if isinstance(destination, str): # Except file-likes here + if os.path.isdir(destination): + destination = os.path.join(destination, self.filename) + if not overwrite and os.path.exists(destination): + raise IOError('File exists.') + with open(destination, 'wb') as fp: + self._copy_file(fp, chunk_size) + else: + self._copy_file(destination, chunk_size) + +############################################################################### +# Application Helper ########################################################### +############################################################################### + + +def abort(code=500, text='Unknown Error.'): + """ Aborts execution and causes a HTTP error. """ + raise HTTPError(code, text) + + +def redirect(url, code=None): + """ Aborts execution and causes a 303 or 302 redirect, depending on + the HTTP protocol version. """ + if not code: + code = 303 if request.get('SERVER_PROTOCOL') == "HTTP/1.1" else 302 + res = response.copy(cls=HTTPResponse) + res.status = code + res.body = "" + res.set_header('Location', urljoin(request.url, url)) + raise res + + +def _rangeiter(fp, offset, limit, bufsize=1024 * 1024): + """ Yield chunks from a range in a file. """ + fp.seek(offset) + while limit > 0: + part = fp.read(min(limit, bufsize)) + if not part: + break + limit -= len(part) + yield part + + +def static_file(filename, root, + mimetype=True, + download=False, + charset='UTF-8', + etag=None, + headers=None): + """ Open a file in a safe way and return an instance of :exc:`HTTPResponse` + that can be sent back to the client. + + :param filename: Name or path of the file to send, relative to ``root``. + :param root: Root path for file lookups. Should be an absolute directory + path. + :param mimetype: Provide the content-type header (default: guess from + file extension) + :param download: If True, ask the browser to open a `Save as...` dialog + instead of opening the file with the associated program. You can + specify a custom filename as a string. If not specified, the + original filename is used (default: False). + :param charset: The charset for files with a ``text/*`` mime-type. + (default: UTF-8) + :param etag: Provide a pre-computed ETag header. If set to ``False``, + ETag handling is disabled. (default: auto-generate ETag header) + :param headers: Additional headers dict to add to the response. + + While checking user input is always a good idea, this function provides + additional protection against malicious ``filename`` parameters from + breaking out of the ``root`` directory and leaking sensitive information + to an attacker. + + Read-protected files or files outside of the ``root`` directory are + answered with ``403 Access Denied``. Missing files result in a + ``404 Not Found`` response. Conditional requests (``If-Modified-Since``, + ``If-None-Match``) are answered with ``304 Not Modified`` whenever + possible. ``HEAD`` and ``Range`` requests (used by download managers to + check or continue partial downloads) are also handled automatically. + """ + + root = os.path.join(os.path.abspath(root), '') + filename = os.path.abspath(os.path.join(root, filename.strip('/\\'))) + headers = headers.copy() if headers else {} + getenv = request.environ.get + + if not filename.startswith(root): + return HTTPError(403, "Access denied.") + if not os.path.exists(filename) or not os.path.isfile(filename): + return HTTPError(404, "File does not exist.") + if not os.access(filename, os.R_OK): + return HTTPError(403, "You do not have permission to access this file.") + + if mimetype is True: + name = download if isinstance(download, str) else filename + mimetype, encoding = mimetypes.guess_type(name) + if encoding == 'gzip': + mimetype = 'application/gzip' + elif encoding: # e.g. bzip2 -> application/x-bzip2 + mimetype = 'application/x-' + encoding + + if charset and mimetype and 'charset=' not in mimetype \ + and (mimetype[:5] == 'text/' or mimetype == 'application/javascript'): + mimetype += '; charset=%s' % charset + + if mimetype: + headers['Content-Type'] = mimetype + + if download is True: + download = os.path.basename(filename) + + if download: + download = download.replace('"','') + headers['Content-Disposition'] = 'attachment; filename="%s"' % download + + stats = os.stat(filename) + headers['Content-Length'] = clen = stats.st_size + headers['Last-Modified'] = email.utils.formatdate(stats.st_mtime, usegmt=True) + headers['Date'] = email.utils.formatdate(time.time(), usegmt=True) + + if etag is None: + etag = '%d:%d:%d:%d:%s' % (stats.st_dev, stats.st_ino, stats.st_mtime, + clen, filename) + etag = hashlib.sha1(tob(etag)).hexdigest() + + if etag: + headers['ETag'] = etag + check = getenv('HTTP_IF_NONE_MATCH') + if check and check == etag: + return HTTPResponse(status=304, **headers) + + ims = getenv('HTTP_IF_MODIFIED_SINCE') + if ims: + ims = parse_date(ims.split(";")[0].strip()) + if ims is not None and ims >= int(stats.st_mtime): + return HTTPResponse(status=304, **headers) + + body = '' if request.method == 'HEAD' else open(filename, 'rb') + + headers["Accept-Ranges"] = "bytes" + range_header = getenv('HTTP_RANGE') + if range_header: + ranges = list(parse_range_header(range_header, clen)) + if not ranges: + return HTTPError(416, "Requested Range Not Satisfiable") + offset, end = ranges[0] + rlen = end - offset + headers["Content-Range"] = "bytes %d-%d/%d" % (offset, end - 1, clen) + headers["Content-Length"] = str(rlen) + if body: body = _closeiter(_rangeiter(body, offset, rlen), body.close) + return HTTPResponse(body, status=206, **headers) + return HTTPResponse(body, **headers) + +############################################################################### +# HTTP Utilities and MISC (TODO) ############################################### +############################################################################### + + +def debug(mode=True): + """ Change the debug level. + There is only one debug level supported at the moment.""" + global DEBUG + if mode: warnings.simplefilter('default') + DEBUG = bool(mode) + + +def http_date(value): + if isinstance(value, str): + return value + if isinstance(value, datetime): + # aware datetime.datetime is converted to UTC time + # naive datetime.datetime is treated as UTC time + value = value.utctimetuple() + elif isinstance(value, datedate): + # datetime.date is naive, and is treated as UTC time + value = value.timetuple() + if not isinstance(value, (int, float)): + # convert struct_time in UTC to UNIX timestamp + value = calendar.timegm(value) + return email.utils.formatdate(value, usegmt=True) + + +def parse_date(ims): + """ Parse rfc1123, rfc850 and asctime timestamps and return UTC epoch. """ + try: + ts = email.utils.parsedate_tz(ims) + return calendar.timegm(ts[:8] + (0, )) - (ts[9] or 0) + except (TypeError, ValueError, IndexError, OverflowError): + return None + + +def parse_auth(header): + """ Parse rfc2617 HTTP authentication header string (basic) and return (user,pass) tuple or None""" + try: + method, data = header.split(None, 1) + if method.lower() == 'basic': + user, pwd = touni(base64.b64decode(tob(data))).split(':', 1) + return user, pwd + except (KeyError, ValueError): + return None + + +def parse_range_header(header, maxlen=0): + """ Yield (start, end) ranges parsed from a HTTP Range header. Skip + unsatisfiable ranges. The end index is non-inclusive.""" + if not header or header[:6] != 'bytes=': return + ranges = [r.split('-', 1) for r in header[6:].split(',') if '-' in r] + for start, end in ranges: + try: + if not start: # bytes=-100 -> last 100 bytes + start, end = max(0, maxlen - int(end)), maxlen + elif not end: # bytes=100- -> all but the first 99 bytes + start, end = int(start), maxlen + else: # bytes=100-200 -> bytes 100-200 (inclusive) + start, end = int(start), min(int(end) + 1, maxlen) + if 0 <= start < end <= maxlen: + yield start, end + except ValueError: + pass + + +#: Header tokenizer used by _parse_http_header() +_hsplit = re.compile('(?:(?:"((?:[^"\\\\]|\\\\.)*)")|([^;,=]+))([;,=]?)').findall + +def _parse_http_header(h): + """ Parses a typical multi-valued and parametrised HTTP header (e.g. Accept headers) and returns a list of values + and parameters. For non-standard or broken input, this implementation may return partial results. + :param h: A header string (e.g. ``text/html,text/plain;q=0.9,*/*;q=0.8``) + :return: List of (value, params) tuples. The second element is a (possibly empty) dict. + """ + values = [] + if '"' not in h: # INFO: Fast path without regexp (~2x faster) + for value in h.split(','): + parts = value.split(';') + values.append((parts[0].strip(), {})) + for attr in parts[1:]: + name, value = attr.split('=', 1) + values[-1][1][name.strip().lower()] = value.strip() + else: + lop, key, attrs = ',', None, {} + for quoted, plain, tok in _hsplit(h): + value = plain.strip() if plain else quoted.replace('\\"', '"') + if lop == ',': + attrs = {} + values.append((value, attrs)) + elif lop == ';': + if tok == '=': + key = value + else: + attrs[value.strip().lower()] = '' + elif lop == '=' and key: + attrs[key.strip().lower()] = value + key = None + lop = tok + return values + + +def _parse_qsl(qs, encoding="utf8"): + r = [] + for pair in qs.split('&'): + if not pair: continue + nv = pair.split('=', 1) + if len(nv) != 2: nv.append('') + key = urlunquote(nv[0].replace('+', ' '), encoding) + value = urlunquote(nv[1].replace('+', ' '), encoding) + r.append((key, value)) + return r + + +def _lscmp(a, b): + """ Compares two strings in a cryptographically safe way: + Runtime is not affected by length of common prefix. """ + return not sum(0 if x == y else 1 + for x, y in zip(a, b)) and len(a) == len(b) + + +def cookie_encode(data, key, digestmod=None): + """ Encode and sign a pickle-able object. Return a (byte) string """ + depr(0, 13, "cookie_encode() will be removed soon.", + "Do not use this API directly.") + digestmod = digestmod or hashlib.sha256 + msg = base64.b64encode(pickle.dumps(data, -1)) + sig = base64.b64encode(hmac.new(tob(key), msg, digestmod=digestmod).digest()) + return b'!' + sig + b'?' + msg + + +def cookie_decode(data, key, digestmod=None): + """ Verify and decode an encoded string. Return an object or None.""" + depr(0, 13, "cookie_decode() will be removed soon.", + "Do not use this API directly.") + data = tob(data) + if cookie_is_encoded(data): + sig, msg = data.split(b'?', 1) + digestmod = digestmod or hashlib.sha256 + hashed = hmac.new(tob(key), msg, digestmod=digestmod).digest() + if _lscmp(sig[1:], base64.b64encode(hashed)): + return pickle.loads(base64.b64decode(msg)) + return None + + +def cookie_is_encoded(data): + """ Return True if the argument looks like a encoded cookie.""" + depr(0, 13, "cookie_is_encoded() will be removed soon.", + "Do not use this API directly.") + return bool(data.startswith(b'!') and b'?' in data) + + +def html_escape(string): + """ Escape HTML special characters ``&<>`` and quotes ``'"``. """ + return string.replace('&', '&').replace('<', '<').replace('>', '>')\ + .replace('"', '"').replace("'", ''') + + +def html_quote(string): + """ Escape and quote a string to be used as an HTTP attribute.""" + return '"%s"' % html_escape(string).replace('\n', ' ')\ + .replace('\r', ' ').replace('\t', ' ') + + +def yieldroutes(func): + """ Return a generator for routes that match the signature (name, args) + of the func parameter. This may yield more than one route if the function + takes optional keyword arguments. The output is best described by example:: + + a() -> '/a' + b(x, y) -> '/b//' + c(x, y=5) -> '/c/' and '/c//' + d(x=5, y=6) -> '/d' and '/d/' and '/d//' + """ + path = '/' + func.__name__.replace('__', '/').lstrip('/') + sig = inspect.signature(func, follow_wrapped=False) + for p in sig.parameters.values(): + if p.kind == p.POSITIONAL_ONLY: + raise ValueError("Invalid signature for yieldroutes: %s" % sig) + if p.kind in (p.POSITIONAL_OR_KEYWORD, p.KEYWORD_ONLY): + if p.default != p.empty: + yield path # Yield path without this (optional) parameter. + path += "/<%s>" % p.name + yield path + + +def path_shift(script_name, path_info, shift=1): + """ Shift path fragments from PATH_INFO to SCRIPT_NAME and vice versa. + + :return: The modified paths. + :param script_name: The SCRIPT_NAME path. + :param script_name: The PATH_INFO path. + :param shift: The number of path fragments to shift. May be negative to + change the shift direction. (default: 1) + """ + if shift == 0: return script_name, path_info + pathlist = path_info.strip('/').split('/') + scriptlist = script_name.strip('/').split('/') + if pathlist and pathlist[0] == '': pathlist = [] + if scriptlist and scriptlist[0] == '': scriptlist = [] + if 0 < shift <= len(pathlist): + moved = pathlist[:shift] + scriptlist = scriptlist + moved + pathlist = pathlist[shift:] + elif 0 > shift >= -len(scriptlist): + moved = scriptlist[shift:] + pathlist = moved + pathlist + scriptlist = scriptlist[:shift] + else: + empty = 'SCRIPT_NAME' if shift < 0 else 'PATH_INFO' + raise AssertionError("Cannot shift. Nothing left from %s" % empty) + new_script_name = '/' + '/'.join(scriptlist) + new_path_info = '/' + '/'.join(pathlist) + if path_info.endswith('/') and pathlist: new_path_info += '/' + return new_script_name, new_path_info + + +def auth_basic(check, realm="private", text="Access denied"): + """ Callback decorator to require HTTP auth (basic). + TODO: Add route(check_auth=...) parameter. """ + + def decorator(func): + + @functools.wraps(func) + def wrapper(*a, **ka): + user, password = request.auth or (None, None) + if user is None or not check(user, password): + err = HTTPError(401, text) + err.add_header('WWW-Authenticate', 'Basic realm="%s"' % realm) + return err + return func(*a, **ka) + + return wrapper + + return decorator + +# Shortcuts for common Bottle methods. +# They all refer to the current default application. + + +def make_default_app_wrapper(name): + """ Return a callable that relays calls to the current default app. """ + + @functools.wraps(getattr(Bottle, name)) + def wrapper(*a, **ka): + return getattr(app(), name)(*a, **ka) + + return wrapper + + +route = make_default_app_wrapper('route') +get = make_default_app_wrapper('get') +post = make_default_app_wrapper('post') +put = make_default_app_wrapper('put') +delete = make_default_app_wrapper('delete') +patch = make_default_app_wrapper('patch') +error = make_default_app_wrapper('error') +mount = make_default_app_wrapper('mount') +hook = make_default_app_wrapper('hook') +install = make_default_app_wrapper('install') +uninstall = make_default_app_wrapper('uninstall') +url = make_default_app_wrapper('get_url') + + +############################################################################### +# Multipart Handling ########################################################### +############################################################################### +# cgi.FieldStorage was deprecated in Python 3.11 and removed in 3.13 +# This implementation is based on https://github.com/defnull/multipart/ + + +class MultipartError(HTTPError): + def __init__(self, msg): + HTTPError.__init__(self, 400, "MultipartError: " + msg) + + +class _MultipartParser(object): + def __init__( + self, + stream, + boundary, + content_length=-1, + disk_limit=2 ** 30, + mem_limit=2 ** 20, + memfile_limit=2 ** 18, + buffer_size=2 ** 16, + charset="latin1", + ): + self.stream = stream + self.boundary = boundary + self.content_length = content_length + self.disk_limit = disk_limit + self.memfile_limit = memfile_limit + self.mem_limit = min(mem_limit, self.disk_limit) + self.buffer_size = min(buffer_size, self.mem_limit) + self.charset = charset + + if not boundary: + raise MultipartError("No boundary.") + + if self.buffer_size - 6 < len(boundary): # "--boundary--\r\n" + raise MultipartError("Boundary does not fit into buffer_size.") + + def _lineiter(self): + """ Iterate over a binary file-like object (crlf terminated) line by + line. Each line is returned as a (line, crlf) tuple. Lines larger + than buffer_size are split into chunks where all but the last chunk + has an empty string instead of crlf. Maximum chunk size is twice the + buffer size. + """ + + read = self.stream.read + maxread, maxbuf = self.content_length, self.buffer_size + partial = b"" # Contains the last (partial) line + + while True: + chunk = read(maxbuf if maxread < 0 else min(maxbuf, maxread)) + maxread -= len(chunk) + if not chunk: + if partial: + yield partial, b'' + break + + if partial: + chunk = partial + chunk + + scanpos = 0 + while True: + i = chunk.find(b'\r\n', scanpos) + if i >= 0: + yield chunk[scanpos:i], b'\r\n' + scanpos = i + 2 + else: # CRLF not found + partial = chunk[scanpos:] if scanpos else chunk + break + + if len(partial) > maxbuf: + yield partial[:-1], b"" + partial = partial[-1:] + + def parse(self): + """ Return a MultiPart iterator. Can only be called once. """ + + lines, line = self._lineiter(), "" + separator = b"--" + tob(self.boundary) + terminator = separator + b"--" + mem_used, disk_used = 0, 0 # Track used resources to prevent DoS + is_tail = False # True if the last line was incomplete (cutted) + + # Consume first boundary. Ignore any preamble, as required by RFC + # 2046, section 5.1.1. + for line, nl in lines: + if line in (separator, terminator): + break + else: + raise MultipartError("Stream does not contain boundary") + + # First line is termainating boundary -> empty multipart stream + if line == terminator: + for _ in lines: + raise MultipartError("Found data after empty multipart stream") + return + + part_options = { + "buffer_size": self.buffer_size, + "memfile_limit": self.memfile_limit, + "charset": self.charset, + } + part = _MultipartPart(**part_options) + + for line, nl in lines: + if not is_tail and (line == separator or line == terminator): + part.finish() + if part.is_buffered(): + mem_used += part.size + else: + disk_used += part.size + yield part + if line == terminator: + break + part = _MultipartPart(**part_options) + else: + is_tail = not nl # The next line continues this one + try: + part.feed(line, nl) + if part.is_buffered(): + if part.size + mem_used > self.mem_limit: + raise MultipartError("Memory limit reached.") + elif part.size + disk_used > self.disk_limit: + raise MultipartError("Disk limit reached.") + except MultipartError: + part.close() + raise + else: + part.close() + + if line != terminator: + raise MultipartError("Unexpected end of multipart stream.") + + +class _MultipartPart(object): + def __init__(self, buffer_size=2 ** 16, memfile_limit=2 ** 18, charset="latin1"): + self.headerlist = [] + self.headers = None + self.file = False + self.size = 0 + self._buf = b"" + self.disposition = None + self.name = None + self.filename = None + self.content_type = None + self.charset = charset + self.memfile_limit = memfile_limit + self.buffer_size = buffer_size + + def feed(self, line, nl=""): + if self.file: + return self.write_body(line, nl) + return self.write_header(line, nl) + + def write_header(self, line, nl): + line = str(line, self.charset) + + if not nl: + raise MultipartError("Unexpected end of line in header.") + + if not line.strip(): # blank line -> end of header segment + self.finish_header() + elif line[0] in " \t" and self.headerlist: + name, value = self.headerlist.pop() + self.headerlist.append((name, value + line.strip())) + else: + if ":" not in line: + raise MultipartError("Syntax error in header: No colon.") + + name, value = line.split(":", 1) + self.headerlist.append((name.strip(), value.strip())) + + def write_body(self, line, nl): + if not line and not nl: + return # This does not even flush the buffer + + self.size += len(line) + len(self._buf) + self.file.write(self._buf + line) + self._buf = nl + + if self.content_length > 0 and self.size > self.content_length: + raise MultipartError("Size of body exceeds Content-Length header.") + + if self.size > self.memfile_limit and isinstance(self.file, BytesIO): + self.file, old = NamedTemporaryFile(mode="w+b"), self.file + old.seek(0) + + copied, maxcopy, chunksize = 0, self.size, self.buffer_size + read, write = old.read, self.file.write + while copied < maxcopy: + chunk = read(min(chunksize, maxcopy - copied)) + write(chunk) + copied += len(chunk) + + def finish_header(self): + self.file = BytesIO() + self.headers = HeaderDict(self.headerlist) + content_disposition = self.headers.get("Content-Disposition") + content_type = self.headers.get("Content-Type") + + if not content_disposition: + raise MultipartError("Content-Disposition header is missing.") + + self.disposition, self.options = _parse_http_header(content_disposition)[0] + self.name = self.options.get("name") + if "filename" in self.options: + self.filename = self.options.get("filename") + if self.filename[1:3] == ":\\" or self.filename[:2] == "\\\\": + self.filename = self.filename.split("\\")[-1] # ie6 bug + + self.content_type, options = _parse_http_header(content_type)[0] if content_type else (None, {}) + self.charset = options.get("charset") or self.charset + + self.content_length = int(self.headers.get("Content-Length", "-1")) + + def finish(self): + if not self.file: + raise MultipartError("Incomplete part: Header section not closed.") + self.file.seek(0) + + def is_buffered(self): + """ Return true if the data is fully buffered in memory.""" + return isinstance(self.file, BytesIO) + + @property + def value(self): + """ Data decoded with the specified charset """ + return str(self.raw, self.charset) + + @property + def raw(self): + """ Data without decoding """ + pos = self.file.tell() + self.file.seek(0) + + try: + return self.file.read() + finally: + self.file.seek(pos) + + def close(self): + if self.file: + self.file.close() + self.file = False + +############################################################################### +# Server Adapter ############################################################### +############################################################################### + +# Before you edit or add a server adapter, please read: +# - https://github.com/bottlepy/bottle/pull/647#issuecomment-60152870 +# - https://github.com/bottlepy/bottle/pull/865#issuecomment-242795341 + +class ServerAdapter(object): + quiet = False + + def __init__(self, host='127.0.0.1', port=8080, **options): + self.options = options + self.host = host + self.port = int(port) + + def run(self, handler): # pragma: no cover + pass + + @property + def _listen_url(self): + if self.host.startswith("unix:"): + return self.host + elif ':' in self.host: + return "http://[%s]:%d/" % (self.host, self.port) + else: + return "http://%s:%d/" % (self.host, self.port) + + def __repr__(self): + args = ', '.join('%s=%r' % kv for kv in self.options.items()) + return "%s(%s)" % (self.__class__.__name__, args) + + +class CGIServer(ServerAdapter): + quiet = True + + def run(self, handler): # pragma: no cover + from wsgiref.handlers import CGIHandler + + def fixed_environ(environ, start_response): + environ.setdefault('PATH_INFO', '') + return handler(environ, start_response) + + CGIHandler().run(fixed_environ) + + +class FlupFCGIServer(ServerAdapter): + def run(self, handler): # pragma: no cover + import flup.server.fcgi + self.options.setdefault('bindAddress', (self.host, self.port)) + flup.server.fcgi.WSGIServer(handler, **self.options).run() + + +class WSGIRefServer(ServerAdapter): + def run(self, app): # pragma: no cover + from wsgiref.simple_server import make_server + from wsgiref.simple_server import WSGIRequestHandler, WSGIServer + import socket + + class FixedHandler(WSGIRequestHandler): + def log_message(other, format, *args): + if not self.quiet: + return WSGIRequestHandler.log_message(other, format, *args) + + handler_cls = self.options.get('handler_class', FixedHandler) + server_cls = self.options.get('server_class', WSGIServer) + + if ':' in self.host: # Fix wsgiref for IPv6 addresses. + if getattr(server_cls, 'address_family') == socket.AF_INET: + + class server_cls(server_cls): + address_family = socket.AF_INET6 + + self.srv = make_server(self.host, self.port, app, server_cls, + handler_cls) + self.port = self.srv.server_port # update port actual port (0 means random) + try: + self.srv.serve_forever() + except KeyboardInterrupt: + self.srv.server_close() # Prevent ResourceWarning: unclosed socket + raise + + +class CherryPyServer(ServerAdapter): + def run(self, handler): # pragma: no cover + depr(0, 13, "The wsgi server part of cherrypy was split into a new " + "project called 'cheroot'.", "Use the 'cheroot' server " + "adapter instead of cherrypy.") + from cherrypy import wsgiserver # This will fail for CherryPy >= 9 + + self.options['bind_addr'] = (self.host, self.port) + self.options['wsgi_app'] = handler + + certfile = self.options.get('certfile') + if certfile: + del self.options['certfile'] + keyfile = self.options.get('keyfile') + if keyfile: + del self.options['keyfile'] + + server = wsgiserver.CherryPyWSGIServer(**self.options) + if certfile: + server.ssl_certificate = certfile + if keyfile: + server.ssl_private_key = keyfile + + try: + server.start() + finally: + server.stop() + + +class CherootServer(ServerAdapter): + def run(self, handler): # pragma: no cover + from cheroot import wsgi + from cheroot.ssl import builtin + self.options['bind_addr'] = (self.host, self.port) + self.options['wsgi_app'] = handler + certfile = self.options.pop('certfile', None) + keyfile = self.options.pop('keyfile', None) + chainfile = self.options.pop('chainfile', None) + server = wsgi.Server(**self.options) + if certfile and keyfile: + server.ssl_adapter = builtin.BuiltinSSLAdapter( + certfile, keyfile, chainfile) + try: + server.start() + finally: + server.stop() + + +class WaitressServer(ServerAdapter): + def run(self, handler): + from waitress import serve + serve(handler, host=self.host, port=self.port, _quiet=self.quiet, **self.options) + + +class PasteServer(ServerAdapter): + def run(self, handler): # pragma: no cover + from paste import httpserver + from paste.translogger import TransLogger + handler = TransLogger(handler, setup_console_handler=(not self.quiet)) + httpserver.serve(handler, + host=self.host, + port=str(self.port), **self.options) + + +class MeinheldServer(ServerAdapter): + def run(self, handler): + from meinheld import server + server.listen((self.host, self.port)) + server.run(handler) + + +class FapwsServer(ServerAdapter): + """ Extremely fast webserver using libev. See https://github.com/william-os4y/fapws3 """ + + def run(self, handler): # pragma: no cover + depr(0, 13, "fapws3 is not maintained and support will be dropped.") + import fapws._evwsgi as evwsgi + from fapws import base, config + port = self.port + if float(config.SERVER_IDENT[-2:]) > 0.4: + # fapws3 silently changed its API in 0.5 + port = str(port) + evwsgi.start(self.host, port) + # fapws3 never releases the GIL. Complain upstream. I tried. No luck. + if 'BOTTLE_CHILD' in os.environ and not self.quiet: + _stderr("WARNING: Auto-reloading does not work with Fapws3.") + _stderr(" (Fapws3 breaks python thread support)") + evwsgi.set_base_module(base) + + def app(environ, start_response): + environ['wsgi.multiprocess'] = False + return handler(environ, start_response) + + evwsgi.wsgi_cb(('', app)) + evwsgi.run() + + +class TornadoServer(ServerAdapter): + """ The super hyped asynchronous server by facebook. Untested. """ + + def run(self, handler): # pragma: no cover + import tornado.wsgi, tornado.httpserver, tornado.ioloop + container = tornado.wsgi.WSGIContainer(handler) + server = tornado.httpserver.HTTPServer(container) + server.listen(port=self.port, address=self.host) + tornado.ioloop.IOLoop.instance().start() + + +class AppEngineServer(ServerAdapter): + """ Adapter for Google App Engine. """ + quiet = True + + def run(self, handler): + depr(0, 13, "AppEngineServer no longer required", + "Configure your application directly in your app.yaml") + from google.appengine.ext.webapp import util + # A main() function in the handler script enables 'App Caching'. + # Lets makes sure it is there. This _really_ improves performance. + module = sys.modules.get('__main__') + if module and not hasattr(module, 'main'): + module.main = lambda: util.run_wsgi_app(handler) + util.run_wsgi_app(handler) + + +class TwistedServer(ServerAdapter): + """ Untested. """ + + def run(self, handler): + from twisted.web import server, wsgi + from twisted.python.threadpool import ThreadPool + from twisted.internet import reactor + thread_pool = ThreadPool() + thread_pool.start() + reactor.addSystemEventTrigger('after', 'shutdown', thread_pool.stop) + factory = server.Site(wsgi.WSGIResource(reactor, thread_pool, handler)) + reactor.listenTCP(self.port, factory, interface=self.host) + if not reactor.running: + reactor.run() + + +class DieselServer(ServerAdapter): + """ Untested. """ + + def run(self, handler): + depr(0, 13, "Diesel is not tested or supported and will be removed.") + from diesel.protocols.wsgi import WSGIApplication + app = WSGIApplication(handler, port=self.port) + app.run() + + +class GeventServer(ServerAdapter): + """ Untested. Options: + + * See gevent.wsgi.WSGIServer() documentation for more options. + """ + + def run(self, handler): + from gevent import pywsgi, local + if not isinstance(threading.local(), local.local): + msg = "Bottle requires gevent.monkey.patch_all() (before import)" + raise RuntimeError(msg) + if self.quiet: + self.options['log'] = None + address = (self.host, self.port) + server = pywsgi.WSGIServer(address, handler, **self.options) + if 'BOTTLE_CHILD' in os.environ: + import signal + signal.signal(signal.SIGINT, lambda s, f: server.stop()) + server.serve_forever() + + +class GunicornServer(ServerAdapter): + """ Untested. See http://gunicorn.org/configure.html for options. """ + + def run(self, handler): + from gunicorn.app.base import BaseApplication + + if self.host.startswith("unix:"): + config = {'bind': self.host} + else: + config = {'bind': "%s:%d" % (self.host, self.port)} + + config.update(self.options) + + class GunicornApplication(BaseApplication): + def load_config(self): + for key, value in config.items(): + self.cfg.set(key, value) + + def load(self): + return handler + + GunicornApplication().run() + + +class EventletServer(ServerAdapter): + """ Untested. Options: + + * `backlog` adjust the eventlet backlog parameter which is the maximum + number of queued connections. Should be at least 1; the maximum + value is system-dependent. + * `family`: (default is 2) socket family, optional. See socket + documentation for available families. + """ + + def run(self, handler): + from eventlet import wsgi, listen, patcher + if not patcher.is_monkey_patched(os): + msg = "Bottle requires eventlet.monkey_patch() (before import)" + raise RuntimeError(msg) + socket_args = {} + for arg in ('backlog', 'family'): + try: + socket_args[arg] = self.options.pop(arg) + except KeyError: + pass + address = (self.host, self.port) + try: + wsgi.server(listen(address, **socket_args), handler, + log_output=(not self.quiet)) + except TypeError: + # Fallback, if we have old version of eventlet + wsgi.server(listen(address), handler) + + +class BjoernServer(ServerAdapter): + """ Fast server written in C: https://github.com/jonashaag/bjoern """ + + def run(self, handler): + from bjoern import run + run(handler, self.host, self.port, reuse_port=True) + +class AsyncioServerAdapter(ServerAdapter): + """ Extend ServerAdapter for adding custom event loop """ + def get_event_loop(self): + pass + +class AiohttpServer(AsyncioServerAdapter): + """ Asynchronous HTTP client/server framework for asyncio + https://pypi.python.org/pypi/aiohttp/ + https://pypi.org/project/aiohttp-wsgi/ + """ + + def get_event_loop(self): + import asyncio + return asyncio.new_event_loop() + + def run(self, handler): + import asyncio + from aiohttp_wsgi.wsgi import serve + self.loop = self.get_event_loop() + asyncio.set_event_loop(self.loop) + + if 'BOTTLE_CHILD' in os.environ: + import signal + signal.signal(signal.SIGINT, lambda s, f: self.loop.stop()) + + serve(handler, host=self.host, port=self.port) + + +class AiohttpUVLoopServer(AiohttpServer): + """uvloop + https://github.com/MagicStack/uvloop + """ + def get_event_loop(self): + import uvloop + return uvloop.new_event_loop() + +class AutoServer(ServerAdapter): + """ Untested. """ + adapters = [WaitressServer, PasteServer, TwistedServer, CherryPyServer, + CherootServer, WSGIRefServer] + + def run(self, handler): + for sa in self.adapters: + try: + return sa(self.host, self.port, **self.options).run(handler) + except ImportError: + pass + + +server_names = { + 'cgi': CGIServer, + 'flup': FlupFCGIServer, + 'wsgiref': WSGIRefServer, + 'waitress': WaitressServer, + 'cherrypy': CherryPyServer, + 'cheroot': CherootServer, + 'paste': PasteServer, + 'fapws3': FapwsServer, + 'tornado': TornadoServer, + 'gae': AppEngineServer, + 'twisted': TwistedServer, + 'diesel': DieselServer, + 'meinheld': MeinheldServer, + 'gunicorn': GunicornServer, + 'eventlet': EventletServer, + 'gevent': GeventServer, + 'bjoern': BjoernServer, + 'aiohttp': AiohttpServer, + 'uvloop': AiohttpUVLoopServer, + 'auto': AutoServer, +} + +############################################################################### +# Application Control ########################################################## +############################################################################### + + +def load(target, **namespace): + """ Import a module or fetch an object from a module. + + * ``package.module`` returns `module` as a module object. + * ``pack.mod:name`` returns the module variable `name` from `pack.mod`. + * ``pack.mod:func()`` calls `pack.mod.func()` and returns the result. + + The last form accepts not only function calls, but any type of + expression. Keyword arguments passed to this function are available as + local variables. Example: ``import_string('re:compile(x)', x='[a-z]')`` + """ + module, target = target.split(":", 1) if ':' in target else (target, None) + if module not in sys.modules: __import__(module) + if not target: return sys.modules[module] + if target.isalnum(): return getattr(sys.modules[module], target) + package_name = module.split('.')[0] + namespace[package_name] = sys.modules[package_name] + return eval('%s.%s' % (module, target), namespace) + + +def load_app(target): + """ Load a bottle application from a module and make sure that the import + does not affect the current default application, but returns a separate + application object. See :func:`load` for the target parameter. """ + global NORUN + NORUN, nr_old = True, NORUN + tmp = default_app.push() # Create a new "default application" + try: + rv = load(target) # Import the target module + return rv if callable(rv) else tmp + finally: + default_app.remove(tmp) # Remove the temporary added default application + NORUN = nr_old + + +_debug = debug + + +def run(app=None, + server='wsgiref', + host='127.0.0.1', + port=8080, + interval=1, + reloader=False, + quiet=False, + plugins=None, + debug=None, + config=None, **kargs): + """ Start a server instance. This method blocks until the server terminates. + + :param app: WSGI application or target string supported by + :func:`load_app`. (default: :func:`default_app`) + :param server: Server adapter to use. See :data:`server_names` keys + for valid names or pass a :class:`ServerAdapter` subclass. + (default: `wsgiref`) + :param host: Server address to bind to. Pass ``0.0.0.0`` to listens on + all interfaces including the external one. (default: 127.0.0.1) + :param port: Server port to bind to. Values below 1024 require root + privileges. (default: 8080) + :param reloader: Start auto-reloading server? (default: False) + :param interval: Auto-reloader interval in seconds (default: 1) + :param quiet: Suppress output to stdout and stderr? (default: False) + :param options: Options passed to the server adapter. + """ + if NORUN: return + if reloader and not os.environ.get('BOTTLE_CHILD'): + import subprocess + fd, lockfile = tempfile.mkstemp(prefix='bottle.', suffix='.lock') + environ = os.environ.copy() + environ['BOTTLE_CHILD'] = 'true' + environ['BOTTLE_LOCKFILE'] = lockfile + args = [sys.executable] + sys.argv + # If a package was loaded with `python -m`, then `sys.argv` needs to be + # restored to the original value, or imports might break. See #1336 + if getattr(sys.modules.get('__main__'), '__package__', None): + args[1:1] = ["-m", sys.modules['__main__'].__package__] + + try: + os.close(fd) # We never write to this file + while os.path.exists(lockfile): + p = subprocess.Popen(args, env=environ) + while p.poll() is None: + os.utime(lockfile, None) # Tell child we are still alive + time.sleep(interval) + if p.returncode == 3: # Child wants to be restarted + continue + sys.exit(p.returncode) + except KeyboardInterrupt: + pass + finally: + if os.path.exists(lockfile): + os.unlink(lockfile) + return + + try: + if debug is not None: _debug(debug) + app = app or default_app() + if isinstance(app, str): + app = load_app(app) + if not callable(app): + raise ValueError("Application is not callable: %r" % app) + + for plugin in plugins or []: + if isinstance(plugin, str): + plugin = load(plugin) + app.install(plugin) + + if config: + app.config.update(config) + + if server in server_names: + server = server_names.get(server) + if isinstance(server, str): + server = load(server) + if isinstance(server, type): + server = server(host=host, port=port, **kargs) + if not isinstance(server, ServerAdapter): + raise ValueError("Unknown or unsupported server: %r" % server) + + server.quiet = server.quiet or quiet + if not server.quiet: + _stderr("Bottle v%s server starting up (using %s)..." % + (__version__, repr(server))) + _stderr("Listening on %s" % server._listen_url) + _stderr("Hit Ctrl-C to quit.\n") + + if reloader: + lockfile = os.environ.get('BOTTLE_LOCKFILE') + bgcheck = FileCheckerThread(lockfile, interval) + with bgcheck: + server.run(app) + if bgcheck.status == 'reload': + sys.exit(3) + else: + server.run(app) + except KeyboardInterrupt: + pass + except (SystemExit, MemoryError): + raise + except: + if not reloader: raise + if not getattr(server, 'quiet', quiet): + print_exc() + time.sleep(interval) + sys.exit(3) + + +class FileCheckerThread(threading.Thread): + """ Interrupt main-thread as soon as a changed module file is detected, + the lockfile gets deleted or gets too old. """ + + def __init__(self, lockfile, interval): + threading.Thread.__init__(self) + self.daemon = True + self.lockfile, self.interval = lockfile, interval + #: Is one of 'reload', 'error' or 'exit' + self.status = None + + def run(self): + exists = os.path.exists + mtime = lambda p: os.stat(p).st_mtime + files = dict() + + for module in list(sys.modules.values()): + path = getattr(module, '__file__', '') or '' + if path[-4:] in ('.pyo', '.pyc'): path = path[:-1] + if path and exists(path): files[path] = mtime(path) + + while not self.status: + if not exists(self.lockfile)\ + or mtime(self.lockfile) < time.time() - self.interval - 5: + self.status = 'error' + thread.interrupt_main() + for path, lmtime in list(files.items()): + if not exists(path) or mtime(path) > lmtime: + self.status = 'reload' + thread.interrupt_main() + break + time.sleep(self.interval) + + def __enter__(self): + self.start() + + def __exit__(self, exc_type, *_): + if not self.status: self.status = 'exit' # silent exit + self.join() + return exc_type is not None and issubclass(exc_type, KeyboardInterrupt) + +############################################################################### +# Template Adapters ############################################################ +############################################################################### + + +class TemplateError(BottleException): + pass + + +class BaseTemplate(object): + """ Base class and minimal API for template adapters """ + extensions = ['tpl', 'html', 'thtml', 'stpl'] + settings = {} # used in prepare() + defaults = {} # used in render() + + def __init__(self, + source=None, + name=None, + lookup=None, + encoding='utf8', **settings): + """ Create a new template. + If the source parameter (str or buffer) is missing, the name argument + is used to guess a template filename. Subclasses can assume that + self.source and/or self.filename are set. Both are strings. + The lookup, encoding and settings parameters are stored as instance + variables. + The lookup parameter stores a list containing directory paths. + The encoding parameter should be used to decode byte strings or files. + The settings parameter contains a dict for engine-specific settings. + """ + self.name = name + self.source = source.read() if hasattr(source, 'read') else source + self.filename = source.filename if hasattr(source, 'filename') else None + self.lookup = [os.path.abspath(x) for x in lookup] if lookup else [] + self.encoding = encoding + self.settings = self.settings.copy() # Copy from class variable + self.settings.update(settings) # Apply + if not self.source and self.name: + self.filename = self.search(self.name, self.lookup) + if not self.filename: + raise TemplateError('Template %s not found.' % repr(name)) + if not self.source and not self.filename: + raise TemplateError('No template specified.') + self.prepare(**self.settings) + + @classmethod + def search(cls, name, lookup=None): + """ Search name in all directories specified in lookup. + First without, then with common extensions. Return first hit. """ + if not lookup: + raise depr(0, 12, "Empty template lookup path.", "Configure a template lookup path.") + + if os.path.isabs(name): + raise depr(0, 12, "Use of absolute path for template name.", + "Refer to templates with names or paths relative to the lookup path.") + + for spath in lookup: + spath = os.path.abspath(spath) + os.sep + fname = os.path.abspath(os.path.join(spath, name)) + if not fname.startswith(spath): continue + if os.path.isfile(fname): return fname + for ext in cls.extensions: + if os.path.isfile('%s.%s' % (fname, ext)): + return '%s.%s' % (fname, ext) + + @classmethod + def global_config(cls, key, *args): + """ This reads or sets the global settings stored in class.settings. """ + if args: + cls.settings = cls.settings.copy() # Make settings local to class + cls.settings[key] = args[0] + else: + return cls.settings[key] + + def prepare(self, **options): + """ Run preparations (parsing, caching, ...). + It should be possible to call this again to refresh a template or to + update settings. + """ + raise NotImplementedError + + def render(self, *args, **kwargs): + """ Render the template with the specified local variables and return + a single byte or unicode string. If it is a byte string, the encoding + must match self.encoding. This method must be thread-safe! + Local variables may be provided in dictionaries (args) + or directly, as keywords (kwargs). + """ + raise NotImplementedError + + +class MakoTemplate(BaseTemplate): + def prepare(self, **options): + from mako.template import Template + from mako.lookup import TemplateLookup + options.update({'input_encoding': self.encoding}) + options.setdefault('format_exceptions', bool(DEBUG)) + lookup = TemplateLookup(directories=self.lookup, **options) + if self.source: + self.tpl = Template(self.source, lookup=lookup, **options) + else: + self.tpl = Template(uri=self.name, + filename=self.filename, + lookup=lookup, **options) + + def render(self, *args, **kwargs): + for dictarg in args: + kwargs.update(dictarg) + _defaults = self.defaults.copy() + _defaults.update(kwargs) + return self.tpl.render(**_defaults) + + +class CheetahTemplate(BaseTemplate): + def prepare(self, **options): + from Cheetah.Template import Template + self.context = threading.local() + self.context.vars = {} + options['searchList'] = [self.context.vars] + if self.source: + self.tpl = Template(source=self.source, **options) + else: + self.tpl = Template(file=self.filename, **options) + + def render(self, *args, **kwargs): + for dictarg in args: + kwargs.update(dictarg) + self.context.vars.update(self.defaults) + self.context.vars.update(kwargs) + out = str(self.tpl) + self.context.vars.clear() + return out + + +class Jinja2Template(BaseTemplate): + def prepare(self, filters=None, tests=None, globals={}, **kwargs): + from jinja2 import Environment, FunctionLoader + self.env = Environment(loader=FunctionLoader(self.loader), **kwargs) + if filters: self.env.filters.update(filters) + if tests: self.env.tests.update(tests) + if globals: self.env.globals.update(globals) + if self.source: + self.tpl = self.env.from_string(self.source) + else: + self.tpl = self.env.get_template(self.name) + + def render(self, *args, **kwargs): + for dictarg in args: + kwargs.update(dictarg) + _defaults = self.defaults.copy() + _defaults.update(kwargs) + return self.tpl.render(**_defaults) + + def loader(self, name): + if name == self.filename: + fname = name + else: + fname = self.search(name, self.lookup) + if not fname: return + with open(fname, "rb") as f: + return (f.read().decode(self.encoding), fname, lambda: False) + + +class SimpleTemplate(BaseTemplate): + def prepare(self, + escape_func=html_escape, + noescape=False, + syntax=None, **ka): + self.cache = {} + enc = self.encoding + self._str = lambda x: touni(x, enc) + self._escape = lambda x: escape_func(touni(x, enc)) + self.syntax = syntax + if noescape: + self._str, self._escape = self._escape, self._str + + @cached_property + def co(self): + return compile(self.code, self.filename or '', 'exec') + + @cached_property + def code(self): + source = self.source + if not source: + with open(self.filename, 'rb') as f: + source = f.read() + try: + source, encoding = touni(source), 'utf8' + except UnicodeError: + raise depr(0, 11, 'Unsupported template encodings.', 'Use utf-8 for templates.') + parser = StplParser(source, encoding=encoding, syntax=self.syntax) + code = parser.translate() + self.encoding = parser.encoding + return code + + def _rebase(self, _env, _name=None, **kwargs): + _env['_rebase'] = (_name, kwargs) + + def _include(self, _env, _name=None, **kwargs): + env = _env.copy() + env.update(kwargs) + if _name not in self.cache: + self.cache[_name] = self.__class__(name=_name, lookup=self.lookup, syntax=self.syntax) + return self.cache[_name].execute(env['_stdout'], env) + + def execute(self, _stdout, kwargs): + env = self.defaults.copy() + env.update(kwargs) + env.update({ + '_stdout': _stdout, + '_printlist': _stdout.extend, + 'include': functools.partial(self._include, env), + 'rebase': functools.partial(self._rebase, env), + '_rebase': None, + '_str': self._str, + '_escape': self._escape, + 'get': env.get, + 'setdefault': env.setdefault, + 'defined': env.__contains__ + }) + exec(self.co, env) + if env.get('_rebase'): + subtpl, rargs = env.pop('_rebase') + rargs['base'] = ''.join(_stdout) # copy stdout + del _stdout[:] # clear stdout + return self._include(env, subtpl, **rargs) + return env + + def render(self, *args, **kwargs): + """ Render the template using keyword arguments as local variables. """ + env = {} + stdout = [] + for dictarg in args: + env.update(dictarg) + env.update(kwargs) + self.execute(stdout, env) + return ''.join(stdout) + + +class StplSyntaxError(TemplateError): + pass + + +class StplParser(object): + """ Parser for stpl templates. """ + _re_cache = {} #: Cache for compiled re patterns + + # This huge pile of voodoo magic splits python code into 8 different tokens. + # We use the verbose (?x) regex mode to make this more manageable + + _re_tok = r'''( + [urbURB]* + (?: ''(?!') + |""(?!") + |'{6} + |"{6} + |'(?:[^\\']|\\.)+?' + |"(?:[^\\"]|\\.)+?" + |'{3}(?:[^\\]|\\.|\n)+?'{3} + |"{3}(?:[^\\]|\\.|\n)+?"{3} + ) + )''' + + _re_inl = _re_tok.replace(r'|\n', '') # We re-use this string pattern later + + _re_tok += r''' + # 2: Comments (until end of line, but not the newline itself) + |(\#.*) + + # 3: Open and close (4) grouping tokens + |([\[\{\(]) + |([\]\}\)]) + + # 5,6: Keywords that start or continue a python block (only start of line) + |^([\ \t]*(?:if|for|while|with|try|def|class)\b) + |^([\ \t]*(?:elif|else|except|finally)\b) + + # 7: Our special 'end' keyword (but only if it stands alone) + |((?:^|;)[\ \t]*end[\ \t]*(?=(?:%(block_close)s[\ \t]*)?\r?$|;|\#)) + + # 8: A customizable end-of-code-block template token (only end of line) + |(%(block_close)s[\ \t]*(?=\r?$)) + + # 9: And finally, a single newline. The 10th token is 'everything else' + |(\r?\n) + ''' + + # Match the start tokens of code areas in a template + _re_split = r'''(?m)^[ \t]*(\\?)((%(line_start)s)|(%(block_start)s))''' + # Match inline statements (may contain python strings) + _re_inl = r'''%%(inline_start)s((?:%s|[^'"\n])*?)%%(inline_end)s''' % _re_inl + + # add the flag in front of the regexp to avoid Deprecation warning (see Issue #949) + # verbose and dot-matches-newline mode + _re_tok = '(?mx)' + _re_tok + _re_inl = '(?mx)' + _re_inl + + + default_syntax = '<% %> % {{ }}' + + def __init__(self, source, syntax=None, encoding='utf8'): + self.source, self.encoding = touni(source, encoding), encoding + self.set_syntax(syntax or self.default_syntax) + self.code_buffer, self.text_buffer = [], [] + self.lineno, self.offset = 1, 0 + self.indent, self.indent_mod = 0, 0 + self.paren_depth = 0 + + def get_syntax(self): + """ Tokens as a space separated string (default: <% %> % {{ }}) """ + return self._syntax + + def set_syntax(self, syntax): + self._syntax = syntax + self._tokens = syntax.split() + if syntax not in self._re_cache: + names = 'block_start block_close line_start inline_start inline_end' + etokens = map(re.escape, self._tokens) + pattern_vars = dict(zip(names.split(), etokens)) + patterns = (self._re_split, self._re_tok, self._re_inl) + patterns = [re.compile(p % pattern_vars) for p in patterns] + self._re_cache[syntax] = patterns + self.re_split, self.re_tok, self.re_inl = self._re_cache[syntax] + + syntax = property(get_syntax, set_syntax) + + def translate(self): + if self.offset: raise RuntimeError('Parser is a one time instance.') + while True: + m = self.re_split.search(self.source, pos=self.offset) + if m: + text = self.source[self.offset:m.start()] + self.text_buffer.append(text) + self.offset = m.end() + if m.group(1): # Escape syntax + line, sep, _ = self.source[self.offset:].partition('\n') + self.text_buffer.append(self.source[m.start():m.start(1)] + + m.group(2) + line + sep) + self.offset += len(line + sep) + continue + self.flush_text() + self.offset += self.read_code(self.source[self.offset:], + multiline=bool(m.group(4))) + else: + break + self.text_buffer.append(self.source[self.offset:]) + self.flush_text() + return ''.join(self.code_buffer) + + def read_code(self, pysource, multiline): + code_line, comment = '', '' + offset = 0 + while True: + m = self.re_tok.search(pysource, pos=offset) + if not m: + code_line += pysource[offset:] + offset = len(pysource) + self.write_code(code_line.strip(), comment) + break + code_line += pysource[offset:m.start()] + offset = m.end() + _str, _com, _po, _pc, _blk1, _blk2, _end, _cend, _nl = m.groups() + if self.paren_depth > 0 and (_blk1 or _blk2): # a if b else c + code_line += _blk1 or _blk2 + continue + if _str: # Python string + code_line += _str + elif _com: # Python comment (up to EOL) + comment = _com + if multiline and _com.strip().endswith(self._tokens[1]): + multiline = False # Allow end-of-block in comments + elif _po: # open parenthesis + self.paren_depth += 1 + code_line += _po + elif _pc: # close parenthesis + if self.paren_depth > 0: + # we could check for matching parentheses here, but it's + # easier to leave that to python - just check counts + self.paren_depth -= 1 + code_line += _pc + elif _blk1: # Start-block keyword (if/for/while/def/try/...) + code_line = _blk1 + self.indent += 1 + self.indent_mod -= 1 + elif _blk2: # Continue-block keyword (else/elif/except/...) + code_line = _blk2 + self.indent_mod -= 1 + elif _cend: # The end-code-block template token (usually '%>') + if multiline: multiline = False + else: code_line += _cend + elif _end: + self.indent -= 1 + self.indent_mod += 1 + else: # \n + self.write_code(code_line.strip(), comment) + self.lineno += 1 + code_line, comment, self.indent_mod = '', '', 0 + if not multiline: + break + + return offset + + def flush_text(self): + text = ''.join(self.text_buffer) + del self.text_buffer[:] + if not text: return + parts, pos, nl = [], 0, '\\\n' + ' ' * self.indent + for m in self.re_inl.finditer(text): + prefix, pos = text[pos:m.start()], m.end() + if prefix: + parts.append(nl.join(map(repr, prefix.splitlines(True)))) + if prefix.endswith('\n'): parts[-1] += nl + parts.append(self.process_inline(m.group(1).strip())) + if pos < len(text): + prefix = text[pos:] + lines = prefix.splitlines(True) + if lines[-1].endswith('\\\\\n'): lines[-1] = lines[-1][:-3] + elif lines[-1].endswith('\\\\\r\n'): lines[-1] = lines[-1][:-4] + parts.append(nl.join(map(repr, lines))) + code = '_printlist((%s,))' % ', '.join(parts) + self.lineno += code.count('\n') + 1 + self.write_code(code) + + @staticmethod + def process_inline(chunk): + if chunk[0] == '!': return '_str(%s)' % chunk[1:] + return '_escape(%s)' % chunk + + def write_code(self, line, comment=''): + code = ' ' * (self.indent + self.indent_mod) + code += line.lstrip() + comment + '\n' + self.code_buffer.append(code) + + +def template(*args, **kwargs): + """ + Get a rendered template as a string iterator. + You can use a name, a filename or a template string as first parameter. + Template rendering arguments can be passed as dictionaries + or directly (as keyword arguments). + """ + tpl = args[0] if args else None + for dictarg in args[1:]: + kwargs.update(dictarg) + adapter = kwargs.pop('template_adapter', SimpleTemplate) + lookup = kwargs.pop('template_lookup', TEMPLATE_PATH) + tplid = (id(lookup), tpl) + if tplid not in TEMPLATES or DEBUG: + settings = kwargs.pop('template_settings', {}) + if isinstance(tpl, adapter): + TEMPLATES[tplid] = tpl + if settings: TEMPLATES[tplid].prepare(**settings) + elif "\n" in tpl or "{" in tpl or "%" in tpl or '$' in tpl: + TEMPLATES[tplid] = adapter(source=tpl, lookup=lookup, **settings) + else: + TEMPLATES[tplid] = adapter(name=tpl, lookup=lookup, **settings) + if not TEMPLATES[tplid]: + abort(500, 'Template (%s) not found' % tpl) + return TEMPLATES[tplid].render(kwargs) + + +mako_template = functools.partial(template, template_adapter=MakoTemplate) +cheetah_template = functools.partial(template, + template_adapter=CheetahTemplate) +jinja2_template = functools.partial(template, template_adapter=Jinja2Template) + + +def view(tpl_name, **defaults): + """ Decorator: renders a template for a handler. + The handler can control its behavior like that: + + - return a dict of template vars to fill out the template + - return something other than a dict and the view decorator will not + process the template, but return the handler result as is. + This includes returning a HTTPResponse(dict) to get, + for instance, JSON with autojson or other castfilters. + """ + + def decorator(func): + + @functools.wraps(func) + def wrapper(*args, **kwargs): + result = func(*args, **kwargs) + if isinstance(result, (dict, DictMixin)): + tplvars = defaults.copy() + tplvars.update(result) + return template(tpl_name, **tplvars) + elif result is None: + return template(tpl_name, **defaults) + return result + + return wrapper + + return decorator + + +mako_view = functools.partial(view, template_adapter=MakoTemplate) +cheetah_view = functools.partial(view, template_adapter=CheetahTemplate) +jinja2_view = functools.partial(view, template_adapter=Jinja2Template) + +############################################################################### +# Constants and Globals ######################################################## +############################################################################### + +TEMPLATE_PATH = ['./', './views/'] +TEMPLATES = {} +DEBUG = False +NORUN = False # If set, run() does nothing. Used by load_app() + +#: A dict to map HTTP status codes (e.g. 404) to phrases (e.g. 'Not Found') +HTTP_CODES = httplib.responses.copy() +HTTP_CODES[418] = "I'm a teapot" # RFC 2324 +HTTP_CODES[428] = "Precondition Required" +HTTP_CODES[429] = "Too Many Requests" +HTTP_CODES[431] = "Request Header Fields Too Large" +HTTP_CODES[451] = "Unavailable For Legal Reasons" # RFC 7725 +HTTP_CODES[511] = "Network Authentication Required" +_HTTP_STATUS_LINES = dict((k, '%d %s' % (k, v)) + for (k, v) in HTTP_CODES.items()) + +#: The default template used for error pages. Override with @error() +ERROR_PAGE_TEMPLATE = """ +%%try: + %%from %s import DEBUG, request + + + + Error: {{e.status}} + + + +

Error: {{e.status}}

+

Sorry, the requested URL {{repr(request.url)}} + caused an error:

+
{{e.body}}
+ %%if DEBUG and e.exception: +

Exception:

+ %%try: + %%exc = repr(e.exception) + %%except: + %%exc = '' %% type(e.exception).__name__ + %%end +
{{exc}}
+ %%end + %%if DEBUG and e.traceback: +

Traceback:

+
{{e.traceback}}
+ %%end + + +%%except ImportError: + ImportError: Could not generate the error page. Please add bottle to + the import path. +%%end +""" % __name__ + +#: A thread-safe instance of :class:`LocalRequest`. If accessed from within a +#: request callback, this instance always refers to the *current* request +#: (even on a multi-threaded server). +request = LocalRequest() + +#: A thread-safe instance of :class:`LocalResponse`. It is used to change the +#: HTTP response for the *current* request. +response = LocalResponse() + +#: A thread-safe namespace. Not used by Bottle. +local = threading.local() + +# Initialize app stack (create first empty Bottle app now deferred until needed) +# BC: 0.6.4 and needed for run() +apps = app = default_app = AppStack() + +#: A virtual package that redirects import statements. +#: Example: ``import bottle.ext.sqlite`` actually imports `bottle_sqlite`. +ext = _ImportRedirect('bottle.ext' if __name__ == '__main__' else + __name__ + ".ext", 'bottle_%s').module + + +def _main(argv): # pragma: no coverage + args, parser = _cli_parse(argv) + + def _cli_error(cli_msg): + parser.print_help() + _stderr('\nError: %s\n' % cli_msg) + sys.exit(1) + + if args.version: + print(__version__) + sys.exit(0) + if not args.app: + _cli_error("No application entry point specified.") + + sys.path.insert(0, '.') + sys.modules.setdefault('bottle', sys.modules['__main__']) + + host, port = (args.bind or 'localhost'), 8080 + if ':' in host and host.rfind(']') < host.rfind(':'): + host, port = host.rsplit(':', 1) + host = host.strip('[]') + + config = ConfigDict() + + for cfile in args.conf or []: + try: + if cfile.endswith('.json'): + with open(cfile, 'rb') as fp: + config.load_dict(json_loads(fp.read())) + else: + config.load_config(cfile) + except configparser.Error as parse_error: + _cli_error(parse_error) + except IOError: + _cli_error("Unable to read config file %r" % cfile) + except (UnicodeError, TypeError, ValueError) as error: + _cli_error("Unable to parse config file %r: %s" % (cfile, error)) + + for cval in args.param or []: + if '=' in cval: + config.update((cval.split('=', 1),)) + else: + config[cval] = True + + run(args.app, + host=host, + port=int(port), + server=args.server, + reloader=args.reload, + plugins=args.plugin, + debug=args.debug, + config=config) + + +def main(): + _main(sys.argv) + + +if __name__ == '__main__': # pragma: no coverage + main() diff --git a/src/aignostics/utils/__init__.py b/src/aignostics/utils/__init__.py index 46b5a385..3be2f11f 100644 --- a/src/aignostics/utils/__init__.py +++ b/src/aignostics/utils/__init__.py @@ -58,3 +58,17 @@ "prepare_cli", "strip_to_none_before_validator", ] + +from importlib.util import find_spec + +if find_spec("nicegui"): + from ._gui import BasePageBuilder, GUILocalFilePicker, gui_register_pages, gui_run + + __all__ += ["BasePageBuilder", "GUILocalFilePicker", "gui_register_pages", "gui_run"] + +if find_spec("marimo"): + from ._notebook import create_marimo_app + + __all__ += [ + "create_marimo_app", + ] diff --git a/src/aignostics/utils/_constants.py b/src/aignostics/utils/_constants.py index eec5e78b..a5e20c2d 100644 --- a/src/aignostics/utils/_constants.py +++ b/src/aignostics/utils/_constants.py @@ -14,7 +14,21 @@ __version__ = metadata.version(__project_name__) __is_development_mode__ = "uvx" not in sys.argv[0].lower() __is_running_in_container__ = os.getenv(f"{__project_name__.upper()}_RUNNING_IN_CONTAINER") -__env__ = os.getenv("ENV", os.getenv("VERCEL_ENV", "local")) + +# Determine environment we are deployed on +ENV_VAR_MAPPINGS = { + "ENV": lambda env: env, + "VERCEL_ENV": lambda env: env, # See https://vercel.com/docs/environment-variables/system-environment-variables + "RAILWAY_ENVIRONMENT": lambda env: env, # See https://docs.railway.com/reference/variables#railway-provided-variables +} +__env__ = "local" # Default +for env_var, mapper in ENV_VAR_MAPPINGS.items(): + env_value = os.getenv(env_var) + if env_value: + __env__ = mapper(env_value) # type: ignore[no-untyped-call] + break + +# Define environment file paths __env_file__ = [ Path.home() / f".{__project_name__}" / ".env", Path.home() / f".{__project_name__}" / f".env.{__env__}", @@ -25,12 +39,18 @@ if env_file_path: __env_file__.insert(2, Path(env_file_path)) -vercel_base_url = os.getenv("VERCEL_URL", None) -if vercel_base_url: - vercel_base_url = "https://" + vercel_base_url -__base__url__ = os.getenv(__project_name__.upper() + "_BASE_URL", None) -if not __base__url__ and vercel_base_url: - __base__url__ = vercel_base_url +# Determine __base_url__ +PLATFORM_URL_MAPPINGS = { + "VERCEL_URL": lambda url: f"https://{url}", # See https://vercel.com/docs/environment-variables/system-environment-variables + "RAILWAY_PUBLIC_DOMAIN": lambda url: f"https://{url}", # See https://docs.railway.com/reference/variables#railway-provided-variables +} +__base__url__ = os.getenv(f"{__project_name__.upper()}_BASE_URL") +if not __base__url__: + for env_var, mappers in PLATFORM_URL_MAPPINGS.items(): + env_value = os.getenv(env_var) + if env_value: + __base__url__ = mappers(env_value) # type: ignore[no-untyped-call] + break def get_project_url_by_label(prefix: str) -> str: @@ -47,7 +67,6 @@ def get_project_url_by_label(prefix: str) -> str: for url_entry in metadata.metadata(__project_name__).get_all("Project-URL", []): if url_entry.startswith(prefix): return str(url_entry.split(", ", 1)[1]) - return "" diff --git a/src/aignostics/utils/_gui.py b/src/aignostics/utils/_gui.py new file mode 100644 index 00000000..a79e4c03 --- /dev/null +++ b/src/aignostics/utils/_gui.py @@ -0,0 +1,178 @@ +import platform +from abc import ABC, abstractmethod +from pathlib import Path +from types import EllipsisType + +from nicegui import app, events, ui +from nicegui import native as native_app + +from ._constants import __is_running_in_container__, __project_name__ +from ._di import locate_subclasses +from ._log import get_logger + +logger = get_logger(__name__) + + +class BasePageBuilder(ABC): + """Base class for all page builders.""" + + @staticmethod + @abstractmethod + def register_pages() -> None: + """Register pages.""" + + +def gui_register_pages() -> None: + """Register pages. + + This function is called by the GUI to register all pages. + """ + page_builders = locate_subclasses(BasePageBuilder) + for page_builder in page_builders: + page_builder.register_pages() + + +def gui_run( # noqa: PLR0913, PLR0917 + native: bool = True, + show: bool = False, + host: str | None = None, + port: int | None = None, + title: str = __project_name__, + icon: str = "", + watch: bool = False, + with_api: bool = False, +) -> None: + """Start the GUI. + + Args: + native: Whether to run the GUI in native mode. + show: Whether to show the GUI. + host: Host to run the GUI on. + port: Port to run the GUI on. + title: Title of the GUI. + icon: Icon for the GUI. + watch: Whether to watch for changes and reload the GUI. + with_api: Whether to mount the API. + + Raises: + ValueError: If with_notebook is True but notebook_path is None, + or trying to run native within container. + """ + if __is_running_in_container__ and native: + message = "Native GUI cannot be run in a container. Please run with uvx or in browser." + raise ValueError(message) + if with_api: + from ..api import api # noqa: PLC0415, TID252 + + app.mount("/api", api) + + gui_register_pages() + ui.run( + title=title, + favicon=icon, + native=native, + reload=watch, + dark=False, + host=host, + port=port or native_app.find_open_port(), + frameless=False, + show_welcome_message=True, + show=show, + ) + + +class GUILocalFilePicker(ui.dialog): + def __init__( + self, + directory: str, + *, + upper_limit: str | EllipsisType | None = ..., + multiple: bool = False, + show_hidden_files: bool = False, + ) -> None: + """Local File Picker. + + A simple file picker that allows selecting files from the local filesystem where NiceGUI is running. + + Args: + directory: The directory to start in. + upper_limit: The directory to stop at. None for no limit, default is same as starting directory. + multiple: Whether to allow multiple files to be selected. + show_hidden_files: Whether to show hidden files. + """ + super().__init__() + + self.path = Path(directory).expanduser() + if upper_limit is None: + self.upper_limit = None + elif upper_limit is ...: + self.upper_limit = Path(directory).expanduser() + else: + self.upper_limit = Path(upper_limit).expanduser() + self.show_hidden_files = show_hidden_files + + with self, ui.card(): + self.add_drives_toggle() + self.grid = ( + ui.aggrid( + { + "columnDefs": [{"field": "name", "headerName": "File"}], + "rowSelection": "multiple" if multiple else "single", + }, + html_columns=[0], + ) + .classes("w-96") + .on("cellDoubleClicked", self.handle_double_click) + ) + with ui.row().classes("w-full justify-end"): + ui.button("Cancel", on_click=self.close).props("outline").mark("BUTTON_CANCEL") + ui.button("Ok", on_click=self._handle_ok).mark("BUTTON_OK") + self.update_grid() + + def add_drives_toggle(self) -> None: + if platform.system() == "Windows": + import win32api # noqa: PLC0415 + + drives = win32api.GetLogicalDriveStrings().split("\000")[:-1] + self.drives_toggle = ui.toggle(drives, value=drives[0], on_change=self.update_drive) + + def update_drive(self) -> None: + self.path = Path(self.drives_toggle.value).expanduser() + self.update_grid() + + def update_grid(self) -> None: + paths = list(self.path.glob("*")) + if not self.show_hidden_files: + paths = [p for p in paths if not p.name.startswith(".")] + paths.sort(key=lambda p: p.name.lower()) + paths.sort(key=lambda p: not p.is_dir()) + + self.grid.options["rowData"] = [ + { + "name": f"📁 {p.name}" if p.is_dir() else p.name, + "path": str(p), + } + for p in paths + ] + if (self.upper_limit is None and self.path != self.path.parent) or ( + self.upper_limit is not None and self.path != self.upper_limit + ): + self.grid.options["rowData"].insert( + 0, + { + "name": "📁 ..", + "path": str(self.path.parent), + }, + ) + self.grid.update() + + def handle_double_click(self, e: events.GenericEventArguments) -> None: + self.path = Path(e.args["data"]["path"]) + if self.path.is_dir(): + self.update_grid() + else: + self.submit([str(self.path)]) + + async def _handle_ok(self) -> None: + rows = await self.grid.get_selected_rows() + self.submit([r["path"] for r in rows]) diff --git a/src/aignostics/utils/_notebook.py b/src/aignostics/utils/_notebook.py new file mode 100644 index 00000000..b0e4d4e4 --- /dev/null +++ b/src/aignostics/utils/_notebook.py @@ -0,0 +1,61 @@ +"""System service.""" + +from collections.abc import Callable + +import marimo +from fastapi import APIRouter, FastAPI + +from ..constants import NOTEBOOK_APP, NOTEBOOK_FOLDER # noqa: TID252 +from ._health import Health +from ._log import get_logger + +logger = get_logger(__name__) + + +def register_health_endpoint(router: APIRouter) -> Callable[..., Health]: + """Register health endpoint to the given router. + + Args: + router: The router to register the health endpoint to. + + Returns: + Callable[..., Health]: The health endpoint function. + """ + + @router.get("/healthz") + def health_endpoint() -> Health: + """Determine health of the app. + + Returns: + Health: Health. + """ + return Health(status=Health.Code.UP) + + return health_endpoint + + +def create_marimo_app() -> FastAPI: + """Create a FastAPI app with marimo notebook server. + + Returns: + FastAPI: FastAPI app with marimo notebook server. + + Raises: + ValueError: If the notebook directory does not exist. + """ + server = marimo.create_asgi_app(include_code=True) + if not NOTEBOOK_FOLDER.is_dir(): + logger.critical( + "Directory %s does not exist. Please create the directory and add your notebooks.", + NOTEBOOK_FOLDER, + ) + message = f"Directory {NOTEBOOK_FOLDER} does not exist. Please create and add your notebooks." + raise ValueError(message) + server = server.with_app(path="/", root=str(NOTEBOOK_APP)) + # .with_dynamic_directory(path="/dashboard", directory=str(self._settings.directory)) + app = FastAPI() + router = APIRouter(tags=["marimo"]) + register_health_endpoint(router) + app.include_router(router) + app.mount("/", server.build()) + return app diff --git a/src/aignostics/utils/boot.py b/src/aignostics/utils/boot.py index 8fa9e99a..65054666 100644 --- a/src/aignostics/utils/boot.py +++ b/src/aignostics/utils/boot.py @@ -2,6 +2,7 @@ import os import sys +from pathlib import Path from ._log import logging_initialize from ._logfire import logfire_initialize @@ -9,6 +10,11 @@ _boot_called = False +# Import vendored dependencies +vendored_dir = Path(__file__).parent.absolute() / ".vendored" +if vendored_dir.is_dir() and str(vendored_dir) not in sys.path: + sys.path.insert(0, str(vendored_dir)) + def boot(modules_to_instrument: list[str]) -> None: """Boot the application. diff --git a/tests/aignostics/application/gui_test.py b/tests/aignostics/application/gui_test.py new file mode 100644 index 00000000..bab8effd --- /dev/null +++ b/tests/aignostics/application/gui_test.py @@ -0,0 +1,24 @@ +"""Tests to verify the GUI functionality of the hello module.""" + +from nicegui.testing import User + +from aignostics.utils import gui_register_pages + + +async def test_gui_index(user: User) -> None: + """Test that the user sees the index page, and sees the output of the Hello service on click.""" + gui_register_pages() + await user.open("/") + await user.should_see("Click me") + user.find(marker="BUTTON_CLICK_ME").click() + await user.should_see("Hello, world!") + await user.should_see("Choose file") + user.find(marker="BUTTON_CHOOSE_FILE").click() + await user.should_see("Cancel") + user.find(marker="BUTTON_CANCEL").click() + await user.should_see("You chose None") + await user.should_see("Choose file") + user.find(marker="BUTTON_CHOOSE_FILE").click() + await user.should_see("Ok") + user.find(marker="BUTTON_OK").click() + await user.should_see("You chose") diff --git a/tests/aignostics/cli_test.py b/tests/aignostics/cli_test.py index edf0c203..a7fd66c0 100644 --- a/tests/aignostics/cli_test.py +++ b/tests/aignostics/cli_test.py @@ -3,6 +3,7 @@ import os import subprocess import sys +from importlib.util import find_spec import pytest from typer.testing import CliRunner @@ -89,3 +90,130 @@ def test_cli_fails_on_invalid_setting_with_environ(runner) -> None: assert result.exit_code == 78 # Check that the error message is in the output assert "Input should be 'CRITICAL'" in result.output + + +if find_spec("nicegui"): + + def test_cli_gui_help(runner: CliRunner) -> None: + """Check gui help works.""" + result = runner.invoke(cli, ["gui", "--help"]) + assert result.exit_code == 0 + + def test_cli_gui_run(runner: CliRunner, monkeypatch: pytest.MonkeyPatch) -> None: + """Check gui component behaviors when gui command is executed.""" + # Create mocks + mock_ui_run_called = False + mock_ui_run_args = {} + mock_register_pages_called = False + mock_app_mount_called = False + + def mock_ui_run( # noqa: PLR0913, PLR0917 + title="", + favicon="", + native=False, + reload=False, + dark=False, + host=None, + port=None, + frameless=False, + show_welcome_message=False, + show=False, + ): + nonlocal mock_ui_run_called, mock_ui_run_args + mock_ui_run_called = True + mock_ui_run_args = { + "title": title, + "favicon": favicon, + "native": native, + "reload": reload, + "dark": dark, + "host": host, + "port": port, + "frameless": frameless, + "show_welcome_message": show_welcome_message, + "show": show, + } + + def mock_gui_register_pages(): + nonlocal mock_register_pages_called + mock_register_pages_called = True + + def mock_app_mount(path, app_instance): + nonlocal mock_app_mount_called + mock_app_mount_called = True + + # Apply the mocks + monkeypatch.setattr("nicegui.ui.run", mock_ui_run) + monkeypatch.setattr("aignostics.utils._gui.gui_register_pages", mock_gui_register_pages) + monkeypatch.setattr("nicegui.app.mount", mock_app_mount) + + # Create a mock for native_app.find_open_port() + monkeypatch.setattr("nicegui.native.find_open_port", lambda: 8080) + + # Run the CLI command + result = runner.invoke(cli, ["gui"]) + + # Check that the command executed successfully + assert result.exit_code == 0 + + # Verify gui_register_pages was called + assert mock_register_pages_called, "gui_register_pages was not called" + + # Verify that app.mount was not called (with_api is False) + assert not mock_app_mount_called, "app.mount should not be called when with_api is False" + + # Check that ui.run was called with the expected parameters + assert mock_ui_run_called, "ui.run was not called" + assert mock_ui_run_args["title"] == "Aignostics Python SDK", "title parameter is incorrect" + assert mock_ui_run_args["favicon"] == "🔬", "favicon parameter is incorrect" + assert mock_ui_run_args["native"] is True, "native parameter should be True" + assert mock_ui_run_args["reload"] is False, "reload parameter is incorrect" + assert not mock_ui_run_args["dark"], "dark parameter should be False" + assert mock_ui_run_args["frameless"] is False, "frameless parameter should be False" + assert mock_ui_run_args["show_welcome_message"] is True, "show_welcome_message parameter should be True" + assert mock_ui_run_args["show"] is False, "show parameter should be False" + + +if find_spec("marimo"): + from fastapi import FastAPI + + def test_cli_notebook_help(runner: CliRunner) -> None: + """Check notebook help works.""" + result = runner.invoke(cli, ["notebook", "--help"]) + assert result.exit_code == 0 + + def test_cli_notebook_run(runner: CliRunner, monkeypatch: pytest.MonkeyPatch) -> None: + """Check uvicorn.run is called with FastAPI app from the notebook service.""" + # Create a mock for uvicorn.run to capture the app instance + mock_called = False + mock_args = {} + + def mock_uvicorn_run(app, host=None, port=None): + """Mock uvicorn.run function that captures the arguments.""" + nonlocal mock_called, mock_args + mock_called = True + mock_args = { + "app": app, + "host": host, + "port": port, + } + + # Apply the mock to uvicorn.run + monkeypatch.setattr("uvicorn.run", mock_uvicorn_run) + + # Create a mock for the Service._settings.directory.is_dir to avoid errors + monkeypatch.setattr("pathlib.Path.is_dir", lambda _: True) + + # Run the CLI command + result = runner.invoke(cli, ["notebook"]) + + # Check that the command executed successfully + assert result.exit_code == 0 + + # Check that uvicorn.run was called + assert mock_called, "uvicorn.run was not called" + + # Check that uvicorn.run was called with the expected arguments + assert isinstance(mock_args["app"], FastAPI), "uvicorn.run was not called with a FastAPI app" + assert mock_args["host"] == "127.0.0.1", "host parameter is incorrect" + assert mock_args["port"] == 8001, "port parameter is incorrect" diff --git a/tests/aignostics/idc/cli_test.py b/tests/aignostics/idc/cli_test.py new file mode 100644 index 00000000..dc3663b5 --- /dev/null +++ b/tests/aignostics/idc/cli_test.py @@ -0,0 +1,51 @@ +"""Tests to verify the CLI functionality of the system module.""" + +import logging +import re + +import pytest +from typer.testing import CliRunner + +from aignostics.cli import cli + +THE_VALUE = "THE_VALUE" + + +@pytest.fixture +def runner() -> CliRunner: + """Provide a CLI test runner fixture.""" + return CliRunner() + + +@pytest.mark.scheduled +def test_cli_columns(runner: CliRunner) -> None: + """Check expected column returned.""" + result = runner.invoke(cli, ["idc", "columns"]) + assert result.exit_code == 0 + assert "Modality" in result.output + + +@pytest.mark.scheduled +def test_cli_query(runner: CliRunner) -> None: + """Check query returns expected results.""" + result = runner.invoke(cli, ["idc", "query"]) + assert result.exit_code == 0 + assert "rows x 1 columns" in result.output + # Verify the number of rows is greater than 100000 + match = re.search(r"\[(\d+) rows x", result.output) + assert match is not None, f"Could not find row count in output: {result.output}" + num_rows = int(match.group(1)) + assert num_rows > 100000, f"Expected more than 100000 rows, but got {num_rows}" + + +@pytest.mark.scheduled +def test_cli_download(runner: CliRunner, caplog, tmp_path) -> None: + """Check download functionality with dry-run option.""" + caplog.set_level(logging.INFO) + result = runner.invoke( + cli, + ["idc", "download", "1.3.6.1.4.1.5962.99.1.1042652702.25371455.1637425225246.2.0", str(tmp_path), "--dry-run"], + ) + assert result.exit_code == 0 + for record in caplog.records: + assert record.levelname != "ERROR" # if id would not be found, error would be logged diff --git a/tests/aignostics/system/cli_test.py b/tests/aignostics/system/cli_test.py index 1b8b7462..397032ce 100644 --- a/tests/aignostics/system/cli_test.py +++ b/tests/aignostics/system/cli_test.py @@ -1,6 +1,7 @@ """Tests to verify the CLI functionality of the system module.""" import os +from unittest.mock import patch import pytest from typer.testing import CliRunner @@ -54,12 +55,63 @@ def test_cli_info_secrets(runner: CliRunner) -> None: assert THE_VALUE in result.output +@pytest.mark.skip # We don't serve an API +@patch("uvicorn.run") +def test_cli_serve_no_app(mock_uvicorn_run, runner: CliRunner) -> None: + """Check serve command starts the server.""" + result = runner.invoke(cli, ["system", "serve", "--host", "127.0.0.1", "--port", "8000", "--no-watch", "--no-app"]) + assert result.exit_code == 0 + assert "Starting webservice API server at http://127.0.0.1:8000" in result.output + mock_uvicorn_run.assert_called_once_with( + "aignostics.api:api", + host="127.0.0.1", + port=8000, + reload=False, + ) + + +@pytest.mark.skip # We don't serve an API +@patch("aignostics.utils._gui.app.mount") +@patch("aignostics.utils._gui.ui.run") +@patch("aignostics.utils._gui.gui_register_pages") +def test_cli_serve_api_and_app(mock_register_pages, mock_ui_run, mock_app_mount, runner: CliRunner) -> None: + """Check serve command starts the server with API and GUI app.""" + # Create a MagicMock for native_app.find_open_port + with patch("aignostics.utils._gui.native_app.find_open_port", return_value=8123): + result = runner.invoke(cli, ["system", "serve", "--host", "127.0.0.1", "--port", "8000", "--no-watch"]) + + assert result.exit_code == 0 + assert "Starting web application server at http://127.0.0.1:8000" in result.output + + # Check that app.mount was called to mount the API + mock_app_mount.assert_called_once_with("/api", mock_app_mount.call_args[0][1]) + + # Check that gui_register_pages was called + mock_register_pages.assert_called_once() + + # Check that ui.run was called with the correct parameters + mock_ui_run.assert_called_once_with( + title="aignostics", + favicon="", + native=False, + reload=False, + dark=False, + host="127.0.0.1", + port=8000, + frameless=False, + show_welcome_message=True, + show=False, + ) + + def test_cli_openapi_yaml(runner: CliRunner) -> None: """Check openapi command outputs YAML schema.""" result = runner.invoke(cli, ["system", "openapi", "--output-format", "yaml"]) assert result.exit_code == 0 # Check for common OpenAPI YAML elements - assert "ApplicationRunStatus:" in result.output + assert "openapi:" in result.output + assert "info:" in result.output + assert "paths:" in result.output result = runner.invoke(cli, ["system", "openapi", "--api-version", "v3", "--output-format", "yaml"]) assert result.exit_code == 1 diff --git a/tests/aignostics/system/gui_test.py b/tests/aignostics/system/gui_test.py new file mode 100644 index 00000000..0a3c341c --- /dev/null +++ b/tests/aignostics/system/gui_test.py @@ -0,0 +1,13 @@ +"""Tests to verify the GUI functionality of the info module.""" + +from nicegui.testing import User + +from aignostics.utils import __project_name__, gui_register_pages + + +async def test_gui_info(user: User) -> None: + """Test that the user sees the info page, and the output includes the project name.""" + gui_register_pages() + await user.open("/info") + await user.should_see("Home") + await user.should_see(__project_name__) diff --git a/tests/aignostics/utils/__init__.py b/tests/aignostics/utils/__init__.py new file mode 100644 index 00000000..09879136 --- /dev/null +++ b/tests/aignostics/utils/__init__.py @@ -0,0 +1 @@ +"""Unit tests for utils module.""" diff --git a/tests/aignostics/utils/health_test.py b/tests/aignostics/utils/health_test.py new file mode 100644 index 00000000..1a2b6781 --- /dev/null +++ b/tests/aignostics/utils/health_test.py @@ -0,0 +1,179 @@ +"""Tests for health models and status definitions.""" + +import pytest + +from aignostics.utils import get_logger +from aignostics.utils._health import Health + +DB_FAILURE = "DB failure" + +log = get_logger(__name__) + + +def test_health_default_status() -> None: + """Test that health can be initialized with default UP status.""" + health = Health(status=Health.Code.UP) + assert health.status == Health.Code.UP + assert health.reason is None + assert health.components == {} + + +def test_health_down_requires_reason() -> None: + """Test that a DOWN status requires a reason.""" + # Valid case - DOWN with reason + health = Health(status=Health.Code.DOWN, reason="Database connection failed") + assert health.status == Health.Code.DOWN + assert health.reason == "Database connection failed" + + # Invalid case - DOWN without reason should raise ValidationError + with pytest.raises(ValueError, match="Health DOWN must have a reason"): + Health(status=Health.Code.DOWN) + + +def test_health_up_with_reason_invalid() -> None: + """Test that an UP status cannot have a reason.""" + with pytest.raises(ValueError, match="Health UP must not have reason"): + Health(status=Health.Code.UP, reason="This should not be allowed") + + +def test_compute_health_from_components_no_components() -> None: + """Test that health status is unchanged when there are no components.""" + health = Health(status=Health.Code.UP) + result = health.compute_health_from_components() + + assert result.status == Health.Code.UP + assert result.reason is None + assert result is health # Should return self + + +def test_compute_health_from_components_already_down() -> None: + """Test that health status remains DOWN with original reason when already DOWN.""" + health = Health(status=Health.Code.DOWN, reason="Original failure") + health.components = { + "database": Health(status=Health.Code.DOWN, reason=DB_FAILURE), + "cache": Health(status=Health.Code.UP), + } + + result = health.compute_health_from_components() + + assert result.status == Health.Code.DOWN + assert result.reason == "Original failure" # Original reason should be preserved + assert result is health # Should return self + + +def test_compute_health_from_components_single_down() -> None: + """Test that health status is DOWN when a single component is DOWN.""" + health = Health(status=Health.Code.UP) + health.components = { + "database": Health(status=Health.Code.DOWN, reason=DB_FAILURE), + "cache": Health(status=Health.Code.UP), + } + + result = health.compute_health_from_components() + + assert result.status == Health.Code.DOWN + assert result.reason == "Component 'database' is DOWN" + assert result is health # Should return self + + +def test_compute_health_from_components_multiple_down() -> None: + """Test that health status is DOWN with correct reason when multiple components are DOWN.""" + health = Health(status=Health.Code.UP) + health.components = { + "database": Health(status=Health.Code.DOWN, reason=DB_FAILURE), + "cache": Health(status=Health.Code.DOWN, reason="Cache failure"), + "api": Health(status=Health.Code.UP), + } + + result = health.compute_health_from_components() + + assert result.status == Health.Code.DOWN + # Order might vary, so check for presence of both components in reason + assert result.reason is not None # First ensure reason is not None + assert "Components '" in result.reason + assert "database" in result.reason + assert "cache" in result.reason + assert "are DOWN" in result.reason + assert result is health # Should return self + + +def test_compute_health_recursive() -> None: + """Test that health status is recursively computed through the component tree.""" + # Create a nested health structure + deep_component = Health(status=Health.Code.DOWN, reason="Deep failure") + mid_component = Health( + status=Health.Code.UP, + components={"deep": deep_component}, + ) + health = Health( + status=Health.Code.UP, + components={"mid": mid_component, "other": Health(status=Health.Code.UP)}, + ) + + result = health.compute_health_from_components() + + assert result.status == Health.Code.DOWN + assert result.reason is not None + assert "Component 'mid' is DOWN" in result.reason + assert health.components["mid"].status == Health.Code.DOWN + assert health.components["mid"].reason is not None # First ensure reason is not None + assert "Component 'deep' is DOWN" in health.components["mid"].reason + assert health.components["other"].status == Health.Code.UP + + +def test_str_representation_up() -> None: + """Test string representation of UP health status.""" + health = Health(status=Health.Code.UP) + assert str(health) == "UP" + + +def test_str_representation_down() -> None: + """Test string representation of DOWN health status.""" + health = Health(status=Health.Code.DOWN, reason="Service unavailable") + assert str(health) == "DOWN: Service unavailable" + + +def test_validate_health_state_integration() -> None: + """Test the complete validation process with complex health tree.""" + # Create a complex health tree + health = Health( + status=Health.Code.UP, + components={ + "database": Health(status=Health.Code.UP), + "services": Health( + status=Health.Code.UP, + components={ + "auth": Health(status=Health.Code.DOWN, reason="Auth error"), + "storage": Health(status=Health.Code.UP), + }, + ), + "monitoring": Health(status=Health.Code.UP), + }, + ) + + # Validation happens automatically during model creation via model_validator + + # Check propagation through levels + assert health.status == Health.Code.DOWN + assert health.reason is not None # First ensure reason is not None + assert "Component 'services' is DOWN" in health.reason + + assert health.components["services"].status == Health.Code.DOWN + assert health.components["services"].reason is not None + assert "Component 'auth' is DOWN" in health.components["services"].reason + + assert health.components["database"].status == Health.Code.UP + assert health.components["monitoring"].status == Health.Code.UP + + +def test_health_manually_set_components_validated() -> None: + """Test that manually setting components triggers validation.""" + health = Health(status=Health.Code.UP) + + # Now manually set components that would cause validation to fail + with pytest.raises(ValueError, match="Health DOWN must have a reason"): + health.components = { + "bad_component": Health(status=Health.Code.DOWN), # Missing reason + } + # Accessing any attribute triggers validation + log.info(str(health)) diff --git a/tests/conftest.py b/tests/conftest.py index 4b9d8a0d..a8442eae 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,10 +1,15 @@ """Common test fixtures and configuration.""" import os +from importlib.util import find_spec from pathlib import Path import pytest +# See https://nicegui.io/documentation/section_testing#project_structure +if find_spec("nicegui"): + pytest_plugins = ("nicegui.testing.plugin",) + def pytest_collection_modifyitems(config, items) -> None: """Modify collected test items by skipping tests marked as 'long_running' unless matching marker given. @@ -57,7 +62,7 @@ def docker_compose_project_name() -> str: """ # You can consider to override this with a project name to reuse the stack # across test executions. - return f"pytest{os.getpid()}" + return f"aignostics-pytest-{os.getpid()}" def pytest_sessionfinish(session, exitstatus) -> None: diff --git a/uv.lock b/uv.lock index 84feedf7..acf90c55 100644 --- a/uv.lock +++ b/uv.lock @@ -23,6 +23,7 @@ dependencies = [ { name = "jsf" }, { name = "jsonschema" }, { name = "logfire", extra = ["system-metrics"] }, + { name = "nicegui", extra = ["native"] }, { name = "opentelemetry-instrumentation-fastapi" }, { name = "opentelemetry-instrumentation-httpx" }, { name = "opentelemetry-instrumentation-jinja2" }, @@ -32,7 +33,6 @@ dependencies = [ { name = "opentelemetry-instrumentation-urllib" }, { name = "opentelemetry-instrumentation-urllib3" }, { name = "psutil" }, - { name = "pydantic" }, { name = "pydantic-settings" }, { name = "pyjwt", extra = ["crypto"] }, { name = "python-dateutil" }, @@ -51,10 +51,18 @@ aws = [ { name = "boto3" }, ] examples = [ + { name = "cloudpathlib" }, + { name = "highdicom" }, { name = "jinja2" }, { name = "jupyter" }, { name = "marimo" }, + { name = "matplotlib" }, + { name = "shapely" }, { name = "streamlit" }, + { name = "wsidicom" }, +] +idc = [ + { name = "idc-index" }, ] [package.dev-dependencies] @@ -79,8 +87,10 @@ dev = [ { name = "pytest-docker" }, { name = "pytest-env" }, { name = "pytest-regressions" }, + { name = "pytest-selenium" }, { name = "pytest-subprocess" }, { name = "pytest-timeout" }, + { name = "pytest-watcher" }, { name = "pytest-xdist", extra = ["psutil"] }, { name = "ruff" }, { name = "sphinx" }, @@ -103,16 +113,21 @@ dev = [ requires-dist = [ { name = "appdirs", specifier = ">=1.4.4" }, { name = "boto3", marker = "extra == 'aws'", specifier = ">=1.37.27" }, + { name = "cloudpathlib", marker = "extra == 'examples'", specifier = ">=0.21.0" }, { name = "fastapi", extras = ["standard", "all"], specifier = ">=0.115.12" }, { name = "google-cloud-storage", specifier = ">=3.1.0" }, { name = "google-crc32c", specifier = ">=1.7.1" }, + { name = "highdicom", marker = "extra == 'examples'", specifier = ">=0.25.1" }, { name = "httpx", specifier = ">=0.28.1" }, + { name = "idc-index", marker = "extra == 'idc'", specifier = ">=0.8.6" }, { name = "jinja2", marker = "extra == 'examples'", specifier = ">=3.1.6" }, { name = "jsf", specifier = ">=0.11.2" }, { name = "jsonschema", specifier = ">=4.23.0" }, { name = "jupyter", marker = "extra == 'examples'", specifier = ">=1.1.1" }, { name = "logfire", extras = ["system-metrics"], specifier = ">=3.13.1" }, - { name = "marimo", marker = "extra == 'examples'", specifier = ">=0.12.8" }, + { name = "marimo", marker = "extra == 'examples'", specifier = ">=0.13.0" }, + { name = "matplotlib", marker = "extra == 'examples'", specifier = ">=3.10.1" }, + { name = "nicegui", extras = ["native"], specifier = ">=2.15.0" }, { name = "opentelemetry-instrumentation-fastapi", specifier = ">=0.53b0" }, { name = "opentelemetry-instrumentation-httpx", specifier = ">=0.53b0" }, { name = "opentelemetry-instrumentation-jinja2", specifier = ">=0.53b0" }, @@ -122,29 +137,30 @@ requires-dist = [ { name = "opentelemetry-instrumentation-urllib", specifier = ">=0.53b0" }, { name = "opentelemetry-instrumentation-urllib3", specifier = ">=0.53b0" }, { name = "psutil", specifier = ">=7.0.0" }, - { name = "pydantic", specifier = ">=2.11.3" }, - { name = "pydantic-settings", specifier = ">=2.8.1" }, + { name = "pydantic-settings", specifier = ">=2.9.1" }, { name = "pyjwt", extras = ["crypto"], specifier = ">=2.10.1" }, { name = "python-dateutil", specifier = ">=2.9.0.post0" }, { name = "pyyaml", specifier = ">=6.0" }, { name = "requests", specifier = ">=2.32.3" }, { name = "requests-oauthlib", specifier = ">=2.0.0" }, - { name = "sentry-sdk", specifier = ">=2.25.1" }, + { name = "sentry-sdk", specifier = ">=2.26.1" }, + { name = "shapely", marker = "extra == 'examples'", specifier = ">=2.1.0" }, { name = "streamlit", marker = "extra == 'examples'", specifier = ">=1.44.1" }, { name = "tqdm", specifier = ">=4.67.1" }, { name = "typer", specifier = ">=0.15.1" }, { name = "uptime", specifier = ">=3.0.1" }, { name = "urllib3", specifier = ">=2.2.3" }, + { name = "wsidicom", marker = "extra == 'examples'", specifier = ">=0.26.0" }, ] -provides-extras = ["examples", "aws"] +provides-extras = ["examples", "aws", "idc"] [package.metadata.requires-dev] dev = [ { name = "autodoc-pydantic", specifier = ">=2.2.0" }, - { name = "bump-my-version", specifier = ">=1.1.1" }, + { name = "bump-my-version", specifier = ">=1.1.2" }, { name = "cyclonedx-py", specifier = ">=1.0.1" }, { name = "detect-secrets", specifier = ">=1.5.0" }, - { name = "enum-tools", specifier = ">=0.12.0" }, + { name = "enum-tools", specifier = ">=0.13.0" }, { name = "furo", specifier = ">=2024.8.6" }, { name = "git-cliff", specifier = ">=2.8.0" }, { name = "matplotlib", specifier = ">=3.10.1" }, @@ -160,10 +176,12 @@ dev = [ { name = "pytest-docker", specifier = ">=3.2.1" }, { name = "pytest-env", specifier = ">=1.1.5" }, { name = "pytest-regressions", specifier = ">=2.7.0" }, + { name = "pytest-selenium", specifier = ">=4.1.0" }, { name = "pytest-subprocess", specifier = ">=1.5.3" }, { name = "pytest-timeout", specifier = ">=2.3.1" }, + { name = "pytest-watcher", specifier = ">=0.4.3" }, { name = "pytest-xdist", extras = ["psutil"], specifier = ">=3.6.1" }, - { name = "ruff", specifier = ">=0.11.5" }, + { name = "ruff", specifier = ">=0.11.6" }, { name = "sphinx", specifier = ">=8.2.3" }, { name = "sphinx-autobuild", specifier = ">=2024.10.3" }, { name = "sphinx-copybutton", specifier = ">=0.5.2" }, @@ -180,6 +198,101 @@ dev = [ { name = "watchdog", specifier = ">=6.0.0" }, ] +[[package]] +name = "aiofiles" +version = "24.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896 }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265 }, +] + +[[package]] +name = "aiohttp" +version = "3.11.16" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f1/d9/1c4721d143e14af753f2bf5e3b681883e1f24b592c0482df6fa6e33597fa/aiohttp-3.11.16.tar.gz", hash = "sha256:16f8a2c9538c14a557b4d309ed4d0a7c60f0253e8ed7b6c9a2859a7582f8b1b8", size = 7676826 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/98/be30539cd84260d9f3ea1936d50445e25aa6029a4cb9707f3b64cfd710f7/aiohttp-3.11.16-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8cb0688a8d81c63d716e867d59a9ccc389e97ac7037ebef904c2b89334407180", size = 708664 }, + { url = "https://files.pythonhosted.org/packages/e6/27/d51116ce18bdfdea7a2244b55ad38d7b01a4298af55765eed7e8431f013d/aiohttp-3.11.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ad1fb47da60ae1ddfb316f0ff16d1f3b8e844d1a1e154641928ea0583d486ed", size = 468953 }, + { url = "https://files.pythonhosted.org/packages/34/23/eedf80ec42865ea5355b46265a2433134138eff9a4fea17e1348530fa4ae/aiohttp-3.11.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:df7db76400bf46ec6a0a73192b14c8295bdb9812053f4fe53f4e789f3ea66bbb", size = 456065 }, + { url = "https://files.pythonhosted.org/packages/36/23/4a5b1ef6cff994936bf96d981dd817b487d9db755457a0d1c2939920d620/aiohttp-3.11.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc3a145479a76ad0ed646434d09216d33d08eef0d8c9a11f5ae5cdc37caa3540", size = 1687976 }, + { url = "https://files.pythonhosted.org/packages/d0/5d/c7474b4c3069bb35276d54c82997dff4f7575e4b73f0a7b1b08a39ece1eb/aiohttp-3.11.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d007aa39a52d62373bd23428ba4a2546eed0e7643d7bf2e41ddcefd54519842c", size = 1752711 }, + { url = "https://files.pythonhosted.org/packages/64/4c/ee416987b6729558f2eb1b727c60196580aafdb141e83bd78bb031d1c000/aiohttp-3.11.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6ddd90d9fb4b501c97a4458f1c1720e42432c26cb76d28177c5b5ad4e332601", size = 1791305 }, + { url = "https://files.pythonhosted.org/packages/58/28/3e1e1884070b95f1f69c473a1995852a6f8516670bb1c29d6cb2dbb73e1c/aiohttp-3.11.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a2f451849e6b39e5c226803dcacfa9c7133e9825dcefd2f4e837a2ec5a3bb98", size = 1674499 }, + { url = "https://files.pythonhosted.org/packages/ad/55/a032b32fa80a662d25d9eb170ed1e2c2be239304ca114ec66c89dc40f37f/aiohttp-3.11.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8df6612df74409080575dca38a5237282865408016e65636a76a2eb9348c2567", size = 1622313 }, + { url = "https://files.pythonhosted.org/packages/b1/df/ca775605f72abbda4e4746e793c408c84373ca2c6ce7a106a09f853f1e89/aiohttp-3.11.16-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78e6e23b954644737e385befa0deb20233e2dfddf95dd11e9db752bdd2a294d3", size = 1658274 }, + { url = "https://files.pythonhosted.org/packages/cc/6c/21c45b66124df5b4b0ab638271ecd8c6402b702977120cb4d5be6408e15d/aiohttp-3.11.16-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:696ef00e8a1f0cec5e30640e64eca75d8e777933d1438f4facc9c0cdf288a810", size = 1666704 }, + { url = "https://files.pythonhosted.org/packages/1d/e2/7d92adc03e3458edd18a21da2575ab84e58f16b1672ae98529e4eeee45ab/aiohttp-3.11.16-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3538bc9fe1b902bef51372462e3d7c96fce2b566642512138a480b7adc9d508", size = 1652815 }, + { url = "https://files.pythonhosted.org/packages/3a/52/7549573cd654ad651e3c5786ec3946d8f0ee379023e22deb503ff856b16c/aiohttp-3.11.16-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3ab3367bb7f61ad18793fea2ef71f2d181c528c87948638366bf1de26e239183", size = 1735669 }, + { url = "https://files.pythonhosted.org/packages/d5/54/dcd24a23c7a5a2922123e07a296a5f79ea87ce605f531be068415c326de6/aiohttp-3.11.16-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:56a3443aca82abda0e07be2e1ecb76a050714faf2be84256dae291182ba59049", size = 1760422 }, + { url = "https://files.pythonhosted.org/packages/a7/53/87327fe982fa310944e1450e97bf7b2a28015263771931372a1dfe682c58/aiohttp-3.11.16-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:61c721764e41af907c9d16b6daa05a458f066015abd35923051be8705108ed17", size = 1694457 }, + { url = "https://files.pythonhosted.org/packages/ce/6d/c5ccf41059267bcf89853d3db9d8d217dacf0a04f4086cb6bf278323011f/aiohttp-3.11.16-cp311-cp311-win32.whl", hash = "sha256:3e061b09f6fa42997cf627307f220315e313ece74907d35776ec4373ed718b86", size = 416817 }, + { url = "https://files.pythonhosted.org/packages/e7/dd/01f6fe028e054ef4f909c9d63e3a2399e77021bb2e1bb51d56ca8b543989/aiohttp-3.11.16-cp311-cp311-win_amd64.whl", hash = "sha256:745f1ed5e2c687baefc3c5e7b4304e91bf3e2f32834d07baaee243e349624b24", size = 442986 }, + { url = "https://files.pythonhosted.org/packages/db/38/100d01cbc60553743baf0fba658cb125f8ad674a8a771f765cdc155a890d/aiohttp-3.11.16-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:911a6e91d08bb2c72938bc17f0a2d97864c531536b7832abee6429d5296e5b27", size = 704881 }, + { url = "https://files.pythonhosted.org/packages/21/ed/b4102bb6245e36591209e29f03fe87e7956e54cb604ee12e20f7eb47f994/aiohttp-3.11.16-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac13b71761e49d5f9e4d05d33683bbafef753e876e8e5a7ef26e937dd766713", size = 464564 }, + { url = "https://files.pythonhosted.org/packages/3b/e1/a9ab6c47b62ecee080eeb33acd5352b40ecad08fb2d0779bcc6739271745/aiohttp-3.11.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fd36c119c5d6551bce374fcb5c19269638f8d09862445f85a5a48596fd59f4bb", size = 456548 }, + { url = "https://files.pythonhosted.org/packages/80/ad/216c6f71bdff2becce6c8776f0aa32cb0fa5d83008d13b49c3208d2e4016/aiohttp-3.11.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d489d9778522fbd0f8d6a5c6e48e3514f11be81cb0a5954bdda06f7e1594b321", size = 1691749 }, + { url = "https://files.pythonhosted.org/packages/bd/ea/7df7bcd3f4e734301605f686ffc87993f2d51b7acb6bcc9b980af223f297/aiohttp-3.11.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69a2cbd61788d26f8f1e626e188044834f37f6ae3f937bd9f08b65fc9d7e514e", size = 1736874 }, + { url = "https://files.pythonhosted.org/packages/51/41/c7724b9c87a29b7cfd1202ec6446bae8524a751473d25e2ff438bc9a02bf/aiohttp-3.11.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd464ba806e27ee24a91362ba3621bfc39dbbb8b79f2e1340201615197370f7c", size = 1786885 }, + { url = "https://files.pythonhosted.org/packages/86/b3/f61f8492fa6569fa87927ad35a40c159408862f7e8e70deaaead349e2fba/aiohttp-3.11.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ce63ae04719513dd2651202352a2beb9f67f55cb8490c40f056cea3c5c355ce", size = 1698059 }, + { url = "https://files.pythonhosted.org/packages/ce/be/7097cf860a9ce8bbb0e8960704e12869e111abcd3fbd245153373079ccec/aiohttp-3.11.16-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09b00dd520d88eac9d1768439a59ab3d145065c91a8fab97f900d1b5f802895e", size = 1626527 }, + { url = "https://files.pythonhosted.org/packages/1d/1d/aaa841c340e8c143a8d53a1f644c2a2961c58cfa26e7b398d6bf75cf5d23/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f6428fee52d2bcf96a8aa7b62095b190ee341ab0e6b1bcf50c615d7966fd45b", size = 1644036 }, + { url = "https://files.pythonhosted.org/packages/2c/88/59d870f76e9345e2b149f158074e78db457985c2b4da713038d9da3020a8/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:13ceac2c5cdcc3f64b9015710221ddf81c900c5febc505dbd8f810e770011540", size = 1685270 }, + { url = "https://files.pythonhosted.org/packages/2b/b1/c6686948d4c79c3745595efc469a9f8a43cab3c7efc0b5991be65d9e8cb8/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fadbb8f1d4140825069db3fedbbb843290fd5f5bc0a5dbd7eaf81d91bf1b003b", size = 1650852 }, + { url = "https://files.pythonhosted.org/packages/fe/94/3e42a6916fd3441721941e0f1b8438e1ce2a4c49af0e28e0d3c950c9b3c9/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6a792ce34b999fbe04a7a71a90c74f10c57ae4c51f65461a411faa70e154154e", size = 1704481 }, + { url = "https://files.pythonhosted.org/packages/b1/6d/6ab5854ff59b27075c7a8c610597d2b6c38945f9a1284ee8758bc3720ff6/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f4065145bf69de124accdd17ea5f4dc770da0a6a6e440c53f6e0a8c27b3e635c", size = 1735370 }, + { url = "https://files.pythonhosted.org/packages/73/2a/08a68eec3c99a6659067d271d7553e4d490a0828d588e1daa3970dc2b771/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa73e8c2656a3653ae6c307b3f4e878a21f87859a9afab228280ddccd7369d71", size = 1697619 }, + { url = "https://files.pythonhosted.org/packages/61/d5/fea8dbbfb0cd68fbb56f0ae913270a79422d9a41da442a624febf72d2aaf/aiohttp-3.11.16-cp312-cp312-win32.whl", hash = "sha256:f244b8e541f414664889e2c87cac11a07b918cb4b540c36f7ada7bfa76571ea2", size = 411710 }, + { url = "https://files.pythonhosted.org/packages/33/fb/41cde15fbe51365024550bf77b95a4fc84ef41365705c946da0421f0e1e0/aiohttp-3.11.16-cp312-cp312-win_amd64.whl", hash = "sha256:23a15727fbfccab973343b6d1b7181bfb0b4aa7ae280f36fd2f90f5476805682", size = 438012 }, + { url = "https://files.pythonhosted.org/packages/52/52/7c712b2d9fb4d5e5fd6d12f9ab76e52baddfee71e3c8203ca7a7559d7f51/aiohttp-3.11.16-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a3814760a1a700f3cfd2f977249f1032301d0a12c92aba74605cfa6ce9f78489", size = 698005 }, + { url = "https://files.pythonhosted.org/packages/51/3e/61057814f7247666d43ac538abcd6335b022869ade2602dab9bf33f607d2/aiohttp-3.11.16-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b751a6306f330801665ae69270a8a3993654a85569b3469662efaad6cf5cc50", size = 461106 }, + { url = "https://files.pythonhosted.org/packages/4f/85/6b79fb0ea6e913d596d5b949edc2402b20803f51b1a59e1bbc5bb7ba7569/aiohttp-3.11.16-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ad497f38a0d6c329cb621774788583ee12321863cd4bd9feee1effd60f2ad133", size = 453394 }, + { url = "https://files.pythonhosted.org/packages/4b/04/e1bb3fcfbd2c26753932c759593a32299aff8625eaa0bf8ff7d9c0c34a36/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca37057625693d097543bd88076ceebeb248291df9d6ca8481349efc0b05dcd0", size = 1666643 }, + { url = "https://files.pythonhosted.org/packages/0e/27/97bc0fdd1f439b8f060beb3ba8fb47b908dc170280090801158381ad7942/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5abcbba9f4b463a45c8ca8b7720891200658f6f46894f79517e6cd11f3405ca", size = 1721948 }, + { url = "https://files.pythonhosted.org/packages/2c/4f/bc4c5119e75c05ef15c5670ef1563bbe25d4ed4893b76c57b0184d815e8b/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f420bfe862fb357a6d76f2065447ef6f484bc489292ac91e29bc65d2d7a2c84d", size = 1774454 }, + { url = "https://files.pythonhosted.org/packages/73/5b/54b42b2150bb26fdf795464aa55ceb1a49c85f84e98e6896d211eabc6670/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58ede86453a6cf2d6ce40ef0ca15481677a66950e73b0a788917916f7e35a0bb", size = 1677785 }, + { url = "https://files.pythonhosted.org/packages/10/ee/a0fe68916d3f82eae199b8535624cf07a9c0a0958c7a76e56dd21140487a/aiohttp-3.11.16-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fdec0213244c39973674ca2a7f5435bf74369e7d4e104d6c7473c81c9bcc8c4", size = 1608456 }, + { url = "https://files.pythonhosted.org/packages/8b/48/83afd779242b7cf7e1ceed2ff624a86d3221e17798061cf9a79e0b246077/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:72b1b03fb4655c1960403c131740755ec19c5898c82abd3961c364c2afd59fe7", size = 1622424 }, + { url = "https://files.pythonhosted.org/packages/6f/27/452f1d5fca1f516f9f731539b7f5faa9e9d3bf8a3a6c3cd7c4b031f20cbd/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:780df0d837276276226a1ff803f8d0fa5f8996c479aeef52eb040179f3156cbd", size = 1660943 }, + { url = "https://files.pythonhosted.org/packages/d6/e1/5c7d63143b8d00c83b958b9e78e7048c4a69903c760c1e329bf02bac57a1/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ecdb8173e6c7aa09eee342ac62e193e6904923bd232e76b4157ac0bfa670609f", size = 1622797 }, + { url = "https://files.pythonhosted.org/packages/46/9e/2ac29cca2746ee8e449e73cd2fcb3d454467393ec03a269d50e49af743f1/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a6db7458ab89c7d80bc1f4e930cc9df6edee2200127cfa6f6e080cf619eddfbd", size = 1687162 }, + { url = "https://files.pythonhosted.org/packages/ad/6b/eaa6768e02edebaf37d77f4ffb74dd55f5cbcbb6a0dbf798ccec7b0ac23b/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2540ddc83cc724b13d1838026f6a5ad178510953302a49e6d647f6e1de82bc34", size = 1718518 }, + { url = "https://files.pythonhosted.org/packages/e5/18/dda87cbad29472a51fa058d6d8257dfce168289adaeb358b86bd93af3b20/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3b4e6db8dc4879015b9955778cfb9881897339c8fab7b3676f8433f849425913", size = 1675254 }, + { url = "https://files.pythonhosted.org/packages/32/d9/d2fb08c614df401d92c12fcbc60e6e879608d5e8909ef75c5ad8d4ad8aa7/aiohttp-3.11.16-cp313-cp313-win32.whl", hash = "sha256:493910ceb2764f792db4dc6e8e4b375dae1b08f72e18e8f10f18b34ca17d0979", size = 410698 }, + { url = "https://files.pythonhosted.org/packages/ce/ed/853e36d5a33c24544cfa46585895547de152dfef0b5c79fa675f6e4b7b87/aiohttp-3.11.16-cp313-cp313-win_amd64.whl", hash = "sha256:42864e70a248f5f6a49fdaf417d9bc62d6e4d8ee9695b24c5916cb4bb666c802", size = 436395 }, +] + +[[package]] +name = "aiosignal" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, +] + [[package]] name = "alabaster" version = "1.0.0" @@ -412,6 +525,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, ] +[[package]] +name = "bidict" +version = "0.23.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/6e/026678aa5a830e07cd9498a05d3e7e650a4f56a42f267a53d22bcda1bdc9/bidict-0.23.1.tar.gz", hash = "sha256:03069d763bc387bbd20e7d49914e75fc4132a41937fa3405417e1a5a2d006d71", size = 29093 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5", size = 32764 }, +] + [[package]] name = "bleach" version = "6.2.0" @@ -475,6 +597,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ea/c3/29ffcb4c90492bcfcff1b7e5ddb5529846acc0e627569432db9842c47675/botocore-1.37.28-py3-none-any.whl", hash = "sha256:c26b645d7b125bf42ffc1671b862b47500ee658e3a1c95d2438cb689fc85df15", size = 13467675 }, ] +[[package]] +name = "bottle" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/97839b95c2a2ea1ca91877a846988f90f4ca16ee42c0bb79e079171c0c06/bottle-0.13.2.tar.gz", hash = "sha256:e53803b9d298c7d343d00ba7d27b0059415f04b9f6f40b8d58b5bf914ba9d348", size = 98472 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/0a/a5260c758ff813acc6967344339aa7ba15f815575f4d49141685c4345d39/bottle-0.13.2-py2.py3-none-any.whl", hash = "sha256:27569ab8d1332fbba3e400b3baab2227ab4efb4882ff147af05a7c00ed73409c", size = 104053 }, +] + [[package]] name = "bracex" version = "2.5.post1" @@ -486,7 +617,7 @@ wheels = [ [[package]] name = "bump-my-version" -version = "1.1.1" +version = "1.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -499,9 +630,9 @@ dependencies = [ { name = "tomlkit" }, { name = "wcmatch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c8/0a/b4e0dea19ca92d871b011dfbd4271d2ea627db74a6b651ea642a7c605cf7/bump_my_version-1.1.1.tar.gz", hash = "sha256:2f590e0eabe894196289c296c52170559c09876454514ae8fce5db75bd47289e", size = 1108000 } +sdist = { url = "https://files.pythonhosted.org/packages/13/0a/544e8eb6d46baa99bf16d180b4ddb4509631fa8476e686c8e6c47681afb4/bump_my_version-1.1.2.tar.gz", hash = "sha256:0122845a78502b5a5a635ca17c1efb3e1ec05e77d72d13b2314186b9806882fb", size = 1120309 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/a7/c516c75f624b4dc7afde397af3bf5c01c6b191e18bcccfa44ec0d7d4a4e4/bump_my_version-1.1.1-py3-none-any.whl", hash = "sha256:6bd78e20421f6335c1a49d7e85a2f16ae8966897d0a2dd130a0e8b6b55954686", size = 59474 }, + { url = "https://files.pythonhosted.org/packages/dc/a9/026894e86ce2838d029af1344c71fd57560d1b6e2ce6513c340cbf8e00cb/bump_my_version-1.1.2-py3-none-any.whl", hash = "sha256:71a2a8c3940c87749c4cc404b2ada2fafbeab4e478e0ef54537686905ae58e0d", size = 59495 }, ] [[package]] @@ -663,6 +794,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, ] +[[package]] +name = "cloudpathlib" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/54/71e828c2e415024783f92ee942d3223f6f94cf3fe2e48689b0f3bbb5b608/cloudpathlib-0.21.0.tar.gz", hash = "sha256:fb8f6b890a3d37b35f0eabff86721bb8d35dfc6a6be98c1f4d34b19e989c6641", size = 45271 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/0f/b1a9b09a84ef98b9fc38d50c6b2815cb2256b804a78e7d838ddfbdc035c7/cloudpathlib-0.21.0-py3-none-any.whl", hash = "sha256:657e95ecd2663f1123b6daa95d49aca4b4bc8a9fa90c07930bdba2c5e295e5ef", size = 52744 }, +] + +[[package]] +name = "clr-loader" +version = "0.2.7.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d5/b3/8ae917e458394e2cebdbf17bed0a8204f8d4ffc79a093a7b1141c7731d3c/clr_loader-0.2.7.post0.tar.gz", hash = "sha256:b7a8b3f8fbb1bcbbb6382d887e21d1742d4f10b5ea209e4ad95568fe97e1c7c6", size = 56701 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/c0/06e64a54bced4e8b885c1e7ec03ee1869e52acf69e87da40f92391a214ad/clr_loader-0.2.7.post0-py3-none-any.whl", hash = "sha256:e0b9fcc107d48347a4311a28ffe3ae78c4968edb216ffb6564cb03f7ace0bb47", size = 50649 }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -987,6 +1139,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/5e/4f5fe4b89fde1dc3ed0eb51bd4ce4c0bca406246673d370ea2ad0c58d747/detect_secrets-1.5.0-py3-none-any.whl", hash = "sha256:e24e7b9b5a35048c313e983f76c4bd09dad89f045ff059e354f9943bf45aa060", size = 120341 }, ] +[[package]] +name = "dicomweb-client" +version = "0.59.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, + { name = "pydicom" }, + { name = "requests" }, + { name = "retrying" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/dd/160c7670dcba8081c737404a3186ae219a8804d8cc087b29aa8d08c2c8fa/dicomweb_client-0.59.3.tar.gz", hash = "sha256:dd11604c99711d3fc9d223de960a1b64db3b2dcbc30592473d935e27b9243d46", size = 70995 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/77/e7ac701ad5ce4507d52ed5ace9f3c0c0129e6fbb29d108a0fd00362547c1/dicomweb_client-0.59.3-py3-none-any.whl", hash = "sha256:58ba2c9d4924ab3bc66d7a078b070b73562d321846f70f0050fb51d078897726", size = 61563 }, +] + [[package]] name = "dict2css" version = "0.3.0.post1" @@ -1040,6 +1208,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/11/208f72084084d3f6a2ed5ebfdfc846692c3f7ad6dce65e400194924f7eed/domdf_python_tools-3.10.0-py3-none-any.whl", hash = "sha256:5e71c1be71bbcc1f881d690c8984b60e64298ec256903b3147f068bc33090c36", size = 126860 }, ] +[[package]] +name = "duckdb" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/b4/34b98425d643e412f52703829b5ed2da7d7cb6dd40c80a3aa210002cafa8/duckdb-1.2.1.tar.gz", hash = "sha256:15d49030d04572540cc1c8ad8a491ce018a590ec995d5d38c8f5f75b6422413e", size = 11591514 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/82/b119808dde71e42cc1fc77ac4a912e38c84eb47fa6ca4bc90652f99b7252/duckdb-1.2.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:99c47ea82df549c284e4e4d8c89a940af4f19c03427f6f42cafeb3c152536bc5", size = 15252717 }, + { url = "https://files.pythonhosted.org/packages/8a/ff/015fd0cdec48791c36d6251916b456e96ed9fb71a791a7385b26cec14810/duckdb-1.2.1-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:203ebdf401d049135492cc3d49146cfd704d866ee9cc52b18e80a586aceabb69", size = 31915709 }, + { url = "https://files.pythonhosted.org/packages/d7/d2/72ef2cf81562fdb6068b1e2cd19a878943067ce812060a4bc91e61d0e92d/duckdb-1.2.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ac5f7c15176b6fb90f1f3bed08a99b9d32f55b58cd3d9d2ed6a1037a8fda2024", size = 16772294 }, + { url = "https://files.pythonhosted.org/packages/b5/06/b454b94ceec3a813c5122a99b0259ced53874b15fb2dfdb669164dbcb153/duckdb-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b2c13f4f9290db60c783b93b79ce521a3890ff8d817a6670afb760e030043b", size = 18728528 }, + { url = "https://files.pythonhosted.org/packages/50/52/6e6f5b5b07841cec334ca6b98f2e02b7bb54ab3b99c49aa3a161cc0b4b37/duckdb-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d493e051f594175a2a5bdcae5c008d3cc424805e3282292c1204f597880de8ea", size = 20197440 }, + { url = "https://files.pythonhosted.org/packages/f5/dc/01c3f5a47d7433d1e261042f61e6b3d77634f28706975b3027697fa19de8/duckdb-1.2.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c252be2ed07817916342823b271253459932c60d7f7ee4e28f33650552cda24", size = 18736032 }, + { url = "https://files.pythonhosted.org/packages/1e/e4/7ef6b8e08c410fc13ba9f62ecf2802e8e2adcae38a5ea7a4f6829b99f32d/duckdb-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:832627f11b370d708543a86d18d5eda4eacb7ca51fdc83c74629adfff2ec1bf2", size = 22251245 }, + { url = "https://files.pythonhosted.org/packages/a5/b7/e3f5d60117fe31623122a44b6d3e8f1cee9d87a23810c9c35bb1d743d4d2/duckdb-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:d05e5914857b4d93b136de385d81a65165a6c24a6ecf6eee3dcd0017233bff6c", size = 11363523 }, + { url = "https://files.pythonhosted.org/packages/5d/70/2c1240415afc176ac7019f0fd5add3310ba93c80885a55d7fecc194108e6/duckdb-1.2.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:7e587410e05343ffaf9a21bacb6811aad253bd443ab4ff869fdaa645908f47a4", size = 15263653 }, + { url = "https://files.pythonhosted.org/packages/2c/6e/83caef4d3b6e68da768ec564d5c9b982a84d9167ead0ad674b69810d7bb8/duckdb-1.2.1-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:8cb84295cafbf2510326f4ae18d401fc2d45b6d4811c43f1b7451a69a0a74f5f", size = 31955476 }, + { url = "https://files.pythonhosted.org/packages/35/fb/ee33f3417d4778ab183d47fe8569dc7906a1b95f69cfb10f15d5f88e8dcf/duckdb-1.2.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:1b6dfefadc455347a2c649d41ebd561b32574b4191508043c9ee81fa0da95485", size = 16798219 }, + { url = "https://files.pythonhosted.org/packages/21/11/9cf670a88f39dd18854883c38b9374c745e47d69896bb8dbc9cc239a43d6/duckdb-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d75d9fdf5865399f634d824c8d427c7666d1f2c640115178115459fa69b20b0", size = 18730807 }, + { url = "https://files.pythonhosted.org/packages/d4/5f/7b511dcaa772f9ae20c7f3fe05dd88174729fbcb67e15b349b72a3855712/duckdb-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4a05d182d1dec1ff4acb53a266b3b8024afcc1ed0d399f5784ff1607a4271e9", size = 20199069 }, + { url = "https://files.pythonhosted.org/packages/9c/58/7942a1d7c84a045e1513acc7e753ac67f2f272601a2c21d71b4cb85967e7/duckdb-1.2.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:317af7385b4f1d0c90ca029a71ce3d4f9571549c162798d58a0b20ba0a11762e", size = 18753393 }, + { url = "https://files.pythonhosted.org/packages/6b/00/57417ae7d9bd47c71284bff7f69736bdde0f213ce312292e4f553449a667/duckdb-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41fca1666d0905e929ede0899a4275d67835a285b98e28fce446e8c3e53cfe8c", size = 22290931 }, + { url = "https://files.pythonhosted.org/packages/71/bc/acb4d48f41dada36e723e9786d1ebe89f8e1db6685b86a2a1f0551bd5e16/duckdb-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:f8f19f145442dbdfae029b68208fc237816f70b3d25bb77ed31ace79b6059fa5", size = 11365235 }, + { url = "https://files.pythonhosted.org/packages/e3/3b/d154fcde6205aafd2002ddec7eef37e5c7907c3aa63b51f6d9f7d2ec1442/duckdb-1.2.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:bc9ed3adea35e7e688750e80330b5b93cd430483d68a5f880dac76bedca14c0e", size = 15264713 }, + { url = "https://files.pythonhosted.org/packages/20/3f/e54f898c62a3d6873c090f06bab62544ac33826ec65e7598af7c09264a14/duckdb-1.2.1-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:b26ff415d89860b7013d711fce916f919ad058dbf0a3fc4bcdff5323ec4bbfa0", size = 31955551 }, + { url = "https://files.pythonhosted.org/packages/11/b9/19ecfcc13b402686cf6f121cb08451f7655bd653990fdabfda1f2db87081/duckdb-1.2.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:0e26037b138a22f72fe44697b605ccac06e223c108b3f4a3e91e7ffad45ee673", size = 16797823 }, + { url = "https://files.pythonhosted.org/packages/35/69/20fe0c748371866bdd150d60b065498b7414537c4ad0f7235b5ae604ac99/duckdb-1.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e2f530e8290e4b2d2c341bc709a6a0c9ec7a0e1c7a4679afa7bd4db972fcf12", size = 18731358 }, + { url = "https://files.pythonhosted.org/packages/cc/f7/ba9b39791a0415c48d4696f10217e44ac526e450b811bc68f9acf0ef3b5c/duckdb-1.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7985129c4bc810cb08938043822bb1fc4b67c11f4c1b025527f9c888e0638b6a", size = 20198769 }, + { url = "https://files.pythonhosted.org/packages/9c/6c/07717799b64e34dd383c4fe9a3a53f5506c97ada096b103154c8856dc68b/duckdb-1.2.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be76e55e9a36febcb0c7c7c28b8fae0b33bbcf6a84b3b23eb23e7ee3e65e3394", size = 18754621 }, + { url = "https://files.pythonhosted.org/packages/53/8b/f971b0cd6cfc3ac094d31998b789a8fb372bd0813fbb47c932342fc926f0/duckdb-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d8f5066ae9acc6cee22c7a455696511d993bdbfc55bb9466360b073b5c8cba67", size = 22291214 }, + { url = "https://files.pythonhosted.org/packages/1e/1c/4e29e52a35b5af451b24232b6f89714180da71c904017e62f7cc5477f135/duckdb-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:6112711457b6014ac041492bedf8b6a97403666aefa20a4a4f3479db10136501", size = 11365219 }, +] + [[package]] name = "email-validator" version = "2.2.0" @@ -1055,15 +1255,15 @@ wheels = [ [[package]] name = "enum-tools" -version = "0.12.0" +version = "0.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/06/55dfd19df0386a2a90d325dba67b0b5ba0b879a4bdac9cd225c22f6736d8/enum_tools-0.12.0.tar.gz", hash = "sha256:13ceb9376a4c5f574a1e7c5f9c8eb7f3d3fbfbb361cc18a738df1a58dfefd460", size = 18931 } +sdist = { url = "https://files.pythonhosted.org/packages/6d/87/50091e20c2765aa495b24521844a7d8f7041d48e4f9b47dd928cd38c8606/enum_tools-0.13.0.tar.gz", hash = "sha256:0d13335e361d300dc0f8fd82c8cf9951417246f9676144f5ee1761eb690228eb", size = 18904 } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/fc/cc600677fe58519352ae5fe9367d05d0054faa47e8c57ef50a1bb9c77b0e/enum_tools-0.12.0-py3-none-any.whl", hash = "sha256:d69b019f193c7b850b17d9ce18440db7ed62381571409af80ccc08c5218b340a", size = 22356 }, + { url = "https://files.pythonhosted.org/packages/84/45/cf8a8df3ebe78db691ab54525d552085b67658877f0334f4b0c08c43b518/enum_tools-0.13.0-py3-none-any.whl", hash = "sha256:e0112b16767dd08cb94105844b52770eae67ece6f026916a06db4a3d330d2a95", size = 22366 }, ] [[package]] @@ -1213,6 +1413,92 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121 }, ] +[[package]] +name = "frozenlist" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/b5/bc883b5296ec902115c00be161da93bf661199c465ec4c483feec6ea4c32/frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d", size = 160912 }, + { url = "https://files.pythonhosted.org/packages/6f/93/51b058b563d0704b39c56baa222828043aafcac17fd3734bec5dbeb619b1/frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0", size = 124315 }, + { url = "https://files.pythonhosted.org/packages/c9/e0/46cd35219428d350558b874d595e132d1c17a9471a1bd0d01d518a261e7c/frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe", size = 122230 }, + { url = "https://files.pythonhosted.org/packages/d1/0f/7ad2ce928ad06d6dd26a61812b959ded573d3e9d0ee6109d96c2be7172e9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba", size = 314842 }, + { url = "https://files.pythonhosted.org/packages/34/76/98cbbd8a20a5c3359a2004ae5e5b216af84a150ccbad67c8f8f30fb2ea91/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595", size = 304919 }, + { url = "https://files.pythonhosted.org/packages/9a/fa/258e771ce3a44348c05e6b01dffc2bc67603fba95761458c238cd09a2c77/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a", size = 324074 }, + { url = "https://files.pythonhosted.org/packages/d5/a4/047d861fd8c538210e12b208c0479912273f991356b6bdee7ea8356b07c9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626", size = 321292 }, + { url = "https://files.pythonhosted.org/packages/c0/25/cfec8af758b4525676cabd36efcaf7102c1348a776c0d1ad046b8a7cdc65/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff", size = 301569 }, + { url = "https://files.pythonhosted.org/packages/87/2f/0c819372fa9f0c07b153124bf58683b8d0ca7bb73ea5ccde9b9ef1745beb/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a", size = 313625 }, + { url = "https://files.pythonhosted.org/packages/50/5f/f0cf8b0fdedffdb76b3745aa13d5dbe404d63493cc211ce8250f2025307f/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0", size = 312523 }, + { url = "https://files.pythonhosted.org/packages/e1/6c/38c49108491272d3e84125bbabf2c2d0b304899b52f49f0539deb26ad18d/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606", size = 322657 }, + { url = "https://files.pythonhosted.org/packages/bd/4b/3bd3bad5be06a9d1b04b1c22be80b5fe65b502992d62fab4bdb25d9366ee/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584", size = 303414 }, + { url = "https://files.pythonhosted.org/packages/5b/89/7e225a30bef6e85dbfe22622c24afe932e9444de3b40d58b1ea589a14ef8/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a", size = 320321 }, + { url = "https://files.pythonhosted.org/packages/22/72/7e3acef4dd9e86366cb8f4d8f28e852c2b7e116927e9722b31a6f71ea4b0/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1", size = 323975 }, + { url = "https://files.pythonhosted.org/packages/d8/85/e5da03d20507e13c66ce612c9792b76811b7a43e3320cce42d95b85ac755/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e", size = 316553 }, + { url = "https://files.pythonhosted.org/packages/ac/8e/6c609cbd0580ae8a0661c408149f196aade7d325b1ae7adc930501b81acb/frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860", size = 115511 }, + { url = "https://files.pythonhosted.org/packages/f2/13/a84804cfde6de12d44ed48ecbf777ba62b12ff09e761f76cdd1ff9e14bb1/frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603", size = 120863 }, + { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193 }, + { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831 }, + { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862 }, + { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361 }, + { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115 }, + { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505 }, + { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666 }, + { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119 }, + { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226 }, + { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788 }, + { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914 }, + { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283 }, + { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264 }, + { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482 }, + { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248 }, + { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161 }, + { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548 }, + { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182 }, + { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838 }, + { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980 }, + { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463 }, + { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985 }, + { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188 }, + { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874 }, + { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897 }, + { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799 }, + { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804 }, + { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404 }, + { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572 }, + { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601 }, + { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232 }, + { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187 }, + { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772 }, + { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847 }, + { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937 }, + { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029 }, + { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831 }, + { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981 }, + { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999 }, + { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200 }, + { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134 }, + { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208 }, + { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548 }, + { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123 }, + { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199 }, + { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854 }, + { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412 }, + { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936 }, + { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459 }, + { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797 }, + { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709 }, + { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404 }, +] + +[[package]] +name = "fsspec" +version = "2024.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/11/de70dee31455c546fbc88301971ec03c328f3d1138cfba14263f651e9551/fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f", size = 291600 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/86/5486b0188d08aa643e127774a99bac51ffa6cf343e3deb0583956dca5b22/fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2", size = 183862 }, +] + [[package]] name = "furo" version = "2024.8.6" @@ -1389,6 +1675,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, ] +[[package]] +name = "highdicom" +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, + { name = "pydicom" }, + { name = "pyjpegls" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/4d/c57fe8ec3d9df870ceb484f66d37341ddf28e3f11e30556e746a21eb158d/highdicom-0.25.1.tar.gz", hash = "sha256:db77eec2c533d79ea698cc10c0be7c203dc5ce5bf0f2b6ca822b816c4c0531f1", size = 1104557 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/fa/0f057191fb08e82f1525d37688beddc6fb53d638db6d27db142a681f9a38/highdicom-0.25.1-py3-none-any.whl", hash = "sha256:ad5a49715e9a67af24622a08c27e0d31792be9a0d53c24da70c9f3dfaf9af79f", size = 1090252 }, +] + [[package]] name = "html5lib" version = "1.1" @@ -1459,6 +1761,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, ] +[[package]] +name = "idc-index" +version = "0.8.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "duckdb" }, + { name = "idc-index-data" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "platformdirs" }, + { name = "psutil" }, + { name = "pyarrow" }, + { name = "requests" }, + { name = "s5cmd" }, + { name = "sphinx-click" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/67/583272695d5e7014f67a1c9401f00f1c17dc8d9338accfe5306767af8f93/idc_index-0.8.6.tar.gz", hash = "sha256:340b83f77a640ae626f3f99efcfccbc2dba3b46030f870daf76089cfcfa2d01f", size = 41194 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/ee/1ad5329215a4d79033b8e2c1fe21484cc1b44465f67abb42c3b4e337b253/idc_index-0.8.6-py3-none-any.whl", hash = "sha256:3b2fd243c382a346cc0175855ce92dc922d8871ee9449fde8b96c2888668af79", size = 26724 }, +] + +[[package]] +name = "idc-index-data" +version = "20.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/b7/9aef00071919744833e3cca60c86f09769752ea4cfe5e3e31a3fd7d0632d/idc_index_data-20.0.3.tar.gz", hash = "sha256:b8b16cfbf10725f2dbfb90135d9d746659ffeb97735965af94ad743011e77937", size = 20059 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/0a/a4d2d5e8bc23b93587865885896638075f6455a797ea798d13a44a286aed/idc_index_data-20.0.3-py3-none-any.whl", hash = "sha256:83f3b5db815e34a7e5bc720a37d9f39e35825ab31357bdc0fba3969a77a6c4ba", size = 80260908 }, +] + [[package]] name = "identify" version = "2.6.9" @@ -1477,6 +1811,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] +[[package]] +name = "ifaddr" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/ac/fb4c578f4a3256561548cd825646680edcadb9440f3f68add95ade1eb791/ifaddr-0.2.0.tar.gz", hash = "sha256:cc0cbfcaabf765d44595825fb96a99bb12c79716b73b44330ea38ee2b0c4aed4", size = 10485 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/1f/19ebc343cc71a7ffa78f17018535adc5cbdd87afb31d7c34874680148b32/ifaddr-0.2.0-py3-none-any.whl", hash = "sha256:085e0305cfe6f16ab12d72e2024030f5d52674afad6911bb1eee207177b8a748", size = 12314 }, +] + [[package]] name = "imagesize" version = "1.4.1" @@ -2081,7 +2424,7 @@ wheels = [ [[package]] name = "marimo" -version = "0.12.8" +version = "0.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -2102,9 +2445,9 @@ dependencies = [ { name = "uvicorn" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/f5/3a7a8637b2c606b3dc66cb5887d0ab638ec29b3cc98931658994c2106d5a/marimo-0.12.8.tar.gz", hash = "sha256:d2d627924a32c73a9491f84e4358df8c83bbe0d4d35d38112f3020b1be32aef1", size = 10727118 } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0f/6d6bf8dbedd528b7beefa4385014f7722e7cfd8fc658b0644eeab3ed4a78/marimo-0.13.0.tar.gz", hash = "sha256:46629fbbd0731c7b819fcd0431dd8ed7982259d6936bd90494376ee17de36e2b", size = 10746792 } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/38/7894596a93c988c9506212ffc5005acf4a8f3877feebfe7598f317adc138/marimo-0.12.8-py3-none-any.whl", hash = "sha256:b4724d224d4bd9dffa4251d1b659a531c7419fe7eb6dea416763845094983f50", size = 11083695 }, + { url = "https://files.pythonhosted.org/packages/51/d5/2b023ba1d0f2fb269cb7f02464bf43865f802c24bd80bdad1379f76c7d05/marimo-0.13.0-py3-none-any.whl", hash = "sha256:f03e479b6eb1ad05404737a1f1ed6d526475adde0faea75c6b23fdb393e6b98a", size = 11110407 }, ] [[package]] @@ -2128,6 +2471,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, ] +[[package]] +name = "markdown2" +version = "2.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/52/d7dcc6284d59edb8301b8400435fbb4926a9b0f13a12b5cbaf3a4a54bb7b/markdown2-2.5.3.tar.gz", hash = "sha256:4d502953a4633408b0ab3ec503c5d6984d1b14307e32b325ec7d16ea57524895", size = 141676 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/37/0a13c83ccf5365b8e08ea572dfbc04b8cb87cadd359b2451a567f5248878/markdown2-2.5.3-py3-none-any.whl", hash = "sha256:a8ebb7e84b8519c37bf7382b3db600f1798a22c245bfd754a1f87ca8d7ea63b3", size = 48550 }, +] + [[package]] name = "markupsafe" version = "3.0.2" @@ -2176,6 +2528,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, ] +[[package]] +name = "marshmallow" +version = "3.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/5e/5e53d26b42ab75491cda89b871dab9e97c840bf12c63ec58a1919710cd06/marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6", size = 221825 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/75/51952c7b2d3873b44a0028b1bd26a25078c18f92f256608e8d1dc61b39fd/marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c", size = 50878 }, +] + [[package]] name = "matplotlib" version = "3.10.1" @@ -2299,6 +2663,83 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f", size = 75140 }, ] +[[package]] +name = "multidict" +version = "6.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e0/53cf7f27eda48fffa53cfd4502329ed29e00efb9e4ce41362cbf8aa54310/multidict-6.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", size = 65259 }, + { url = "https://files.pythonhosted.org/packages/44/79/1dcd93ce7070cf01c2ee29f781c42b33c64fce20033808f1cc9ec8413d6e/multidict-6.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", size = 38451 }, + { url = "https://files.pythonhosted.org/packages/f4/35/2292cf29ab5f0d0b3613fad1b75692148959d3834d806be1885ceb49a8ff/multidict-6.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad", size = 37706 }, + { url = "https://files.pythonhosted.org/packages/f6/d1/6b157110b2b187b5a608b37714acb15ee89ec773e3800315b0107ea648cd/multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", size = 226669 }, + { url = "https://files.pythonhosted.org/packages/40/7f/61a476450651f177c5570e04bd55947f693077ba7804fe9717ee9ae8de04/multidict-6.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", size = 223182 }, + { url = "https://files.pythonhosted.org/packages/51/7b/eaf7502ac4824cdd8edcf5723e2e99f390c879866aec7b0c420267b53749/multidict-6.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", size = 235025 }, + { url = "https://files.pythonhosted.org/packages/3b/f6/facdbbd73c96b67a93652774edd5778ab1167854fa08ea35ad004b1b70ad/multidict-6.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", size = 231481 }, + { url = "https://files.pythonhosted.org/packages/70/57/c008e861b3052405eebf921fd56a748322d8c44dcfcab164fffbccbdcdc4/multidict-6.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", size = 223492 }, + { url = "https://files.pythonhosted.org/packages/30/4d/7d8440d3a12a6ae5d6b202d6e7f2ac6ab026e04e99aaf1b73f18e6bc34bc/multidict-6.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", size = 217279 }, + { url = "https://files.pythonhosted.org/packages/7f/e7/bca0df4dd057597b94138d2d8af04eb3c27396a425b1b0a52e082f9be621/multidict-6.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", size = 228733 }, + { url = "https://files.pythonhosted.org/packages/88/f5/383827c3f1c38d7c92dbad00a8a041760228573b1c542fbf245c37bbca8a/multidict-6.4.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", size = 218089 }, + { url = "https://files.pythonhosted.org/packages/36/8a/a5174e8a7d8b94b4c8f9c1e2cf5d07451f41368ffe94d05fc957215b8e72/multidict-6.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", size = 225257 }, + { url = "https://files.pythonhosted.org/packages/8c/76/1d4b7218f0fd00b8e5c90b88df2e45f8af127f652f4e41add947fa54c1c4/multidict-6.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", size = 234728 }, + { url = "https://files.pythonhosted.org/packages/64/44/18372a4f6273fc7ca25630d7bf9ae288cde64f29593a078bff450c7170b6/multidict-6.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", size = 230087 }, + { url = "https://files.pythonhosted.org/packages/0f/ae/28728c314a698d8a6d9491fcacc897077348ec28dd85884d09e64df8a855/multidict-6.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", size = 223137 }, + { url = "https://files.pythonhosted.org/packages/22/50/785bb2b3fe16051bc91c70a06a919f26312da45c34db97fc87441d61e343/multidict-6.4.3-cp311-cp311-win32.whl", hash = "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", size = 34959 }, + { url = "https://files.pythonhosted.org/packages/2f/63/2a22e099ae2f4d92897618c00c73a09a08a2a9aa14b12736965bf8d59fd3/multidict-6.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", size = 38541 }, + { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019 }, + { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925 }, + { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008 }, + { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374 }, + { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869 }, + { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949 }, + { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032 }, + { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517 }, + { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291 }, + { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982 }, + { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823 }, + { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714 }, + { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739 }, + { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809 }, + { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934 }, + { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242 }, + { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635 }, + { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831 }, + { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888 }, + { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852 }, + { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644 }, + { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446 }, + { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070 }, + { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956 }, + { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599 }, + { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136 }, + { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139 }, + { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251 }, + { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868 }, + { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106 }, + { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163 }, + { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906 }, + { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238 }, + { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799 }, + { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642 }, + { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028 }, + { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424 }, + { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178 }, + { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617 }, + { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919 }, + { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097 }, + { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706 }, + { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728 }, + { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276 }, + { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069 }, + { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858 }, + { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988 }, + { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435 }, + { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494 }, + { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775 }, + { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946 }, + { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400 }, +] + [[package]] name = "mypy" version = "1.15.0" @@ -2421,6 +2862,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, ] +[[package]] +name = "nicegui" +version = "2.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiofiles" }, + { name = "aiohttp" }, + { name = "certifi" }, + { name = "docutils" }, + { name = "fastapi" }, + { name = "httpx" }, + { name = "ifaddr" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "markdown2" }, + { name = "orjson", marker = "platform_machine != 'i386' and platform_machine != 'i686'" }, + { name = "pygments" }, + { name = "python-engineio" }, + { name = "python-multipart" }, + { name = "python-socketio", extra = ["asyncio-client"] }, + { name = "requests" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "urllib3" }, + { name = "uvicorn", extra = ["standard"] }, + { name = "vbuild" }, + { name = "watchfiles" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/4e/6e6ab26320c5b5c992c5879de58d08d59decadf59a274bf88cbc89de88d3/nicegui-2.15.0.tar.gz", hash = "sha256:0b63bcf9634744d285aa618f74c4d57ea7264fd8f8a9e331cf10d528ba37355c", size = 16036134 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/48/a302bfeddd0948cccb028716204baa1dc1cfd38d6d6016e42168ddd66295/nicegui-2.15.0-py3-none-any.whl", hash = "sha256:0e401108447ae0e6b0a77c1de2611b67c4508f095a6f34d98a4640a2e17e2a08", size = 16485380 }, +] + +[package.optional-dependencies] +native = [ + { name = "pywebview" }, +] + [[package]] name = "nodeenv" version = "1.9.1" @@ -2858,6 +3337,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/9c/b66ce9245ff319df2c3278acd351a3f6145ef34b4a2d7f4b0f739368370f/orjson-3.10.16-cp313-cp313-win_amd64.whl", hash = "sha256:fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7", size = 133954 }, ] +[[package]] +name = "outcome" +version = "1.3.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/df/77698abfac98571e65ffeb0c1fba8ffd692ab8458d617a0eed7d9a8d38f2/outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", size = 21060 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b", size = 10692 }, +] + [[package]] name = "overrides" version = "7.7.0" @@ -3135,6 +3626,79 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 }, ] +[[package]] +name = "propcache" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/0f/5a5319ee83bd651f75311fcb0c492c21322a7fc8f788e4eef23f44243427/propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", size = 80243 }, + { url = "https://files.pythonhosted.org/packages/ce/84/3db5537e0879942783e2256616ff15d870a11d7ac26541336fe1b673c818/propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", size = 46503 }, + { url = "https://files.pythonhosted.org/packages/e2/c8/b649ed972433c3f0d827d7f0cf9ea47162f4ef8f4fe98c5f3641a0bc63ff/propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", size = 45934 }, + { url = "https://files.pythonhosted.org/packages/59/f9/4c0a5cf6974c2c43b1a6810c40d889769cc8f84cea676cbe1e62766a45f8/propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", size = 233633 }, + { url = "https://files.pythonhosted.org/packages/e7/64/66f2f4d1b4f0007c6e9078bd95b609b633d3957fe6dd23eac33ebde4b584/propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", size = 241124 }, + { url = "https://files.pythonhosted.org/packages/aa/bf/7b8c9fd097d511638fa9b6af3d986adbdf567598a567b46338c925144c1b/propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", size = 240283 }, + { url = "https://files.pythonhosted.org/packages/fa/c9/e85aeeeaae83358e2a1ef32d6ff50a483a5d5248bc38510d030a6f4e2816/propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", size = 232498 }, + { url = "https://files.pythonhosted.org/packages/8e/66/acb88e1f30ef5536d785c283af2e62931cb934a56a3ecf39105887aa8905/propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", size = 221486 }, + { url = "https://files.pythonhosted.org/packages/f5/f9/233ddb05ffdcaee4448508ee1d70aa7deff21bb41469ccdfcc339f871427/propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", size = 222675 }, + { url = "https://files.pythonhosted.org/packages/98/b8/eb977e28138f9e22a5a789daf608d36e05ed93093ef12a12441030da800a/propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", size = 215727 }, + { url = "https://files.pythonhosted.org/packages/89/2d/5f52d9c579f67b8ee1edd9ec073c91b23cc5b7ff7951a1e449e04ed8fdf3/propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", size = 217878 }, + { url = "https://files.pythonhosted.org/packages/7a/fd/5283e5ed8a82b00c7a989b99bb6ea173db1ad750bf0bf8dff08d3f4a4e28/propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", size = 230558 }, + { url = "https://files.pythonhosted.org/packages/90/38/ab17d75938ef7ac87332c588857422ae126b1c76253f0f5b1242032923ca/propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", size = 233754 }, + { url = "https://files.pythonhosted.org/packages/06/5d/3b921b9c60659ae464137508d3b4c2b3f52f592ceb1964aa2533b32fcf0b/propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", size = 226088 }, + { url = "https://files.pythonhosted.org/packages/54/6e/30a11f4417d9266b5a464ac5a8c5164ddc9dd153dfa77bf57918165eb4ae/propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", size = 40859 }, + { url = "https://files.pythonhosted.org/packages/1d/3a/8a68dd867da9ca2ee9dfd361093e9cb08cb0f37e5ddb2276f1b5177d7731/propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", size = 45153 }, + { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430 }, + { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637 }, + { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123 }, + { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031 }, + { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100 }, + { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170 }, + { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000 }, + { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262 }, + { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772 }, + { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133 }, + { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741 }, + { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047 }, + { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467 }, + { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022 }, + { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647 }, + { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784 }, + { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865 }, + { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452 }, + { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800 }, + { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804 }, + { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235 }, + { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249 }, + { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964 }, + { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501 }, + { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917 }, + { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089 }, + { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102 }, + { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122 }, + { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818 }, + { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112 }, + { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034 }, + { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613 }, + { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763 }, + { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175 }, + { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265 }, + { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412 }, + { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290 }, + { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926 }, + { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808 }, + { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916 }, + { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661 }, + { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384 }, + { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420 }, + { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880 }, + { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407 }, + { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573 }, + { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757 }, + { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376 }, +] + [[package]] name = "proto-plus" version = "1.26.1" @@ -3161,6 +3725,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/fb/a586e0c973c95502e054ac5f81f88394f24ccc7982dac19c515acd9e2c93/protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862", size = 172551 }, ] +[[package]] +name = "proxy-tools" +version = "0.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/cf/77d3e19b7fabd03895caca7857ef51e4c409e0ca6b37ee6e9f7daa50b642/proxy_tools-0.1.0.tar.gz", hash = "sha256:ccb3751f529c047e2d8a58440d86b205303cf0fe8146f784d1cbcd94f0a28010", size = 2978 } + +[[package]] +name = "pscript" +version = "0.7.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/68/f918702e270eddc5f7c54108f6a2f2afc2d299985820dbb0db9beb77d66d/pscript-0.7.7.tar.gz", hash = "sha256:8632f7a4483f235514aadee110edee82eb6d67336bf68744a7b18d76e50442f8", size = 176138 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/bc/980e2ebd442d2a8f1d22780f73db76f2a1df3bf79b3fb501b054b4b4dd03/pscript-0.7.7-py3-none-any.whl", hash = "sha256:b0fdac0df0393a4d7497153fea6a82e6429f32327c4c0a4817f1cd68adc08083", size = 126689 }, +] + [[package]] name = "psutil" version = "7.0.0" @@ -3404,15 +3983,16 @@ wheels = [ [[package]] name = "pydantic-settings" -version = "2.8.1" +version = "2.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550 } +sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 }, + { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356 }, ] [[package]] @@ -3428,6 +4008,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl", hash = "sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038", size = 6900403 }, ] +[[package]] +name = "pydicom" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/6f/55ea163b344c91df2e03c007bebf94781f0817656e2c037d7c5bf86c3bfc/pydicom-3.0.1.tar.gz", hash = "sha256:7b8be344b5b62493c9452ba6f5a299f78f8a6ab79786c729b0613698209603ec", size = 2884731 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/a6/98651e752a49f341aa99aa3f6c8ba361728dfc064242884355419df63669/pydicom-3.0.1-py3-none-any.whl", hash = "sha256:db32f78b2641bd7972096b8289111ddab01fb221610de8d7afa835eb938adb41", size = 2376126 }, +] + [[package]] name = "pygments" version = "2.19.1" @@ -3437,6 +4026,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, ] +[[package]] +name = "pyjpegls" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/59/98f5e19752ae8ffea9b0d15b4ad3b20022d96479201b9674d4708e3293d1/pyjpegls-1.5.1.tar.gz", hash = "sha256:d0fe09dfb7f75ce78e3b1e0519912a42f1827d68bbc3609652f4f8743c956025", size = 1103288 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/ca/32f520feb652c78359c96b2603c7cd2e7bf87600e8239c78e19c86af56c1/pyjpegls-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14b870392e6796ea0e2fac226e97ac730a634549923c475d173bc9c291f02658", size = 1201446 }, + { url = "https://files.pythonhosted.org/packages/e1/1d/058786659fdb8ffa38a50949c8ba91dc41606269868e88d409ec7e08bac7/pyjpegls-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e206e4ade507f6a3066a134d04a68b7c2570a2365f18e43ee2b01a08f3efcd30", size = 1190920 }, + { url = "https://files.pythonhosted.org/packages/dc/50/cb385d00b028037e2b814936bc77e3992a921f40e0d6855e8ef1b171dfef/pyjpegls-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:496ae75dc1b06a5e3fb6893593665fa40093e18a162de518ee0609c77cb7d4fe", size = 2659348 }, + { url = "https://files.pythonhosted.org/packages/ee/67/a42ff2401f9accf8b245c7b503e6d71bba3ebdb95cd185a053aa7deedca7/pyjpegls-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ec9eb9f7bd5332f86b3c9749f17aa8429a7965acfa7f2ab568eb11b70631472", size = 2665938 }, + { url = "https://files.pythonhosted.org/packages/3d/2a/64057a0a464105e40e22adc7a527b1c5453fe374b4002c214123abba6ff5/pyjpegls-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:acbe5ba2dde9b97bb98571a17a949bfbba7c9e40e78dfb79c08ecc568db50cee", size = 1143691 }, + { url = "https://files.pythonhosted.org/packages/d3/63/9e65815ea2c1b8abefda341d8fadb7d4d19c4fc9e7f3eb4bff1706a95371/pyjpegls-1.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a5430dcd735bc4c0c1eb478510d73a5178a4743cbad1d72113926accdd738921", size = 1200829 }, + { url = "https://files.pythonhosted.org/packages/84/5f/08760f98d1a49bee3046a2da6af4c1da339b49c8ebcbd976e36177af0c89/pyjpegls-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c3e6355a4bc9d3da46f7d4377793576b261bf60df297cea7167b3556adb98eb7", size = 1191073 }, + { url = "https://files.pythonhosted.org/packages/bc/83/153aedc15c9064091b2251fba99998866e4a2c0624905b9bae1c31644e5e/pyjpegls-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45630167eb37990701854f882455f4611c24902a2de1d27635076c3fed4a04a7", size = 2670175 }, + { url = "https://files.pythonhosted.org/packages/4d/f6/597cd0566f90b33428d6979f2967ac7ff1f7be0631e72c3a170dd966a98a/pyjpegls-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e8c7257bfd1700d563c4fdc60a8794519e00da21798221d964271bc5a027a49", size = 2678115 }, + { url = "https://files.pythonhosted.org/packages/50/32/b011c2c33850c8d6f7815cf30257e0e00d9fcb70e0a8052448257636bf19/pyjpegls-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:14d7cf5e61ffdb9343a888dde5e3f9b7e527cc805c31c7f48a1e2cdb73d9d9fa", size = 1143350 }, + { url = "https://files.pythonhosted.org/packages/2d/f7/c3e0e7d5067ce71930b757e61d82aef129b69e7c95ad881adae571ee49b1/pyjpegls-1.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bba892f411091a0de0736f39ac8da11e667a929fbc1e474657f1291d5e303d37", size = 1200012 }, + { url = "https://files.pythonhosted.org/packages/6d/91/59f22460a9f64b38bbd83de859963a4b5688f9cfac9e67c7d7a33b54373e/pyjpegls-1.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0080024c9e9e6be7bb0276ea54510488c28c8c9f2c0841049c64ab8b66d899f2", size = 1190156 }, + { url = "https://files.pythonhosted.org/packages/f1/9d/219cd41b62aec45f8f635c0f2175abcbc6642f334d94276da852d077b0d4/pyjpegls-1.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfecd3ea08ff2df367eb90791e3ff5288ccc0293fc13e99adc5542629a97a493", size = 2669034 }, + { url = "https://files.pythonhosted.org/packages/48/db/08ce5743ca250750776bf39729d495442966a2ddb23017e61ac43567c5bf/pyjpegls-1.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb56f056868561a1e49995bcbbe7ba8c38d56838d5c975ef5a0ff887d9189230", size = 2677947 }, + { url = "https://files.pythonhosted.org/packages/d8/8a/98c33dae7a420fdd0078df7eed406748abe68eed43622258e03da9049c77/pyjpegls-1.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:5812655f1fbb93bd2666ff05616bf3c7eae2474c6c4f8bf8afb6d5e5c0d6e9cf", size = 1142653 }, +] + [[package]] name = "pyjwt" version = "2.10.1" @@ -3464,6 +4079,81 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/eb/f5/b9e2a42aa8f9e34d52d66de87941ecd236570c7ed2e87775ed23bbe4e224/pymdown_extensions-10.14.3-py3-none-any.whl", hash = "sha256:05e0bee73d64b9c71a4ae17c72abc2f700e8bc8403755a00580b49a4e9f189e9", size = 264467 }, ] +[[package]] +name = "pyobjc-core" +version = "11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/94/a111239b98260869780a5767e5d74bfd3a8c13a40457f479c28dcd91f89d/pyobjc_core-11.0.tar.gz", hash = "sha256:63bced211cb8a8fb5c8ff46473603da30e51112861bd02c438fbbbc8578d9a70", size = 994931 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/05/fa97309c3b1bc1ec90d701db89902e0bd5e1024023aa2c5387b889458b1b/pyobjc_core-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:50675c0bb8696fe960a28466f9baf6943df2928a1fd85625d678fa2f428bd0bd", size = 727295 }, + { url = "https://files.pythonhosted.org/packages/56/ce/bf3ff9a9347721a398c3dfb83e29b43fb166b7ef590f3f7b7ddcd283df39/pyobjc_core-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a03061d4955c62ddd7754224a80cdadfdf17b6b5f60df1d9169a3b1b02923f0b", size = 739750 }, + { url = "https://files.pythonhosted.org/packages/72/16/0c468e73dbecb821e3da8819236fe832dfc53eb5f66a11775b055a7589ea/pyobjc_core-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c338c1deb7ab2e9436d4175d1127da2eeed4a1b564b3d83b9f3ae4844ba97e86", size = 743900 }, + { url = "https://files.pythonhosted.org/packages/f3/88/cecec88fd51f62a6cd7775cc4fb6bfde16652f97df88d28c84fb77ca0c18/pyobjc_core-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b4e9dc4296110f251a4033ff3f40320b35873ea7f876bd29a1c9705bb5e08c59", size = 791905 }, +] + +[[package]] +name = "pyobjc-framework-cocoa" +version = "11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/32/53809096ad5fc3e7a2c5ddea642590a5f2cb5b81d0ad6ea67fdb2263d9f9/pyobjc_framework_cocoa-11.0.tar.gz", hash = "sha256:00346a8cb81ad7b017b32ff7bf596000f9faa905807b1bd234644ebd47f692c5", size = 6173848 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/97/81fd41ad90e9c241172110aa635a6239d56f50d75923aaedbbe351828580/pyobjc_framework_Cocoa-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3ea7be6e6dd801b297440de02d312ba3fa7fd3c322db747ae1cb237e975f5d33", size = 385534 }, + { url = "https://files.pythonhosted.org/packages/5b/8d/0e2558447c26b3ba64f7c9776a5a6c9d2ae8abf9d34308b174ae0934402e/pyobjc_framework_Cocoa-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:280a577b83c68175a28b2b7138d1d2d3111f2b2b66c30e86f81a19c2b02eae71", size = 385811 }, + { url = "https://files.pythonhosted.org/packages/1d/a5/609281a7e89efefbef9db1d8fe66bc0458c3b4e74e2227c644f9c18926fa/pyobjc_framework_Cocoa-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:15b2bd977ed340074f930f1330f03d42912d5882b697d78bd06f8ebe263ef92e", size = 385889 }, + { url = "https://files.pythonhosted.org/packages/93/f6/2d5a863673ef7b85a3cba875c43e6c495fb1307427a6801001ae94bb5e54/pyobjc_framework_Cocoa-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5750001db544e67f2b66f02067d8f0da96bb2ef71732bde104f01b8628f9d7ea", size = 389831 }, +] + +[[package]] +name = "pyobjc-framework-quartz" +version = "11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a5/ad/f00f3f53387c23bbf4e0bb1410e11978cbf87c82fa6baff0ee86f74c5fb6/pyobjc_framework_quartz-11.0.tar.gz", hash = "sha256:3205bf7795fb9ae34747f701486b3db6dfac71924894d1f372977c4d70c3c619", size = 3952463 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/6a/68957c8c5e8f0128d4d419728bac397d48fa7ad7a66e82b70e64d129ffca/pyobjc_framework_Quartz-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d251696bfd8e8ef72fbc90eb29fec95cb9d1cc409008a183d5cc3246130ae8c2", size = 212349 }, + { url = "https://files.pythonhosted.org/packages/60/5d/df827b78dcb5140652ad08af8038c9ddd7e01e6bdf84462bfee644e6e661/pyobjc_framework_Quartz-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cb4a9f2d9d580ea15e25e6b270f47681afb5689cafc9e25712445ce715bcd18e", size = 212061 }, + { url = "https://files.pythonhosted.org/packages/a6/9e/54c48fe8faab06ee5eb80796c8c17ec61fc313d84398540ee70abeaf7070/pyobjc_framework_Quartz-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:973b4f9b8ab844574461a038bd5269f425a7368d6e677e3cc81fcc9b27b65498", size = 212478 }, + { url = "https://files.pythonhosted.org/packages/4a/28/456b54a59bfe11a91b7b4e94f8ffdcf174ffd1efa169f4283e5b3bc10194/pyobjc_framework_Quartz-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:66ab58d65348863b8707e63b2ec5cdc54569ee8189d1af90d52f29f5fdf6272c", size = 217973 }, +] + +[[package]] +name = "pyobjc-framework-security" +version = "11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/75/4b916bff8c650e387077a35916b7a7d331d5ff03bed7275099d96dcc6cd9/pyobjc_framework_security-11.0.tar.gz", hash = "sha256:ac078bb9cc6762d6f0f25f68325dcd7fe77acdd8c364bf4378868493f06a0758", size = 347059 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/d8/092940f8c46cf09000a9d026e9854772846d5335e3e8a44d0a81aa1f359e/pyobjc_framework_Security-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:93bc23630563de2551ac49048af010ac9cb40f927cc25c898b7cc48550ccd526", size = 41499 }, + { url = "https://files.pythonhosted.org/packages/0b/fc/8710bbe80b825c97ecc312aaead3b0f606a23b62b895f6e0a07df8bfeeae/pyobjc_framework_Security-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:421e03b8560ed296a7f5ee67f42f5f978f8c7959d65c8fec99cd77dc65786355", size = 41523 }, + { url = "https://files.pythonhosted.org/packages/ab/9f/79c1713be83d58199e5379e928c2c94bb3ca44d294de2a0a0edefc6b3ba8/pyobjc_framework_Security-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dda83260c5638dd0470c01ca9d37eccedbce15d0642d9c28b357329e4145528f", size = 41530 }, + { url = "https://files.pythonhosted.org/packages/80/f2/d71306d4431b5492a1c178a44ae922caabc40b884b081aa428bb06f642e6/pyobjc_framework_Security-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:51dd6fb24235f4623d68a02bda4dabd85f48bce00f9b0b306016cf2c891392c4", size = 42057 }, +] + +[[package]] +name = "pyobjc-framework-webkit" +version = "11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyobjc-core" }, + { name = "pyobjc-framework-cocoa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/4f/02a6270acf225c2a34339677e796002c77506238475059ae6e855358a40c/pyobjc_framework_webkit-11.0.tar.gz", hash = "sha256:fa6bedf9873786b3376a74ce2ea9dcd311f2a80f61e33dcbd931cc956aa29644", size = 767210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/63/6f04faa75c4c39c54007b256a8e13838c1de213d487f561937d342ec2eac/pyobjc_framework_WebKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:163abaa5a665b59626ef20cdc3dcc5e2e3fcd9830d5fc328507e13f663acd0ed", size = 44940 }, + { url = "https://files.pythonhosted.org/packages/3e/61/934f03510e7f49454fbf6eeff8ad2eca5d8bfbe71aa4b8a034f8132af2fa/pyobjc_framework_WebKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2e4911519e94822011d99fdb9addf4a176f45a79808dab18dc303293f4590f7c", size = 44901 }, + { url = "https://files.pythonhosted.org/packages/dc/8b/e880680429fbac494687626c1338758e70b5dfb75883d9cb78f66635f381/pyobjc_framework_WebKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:22d09bb22c3c48d9243f300f8264a68ecc0bdfe09d25794ee86ab2239eae7da2", size = 44938 }, + { url = "https://files.pythonhosted.org/packages/ec/8f/f0ba035f682038264b1e05bde8fb538e8fa61267dc3ac22e3c2e3d3001bc/pyobjc_framework_WebKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6141a416f1eb33ded2c6685931d1b4d5f17c83814f2d17b7e2febff03c6f6bee", size = 45443 }, +] + [[package]] name = "pyparsing" version = "3.2.3" @@ -3486,6 +4176,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2f/b5/380380c9e7a534cb1783c70c3e8ac6d1193c599650a55838d0557586796e/pyright-1.1.399-py3-none-any.whl", hash = "sha256:55f9a875ddf23c9698f24208c764465ffdfd38be6265f7faf9a176e1dc549f3b", size = 5592584 }, ] +[[package]] +name = "pysocks" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/11/293dd436aea955d45fc4e8a35b6ae7270f5b8e00b53cf6c024c83b657a11/PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0", size = 284429 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", size = 16725 }, +] + [[package]] name = "pytest" version = "8.3.5" @@ -3513,6 +4212,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0", size = 19694 }, ] +[[package]] +name = "pytest-base-url" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/1a/b64ac368de6b993135cb70ca4e5d958a5c268094a3a2a4cac6f0021b6c4f/pytest_base_url-2.1.0.tar.gz", hash = "sha256:02748589a54f9e63fcbe62301d6b0496da0d10231b753e950c63e03aee745d45", size = 6702 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/1c/b00940ab9eb8ede7897443b771987f2f4a76f06be02f1b3f01eb7567e24a/pytest_base_url-2.1.0-py3-none-any.whl", hash = "sha256:3ad15611778764d451927b2a53240c1a7a591b521ea44cebfe45849d2d2812e6", size = 5302 }, +] + [[package]] name = "pytest-cov" version = "6.1.1" @@ -3563,6 +4275,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/de/b8/87cfb16045c9d4092cfcf526135d73b88101aac83bc1adcf82dfb5fd3833/pytest_env-1.1.5-py3-none-any.whl", hash = "sha256:ce90cf8772878515c24b31cd97c7fa1f4481cd68d588419fd45f10ecaee6bc30", size = 6141 }, ] +[[package]] +name = "pytest-html" +version = "4.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "pytest" }, + { name = "pytest-metadata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/ab/4862dcb5a8a514bd87747e06b8d55483c0c9e987e1b66972336946e49b49/pytest_html-4.1.1.tar.gz", hash = "sha256:70a01e8ae5800f4a074b56a4cb1025c8f4f9b038bba5fe31e3c98eb996686f07", size = 150773 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/c7/c160021cbecd956cc1a6f79e5fe155f7868b2e5b848f1320dad0b3e3122f/pytest_html-4.1.1-py3-none-any.whl", hash = "sha256:c8152cea03bd4e9bee6d525573b67bbc6622967b72b9628dda0ea3e2a0b5dd71", size = 23491 }, +] + +[[package]] +name = "pytest-metadata" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a6/85/8c969f8bec4e559f8f2b958a15229a35495f5b4ce499f6b865eac54b878d/pytest_metadata-3.1.1.tar.gz", hash = "sha256:d2a29b0355fbc03f168aa96d41ff88b1a3b44a3b02acbe491801c98a048017c8", size = 9952 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/43/7e7b2ec865caa92f67b8f0e9231a798d102724ca4c0e1f414316be1c1ef2/pytest_metadata-3.1.1-py3-none-any.whl", hash = "sha256:c8e0844db684ee1c798cfa38908d20d67d0463ecb6137c72e91f418558dd5f4b", size = 11428 }, +] + [[package]] name = "pytest-regressions" version = "2.7.0" @@ -3577,6 +4315,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6d/83/3eaf30c06a1cf8bb58b1e5dba0345d1c747b720e889cbae81750c7659e9f/pytest_regressions-2.7.0-py3-none-any.whl", hash = "sha256:69f5e3f03493cf0ef84d96d23e50a546617c198b1d7746f2e2b9e441cbab4847", size = 24497 }, ] +[[package]] +name = "pytest-selenium" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, + { name = "pytest-base-url" }, + { name = "pytest-html" }, + { name = "pytest-variables" }, + { name = "requests" }, + { name = "selenium" }, + { name = "tenacity" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/a9/c275839e461fdde9ccaaf7ec46f67ad08dbd28bfebc5f8480f883d9da690/pytest_selenium-4.1.0.tar.gz", hash = "sha256:b0a4e1f27750cde631c513c87ae4863dcf9e180e5a1d680a66077da8a669156c", size = 41059 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/27/bac432528c2b20a382ef2423731c1bb8c6292ea5328e3522eccfa9bf0687/pytest_selenium-4.1.0-py3-none-any.whl", hash = "sha256:c6f2c18e91596d3ef360d74c450953767a15193879d3971296498151d1843c01", size = 24131 }, +] + [[package]] name = "pytest-subprocess" version = "1.5.3" @@ -3601,6 +4357,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/03/27/14af9ef8321f5edc7527e47def2a21d8118c6f329a9342cc61387a0c0599/pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e", size = 14148 }, ] +[[package]] +name = "pytest-variables" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/52/d756c9704a80119f2e8a84e418290f8bd1b7e1415c3417a1b9c13fcd2a87/pytest_variables-3.1.0.tar.gz", hash = "sha256:4719b07f0f6e5d07829b19284a99d9159543a2e0336311f7bc4ee3b1617f595d", size = 7420 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/fe/30dbeccfeafa242b3c9577db059019022cd96db20942c4a74ef9361c5b3c/pytest_variables-3.1.0-py3-none-any.whl", hash = "sha256:4c864d2b7093f9053a2bed61e4b1d027bb26456924e637fcef2d1455d32732b1", size = 6070 }, +] + +[[package]] +name = "pytest-watcher" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/72/a2a1e81f1b272ddd9a1848af4959c87c39aa95c0bbfb3007cacb86c47fa9/pytest_watcher-0.4.3.tar.gz", hash = "sha256:0cb0e4661648c8c0ff2b2d25efa5a8e421784b9e4c60fcecbf9b7c30b2d731b3", size = 10386 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/3a/c44a76c6bb5e9e896d9707fb1c704a31a0136950dec9514373ced0684d56/pytest_watcher-0.4.3-py3-none-any.whl", hash = "sha256:d59b1e1396f33a65ea4949b713d6884637755d641646960056a90b267c3460f9", size = 11852 }, +] + [[package]] name = "pytest-xdist" version = "3.6.1" @@ -3640,6 +4420,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 }, ] +[[package]] +name = "python-engineio" +version = "4.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "simple-websocket" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/e1/eee1129544b7f78fa2afa9fa0fce153cdcb21015b9b331d1b8adf90f45cb/python_engineio-4.12.0.tar.gz", hash = "sha256:f42a36a868d7063aa10ddccf6bd6117a169b6bd00d7ca53999772093b62014f9", size = 91503 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/f7/0aeea75424c47633c1d98557a2323be23bed31fa950f00161b34a5150d06/python_engineio-4.12.0-py3-none-any.whl", hash = "sha256:a0c47c129c39777e8ebc6d18011efd50db2144e4e8f08983acae8a3614626535", size = 59319 }, +] + [[package]] name = "python-json-logger" version = "3.3.0" @@ -3658,6 +4450,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, ] +[[package]] +name = "python-socketio" +version = "5.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bidict" }, + { name = "python-engineio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/1a/396d50ccf06ee539fa758ce5623b59a9cb27637fc4b2dc07ed08bf495e77/python_socketio-5.13.0.tar.gz", hash = "sha256:ac4e19a0302ae812e23b712ec8b6427ca0521f7c582d6abb096e36e24a263029", size = 121125 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-py3-none-any.whl", hash = "sha256:51f68d6499f2df8524668c24bcec13ba1414117cfb3a90115c559b601ab10caf", size = 77800 }, +] + +[package.optional-dependencies] +asyncio-client = [ + { name = "aiohttp" }, +] + +[[package]] +name = "pythonnet" +version = "3.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "clr-loader" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/d6/1afd75edd932306ae9bd2c2d961d603dc2b52fcec51b04afea464f1f6646/pythonnet-3.0.5.tar.gz", hash = "sha256:48e43ca463941b3608b32b4e236db92d8d40db4c58a75ace902985f76dac21cf", size = 239212 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/f1/bfb6811df4745f92f14c47a29e50e89a36b1533130fcc56452d4660bd2d6/pythonnet-3.0.5-py3-none-any.whl", hash = "sha256:f6702d694d5d5b163c9f3f5cc34e0bed8d6857150237fae411fefb883a656d20", size = 297506 }, +] + [[package]] name = "pytz" version = "2025.2" @@ -3667,6 +4489,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, ] +[[package]] +name = "pywebview" +version = "5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bottle" }, + { name = "proxy-tools" }, + { name = "pyobjc-core", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-cocoa", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-quartz", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-security", marker = "sys_platform == 'darwin'" }, + { name = "pyobjc-framework-webkit", marker = "sys_platform == 'darwin'" }, + { name = "pythonnet", marker = "sys_platform == 'win32'" }, + { name = "qtpy", marker = "sys_platform == 'openbsd6'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/c7/645f3b0bb190bf58c5cea9cfbcaa337ce3b54531ad207d3748676eb8cdc9/pywebview-5.4.tar.gz", hash = "sha256:b5e2c6c7502aaf72a9ae6034daf83785f5fad874fac7fa82bf4fcf854f1f083a", size = 466398 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/5a/7af3b9f8fb51d544b31f2f6c12635eac77d1e9a99f72dd12c9364062d59d/pywebview-5.4-py3-none-any.whl", hash = "sha256:0559c47db543556498dd38604a2a0479896c320f86c9b23499b8e580b58b699d", size = 475504 }, +] + [[package]] name = "pywin32" version = "310" @@ -3787,6 +4630,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/13/9c/d8073bd898eb896e94c679abe82e47506e2b750eb261cf6010ced869797c/pyzmq-26.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a222ad02fbe80166b0526c038776e8042cd4e5f0dec1489a006a1df47e9040e0", size = 555371 }, ] +[[package]] +name = "qtpy" +version = "2.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/01/392eba83c8e47b946b929d7c46e0f04b35e9671f8bb6fc36b6f7945b4de8/qtpy-2.4.3.tar.gz", hash = "sha256:db744f7832e6d3da90568ba6ccbca3ee2b3b4a890c3d6fbbc63142f6e4cdf5bb", size = 66982 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/76/37c0ccd5ab968a6a438f9c623aeecc84c202ab2fabc6a8fd927580c15b5a/QtPy-2.4.3-py3-none-any.whl", hash = "sha256:72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1", size = 95045 }, +] + [[package]] name = "questionary" version = "2.1.0" @@ -3841,6 +4696,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179 }, ] +[[package]] +name = "retrying" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/70/15ce8551d65b324e18c5aa6ef6998880f21ead51ebe5ed743c0950d7d9dd/retrying-1.3.4.tar.gz", hash = "sha256:345da8c5765bd982b1d1915deb9102fd3d1f7ad16bd84a9700b85f64d24e8f3e", size = 10929 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/04/9e36f28be4c0532c0e9207ff9dc01fb13a2b0eb036476a213b0000837d0e/retrying-1.3.4-py3-none-any.whl", hash = "sha256:8cc4d43cb8e1125e0ff3344e9de678fefd85db3b750b81b2240dc0183af37b35", size = 11602 }, +] + [[package]] name = "rfc3339-validator" version = "0.1.4" @@ -4062,27 +4929,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.11.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/45/71/5759b2a6b2279bb77fe15b1435b89473631c2cd6374d45ccdb6b785810be/ruff-0.11.5.tar.gz", hash = "sha256:cae2e2439cb88853e421901ec040a758960b576126dab520fa08e9de431d1bef", size = 3976488 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/db/6efda6381778eec7f35875b5cbefd194904832a1153d68d36d6b269d81a8/ruff-0.11.5-py3-none-linux_armv6l.whl", hash = "sha256:2561294e108eb648e50f210671cc56aee590fb6167b594144401532138c66c7b", size = 10103150 }, - { url = "https://files.pythonhosted.org/packages/44/f2/06cd9006077a8db61956768bc200a8e52515bf33a8f9b671ee527bb10d77/ruff-0.11.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac12884b9e005c12d0bd121f56ccf8033e1614f736f766c118ad60780882a077", size = 10898637 }, - { url = "https://files.pythonhosted.org/packages/18/f5/af390a013c56022fe6f72b95c86eb7b2585c89cc25d63882d3bfe411ecf1/ruff-0.11.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4bfd80a6ec559a5eeb96c33f832418bf0fb96752de0539905cf7b0cc1d31d779", size = 10236012 }, - { url = "https://files.pythonhosted.org/packages/b8/ca/b9bf954cfed165e1a0c24b86305d5c8ea75def256707f2448439ac5e0d8b/ruff-0.11.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0947c0a1afa75dcb5db4b34b070ec2bccee869d40e6cc8ab25aca11a7d527794", size = 10415338 }, - { url = "https://files.pythonhosted.org/packages/d9/4d/2522dde4e790f1b59885283f8786ab0046958dfd39959c81acc75d347467/ruff-0.11.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ad871ff74b5ec9caa66cb725b85d4ef89b53f8170f47c3406e32ef040400b038", size = 9965277 }, - { url = "https://files.pythonhosted.org/packages/e5/7a/749f56f150eef71ce2f626a2f6988446c620af2f9ba2a7804295ca450397/ruff-0.11.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6cf918390cfe46d240732d4d72fa6e18e528ca1f60e318a10835cf2fa3dc19f", size = 11541614 }, - { url = "https://files.pythonhosted.org/packages/89/b2/7d9b8435222485b6aac627d9c29793ba89be40b5de11584ca604b829e960/ruff-0.11.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56145ee1478582f61c08f21076dc59153310d606ad663acc00ea3ab5b2125f82", size = 12198873 }, - { url = "https://files.pythonhosted.org/packages/00/e0/a1a69ef5ffb5c5f9c31554b27e030a9c468fc6f57055886d27d316dfbabd/ruff-0.11.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e5f66f8f1e8c9fc594cbd66fbc5f246a8d91f916cb9667e80208663ec3728304", size = 11670190 }, - { url = "https://files.pythonhosted.org/packages/05/61/c1c16df6e92975072c07f8b20dad35cd858e8462b8865bc856fe5d6ccb63/ruff-0.11.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80b4df4d335a80315ab9afc81ed1cff62be112bd165e162b5eed8ac55bfc8470", size = 13902301 }, - { url = "https://files.pythonhosted.org/packages/79/89/0af10c8af4363304fd8cb833bd407a2850c760b71edf742c18d5a87bb3ad/ruff-0.11.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3068befab73620b8a0cc2431bd46b3cd619bc17d6f7695a3e1bb166b652c382a", size = 11350132 }, - { url = "https://files.pythonhosted.org/packages/b9/e1/ecb4c687cbf15164dd00e38cf62cbab238cad05dd8b6b0fc68b0c2785e15/ruff-0.11.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f5da2e710a9641828e09aa98b92c9ebbc60518fdf3921241326ca3e8f8e55b8b", size = 10312937 }, - { url = "https://files.pythonhosted.org/packages/cf/4f/0e53fe5e500b65934500949361e3cd290c5ba60f0324ed59d15f46479c06/ruff-0.11.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ef39f19cb8ec98cbc762344921e216f3857a06c47412030374fffd413fb8fd3a", size = 9936683 }, - { url = "https://files.pythonhosted.org/packages/04/a8/8183c4da6d35794ae7f76f96261ef5960853cd3f899c2671961f97a27d8e/ruff-0.11.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b2a7cedf47244f431fd11aa5a7e2806dda2e0c365873bda7834e8f7d785ae159", size = 10950217 }, - { url = "https://files.pythonhosted.org/packages/26/88/9b85a5a8af21e46a0639b107fcf9bfc31da4f1d263f2fc7fbe7199b47f0a/ruff-0.11.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:81be52e7519f3d1a0beadcf8e974715b2dfc808ae8ec729ecfc79bddf8dbb783", size = 11404521 }, - { url = "https://files.pythonhosted.org/packages/fc/52/047f35d3b20fd1ae9ccfe28791ef0f3ca0ef0b3e6c1a58badd97d450131b/ruff-0.11.5-py3-none-win32.whl", hash = "sha256:e268da7b40f56e3eca571508a7e567e794f9bfcc0f412c4b607931d3af9c4afe", size = 10320697 }, - { url = "https://files.pythonhosted.org/packages/b9/fe/00c78010e3332a6e92762424cf4c1919065707e962232797d0b57fd8267e/ruff-0.11.5-py3-none-win_amd64.whl", hash = "sha256:6c6dc38af3cfe2863213ea25b6dc616d679205732dc0fb673356c2d69608f800", size = 11378665 }, - { url = "https://files.pythonhosted.org/packages/43/7c/c83fe5cbb70ff017612ff36654edfebec4b1ef79b558b8e5fd933bab836b/ruff-0.11.5-py3-none-win_arm64.whl", hash = "sha256:67e241b4314f4eacf14a601d586026a962f4002a475aa702c69980a38087aa4e", size = 10460287 }, +version = "0.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/11/bcef6784c7e5d200b8a1f5c2ddf53e5da0efec37e6e5a44d163fb97e04ba/ruff-0.11.6.tar.gz", hash = "sha256:bec8bcc3ac228a45ccc811e45f7eb61b950dbf4cf31a67fa89352574b01c7d79", size = 4010053 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/1f/8848b625100ebcc8740c8bac5b5dd8ba97dd4ee210970e98832092c1635b/ruff-0.11.6-py3-none-linux_armv6l.whl", hash = "sha256:d84dcbe74cf9356d1bdb4a78cf74fd47c740bf7bdeb7529068f69b08272239a1", size = 10248105 }, + { url = "https://files.pythonhosted.org/packages/e0/47/c44036e70c6cc11e6ee24399c2a1e1f1e99be5152bd7dff0190e4b325b76/ruff-0.11.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9bc583628e1096148011a5d51ff3c836f51899e61112e03e5f2b1573a9b726de", size = 11001494 }, + { url = "https://files.pythonhosted.org/packages/ed/5b/170444061650202d84d316e8f112de02d092bff71fafe060d3542f5bc5df/ruff-0.11.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f2959049faeb5ba5e3b378709e9d1bf0cab06528b306b9dd6ebd2a312127964a", size = 10352151 }, + { url = "https://files.pythonhosted.org/packages/ff/91/f02839fb3787c678e112c8865f2c3e87cfe1744dcc96ff9fc56cfb97dda2/ruff-0.11.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63c5d4e30d9d0de7fedbfb3e9e20d134b73a30c1e74b596f40f0629d5c28a193", size = 10541951 }, + { url = "https://files.pythonhosted.org/packages/9e/f3/c09933306096ff7a08abede3cc2534d6fcf5529ccd26504c16bf363989b5/ruff-0.11.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a4b9a4e1439f7d0a091c6763a100cef8fbdc10d68593df6f3cfa5abdd9246e", size = 10079195 }, + { url = "https://files.pythonhosted.org/packages/e0/0d/a87f8933fccbc0d8c653cfbf44bedda69c9582ba09210a309c066794e2ee/ruff-0.11.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5edf270223dd622218256569636dc3e708c2cb989242262fe378609eccf1308", size = 11698918 }, + { url = "https://files.pythonhosted.org/packages/52/7d/8eac0bd083ea8a0b55b7e4628428203441ca68cd55e0b67c135a4bc6e309/ruff-0.11.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f55844e818206a9dd31ff27f91385afb538067e2dc0beb05f82c293ab84f7d55", size = 12319426 }, + { url = "https://files.pythonhosted.org/packages/c2/dc/d0c17d875662d0c86fadcf4ca014ab2001f867621b793d5d7eef01b9dcce/ruff-0.11.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d8f782286c5ff562e4e00344f954b9320026d8e3fae2ba9e6948443fafd9ffc", size = 11791012 }, + { url = "https://files.pythonhosted.org/packages/f9/f3/81a1aea17f1065449a72509fc7ccc3659cf93148b136ff2a8291c4bc3ef1/ruff-0.11.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:01c63ba219514271cee955cd0adc26a4083df1956d57847978383b0e50ffd7d2", size = 13949947 }, + { url = "https://files.pythonhosted.org/packages/61/9f/a3e34de425a668284e7024ee6fd41f452f6fa9d817f1f3495b46e5e3a407/ruff-0.11.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15adac20ef2ca296dd3d8e2bedc6202ea6de81c091a74661c3666e5c4c223ff6", size = 11471753 }, + { url = "https://files.pythonhosted.org/packages/df/c5/4a57a86d12542c0f6e2744f262257b2aa5a3783098ec14e40f3e4b3a354a/ruff-0.11.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4dd6b09e98144ad7aec026f5588e493c65057d1b387dd937d7787baa531d9bc2", size = 10417121 }, + { url = "https://files.pythonhosted.org/packages/58/3f/a3b4346dff07ef5b862e2ba06d98fcbf71f66f04cf01d375e871382b5e4b/ruff-0.11.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:45b2e1d6c0eed89c248d024ea95074d0e09988d8e7b1dad8d3ab9a67017a5b03", size = 10073829 }, + { url = "https://files.pythonhosted.org/packages/93/cc/7ed02e0b86a649216b845b3ac66ed55d8aa86f5898c5f1691797f408fcb9/ruff-0.11.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bd40de4115b2ec4850302f1a1d8067f42e70b4990b68838ccb9ccd9f110c5e8b", size = 11076108 }, + { url = "https://files.pythonhosted.org/packages/39/5e/5b09840fef0eff1a6fa1dea6296c07d09c17cb6fb94ed5593aa591b50460/ruff-0.11.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:77cda2dfbac1ab73aef5e514c4cbfc4ec1fbef4b84a44c736cc26f61b3814cd9", size = 11512366 }, + { url = "https://files.pythonhosted.org/packages/6f/4c/1cd5a84a412d3626335ae69f5f9de2bb554eea0faf46deb1f0cb48534042/ruff-0.11.6-py3-none-win32.whl", hash = "sha256:5151a871554be3036cd6e51d0ec6eef56334d74dfe1702de717a995ee3d5b287", size = 10485900 }, + { url = "https://files.pythonhosted.org/packages/42/46/8997872bc44d43df986491c18d4418f1caff03bc47b7f381261d62c23442/ruff-0.11.6-py3-none-win_amd64.whl", hash = "sha256:cce85721d09c51f3b782c331b0abd07e9d7d5f775840379c640606d3159cae0e", size = 11558592 }, + { url = "https://files.pythonhosted.org/packages/d7/6a/65fecd51a9ca19e1477c3879a7fda24f8904174d1275b419422ac00f6eee/ruff-0.11.6-py3-none-win_arm64.whl", hash = "sha256:3567ba0d07fb170b1b48d944715e3294b77f5b7679e8ba258199a250383ccb79", size = 10682766 }, ] [[package]] @@ -4097,6 +4964,43 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/86/62/8d3fc3ec6640161a5649b2cddbbf2b9fa39c92541225b33f117c37c5a2eb/s3transfer-0.11.4-py3-none-any.whl", hash = "sha256:ac265fa68318763a03bf2dc4f39d5cbd6a9e178d81cc9483ad27da33637e320d", size = 84412 }, ] +[[package]] +name = "s5cmd" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/ec/7d996b105d299d2189928732d4a6034e9237d24a6a12c57a0f5e718932eb/s5cmd-0.2.0.tar.gz", hash = "sha256:2e8055e2579ae11d8f251afbdc2baac93333f2305f953b080f92ce9629675f76", size = 13092 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/01/2f005cf78b96c2e72184eff2de026d64f502fef8c874d1ce57a877585a2d/s5cmd-0.2.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cb797e43fe2a2687a341a57b7795fd7ecebbfb1aa59451bd9b086073e606d445", size = 4732484 }, + { url = "https://files.pythonhosted.org/packages/ee/7c/255b7fcccff89c3b2ec816f54f31692290c71750a00cbea01dcdd88a6887/s5cmd-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045844878f2ca345f159333abc321c3d1bcf0acb436778c43c90b10393f6a818", size = 4277121 }, + { url = "https://files.pythonhosted.org/packages/c5/54/53f8f4de0752e63b92844215cfaead96b0b5ab748f7809a052e443009230/s5cmd-0.2.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4dc3c19cee6e0447bcc68554bb39ed9ab3aeaf463b1c823cb61a175b6254fa9", size = 4158407 }, + { url = "https://files.pythonhosted.org/packages/73/cd/aefd5f093a17ec9f55072a976d135711b16993632fbebbe1824f1d038b1a/s5cmd-0.2.0-py3-none-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5befb0461ad7dd57ba80d6d35b688a4ac9c34179e0690faeec3aad0243adb127", size = 4744781 }, + { url = "https://files.pythonhosted.org/packages/6c/ce/5872c73dd7d54c4648772bda0a943b65e15d7056fef24ee7187e4c74e05f/s5cmd-0.2.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc07ded42370ec931aa6b642a70274669d11a332a81f825eaa1093f65245034e", size = 4744785 }, + { url = "https://files.pythonhosted.org/packages/92/6f/1e179f96638c38cab32334c35cdec7378b349a5f36a90e5b1fd2e5b210fa/s5cmd-0.2.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fb992f69dcf019e89a9e025c9105d2340b694f68234e4fb86ebbb1827f6046bf", size = 4277108 }, + { url = "https://files.pythonhosted.org/packages/ea/68/a1fe36d8ff39c1050f5ba5199a47c5763499f5fe02b4a71a0048446e571b/s5cmd-0.2.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:65fe3aad880625c61b3e210a17c2ddf110d1e3da5f7c63c9d091ce40db28952f", size = 4744763 }, + { url = "https://files.pythonhosted.org/packages/ff/09/d347b2e4adce3b610389caab752b03f64285221e555e157e56c1dfe2346e/s5cmd-0.2.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:b6974bc842baa6bfec31121e798fbe08f8a254a617afbdbc47f166c232070b26", size = 4158396 }, + { url = "https://files.pythonhosted.org/packages/cf/91/13963410e27453e3de97432f29037630c82e806e35eb4d9dc316b102e890/s5cmd-0.2.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6de4ce8d3ee3c92522fcfd98460bece854026b5f43020c59e0a209c8bcdc083a", size = 4744764 }, + { url = "https://files.pythonhosted.org/packages/72/41/beff9ba3da18dfd3757d794d29287a3e2551dda5dfe01a36dee81f1308fd/s5cmd-0.2.0-py3-none-win32.whl", hash = "sha256:2589d2cf6eab6d06fb5dc7e53160daa46c0d5295d971c3ab7567d74001799e44", size = 4867734 }, + { url = "https://files.pythonhosted.org/packages/28/b3/2169c2abf2086f5586e1670a0ce765af24a9b560461ca12ce663e6648618/s5cmd-0.2.0-py3-none-win_amd64.whl", hash = "sha256:8d1b8b08e5aabd81473bc8826d403ffe17d435f8972ec05c0c22b29999fef491", size = 4867738 }, + { url = "https://files.pythonhosted.org/packages/6c/5d/7247fb2deb8857f8cfef16f28b1a79a85042fee19932c56533211c36585a/s5cmd-0.2.0-py3-none-win_arm64.whl", hash = "sha256:1cda970814aa2e15e4add42a3005a1a6ea7bd23212fc704d7273e7372fb228db", size = 4376083 }, +] + +[[package]] +name = "selenium" +version = "4.31.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "trio" }, + { name = "trio-websocket" }, + { name = "typing-extensions" }, + { name = "urllib3", extra = ["socks"] }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/bf/642cce8b5a9edad8e4880fdefbeb24f69bec2086b1121c63f883c412b797/selenium-4.31.0.tar.gz", hash = "sha256:441cffc436a2e6659fe3cfb012692435652efd38b0d368d16f661a5db47825f5", size = 855418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/53/212db779d2481b0a8428365960596f8d5a4d482ae12c441d0507fd54aaf2/selenium-4.31.0-py3-none-any.whl", hash = "sha256:7b8b8d5e424d7133cb7aa656263b19ac505ec26d65c0f921a696e7e2c5ccd95b", size = 9350584 }, +] + [[package]] name = "send2trash" version = "1.8.3" @@ -4108,15 +5012,15 @@ wheels = [ [[package]] name = "sentry-sdk" -version = "2.25.1" +version = "2.26.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/2f/a0f732270cc7c1834f5ec45539aec87c360d5483a8bd788217a9102ccfbd/sentry_sdk-2.25.1.tar.gz", hash = "sha256:f9041b7054a7cf12d41eadabe6458ce7c6d6eea7a97cfe1b760b6692e9562cf0", size = 322190 } +sdist = { url = "https://files.pythonhosted.org/packages/85/26/099631caa51abffb1fd9e08c2138bc6681d3f288a5936c2fc4e054729611/sentry_sdk-2.26.1.tar.gz", hash = "sha256:759e019c41551a21519a95e6cef6d91fb4af1054761923dadaee2e6eca9c02c7", size = 323099 } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/b6/84049ab0967affbc7cc7590d86ae0170c1b494edb69df8786707100420e5/sentry_sdk-2.25.1-py2.py3-none-any.whl", hash = "sha256:60b016d0772789454dc55a284a6a44212044d4a16d9f8448725effee97aaf7f6", size = 339851 }, + { url = "https://files.pythonhosted.org/packages/23/32/0a30b4fafdb3d26d133f99bb566aaa6000004ee7f2c4b72aafea9237ab7e/sentry_sdk-2.26.1-py2.py3-none-any.whl", hash = "sha256:e99390e3f217d13ddcbaeaed08789f1ca614d663b345b9da42e35ad6b60d696a", size = 340558 }, ] [[package]] @@ -4128,6 +5032,49 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/21/f43f0a1fa8b06b32812e0975981f4677d28e0f3271601dc88ac5a5b83220/setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8", size = 1256108 }, ] +[[package]] +name = "shapely" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/fe/3b0d2f828ffaceadcdcb51b75b9c62d98e62dd95ce575278de35f24a1c20/shapely-2.1.0.tar.gz", hash = "sha256:2cbe90e86fa8fc3ca8af6ffb00a77b246b918c7cf28677b7c21489b678f6b02e", size = 313617 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/37/ae448f06f363ff3dfe4bae890abd842c4e3e9edaf01245dbc9b97008c9e6/shapely-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8323031ef7c1bdda7a92d5ddbc7b6b62702e73ba37e9a8ccc8da99ec2c0b87c", size = 1820974 }, + { url = "https://files.pythonhosted.org/packages/78/da/ea2a898e93c6953c5eef353a0e1781a0013a1352f2b90aa9ab0b800e0c75/shapely-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4da7c6cd748d86ec6aace99ad17129d30954ccf5e73e9911cdb5f0fa9658b4f8", size = 1624137 }, + { url = "https://files.pythonhosted.org/packages/64/4a/f903f82f0fabcd3f43ea2e8132cabda079119247330a9fe58018c39c4e22/shapely-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f0cdf85ff80831137067e7a237085a3ee72c225dba1b30beef87f7d396cf02b", size = 2957161 }, + { url = "https://files.pythonhosted.org/packages/92/07/3e2738c542d73182066196b8ce99388cb537d19e300e428d50b1537e3b21/shapely-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f2be5d79aac39886f23000727cf02001aef3af8810176c29ee12cdc3ef3a50", size = 3078530 }, + { url = "https://files.pythonhosted.org/packages/82/08/32210e63d8f8af9142d37c2433ece4846862cdac91a0fe66f040780a71bd/shapely-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:21a4515009f56d7a159cf5c2554264e82f56405b4721f9a422cb397237c5dca8", size = 3902208 }, + { url = "https://files.pythonhosted.org/packages/19/0e/0abb5225f8a32fbdb615476637038a7d2db40c0af46d1bb3a08b869bee39/shapely-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:15cebc323cec2cb6b2eaa310fdfc621f6dbbfaf6bde336d13838fcea76c885a9", size = 4082863 }, + { url = "https://files.pythonhosted.org/packages/f8/1b/7cd816fd388108c872ab7e2930180b02d0c34891213f361e4a66e5e032f2/shapely-2.1.0-cp311-cp311-win32.whl", hash = "sha256:cad51b7a5c8f82f5640472944a74f0f239123dde9a63042b3c5ea311739b7d20", size = 1527488 }, + { url = "https://files.pythonhosted.org/packages/fd/28/7bb5b1944d4002d4b2f967762018500381c3b532f98e456bbda40c3ded68/shapely-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:d4005309dde8658e287ad9c435c81877f6a95a9419b932fa7a1f34b120f270ae", size = 1708311 }, + { url = "https://files.pythonhosted.org/packages/4e/d1/6a9371ec39d3ef08e13225594e6c55b045209629afd9e6d403204507c2a8/shapely-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53e7ee8bd8609cf12ee6dce01ea5affe676976cf7049315751d53d8db6d2b4b2", size = 1830732 }, + { url = "https://files.pythonhosted.org/packages/32/87/799e3e48be7ce848c08509b94d2180f4ddb02e846e3c62d0af33da4d78d3/shapely-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3cab20b665d26dbec0b380e15749bea720885a481fa7b1eedc88195d4a98cfa4", size = 1638404 }, + { url = "https://files.pythonhosted.org/packages/85/00/6665d77f9dd09478ab0993b8bc31668aec4fd3e5f1ddd1b28dd5830e47be/shapely-2.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4a38b39a09340273c3c92b3b9a374272a12cc7e468aeeea22c1c46217a03e5c", size = 2945316 }, + { url = "https://files.pythonhosted.org/packages/34/49/738e07d10bbc67cae0dcfe5a484c6e518a517f4f90550dda2adf3a78b9f2/shapely-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:edaec656bdd9b71278b98e6f77c464b1c3b2daa9eace78012ff0f0b4b5b15b04", size = 3063099 }, + { url = "https://files.pythonhosted.org/packages/88/b8/138098674559362ab29f152bff3b6630de423378fbb0324812742433a4ef/shapely-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c8a732ddd9b25e7a54aa748e7df8fd704e23e5d5d35b7d376d80bffbfc376d04", size = 3887873 }, + { url = "https://files.pythonhosted.org/packages/67/a8/fdae7c2db009244991d86f4d2ca09d2f5ccc9d41c312c3b1ee1404dc55da/shapely-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9c93693ad8adfdc9138a5a2d42da02da94f728dd2e82d2f0f442f10e25027f5f", size = 4067004 }, + { url = "https://files.pythonhosted.org/packages/ed/78/17e17d91b489019379df3ee1afc4bd39787b232aaa1d540f7d376f0280b7/shapely-2.1.0-cp312-cp312-win32.whl", hash = "sha256:d8ac6604eefe807e71a908524de23a37920133a1729fe3a4dfe0ed82c044cbf4", size = 1527366 }, + { url = "https://files.pythonhosted.org/packages/b8/bd/9249bd6dda948441e25e4fb14cbbb5205146b0fff12c66b19331f1ff2141/shapely-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:f4f47e631aa4f9ec5576eac546eb3f38802e2f82aeb0552f9612cb9a14ece1db", size = 1708265 }, + { url = "https://files.pythonhosted.org/packages/8d/77/4e368704b2193e74498473db4461d697cc6083c96f8039367e59009d78bd/shapely-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b64423295b563f43a043eb786e7a03200ebe68698e36d2b4b1c39f31dfb50dfb", size = 1830029 }, + { url = "https://files.pythonhosted.org/packages/71/3c/d888597bda680e4de987316b05ca9db07416fa29523beff64f846503302f/shapely-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1b5578f45adc25b235b22d1ccb9a0348c8dc36f31983e57ea129a88f96f7b870", size = 1637999 }, + { url = "https://files.pythonhosted.org/packages/03/8d/ee0e23b7ef88fba353c63a81f1f329c77f5703835db7b165e7c0b8b7f839/shapely-2.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a7e83d383b27f02b684e50ab7f34e511c92e33b6ca164a6a9065705dd64bcb", size = 2929348 }, + { url = "https://files.pythonhosted.org/packages/d1/a7/5c9cb413e4e2ce52c16be717e94abd40ce91b1f8974624d5d56154c5d40b/shapely-2.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:942031eb4d8f7b3b22f43ba42c09c7aa3d843aa10d5cc1619fe816e923b66e55", size = 3048973 }, + { url = "https://files.pythonhosted.org/packages/84/23/45b90c0bd2157b238490ca56ef2eedf959d3514c7d05475f497a2c88b6d9/shapely-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d2843c456a2e5627ee6271800f07277c0d2652fb287bf66464571a057dbc00b3", size = 3873148 }, + { url = "https://files.pythonhosted.org/packages/c0/bc/ed7d5d37f5395166042576f0c55a12d7e56102799464ba7ea3a72a38c769/shapely-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8c4b17469b7f39a5e6a7cfea79f38ae08a275427f41fe8b48c372e1449147908", size = 4052655 }, + { url = "https://files.pythonhosted.org/packages/c0/8f/a1dafbb10d20d1c569f2db3fb1235488f624dafe8469e8ce65356800ba31/shapely-2.1.0-cp313-cp313-win32.whl", hash = "sha256:30e967abd08fce49513d4187c01b19f139084019f33bec0673e8dbeb557c45e4", size = 1526600 }, + { url = "https://files.pythonhosted.org/packages/e3/f0/9f8cdf2258d7aed742459cea51c70d184de92f5d2d6f5f7f1ded90a18c31/shapely-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:1dc8d4364483a14aba4c844b7bd16a6fa3728887e2c33dfa1afa34a3cf4d08a5", size = 1707115 }, + { url = "https://files.pythonhosted.org/packages/75/ed/32952df461753a65b3e5d24c8efb361d3a80aafaef0b70d419063f6f2c11/shapely-2.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:673e073fea099d1c82f666fb7ab0a00a77eff2999130a69357ce11941260d855", size = 1824847 }, + { url = "https://files.pythonhosted.org/packages/ff/b9/2284de512af30b02f93ddcdd2e5c79834a3cf47fa3ca11b0f74396feb046/shapely-2.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6d1513f915a56de67659fe2047c1ad5ff0f8cbff3519d1e74fced69c9cb0e7da", size = 1631035 }, + { url = "https://files.pythonhosted.org/packages/35/16/a59f252a7e736b73008f10d0950ffeeb0d5953be7c0bdffd39a02a6ba310/shapely-2.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d6a7043178890b9e028d80496ff4c79dc7629bff4d78a2f25323b661756bab8", size = 2968639 }, + { url = "https://files.pythonhosted.org/packages/a5/0a/6a20eca7b0092cfa243117e8e145a58631a4833a0a519ec9b445172e83a0/shapely-2.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb638378dc3d76f7e85b67d7e2bb1366811912430ac9247ac00c127c2b444cdc", size = 3055713 }, + { url = "https://files.pythonhosted.org/packages/fb/44/eeb0c7583b1453d1cf7a319a1d738e08f98a5dc993fa1ef3c372983e4cb5/shapely-2.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:737124e87d91d616acf9a911f74ac55e05db02a43a6a7245b3d663817b876055", size = 3890478 }, + { url = "https://files.pythonhosted.org/packages/5d/6e/37ff3c6af1d408cacb0a7d7bfea7b8ab163a5486e35acb08997eae9d8756/shapely-2.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e6c229e7bb87aae5df82fa00b6718987a43ec168cc5affe095cca59d233f314", size = 4036148 }, + { url = "https://files.pythonhosted.org/packages/c8/6a/8c0b7de3aeb5014a23f06c5e9d3c7852ebcf0d6b00fe660b93261e310e24/shapely-2.1.0-cp313-cp313t-win32.whl", hash = "sha256:a9580bda119b1f42f955aa8e52382d5c73f7957e0203bc0c0c60084846f3db94", size = 1535993 }, + { url = "https://files.pythonhosted.org/packages/a8/91/ae80359a58409d52e4d62c7eacc7eb3ddee4b9135f1db884b6a43cf2e174/shapely-2.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e8ff4e5cfd799ba5b6f37b5d5527dbd85b4a47c65b6d459a03d0962d2a9d4d10", size = 1717777 }, +] + [[package]] name = "shellingham" version = "1.5.4" @@ -4137,6 +5084,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, ] +[[package]] +name = "simple-websocket" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wsproto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b0/d4/bfa032f961103eba93de583b161f0e6a5b63cebb8f2c7d0c6e6efe1e3d2e/simple_websocket-1.1.0.tar.gz", hash = "sha256:7939234e7aa067c534abdab3a9ed933ec9ce4691b0713c78acb195560aa52ae4", size = 17300 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl", hash = "sha256:4af6069630a38ed6c561010f0e11a5bc0d4ca569b36306eb257cd9a192497c8c", size = 13842 }, +] + [[package]] name = "six" version = "1.17.0" @@ -4277,6 +5236,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496 }, ] +[[package]] +name = "sphinx-click" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "docutils" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/0a/5b1e8d0579dbb4ca8114e456ca4a68020bfe8e15c7001f3856be4929ab83/sphinx_click-6.0.0.tar.gz", hash = "sha256:f5d664321dc0c6622ff019f1e1c84e58ce0cecfddeb510e004cf60c2a3ab465b", size = 29574 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/d7/8621c4726ad3f788a1db4c0c409044b16edc563f5c9542807b3724037555/sphinx_click-6.0.0-py3-none-any.whl", hash = "sha256:1e0a3c83bcb7c55497751b19d07ebe56b5d7b85eb76dd399cf9061b497adc317", size = 9922 }, +] + [[package]] name = "sphinx-copybutton" version = "0.5.2" @@ -4705,6 +5678,37 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, ] +[[package]] +name = "trio" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "cffi", marker = "implementation_name != 'pypy' and os_name == 'nt'" }, + { name = "idna" }, + { name = "outcome" }, + { name = "sniffio" }, + { name = "sortedcontainers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/c1/68d582b4d3a1c1f8118e18042464bb12a7c1b75d64d75111b297687041e3/trio-0.30.0.tar.gz", hash = "sha256:0781c857c0c81f8f51e0089929a26b5bb63d57f927728a5586f7e36171f064df", size = 593776 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/8e/3f6dfda475ecd940e786defe6df6c500734e686c9cd0a0f8ef6821e9b2f2/trio-0.30.0-py3-none-any.whl", hash = "sha256:3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5", size = 499194 }, +] + +[[package]] +name = "trio-websocket" +version = "0.12.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "outcome" }, + { name = "trio" }, + { name = "wsproto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/3c/8b4358e81f2f2cfe71b66a267f023a91db20a817b9425dd964873796980a/trio_websocket-0.12.2.tar.gz", hash = "sha256:22c72c436f3d1e264d0910a3951934798dcc5b00ae56fc4ee079d46c7cf20fae", size = 33549 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/19/eb640a397bba49ba49ef9dbe2e7e5c04202ba045b6ce2ec36e9cadc51e04/trio_websocket-0.12.2-py3-none-any.whl", hash = "sha256:df605665f1db533f4a386c94525870851096a223adcb97f72a07e8b4beba45b6", size = 21221 }, +] + [[package]] name = "typer" version = "0.15.2" @@ -4818,6 +5822,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/72/6cb6728e2738c05bbe9bd522d6fc79f86b9a28402f38663e85a28fddd4a0/ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539", size = 42212 }, ] +[[package]] +name = "universal-pathlib" +version = "0.2.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fsspec" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/21/dd871495af3933e585261adce42678dcdf1168c9d6fa0a8f7b6565e54472/universal_pathlib-0.2.6.tar.gz", hash = "sha256:50817aaeaa9f4163cb1e76f5bdf84207fa05ce728b23fd779479b3462e5430ac", size = 175427 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/4d/2e577f6db7aa0f932d19f799c18f604b2b302c65f733419b900ec07dbade/universal_pathlib-0.2.6-py3-none-any.whl", hash = "sha256:700dec2b58ef34b87998513de6d2ae153b22f083197dfafb8544744edabd1b18", size = 50087 }, +] + [[package]] name = "uptime" version = "3.0.1" @@ -4842,6 +5858,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, ] +[package.optional-dependencies] +socks = [ + { name = "pysocks" }, +] + [[package]] name = "uv" version = "0.6.12" @@ -4917,6 +5938,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018 }, ] +[[package]] +name = "vbuild" +version = "0.8.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pscript" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/be/f0c6204a36440bbcc086bfa25964d009b7391c5a3c74d6e73188efd47adb/vbuild-0.8.2.tar.gz", hash = "sha256:270cd9078349d907dfae6c0e6364a5a5e74cb86183bb5093613f12a18b435fa9", size = 8937 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/3d/7b22abbdb059d551507275a2815bc2b1974e3b9f6a13781c1eac9e858965/vbuild-0.8.2-py2.py3-none-any.whl", hash = "sha256:d76bcc976a1c53b6a5776ac947606f9e7786c25df33a587ebe33ed09dd8a1076", size = 9371 }, +] + [[package]] name = "virtualenv" version = "20.30.0" @@ -5159,6 +6192,118 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, ] +[[package]] +name = "wsidicom" +version = "0.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dicomweb-client" }, + { name = "fsspec" }, + { name = "marshmallow" }, + { name = "numpy" }, + { name = "pillow" }, + { name = "pydicom" }, + { name = "universal-pathlib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/ff/9a248d5ec84c7e9f50df4bc00bead18dcf1e63fe5ca55fc5e8f4be466497/wsidicom-0.26.0.tar.gz", hash = "sha256:45435b6ed2e3947f453653bc777491ad050afc1ca9166b66cad8823855042a63", size = 156973 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/5f/005ef39a82762dc797b90f7f54596d8d770bf4d26e5b456310a674fc6bd4/wsidicom-0.26.0-py3-none-any.whl", hash = "sha256:7db2a2a52786e32c9d8de2d83fcd3ee0ff3a7920ea70da484ee295975c741448", size = 231108 }, +] + +[[package]] +name = "wsproto" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226 }, +] + +[[package]] +name = "yarl" +version = "1.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/82/a59d8e21b20ffc836775fa7daedac51d16bb8f3010c4fcb495c4496aa922/yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3", size = 145178 }, + { url = "https://files.pythonhosted.org/packages/ba/81/315a3f6f95947cfbf37c92d6fbce42a1a6207b6c38e8c2b452499ec7d449/yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a", size = 96859 }, + { url = "https://files.pythonhosted.org/packages/ad/17/9b64e575583158551b72272a1023cdbd65af54fe13421d856b2850a6ddb7/yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2", size = 94647 }, + { url = "https://files.pythonhosted.org/packages/2c/29/8f291e7922a58a21349683f6120a85701aeefaa02e9f7c8a2dc24fe3f431/yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e", size = 355788 }, + { url = "https://files.pythonhosted.org/packages/26/6d/b4892c80b805c42c228c6d11e03cafabf81662d371b0853e7f0f513837d5/yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9", size = 344613 }, + { url = "https://files.pythonhosted.org/packages/d7/0e/517aa28d3f848589bae9593717b063a544b86ba0a807d943c70f48fcf3bb/yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a", size = 370953 }, + { url = "https://files.pythonhosted.org/packages/5f/9b/5bd09d2f1ad6e6f7c2beae9e50db78edd2cca4d194d227b958955573e240/yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2", size = 369204 }, + { url = "https://files.pythonhosted.org/packages/9c/85/d793a703cf4bd0d4cd04e4b13cc3d44149470f790230430331a0c1f52df5/yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2", size = 358108 }, + { url = "https://files.pythonhosted.org/packages/6f/54/b6c71e13549c1f6048fbc14ce8d930ac5fb8bafe4f1a252e621a24f3f1f9/yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8", size = 346610 }, + { url = "https://files.pythonhosted.org/packages/a0/1a/d6087d58bdd0d8a2a37bbcdffac9d9721af6ebe50d85304d9f9b57dfd862/yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902", size = 365378 }, + { url = "https://files.pythonhosted.org/packages/02/84/e25ddff4cbc001dbc4af76f8d41a3e23818212dd1f0a52044cbc60568872/yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791", size = 356919 }, + { url = "https://files.pythonhosted.org/packages/04/76/898ae362353bf8f64636495d222c8014c8e5267df39b1a9fe1e1572fb7d0/yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f", size = 364248 }, + { url = "https://files.pythonhosted.org/packages/1b/b0/9d9198d83a622f1c40fdbf7bd13b224a6979f2e1fc2cf50bfb1d8773c495/yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da", size = 378418 }, + { url = "https://files.pythonhosted.org/packages/c7/ce/1f50c1cc594cf5d3f5bf4a9b616fca68680deaec8ad349d928445ac52eb8/yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4", size = 383850 }, + { url = "https://files.pythonhosted.org/packages/89/1e/a59253a87b35bfec1a25bb5801fb69943330b67cfd266278eb07e0609012/yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5", size = 381218 }, + { url = "https://files.pythonhosted.org/packages/85/b0/26f87df2b3044b0ef1a7cf66d321102bdca091db64c5ae853fcb2171c031/yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6", size = 86606 }, + { url = "https://files.pythonhosted.org/packages/33/46/ca335c2e1f90446a77640a45eeb1cd8f6934f2c6e4df7db0f0f36ef9f025/yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb", size = 93374 }, + { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089 }, + { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706 }, + { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719 }, + { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972 }, + { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639 }, + { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745 }, + { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178 }, + { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219 }, + { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266 }, + { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873 }, + { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524 }, + { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370 }, + { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297 }, + { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771 }, + { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000 }, + { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355 }, + { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904 }, + { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030 }, + { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894 }, + { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457 }, + { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070 }, + { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739 }, + { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338 }, + { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636 }, + { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061 }, + { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150 }, + { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207 }, + { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277 }, + { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990 }, + { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684 }, + { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599 }, + { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573 }, + { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051 }, + { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742 }, + { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575 }, + { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121 }, + { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815 }, + { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231 }, + { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221 }, + { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400 }, + { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714 }, + { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279 }, + { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044 }, + { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236 }, + { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034 }, + { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943 }, + { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058 }, + { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792 }, + { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242 }, + { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816 }, + { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093 }, + { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124 }, +] + [[package]] name = "zipp" version = "3.21.0" diff --git a/watch_gui.py b/watch_gui.py new file mode 100644 index 00000000..36da0592 --- /dev/null +++ b/watch_gui.py @@ -0,0 +1,6 @@ +"""Graphical User Interface (GUI) of Aignostics Python SDK.""" + +from aignostics.utils import gui_run + +# For development run via `uv run watch_gui.py` +gui_run(native=False, show=True, watch=True) From 34116d2bd0c250402da70015b53cce8df618460d Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Fri, 25 Apr 2025 00:06:01 +0200 Subject: [PATCH 101/110] chore: Add scheduled test for HETA --- API_REFERENCE_v1.md | 3180 ++++++++++------ ATTRIBUTIONS.md | 4085 +-------------------- CLI_REFERENCE.md | 2 +- docs/source/_static/openapi_v1.json | 1 - docs/source/_static/openapi_v1.yaml | 1 - tests/aignostics/client/scheduled_test.py | 136 +- 6 files changed, 2337 insertions(+), 5068 deletions(-) diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md index 86e425dc..8425b45f 100644 --- a/API_REFERENCE_v1.md +++ b/API_REFERENCE_v1.md @@ -1,1119 +1,2063 @@ # API v1 Reference ---- -title: is chosen, and which user data -language_tabs: -toc_footers: [] -includes: [] -search: true -highlight_theme: darkula ---- - - - - - - - - - - - h-e-tme - title: Application Id - type: string - description: - description: Application documentations - title: Description - type: string - name: - description: Application display name - examples: - - HETA - title: Name - type: string - regulatory_classes: - description: Regulatory class, to which the applications compliance - examples: - - - RuO - items: - type: string - title: Regulatory Classes - type: array - required: - - application_id - - name - - regulatory_classes - - description - title: ApplicationReadResponse - type: object - ApplicationRunStatus: - enum: - - canceled_system - - canceled_user - - completed - - completed_with_error - - received - - rejected - - running - - scheduled - title: ApplicationRunStatus - type: string - ApplicationVersionReadResponse: - properties: - application_id: - description: Application ID - title: Application Id - type: string - application_version_id: - description: Application version ID - examples: - - h-e-tme:v0.0.1 - title: Application Version Id - type: string - changelog: - description: Description of the changes relative to the previous version - title: Changelog - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - description: Flow ID, used internally by the platform - title: Flow Id - input_artifacts: - description: List of the input fields, provided by the User - items: - $ref: '#/components/schemas/InputArtifactReadResponse' - title: Input Artifacts - type: array - output_artifacts: - description: List of the output fields, generated by the application - items: - $ref: '#/components/schemas/OutputArtifactReadResponse' - title: Output Artifacts - type: array - version: - description: Semantic version of the application - title: Version - type: string - required: - - application_version_id - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - title: ApplicationVersionReadResponse - type: object - HTTPValidationError: - properties: - detail: - items: - $ref: '#/components/schemas/ValidationError' - title: Detail - type: array - title: HTTPValidationError - type: object - InputArtifactCreationRequest: - properties: - download_url: - description: '[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) - to the input artifact file. The URL should be valid for at least 6 days - from the payload submission time.' - examples: - - https://example.com/case-no-1-slide.tiff - format: uri - maxLength: 2083 - minLength: 1 - title: Download Url - type: string - metadata: - description: The metadata of the artifact, required by the application version. - The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. - The schema is located in `input_artifacts.[].metadata_schema` - examples: - - checksum_crc32c: 752f9554 - height: 2000 - height_mpp: 0.5 - width: 10000 - width_mpp: 0.5 - title: Metadata - type: object - name: - description: The artifact name according to the application version. List - of required artifacts is returned by `/v1/versions/{application_version_id}`. - The artifact names are located in the `input_artifacts.[].name` value - examples: - - slide - title: Name - type: string - required: - - name - - download_url - - metadata - title: InputArtifactCreationRequest - type: object - InputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactReadResponse - type: object - ItemCreationRequest: - properties: - input_artifacts: - description: All the input files of the item, required by the application - version - items: - $ref: '#/components/schemas/InputArtifactCreationRequest' - title: Input Artifacts - type: array - reference: - description: The ID of the slide provided by the caller. The reference should - be unique across all items of the application run - examples: - - case-no-1 - title: Reference - type: string - required: - - reference - - input_artifacts - title: ItemCreationRequest - type: object - ItemResultReadResponse: - properties: - application_run_id: - description: Application run UUID to which the item belongs - format: uuid - title: Application Run Id - type: string - error: - anyOf: - - type: string - - type: 'null' - description: "\nThe error message in case the item is in `error_system`\ - \ or `error_user` state\n " - title: Error - item_id: - description: Item UUID generated by the Platform - format: uuid - title: Item Id - type: string - output_artifacts: - description: "\nThe list of the results generated by the application algorithm.\ - \ The number of files and their\ntypes depend on the particular application\ - \ version, call `/v1/versions/{version_id}` to get\nthe details.\n " - items: - $ref: '#/components/schemas/OutputArtifactResultReadResponse' - title: Output Artifacts - type: array - reference: - description: The reference of the item from the user payload - title: Reference - type: string - status: - $ref: '#/components/schemas/ItemStatus' - description: "\nWhen the item is not processed yet, the status is set to\ - \ `pending`.\n\nWhen the item is successfully finished, status is set\ - \ to `succeeded`, and the processing results\nbecome available for download\ - \ in `output_artifacts` field.\n\nWhen the item processing is failed because\ - \ the provided item is invalid, the status is set to\n`error_user`. When\ - \ the item processing failed because of the error in the model or platform,\n\ - the status is set to `error_system`. When the application_run is canceled,\ - \ the status of all\npending items is set to either `cancelled_user` or\ - \ `cancelled_system`.\n " - required: - - item_id - - application_run_id - - reference - - status - - error - - output_artifacts - title: ItemResultReadResponse - type: object - ItemStatus: - enum: - - pending - - canceled_user - - canceled_system - - error_user - - error_system - - succeeded - title: ItemStatus - type: string - OutputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - required: - - name - - mime_type - - metadata_schema - - scope - title: OutputArtifactReadResponse - type: object - OutputArtifactResultReadResponse: - properties: - download_url: - anyOf: - - format: uri - maxLength: 2083 - minLength: 1 - type: string - - type: 'null' - description: "\nThe download URL to the output file. The URL is valid for\ - \ 1 hour after the endpoint is called.\nA new URL is generated every time\ - \ the endpoint is called.\n " - title: Download Url - metadata: - description: The metadata of the output artifact, provided by the application - title: Metadata - type: object - mime_type: - description: The mime type of the output file - examples: - - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - description: "\nName of the output from the output schema from the `/v1/versions/{version_id}`\ - \ endpoint.\n " - title: Name - type: string - output_artifact_id: - description: The Id of the artifact. Used internally - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - name - - mime_type - - metadata - - download_url - title: OutputArtifactResultReadResponse - type: object - OutputArtifactScope: - enum: - - item - - global - title: OutputArtifactScope - type: string - PayloadInputArtifact: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - input_artifact_id: - format: uuid - title: Input Artifact Id - type: string - metadata: - title: Metadata - type: object - required: - - metadata - - download_url - title: PayloadInputArtifact - type: object - PayloadItem: - properties: - input_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadInputArtifact' - title: Input Artifacts - type: object - item_id: - format: uuid - title: Item Id - type: string - output_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - title: Output Artifacts - type: object - required: - - item_id - - input_artifacts - - output_artifacts - title: PayloadItem - type: object - PayloadOutputArtifact: - properties: - data: - $ref: '#/components/schemas/TransferUrls' - metadata: - $ref: '#/components/schemas/TransferUrls' - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - data - - metadata - title: PayloadOutputArtifact - type: object - RunCreationRequest: - description: 'Application run payload. It describes which application version - is chosen, and which user data - -> 2025-04-22 08:54:57 INFO aignostics.aignostics.utils.boot ⭐ Booting aignostics v0.0.10 (project root /Users/helmut/Code/python-sdk, pid 13186), parent 'python3.13' (pid 11950) boot.py:84 - -> components: - -> schemas: - -> ApplicationReadResponse: - -> properties: - -> application_id: - -> description: Application ID - -> examples: - - should be processed.' - properties: - application_version_id: - description: Application version ID - examples: - - h-e-tme:v1.2.3 - title: Application Version Id - type: string - items: - description: List of the items to process by the application - items: - $ref: '#/components/schemas/ItemCreationRequest' - title: Items - type: array - required: - - application_version_id - - items - title: RunCreationRequest - type: object - RunCreationResponse: - properties: - application_run_id: - default: Application run id - format: uuid - title: Application Run Id - type: string - title: RunCreationResponse - type: object - RunReadResponse: - properties: - application_run_id: - description: UUID of the application - format: uuid - title: Application Run Id - type: string - application_version_id: - description: ID of the application version - title: Application Version Id - type: string - organization_id: - description: Organization of the owner of the application run - title: Organization Id - type: string - status: - $ref: '#/components/schemas/ApplicationRunStatus' - description: "\nWhen the application run request is received by the Platform,\ - \ the `status` of it is set to\n`received`. Then it is transitioned to\ - \ `scheduled`, when it is scheduled for the processing.\nWhen the application\ - \ run is scheduled, it will process the input items and generate the result\n\ - incrementally. As soon as the first result is generated, the state is\ - \ changed to `running`.\nThe results can be downloaded via `/v1/runs/{run_id}/results`\ - \ endpoint.\nWhen all items are processed and all results are generated,\ - \ the application status is set to\n`completed`. If the processing is\ - \ done, but some items fail, the status is set to\n`completed_with_error`.\n\ - \nWhen the application run request is rejected by the Platform before\ - \ scheduling, it is transferred\nto `rejected`. When the application run\ - \ reaches the threshold of number of failed items, the whole\napplication\ - \ run is set to `canceled_system` and the remaining pending items are\ - \ not processed.\nWhen the application run fails, the finished item results\ - \ are available for download.\n\nIf the application run is canceled by\ - \ calling `POST /v1/runs/{run_id}/cancel` endpoint, the\nprocessing of\ - \ the items is stopped, and the application status is set to `cancelled_user`\n\ - \ " - triggered_at: - description: Timestamp showing when the application run was triggered - format: date-time - title: Triggered At - type: string - triggered_by: - description: Id of the user who triggered the application run - title: Triggered By - type: string - user_payload: - anyOf: - - $ref: '#/components/schemas/UserPayload' - - type: 'null' - description: Field used internally by the Platform - required: - - application_run_id - - application_version_id - - organization_id - - status - - triggered_at - - triggered_by - title: RunReadResponse - type: object - TransferUrls: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - upload_url: - format: uri - minLength: 1 - title: Upload Url - type: string - required: - - upload_url - - download_url - title: TransferUrls - type: object - UserPayload: - properties: - application_id: - title: Application Id - type: string - application_run_id: - format: uuid - title: Application Run Id - type: string - global_output_artifacts: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - type: object - - type: 'null' - title: Global Output Artifacts - items: - items: - $ref: '#/components/schemas/PayloadItem' - title: Items - type: array - required: - - application_id - - application_run_id - - global_output_artifacts - - items - title: UserPayload - type: object - ValidationError: - properties: - loc: - items: - anyOf: - - type: string - - type: integer - title: Location - type: array - msg: - title: Message - type: string - type: - title: Error Type - type: string - required: - - loc - - msg - - type - title: ValidationError - type: object - securitySchemes: - OAuth2AuthorizationCodeBearer: - flows: - authorizationCode: - authorizationUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize - scopes: {} - tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token - type: oauth2 -info: - description: ' - - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. - - The `sort` query parameter can be provided multiple times. The sorting direction - can be indicated via - - `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`.' - title: Aignostics Platform API reference - version: 1.0.0 -openapi: 3.1.0 -paths: - /v1/applications: - get: - description: 'Returns the list of the applications, available to the caller. - - - The application is available if any of the version of the application is assigned - to the - - user organization. To switch between organizations, the user should re-login - and choose the - - needed organization.' - operationId: list_applications_v1_applications_get - parameters: - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationReadResponse' - title: Response List Applications V1 Applications Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Applications - tags: - - Public - /v1/applications/{application_id}/versions: - get: - description: 'Returns the list of the application versions for this application, - available to the caller. - - - The application version is available if it is assigned to the user''s organization. - - - The application versions are assigned to the organization by the Aignostics - admin. To - - assign or unassign a version from your organization, please contact Aignostics - support team.' - operationId: list_versions_by_application_id_v1_applications__application_id__versions_get - parameters: - - in: path - name: application_id - required: true - schema: - title: Application Id - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications Application - Id Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Versions By Application Id - tags: - - Public - /v1/runs: - get: - description: 'The endpoint returns the application runs triggered by the caller. - After the application run - - is created by POST /v1/runs, it becomes available for the current endpoint' - operationId: list_application_runs_v1_runs_get - parameters: - - description: Optional application ID filter - in: query - name: application_id - required: false - schema: - anyOf: - - type: string - - type: 'null' - description: Optional application ID filter - title: Application Id - - description: Optional application version filter - in: query - name: application_version - required: false - schema: - anyOf: - - type: string - - type: 'null' - description: Optional application version filter - title: Application Version - - description: Request optional output values. Used internally by the platform - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - description: Request optional output values. Used internally by the platform - title: Include - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/RunReadResponse' - title: Response List Application Runs V1 Runs Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Application Runs - tags: - - Public - post: - description: "The endpoint is used to process the input items by the chosen\ - \ application version. The endpoint\nreturns the `application_run_id`. The\ - \ processing fo the items is done asynchronously.\n\nTo check the status or\ - \ cancel the execution, use the /v1/runs/{application_run_id} endpoint.\n\n\ - ### Payload\n\nThe payload includes `application_version_id` and `items` base\ - \ fields.\n\n`application_version_id` is the id used for `/v1/versions/{application_id}`\ - \ endpoint.\n\n`items` includes the list of the items to process (slides,\ - \ in case of HETA application).\nEvery item has a set of standard fields defined\ - \ by the API, plus the metadata, specific to the\nchosen application.\n\n\ - Example payload structure with the comments:\n```\n{\n application_version_id:\ - \ \"heta:v1.0.0\",\n items: [{\n \"reference\": \"slide_1\" <--\ - \ Input ID to connect the input and the output artifact\n \"input_artifacts\"\ - : [{\n \"name\": \"input_slide\" <-- Name of the artifact defined\ - \ by the application (For HETA it is\"input_slide\")\n \"download_url\"\ - : \"https://...\" <-- signed URL to the input file in the S3 or GCS. Should\ - \ be valid for more than 6 days\n \"metadata\": { <-- The metadata\ - \ fields defined by the application. (The example fields set for a slide files\ - \ are provided)\n \"checksum_crc32c\": \"abc12==\",\n \ - \ \"mime_type\": \"image/tiff\",\n \"height\": 100,\n\ - \ \"weight\": 500,\n \"mpp\": 0.543\n \ - \ }\n }]\n }]\n}\n```\n\n### Response\n\nThe endpoint returns\ - \ the application run UUID. After that the job is scheduled for the\nexecution\ - \ in the background.\n\nTo check the status of the run call `v1/runs/{application_run_id}`.\n\ - \n### Rejection\n\nApart from the authentication, authorization and malformed\ - \ input error, the request can be\nrejected when the quota limit is exceeded.\ - \ More details on quotas is described in the\ndocumentation" - operationId: create_application_run_v1_runs_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Create Application Run - tags: - - Public - /v1/runs/{application_run_id}: - get: - description: 'Returns the details of the application run. The application run - is available as soon as it is - - created via `POST /runs/` endpoint. To download the items results, call - - `/runs/{application_run_id}/results`. - - - The application is only available to the user who triggered it, regardless - of the role.' - operationId: get_run_v1_runs__application_run_id__get - parameters: - - description: Application run id, returned by `POST /runs/` endpoint - in: path - name: application_run_id - required: true - schema: - description: Application run id, returned by `POST /runs/` endpoint - format: uuid - title: Application Run Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/RunReadResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get Run - tags: - - Public - /v1/runs/{application_run_id}/cancel: - post: - description: 'The application run can be canceled by the user who created the - application run. - - - The execution can be canceled any time while the application is not in a final - state. The - - pending items will not be processed and will not add to the cost. - - - When the application is canceled, the already completed items stay available - for download.' - operationId: cancel_application_run_v1_runs__application_run_id__cancel_post - parameters: - - description: Application run id, returned by `POST /runs/` endpoint - in: path - name: application_run_id - required: true - schema: - description: Application run id, returned by `POST /runs/` endpoint - format: uuid - title: Application Run Id - type: string - responses: - '202': - content: - application/json: - schema: {} - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Cancel Application Run - tags: - - Public - /v1/runs/{application_run_id}/results: - delete: - description: 'Delete the application run results. It can only be called when - the application is in a final - - state (meaning it''s not in `received` or `pending` states). To delete the - results of the running - - artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel - the application run. - - - The output results are deleted automatically 30 days after the application - run is finished.' - operationId: delete_application_run_results_v1_runs__application_run_id__results_delete - parameters: - - description: Application run id, returned by `POST /runs/` endpoint - in: path - name: application_run_id - required: true - schema: - description: Application run id, returned by `POST /runs/` endpoint - format: uuid - title: Application Run Id - type: string - responses: - '204': - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Delete Application Run Results - tags: - - Public - get: - description: Get the list of the results for the run items - operationId: list_run_results_v1_runs__application_run_id__results_get - parameters: - - description: Application run id, returned by `POST /runs/` endpoint - in: path - name: application_run_id - required: true - schema: - description: Application run id, returned by `POST /runs/` endpoint - format: uuid - title: Application Run Id - type: string - - description: Filter for items ids - in: query - name: item_id__in - required: false - schema: - anyOf: - - items: - format: uuid - type: string - type: array - - type: 'null' - description: Filter for items ids - title: Item Id In - - description: Filter for items by their reference from the input payload - in: query - name: reference__in - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - description: Filter for items by their reference from the input payload - title: Reference In - - description: Filter for items in certain statuses - in: query - name: status__in - required: false - schema: - anyOf: - - items: - $ref: '#/components/schemas/ItemStatus' - type: array - - type: 'null' - description: Filter for items in certain statuses - title: Status In - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id Results - Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Run Results - tags: - - Public -servers: -- url: /api +## Aignostics Platform API reference v1.0.0 + +> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. +The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via +`+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. + +Base URLs: + +* [/api](/api) + +## Authentication + +- oAuth2 authentication. + + - Flow: authorizationCode + - Authorization URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize) + - Token URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token) + +|Scope|Scope Description| +|---|---| + +## Public + +### list_applications_v1_applications_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/api/v1/applications', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/applications', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications` + +*List Applications* + +Returns the list of the applications, available to the caller. + +The application is available if any of the version of the application is assigned to the +user organization. To switch between organizations, the user should re-login and choose the +needed organization. + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "h-e-tme", + "description": "string", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ] + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Applications V1 Applications Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Applications V1 Applications Get|[[ApplicationReadResponse](#schemaapplicationreadresponse)]|false|none|none| +|» ApplicationReadResponse|[ApplicationReadResponse](#schemaapplicationreadresponse)|false|none|none| +|»» application_id|string|true|none|Application ID| +|»» description|string|true|none|Application documentations| +|»» name|string|true|none|Application display name| +|»» regulatory_classes|[string]|true|none|Regulatory class, to which the applications compliance| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### list_versions_by_application_id_v1_applications__application_id__versions_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/api/v1/applications/{application_id}/versions', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/applications/{application_id}/versions', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_id}/versions` + +*List Versions By Application Id* + +Returns the list of the application versions for this application, available to the caller. + +The application version is available if it is assigned to the user's organization. + +The application versions are assigned to the organization by the Aignostics admin. To +assign or unassign a version from your organization, please contact Aignostics support team. + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|path|string|true|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|version|query|any|false|none| +|include|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "string", + "application_version_id": "h-e-tme:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Versions By Application Id V1 Applications Application Id Versions Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| +|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| +|»» application_id|string|true|none|Application ID| +|»» application_version_id|string|true|none|Application version ID| +|»» changelog|string|true|none|Description of the changes relative to the previous version| +|»» flow_id|any|false|none|Flow ID, used internally by the platform| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string(uuid)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|List of the input fields, provided by the User| +|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|List of the output fields, generated by the application| +|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|»» version|string|true|none|Semantic version of the application| + +##### Enumerated Values + +|Property|Value| +|---|---| +|scope|item| +|scope|global| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### list_application_runs_v1_runs_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/api/v1/runs', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/runs', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs` + +*List Application Runs* + +The endpoint returns the application runs triggered by the caller. After the application run +is created by POST /v1/runs, it becomes available for the current endpoint + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|query|any|false|Optional application ID filter| +|application_version|query|any|false|Optional application version filter| +|include|query|any|false|Request optional output values. Used internally by the platform| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "string", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "string", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Application Runs V1 Runs Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Application Runs V1 Runs Get|[[RunReadResponse](#schemarunreadresponse)]|false|none|none| +|» RunReadResponse|[RunReadResponse](#schemarunreadresponse)|false|none|none| +|»» application_run_id|string(uuid)|true|none|UUID of the application| +|»» application_version_id|string|true|none|ID of the application version| +|»» organization_id|string|true|none|Organization of the owner of the application run| +|»» status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| +|»» triggered_at|string(date-time)|true|none|Timestamp showing when the application run was triggered| +|»» triggered_by|string|true|none|Id of the user who triggered the application run| +|»» user_payload|any|false|none|Field used internally by the Platform| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| +|»»»» application_id|string|true|none|none| +|»»»» application_run_id|string(uuid)|true|none|none| +|»»»» global_output_artifacts|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|object|false|none|none| +|»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| +|»»»»»»» data|[TransferUrls](#schematransferurls)|true|none|none| +|»»»»»»»» download_url|string(uri)|true|none|none| +|»»»»»»»» upload_url|string(uri)|true|none|none| +|»»»»»»» metadata|[TransferUrls](#schematransferurls)|true|none|none| +|»»»»»»» output_artifact_id|string(uuid)|true|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»» items|[[PayloadItem](#schemapayloaditem)]|true|none|none| +|»»»»» PayloadItem|[PayloadItem](#schemapayloaditem)|false|none|none| +|»»»»»» input_artifacts|object|true|none|none| +|»»»»»»» PayloadInputArtifact|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| +|»»»»»»»» download_url|string(uri)|true|none|none| +|»»»»»»»» input_artifact_id|string(uuid)|false|none|none| +|»»»»»»»» metadata|object|true|none|none| +|»»»»»» item_id|string(uuid)|true|none|none| +|»»»»»» output_artifacts|object|true|none|none| +|»»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|status|canceled_system| +|status|canceled_user| +|status|completed| +|status|completed_with_error| +|status|received| +|status|rejected| +|status|running| +|status|scheduled| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### create_application_run_v1_runs_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.post('/api/v1/runs', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "application_version_id": "h-e-tme:v1.2.3", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/runs', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/runs` + +*Create Application Run* + +The endpoint is used to process the input items by the chosen application version. The endpoint +returns the `application_run_id`. The processing fo the items is done asynchronously. + +To check the status or cancel the execution, use the /v1/runs/{application_run_id} endpoint. + +#### Payload + +The payload includes `application_version_id` and `items` base fields. + +`application_version_id` is the id used for `/v1/versions/{application_id}` endpoint. + +`items` includes the list of the items to process (slides, in case of HETA application). +Every item has a set of standard fields defined by the API, plus the metadata, specific to the +chosen application. + +Example payload structure with the comments: +``` +{ + application_version_id: "heta:v1.0.0", + items: [{ + "reference": "slide_1" Body parameter + +```json +{ + "application_version_id": "h-e-tme:v1.2.3", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[RunCreationRequest](#schemaruncreationrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "application_run_id": "Application run id" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[RunCreationResponse](#schemaruncreationresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### get_run_v1_runs__application_run_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/api/v1/runs/{application_run_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/runs/{application_run_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs/{application_run_id}` + +*Get Run* + +Returns the details of the application run. The application run is available as soon as it is +created via `POST /runs/` endpoint. To download the items results, call +`/runs/{application_run_id}/results`. + +The application is only available to the user who triggered it, regardless of the role. + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| +|include|query|any|false|none| + +> Example responses + +> 200 Response + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "string", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "string", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[RunReadResponse](#schemarunreadresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### cancel_application_run_v1_runs__application_run_id__cancel_post + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.post('/api/v1/runs/{application_run_id}/cancel', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/runs/{application_run_id}/cancel', +{ + method: 'POST', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/runs/{application_run_id}/cancel` + +*Cancel Application Run* + +The application run can be canceled by the user who created the application run. + +The execution can be canceled any time while the application is not in a final state. The +pending items will not be processed and will not add to the cost. + +When the application is canceled, the already completed items stay available for download. + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| + +> Example responses + +> 202 Response + +```json +null +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### delete_application_run_results_v1_runs__application_run_id__results_delete + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.delete('/api/v1/runs/{application_run_id}/results', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/runs/{application_run_id}/results', +{ + method: 'DELETE', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`DELETE /v1/runs/{application_run_id}/results` + +*Delete Application Run Results* + +Delete the application run results. It can only be called when the application is in a final +state (meaning it's not in `received` or `pending` states). To delete the results of the running +artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel the application run. + +The output results are deleted automatically 30 days after the application run is finished. + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| + +> Example responses + +> 422 Response + +```json +{ + "detail": [ + { + "loc": [ + "string" + ], + "msg": "string", + "type": "string" + } + ] +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|Successful Response|None| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### list_run_results_v1_runs__application_run_id__results_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/api/v1/runs/{application_run_id}/results', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/runs/{application_run_id}/results', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs/{application_run_id}/results` + +*List Run Results* + +Get the list of the results for the run items + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| +|item_id__in|query|any|false|Filter for items ids| +|reference__in|query|any|false|Filter for items by their reference from the input payload| +|status__in|query|any|false|Filter for items in certain statuses| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": [ + { + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + ], + "reference": "string", + "status": "pending" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Run Results V1 Runs Application Run Id Results Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Run Results V1 Runs Application Run Id Results Get|[[ItemResultReadResponse](#schemaitemresultreadresponse)]|false|none|none| +|» ItemResultReadResponse|[ItemResultReadResponse](#schemaitemresultreadresponse)|false|none|none| +|»» application_run_id|string(uuid)|true|none|Application run UUID to which the item belongs| +|»» error|any|true|none|The error message in case the item is in `error_system` or `error_user` state| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» item_id|string(uuid)|true|none|Item UUID generated by the Platform| +|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|The list of the results generated by the application algorithm. The number of files and theirtypes depend on the particular application version, call `/v1/versions/{version_id}` to getthe details.| +|»»» OutputArtifactResultReadResponse|[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)|false|none|none| +|»»»» download_url|any|true|none|The download URL to the output file. The URL is valid for 1 hour after the endpoint is called.A new URL is generated every time the endpoint is called.| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|string(uri)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»» metadata|object|true|none|The metadata of the output artifact, provided by the application| +|»»»» mime_type|string|true|none|The mime type of the output file| +|»»»» name|string|true|none|Name of the output from the output schema from the `/v1/versions/{version_id}` endpoint.| +|»»»» output_artifact_id|string(uuid)|true|none|The Id of the artifact. Used internally| +|»» reference|string|true|none|The reference of the item from the user payload| +|»» status|[ItemStatus](#schemaitemstatus)|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|status|pending| +|status|canceled_user| +|status|canceled_system| +|status|error_user| +|status|error_system| +|status|succeeded| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +## Schemas + +### ApplicationReadResponse + + + + + + +```json +{ + "application_id": "h-e-tme", + "description": "string", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ] +} + +``` + +ApplicationReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string|true|none|Application ID| +|description|string|true|none|Application documentations| +|name|string|true|none|Application display name| +|regulatory_classes|[string]|true|none|Regulatory class, to which the applications compliance| + +### ApplicationRunStatus + + + + + + +```json +"canceled_system" + +``` + +ApplicationRunStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ApplicationRunStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ApplicationRunStatus|canceled_system| +|ApplicationRunStatus|canceled_user| +|ApplicationRunStatus|completed| +|ApplicationRunStatus|completed_with_error| +|ApplicationRunStatus|received| +|ApplicationRunStatus|rejected| +|ApplicationRunStatus|running| +|ApplicationRunStatus|scheduled| + +### ApplicationVersionReadResponse + + + + + + +```json +{ + "application_id": "string", + "application_version_id": "h-e-tme:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" +} + +``` + +ApplicationVersionReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string|true|none|Application ID| +|application_version_id|string|true|none|Application version ID| +|changelog|string|true|none|Description of the changes relative to the previous version| +|flow_id|any|false|none|Flow ID, used internally by the platform| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|List of the input fields, provided by the User| +|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|List of the output fields, generated by the application| +|version|string|true|none|Semantic version of the application| + +### HTTPValidationError + + + + + + +```json +{ + "detail": [ + { + "loc": [ + "string" + ], + "msg": "string", + "type": "string" + } + ] +} + +``` + +HTTPValidationError + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|detail|[[ValidationError](#schemavalidationerror)]|false|none|none| + +### InputArtifactCreationRequest + + + + + + +```json +{ + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" +} + +``` + +InputArtifactCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) to the input artifact file. The URL should be valid for at least 6 days from the payload submission time.| +|metadata|object|true|none|The metadata of the artifact, required by the application version. The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. The schema is located in `input_artifacts.[].metadata_schema`| +|name|string|true|none|The artifact name according to the application version. List of required artifacts is returned by `/v1/versions/{application_version_id}`. The artifact names are located in the `input_artifacts.[].name` value| + +### InputArtifactReadResponse + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" +} + +``` + +InputArtifactReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### ItemCreationRequest + + + + + + +```json +{ + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" +} + +``` + +ItemCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|All the input files of the item, required by the application version| +|reference|string|true|none|The ID of the slide provided by the caller. The reference should be unique across all items of the application run| + +### ItemResultReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": [ + { + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + ], + "reference": "string", + "status": "pending" +} + +``` + +ItemResultReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|Application run UUID to which the item belongs| +|error|any|true|none|The error message in case the item is in `error_system` or `error_user` state| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|item_id|string(uuid)|true|none|Item UUID generated by the Platform| +|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|The list of the results generated by the application algorithm. The number of files and theirtypes depend on the particular application version, call `/v1/versions/{version_id}` to getthe details.| +|reference|string|true|none|The reference of the item from the user payload| +|status|[ItemStatus](#schemaitemstatus)|true|none|When the item is not processed yet, the status is set to `pending`.When the item is successfully finished, status is set to `succeeded`, and the processing resultsbecome available for download in `output_artifacts` field.When the item processing is failed because the provided item is invalid, the status is set to`error_user`. When the item processing failed because of the error in the model or platform,the status is set to `error_system`. When the application_run is canceled, the status of allpending items is set to either `cancelled_user` or `cancelled_system`.| + +### ItemStatus + + + + + + +```json +"pending" + +``` + +ItemStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ItemStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ItemStatus|pending| +|ItemStatus|canceled_user| +|ItemStatus|canceled_system| +|ItemStatus|error_user| +|ItemStatus|error_system| +|ItemStatus|succeeded| + +### OutputArtifactReadResponse + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" +} + +``` + +OutputArtifactReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| + +### OutputArtifactResultReadResponse + + + + + + +```json +{ + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" +} + +``` + +OutputArtifactResultReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|any|true|none|The download URL to the output file. The URL is valid for 1 hour after the endpoint is called.A new URL is generated every time the endpoint is called.| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uri)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata|object|true|none|The metadata of the output artifact, provided by the application| +|mime_type|string|true|none|The mime type of the output file| +|name|string|true|none|Name of the output from the output schema from the `/v1/versions/{version_id}` endpoint.| +|output_artifact_id|string(uuid)|true|none|The Id of the artifact. Used internally| + +### OutputArtifactScope + + + + + + +```json +"item" + +``` + +OutputArtifactScope + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|OutputArtifactScope|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|OutputArtifactScope|item| +|OutputArtifactScope|global| + +### PayloadInputArtifact + + + + + + +```json +{ + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} +} + +``` + +PayloadInputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|input_artifact_id|string(uuid)|false|none|none| +|metadata|object|true|none|none| + +### PayloadItem + + + + + + +```json +{ + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } +} + +``` + +PayloadItem + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|object|true|none|none| +|» **additionalProperties**|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| +|item_id|string(uuid)|true|none|none| +|output_artifacts|object|true|none|none| +|» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +### PayloadOutputArtifact + + + + + + +```json +{ + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" +} + +``` + +PayloadOutputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|data|[TransferUrls](#schematransferurls)|true|none|none| +|metadata|[TransferUrls](#schematransferurls)|true|none|none| +|output_artifact_id|string(uuid)|true|none|none| + +### RunCreationRequest + + + + + + +```json +{ + "application_version_id": "h-e-tme:v1.2.3", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +} + +``` + +RunCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_version_id|string|true|none|Application version ID| +|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|List of the items to process by the application| + +### RunCreationResponse + + + + + + +```json +{ + "application_run_id": "Application run id" +} + +``` + +RunCreationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|false|none|none| + +### RunReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "string", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "string", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } +} + +``` + +RunReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|UUID of the application| +|application_version_id|string|true|none|ID of the application version| +|organization_id|string|true|none|Organization of the owner of the application run| +|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|When the application run request is received by the Platform, the `status` of it is set to`received`. Then it is transitioned to `scheduled`, when it is scheduled for the processing.When the application run is scheduled, it will process the input items and generate the resultincrementally. As soon as the first result is generated, the state is changed to `running`.The results can be downloaded via `/v1/runs/{run_id}/results` endpoint.When all items are processed and all results are generated, the application status is set to`completed`. If the processing is done, but some items fail, the status is set to`completed_with_error`.When the application run request is rejected by the Platform before scheduling, it is transferredto `rejected`. When the application run reaches the threshold of number of failed items, the wholeapplication run is set to `canceled_system` and the remaining pending items are not processed.When the application run fails, the finished item results are available for download.If the application run is canceled by calling `POST /v1/runs/{run_id}/cancel` endpoint, theprocessing of the items is stopped, and the application status is set to `cancelled_user`| +|triggered_at|string(date-time)|true|none|Timestamp showing when the application run was triggered| +|triggered_by|string|true|none|Id of the user who triggered the application run| +|user_payload|any|false|none|Field used internally by the Platform| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +### TransferUrls + + + + + + +```json +{ + "download_url": "http://example.com", + "upload_url": "http://example.com" +} + +``` + +TransferUrls + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|upload_url|string(uri)|true|none|none| + +### UserPayload + + + + + + +```json +{ + "application_id": "string", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] +} + +``` + +UserPayload + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string|true|none|none| +|application_run_id|string(uuid)|true|none|none| +|global_output_artifacts|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|object|false|none|none| +|»» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|items|[[PayloadItem](#schemapayloaditem)]|true|none|none| + +### ValidationError + + + + + + +```json +{ + "loc": [ + "string" + ], + "msg": "string", + "type": "string" +} + +``` + +ValidationError + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|loc|[anyOf]|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|integer|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|msg|string|true|none|none| +|type|string|true|none|none| diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index 9d5b7d66..9c820085 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -297,41 +297,6 @@ SOFTWARE. ``` -## PySocks (1.7.1) - BSD - -A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. - -* URL: https://github.com/Anorov/PySocks -* Author(s): Anorov - -### License Text - -``` -Copyright 2006 Dan-Haim. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. -3. Neither the name of Dan Haim nor the names of his contributors may be used - to endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY DAN HAIM "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL DAN HAIM OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMANGE. - -``` - ## PyYAML (6.0.2) - MIT License YAML parser and emitter for Python @@ -505,761 +470,6 @@ SOFTWARE. ``` -## aiofiles (24.1.0) - Apache Software License - -File support for asyncio. - -* URL: https://github.com/Tinche/aiofiles -* Author(s): Tin Tvrtkovic - -### License Text - -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -``` - -### Notice - -``` -Asyncio support for files -Copyright 2016 Tin Tvrtkovic - -``` - -## aiohappyeyeballs (2.6.1) - Python Software Foundation License - -Happy Eyeballs for asyncio - -* URL: https://github.com/aio-libs/aiohappyeyeballs -* Author(s): J. Nick Koston - -### License Text - -``` -A. HISTORY OF THE SOFTWARE -========================== - -Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands -as a successor of a language called ABC. Guido remains Python's -principal author, although it includes many contributions from others. - -In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) -in Reston, Virginia where he released several versions of the -software. - -In May 2000, Guido and the Python core development team moved to -BeOpen.com to form the BeOpen PythonLabs team. In October of the same -year, the PythonLabs team moved to Digital Creations, which became -Zope Corporation. In 2001, the Python Software Foundation (PSF, see -https://www.python.org/psf/) was formed, a non-profit organization -created specifically to own Python-related Intellectual Property. -Zope Corporation was a sponsoring member of the PSF. - -All Python releases are Open Source (see https://opensource.org for -the Open Source Definition). Historically, most, but not all, Python -releases have also been GPL-compatible; the table below summarizes -the various releases. - - Release Derived Year Owner GPL- - from compatible? (1) - - 0.9.0 thru 1.2 1991-1995 CWI yes - 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - 1.6 1.5.2 2000 CNRI no - 2.0 1.6 2000 BeOpen.com no - 1.6.1 1.6 2001 CNRI yes (2) - 2.1 2.0+1.6.1 2001 PSF no - 2.0.1 2.0+1.6.1 2001 PSF yes - 2.1.1 2.1+2.0.1 2001 PSF yes - 2.1.2 2.1.1 2002 PSF yes - 2.1.3 2.1.2 2002 PSF yes - 2.2 and above 2.1.1 2001-now PSF yes - -Footnotes: - -(1) GPL-compatible doesn't mean that we're distributing Python under - the GPL. All Python licenses, unlike the GPL, let you distribute - a modified version without making your changes open source. The - GPL-compatible licenses make it possible to combine Python with - other software that is released under the GPL; the others don't. - -(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - because its license has a choice of law clause. According to - CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - is "not incompatible" with the GPL. - -Thanks to the many outside volunteers who have worked under Guido's -direction to make these releases possible. - - -B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -=============================================================== - -Python software and documentation are licensed under the -Python Software Foundation License Version 2. - -Starting with Python 3.8.6, examples, recipes, and other code in -the documentation are dual licensed under the PSF License Version 2 -and the Zero-Clause BSD license. - -Some software incorporated into Python is under different licenses. -The licenses are listed with code falling under that license. - - -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; -All Rights Reserved" are retained in Python alone or in any derivative version -prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -------------------------------------------- - -BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 - -1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization ("Licensee") accessing and otherwise using -this software in source or binary form and its associated -documentation ("the Software"). - -2. Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. - -3. BeOpen is making the Software available to Licensee on an "AS IS" -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -5. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -6. This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. - -7. By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 ---------------------------------------- - -1. This LICENSE AGREEMENT is between the Corporation for National -Research Initiatives, having an office at 1895 Preston White Drive, -Reston, VA 20191 ("CNRI"), and the Individual or Organization -("Licensee") accessing and otherwise using Python 1.6.1 software in -source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, CNRI -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python 1.6.1 -alone or in any derivative version, provided, however, that CNRI's -License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -1995-2001 Corporation for National Research Initiatives; All Rights -Reserved" are retained in Python 1.6.1 alone or in any derivative -version prepared by Licensee. Alternately, in lieu of CNRI's License -Agreement, Licensee may substitute the following text (omitting the -quotes): "Python 1.6.1 is made available subject to the terms and -conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the internet using the following -unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the internet -using the following URL: http://hdl.handle.net/1895.22/1013". - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python 1.6.1 or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python 1.6.1. - -4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. This License Agreement shall be governed by the federal -intellectual property law of the United States, including without -limitation the federal copyright law, and, to the extent such -U.S. federal law does not apply, by the law of the Commonwealth of -Virginia, excluding Virginia's conflict of law provisions. -Notwithstanding the foregoing, with regard to derivative works based -on Python 1.6.1 that incorporate non-separable material that was -previously distributed under the GNU General Public License (GPL), the -law of the Commonwealth of Virginia shall govern this License -Agreement only as to issues arising under or with respect to -Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -License Agreement shall be deemed to create any relationship of -agency, partnership, or joint venture between CNRI and Licensee. This -License Agreement does not grant permission to use CNRI trademarks or -trade name in a trademark sense to endorse or promote products or -services of Licensee, or any third party. - -8. By clicking on the "ACCEPT" button where indicated, or by copying, -installing or otherwise using Python 1.6.1, Licensee agrees to be -bound by the terms and conditions of this License Agreement. - - ACCEPT - - -CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 --------------------------------------------------- - -Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -The Netherlands. All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION ----------------------------------------------------------------------- - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - -``` - -## aiohttp (3.11.16) - Apache Software License - -Async http client/server framework (asyncio) - -* URL: https://github.com/aio-libs/aiohttp -* Maintainer(s): aiohttp team - -### License Text - -``` - Copyright aio-libs contributors. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -``` - -## aiosignal (1.3.2) - Apache Software License - -aiosignal: a list of registered asynchronous callbacks - -* URL: https://github.com/aio-libs/aiosignal -* Maintainer(s): aiohttp team - -### License Text - -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2013-2019 Nikolay Kim and Andrew Svetlov - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -``` - ## alabaster (1.0.0) - BSD License A light, configurable Sphinx theme @@ -2834,395 +2044,6 @@ Isaac Muse ``` -## bidict (0.23.1) - Mozilla Public License 2.0 (MPL 2.0) - -The bidirectional mapping library for Python. - -* URL: https://github.com/jab/bidict -* Author(s): Joshua Bronson - -### License Text - -``` -Mozilla Public License Version 2.0 -================================== - -Copyright 2009-2024 Joshua Bronson. All rights reserved. - - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. - -``` - ## bleach (6.2.0) - Apache Software License An easy safelist-based HTML-sanitizing tool. @@ -3773,38 +2594,6 @@ one at http://mozilla.org/MPL/2.0/. ``` -## bottle (0.13.2) - MIT License - -Fast and simple WSGI-framework for small web-applications. - -* URL: http://bottlepy.org/ -* Author(s): Marcel Hellkamp - -### License Text - -``` -Copyright (c) 2009-2024, Marcel Hellkamp. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -``` - ## bracex (2.5.post1) - MIT License Bash style brace expander. @@ -3839,7 +2628,7 @@ SOFTWARE. ``` -## bump-my-version (1.1.2) - MIT License +## bump-my-version (1.1.1) - MIT License Version bump your Python project @@ -4602,40 +3391,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## cloudpathlib (0.21.0) - MIT License - -pathlib-style classes for cloud storage services. - -* URL: https://github.com/drivendataorg/cloudpathlib -* Author(s): DrivenData - -### License Text - -``` -MIT License - -Copyright (c) 2020 DrivenData Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - ## colorama (0.4.6) - BSD License Cross-platform colored terminal text. @@ -6051,27 +4806,6 @@ limitations under the License. ``` -## dicomweb-client (0.59.3) - MIT License - -Client for DICOMweb RESTful services. - -* URL: https://github.com/ImagingDataCommons/dicomweb-client -* Author(s): Markus D. Herrmann -* Maintainer(s): Markus D. Herrmann, Christopher P. Bridge, Steve Pieper - -### License Text - -``` -Copyright 2020 MGH Computational Pathology - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - ## dict2css (0.3.0.post1) - MIT License A μ-library for constructing cascading style sheets from Python dictionaries. @@ -6654,278 +5388,6 @@ OR OTHER DEALINGS IN THE SOFTWARE. ``` -## duckdb (1.2.1) - MIT License - -DuckDB in-process database - -* URL: https://www.duckdb.org -* Maintainer(s): Hannes Muehleisen - -### License Text - -``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ------------------------------------------------------------------------------------- -This product bundles various third-party components under other open source licenses. -This section summarizes those components and their licenses. See licenses/ -for text of these licenses. - - -Apache Software Foundation License 2.0 --------------------------------------- - -common/network-common/src/main/java/org/apache/spark/network/util/LimitedInputStream.java -core/src/main/java/org/apache/spark/util/collection/TimSort.java -core/src/main/resources/org/apache/spark/ui/static/bootstrap* -core/src/main/resources/org/apache/spark/ui/static/vis* -docs/js/vendor/bootstrap.js -connector/spark-ganglia-lgpl/src/main/java/com/codahale/metrics/ganglia/GangliaReporter.java - - -Python Software Foundation License ----------------------------------- - -python/docs/source/_static/copybutton.js - -BSD 3-Clause ------------- - -python/lib/py4j-*-src.zip -python/pyspark/cloudpickle/*.py -python/pyspark/join.py -core/src/main/resources/org/apache/spark/ui/static/d3.min.js - -The CSS style for the navigation sidebar of the documentation was originally -submitted by Óscar Nájera for the scikit-learn project. The scikit-learn project -is distributed under the 3-Clause BSD license. - - -MIT License ------------ - -core/src/main/resources/org/apache/spark/ui/static/dagre-d3.min.js -core/src/main/resources/org/apache/spark/ui/static/*dataTables* -core/src/main/resources/org/apache/spark/ui/static/graphlib-dot.min.js -core/src/main/resources/org/apache/spark/ui/static/jquery* -core/src/main/resources/org/apache/spark/ui/static/sorttable.js -docs/js/vendor/anchor.min.js -docs/js/vendor/jquery* -docs/js/vendor/modernizer* - - -Creative Commons CC0 1.0 Universal Public Domain Dedication ------------------------------------------------------------ -(see LICENSE-CC0.txt) - -data/mllib/images/kittens/29.5.a_b_EGDP022204.jpg -data/mllib/images/kittens/54893.jpg -data/mllib/images/kittens/DP153539.jpg -data/mllib/images/kittens/DP802813.jpg -data/mllib/images/multi-channel/chr30.4.184.jpg -``` - ## email_validator (2.2.0) - The Unlicense (Unlicense) A robust email address syntax and deliverability validation library. @@ -6966,7 +5428,7 @@ For more information, please refer to ``` -## enum-tools (0.13.0) - GNU Lesser General Public License v3 or later (LGPLv3+) +## enum-tools (0.12.0) - GNU Lesser General Public License v3 or later (LGPLv3+) Tools to expand Python's enum module. @@ -7775,262 +6237,6 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice ``` -## frozenlist (1.6.0) - Apache-2.0 - -A list-like structure which implements collections.abc.MutableSequence - -* URL: https://github.com/aio-libs/frozenlist -* Maintainer(s): aiohttp team - -### License Text - -``` -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2013-2019 Nikolay Kim and Andrew Svetlov - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -``` - -## fsspec (2024.12.0) - BSD License - -File-system specification - -* URL: https://github.com/fsspec/filesystem_spec -* Maintainer(s): Martin Durant - -### License Text - -``` -BSD 3-Clause License - -Copyright (c) 2018, Martin Durant -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -``` - ## furo (2024.8.6) - MIT License A clean customisable Sphinx documentation theme. @@ -9664,27 +7870,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## highdicom (0.25.1) - MIT License - -High-level DICOM abstractions. - -* URL: https://github.com/imagingdatacommons/highdicom -* Author(s): Markus D. Herrmann, Christopher P. Bridge -* Maintainer(s): Markus D. Herrmann, Christopher P. Bridge - -### License Text - -``` -Copyright 2020 MGH Computational Pathology - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - ## html5lib (1.1) - MIT License HTML parser based on the WHATWG HTML specification @@ -9817,72 +8002,6 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ``` -## idc-index (0.8.6) - MIT License - -Package to query and download data from an index of ImagingDataCommons - -* URL: https://github.com/ImagingDataCommons/idc-index -* Author(s): Andrey Fedorov , Vamsi Thiriveedhi - -### License Text - -``` -MIT License - -Copyright (c) 2023 Imaging Data Commons - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - -## idc-index-data (20.0.3) - MIT License - -ImagingDataCommons index to query and download data. - -* URL: https://github.com/ImagingDataCommons/idc-index-data -* Author(s): Andrey Fedorov , Vamsi Thiriveedhi , Jean-Christophe Fillion-Robin - -### License Text - -``` -Copyright 2024 Andrey Fedorov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - ## identify (2.6.9) - MIT License File identification library for Python @@ -9959,40 +8078,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## ifaddr (0.2.0) - MIT License - -Cross-platform network interface and IP address enumeration library - -* URL: https://github.com/pydron/ifaddr -* Author(s): Stefan C. Mueller - -### License Text - -``` -The MIT License (MIT) - -Copyright (c) 2014 Stefan C. Mueller - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -``` - ## imagesize (1.4.1) - MIT License Getting image size from png/jpeg/jpeg2000/gif file @@ -12011,7 +10096,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## marimo (0.13.0) - Apache Software License +## marimo (0.12.8) - Apache Software License A library for making reactive notebooks and apps @@ -12259,112 +10344,6 @@ SOFTWARE. ``` -## markdown2 (2.5.3) - MIT License - -A fast and complete Python implementation of Markdown - -* URL: https://github.com/trentm/python-markdown2 -* Author(s): Trent Mick -* Maintainer(s): Trent Mick - -### License Text - -``` -This implementation of Markdown is licensed under the MIT License: - - The MIT License - - Copyright (c) 2012 Trent Mick - Copyright (c) 2010 ActiveState Software Inc. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to permit - persons to whom the Software is furnished to do so, subject to the - following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN - NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - USE OR OTHER DEALINGS IN THE SOFTWARE. - - -All files in a *source package* of markdown2 (i.e. those available on -pypi.python.org and the Google Code project "downloads" page) are under the -MIT license. However, in the *subversion repository* there are some files -(used for performance and testing purposes) that are under different licenses -as follows: - -- perf/recipes.pprint - - Python License. This file includes a number of real-world examples of - Markdown from the ActiveState Python Cookbook, used for doing some - performance testing of markdown2.py. - -- test/php-markdown-cases/... - test/php-markdown-extra-cases/... - - GPL. These are from the MDTest package announced here: - http://six.pairlist.net/pipermail/markdown-discuss/2007-July/000674.html - -- test/markdown.py - - GPL 2 or BSD. A copy (currently old) of Python-Markdown -- the other - Python Markdown implementation. - -- test/markdown.php - - BSD-style. This is PHP Markdown - (http://michelf.com/projects/php-markdown/). - -- test/Markdown.pl: BSD-style - - A copy of Perl Markdown (http://daringfireball.net/projects/markdown/). - - -``` - -## marshmallow (3.26.1) - MIT License - -A lightweight library for converting complex datatypes to and from native Python datatypes. - -* URL: https://github.com/marshmallow-code/marshmallow -* Author(s): Steven Loria -* Maintainer(s): Steven Loria , Jérôme Lafréchoux , Jared Deckard - -### License Text - -``` -Copyright Steven Loria and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -``` - ## matplotlib (3.10.1) - Python Software Foundation License Python plotting package @@ -12663,32 +10642,6 @@ Copyright (C) 2008-2011 INADA Naoki ``` -## multidict (6.4.3) - Apache Software License - -multidict implementation - -* URL: https://github.com/aio-libs/multidict -* Author(s): Andrew Svetlov - -### License Text - -``` - Copyright 2016 Andrew Svetlov and aio-libs contributors - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -``` - ## mypy (1.15.0) - MIT License Optional static typing for Python @@ -13206,40 +11159,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## nicegui (2.15.0) - MIT License - -Create web-based user interfaces with Python. The nice way. - -* URL: https://github.com/zauberzeug/nicegui -* Author(s): Zauberzeug GmbH - -### License Text - -``` -MIT License - -Copyright (c) 2021 Zauberzeug GmbH - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - ## nodeenv (1.9.1) - BSD License Node.js virtual environment builder @@ -18683,22 +16602,6 @@ limitations under the License. ``` -## outcome (1.3.0.post0) - Apache Software License; MIT License - -Capture the outcome of Python function calls. - -* URL: https://github.com/python-trio/outcome -* Author(s): Frazer McLean - -### License Text - -``` -This software is made available under the terms of *either* of the -licenses found in LICENSE.APACHE2 or LICENSE.MIT. Contributions to are -made under the terms of *both* these licenses. - -``` - ## overrides (7.7.0) - Apache License, Version 2.0 A decorator to automatically detect mismatch when overriding a method. @@ -22177,429 +20080,162 @@ A tool for scanning Python environments for known vulnerabilities END OF TERMS AND CONDITIONS -``` - -## platformdirs (4.3.7) - MIT License - -A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. - -* URL: https://github.com/tox-dev/platformdirs -* Maintainer(s): Bernát Gábor , Julian Berman , Ofek Lev , Ronny Pfannschmidt - -### License Text - -``` -MIT License - -Copyright (c) 2010-202x The platformdirs developers - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - -## pluggy (1.5.0) - MIT License - -plugin and hook calling mechanisms for python - -* URL: https://github.com/pytest-dev/pluggy -* Author(s): Holger Krekel - -### License Text - -``` -The MIT License (MIT) - -Copyright (c) 2015 holger krekel (rather uses bitbucket/hpk42) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - -## pre_commit (4.2.0) - MIT License - -A framework for managing and maintaining multi-language pre-commit hooks. - -* URL: https://github.com/pre-commit/pre-commit -* Author(s): Anthony Sottile - -### License Text - -``` -Copyright (c) 2014 pre-commit dev team: Anthony Sottile, Ken Struys - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -``` - -## prettytable (3.16.0) - UNKNOWN - -A simple Python library for easily displaying tabular data in a visually appealing ASCII table format - -* URL: https://github.com/prettytable/prettytable -* Author(s): Luke Maurits -* Maintainer(s): Hugo van Kemenade - -### License Text - -``` -# Copyright (c) 2009-2014 Luke Maurits -# All rights reserved. -# With contributions from: -# * Chris Clark -# * Klein Stephane -# * John Filleau -# * Vladimir Vrzić -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * The name of the author may not be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -``` - -## prometheus_client (0.21.1) - Apache Software License - -Python client for the Prometheus monitoring system. - -* URL: https://github.com/prometheus/client_python -* Author(s): Brian Brazil - -### License Text - -``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. +``` - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +## platformdirs (4.3.7) - MIT License - Copyright [yyyy] [name of copyright owner] +A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +* URL: https://github.com/tox-dev/platformdirs +* Maintainer(s): Bernát Gábor , Julian Berman , Ofek Lev , Ronny Pfannschmidt - http://www.apache.org/licenses/LICENSE-2.0 +### License Text - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +``` +MIT License + +Copyright (c) 2010-202x The platformdirs developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` -### Notice +## pluggy (1.5.0) - MIT License + +plugin and hook calling mechanisms for python + +* URL: https://github.com/pytest-dev/pluggy +* Author(s): Holger Krekel + +### License Text ``` -Prometheus instrumentation library for Python applications -Copyright 2015 The Prometheus Authors +The MIT License (MIT) -This product bundles decorator 4.0.10 which is available under a "2-clause BSD" -license. For details, see prometheus_client/decorator.py. +Copyright (c) 2015 holger krekel (rather uses bitbucket/hpk42) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` -## prompt_toolkit (3.0.50) - BSD License +## pre_commit (4.2.0) - MIT License -Library for building powerful interactive command lines in Python +A framework for managing and maintaining multi-language pre-commit hooks. -* URL: https://github.com/prompt-toolkit/python-prompt-toolkit -* Author(s): Jonathan Slenders +* URL: https://github.com/pre-commit/pre-commit +* Author(s): Anthony Sottile ### License Text ``` -Copyright (c) 2014, Jonathan Slenders -All rights reserved. +Copyright (c) 2014 pre-commit dev team: Anthony Sottile, Ken Struys -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. -* Neither the name of the {organization} nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. +``` -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## prettytable (3.16.0) - UNKNOWN + +A simple Python library for easily displaying tabular data in a visually appealing ASCII table format + +* URL: https://github.com/prettytable/prettytable +* Author(s): Luke Maurits +* Maintainer(s): Hugo van Kemenade + +### License Text + +``` +# Copyright (c) 2009-2014 Luke Maurits +# All rights reserved. +# With contributions from: +# * Chris Clark +# * Klein Stephane +# * John Filleau +# * Vladimir Vrzić +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. ``` -## propcache (0.3.1) - Apache Software License +## prometheus_client (0.21.1) - Apache Software License -Accelerated property cache +Python client for the Prometheus monitoring system. -* URL: https://github.com/aio-libs/propcache -* Author(s): Andrew Svetlov -* Maintainer(s): aiohttp team +* URL: https://github.com/prometheus/client_python +* Author(s): Brian Brazil ### License Text ``` - Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -22807,19 +20443,51 @@ Accelerated property cache ### Notice ``` - Copyright 2016-2021, Andrew Svetlov and aio-libs team +Prometheus instrumentation library for Python applications +Copyright 2015 The Prometheus Authors - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +This product bundles decorator 4.0.10 which is available under a "2-clause BSD" +license. For details, see prometheus_client/decorator.py. - http://www.apache.org/licenses/LICENSE-2.0 +``` - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +## prompt_toolkit (3.0.50) - BSD License + +Library for building powerful interactive command lines in Python + +* URL: https://github.com/prompt-toolkit/python-prompt-toolkit +* Author(s): Jonathan Slenders + +### License Text + +``` +Copyright (c) 2014, Jonathan Slenders +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +* Neither the name of the {organization} nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` @@ -23081,50 +20749,6 @@ of the input file used when generating it. This code is not standalone and requires a support library to be linked with it. This support library is itself covered by the above license. -``` - -## proxy_tools (0.1.0) - MIT License - -Proxy Implementation - -* URL: http://github.com/jtushman/proxy_tools -* Author(s): Jonathan Tushman - -## pscript (0.7.7) - BSD License - -Python to JavaScript compiler. - -* URL: http://pscript.readthedocs.io -* Author(s): Almar Klein and contributors - -### License Text - -``` -Copyright (c) 2015-2020, PScript developers -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ``` ## psutil (7.0.0) - BSD License @@ -26030,7 +23654,7 @@ SOFTWARE. ``` -## pydantic-settings (2.9.1) - MIT License +## pydantic-settings (2.8.1) - MIT License Settings management using Pydantic @@ -26124,85 +23748,6 @@ Widget for deck.gl maps ``` -## pydicom (3.0.1) - MIT License - -A pure Python package for reading and writing DICOM data - -* URL: https://github.com/pydicom/pydicom -* Author(s): Darcy Mason and contributors - -### License Text - -``` -License file for pydicom, a pure-python DICOM library - -Copyright (c) 2008-2020 Darcy Mason and pydicom contributors - -Except for portions outlined below, pydicom is released under an MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -Portions of pydicom (private dictionary file(s)) were generated from the -private dictionary of the GDCM library, released under the following license: - - Program: GDCM (Grassroots DICOM). A DICOM library - -Copyright (c) 2006-2016 Mathieu Malaterre -Copyright (c) 1993-2005 CREATIS -(CREATIS = Centre de Recherche et d'Applications en Traitement de l'Image) -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither name of Mathieu Malaterre, or CREATIS, nor the names of any - contributors (CNRS, INSERM, UCB, Universite Lyon I), may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -``` - -## pyjpegls (1.5.1) - MIT License - -JPEG-LS for Python via CharLS C++ Library - -* URL: https://github.com/pydicom/pyjpegls -* Author(s): pydicom contributors - ## pymdown-extensions (10.14.3) - MIT License Extension pack for Python Markdown. @@ -26329,90 +23874,6 @@ Complete Legal Terms: http://opensource.org/licenses/MIT ``` -## pyobjc-core (11.0) - MIT License - -Python<->ObjC Interoperability Module - -* URL: https://github.com/ronaldoussoren/pyobjc -* Author(s): Ronald Oussoren, bbum, SteveM, LeleG, many others stretching back through the reaches of time... -* Maintainer(s): Ronald Oussoren - -## pyobjc-framework-Cocoa (11.0) - MIT License - -Wrappers for the Cocoa frameworks on macOS - -* URL: https://github.com/ronaldoussoren/pyobjc -* Author(s): Ronald Oussoren - -### License Text - -``` -(This is the MIT license, note that libffi-src is a separate product with its own license) - -Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al. -Copyright 2003-2024 - Ronald Oussoren - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## pyobjc-framework-Quartz (11.0) - MIT License - -Wrappers for the Quartz frameworks on macOS - -* URL: https://github.com/ronaldoussoren/pyobjc -* Author(s): Ronald Oussoren - -### License Text - -``` -(This is the MIT license, note that libffi-src is a separate product with its own license) - -Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al. -Copyright 2003-2024 - Ronald Oussoren - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## pyobjc-framework-Security (11.0) - MIT License - -Wrappers for the framework Security on macOS - -* URL: https://github.com/ronaldoussoren/pyobjc -* Author(s): Ronald Oussoren - -## pyobjc-framework-WebKit (11.0) - MIT License - -Wrappers for the framework WebKit on macOS - -* URL: https://github.com/ronaldoussoren/pyobjc -* Author(s): Ronald Oussoren - -### License Text - -``` -(This is the MIT license, note that libffi-src is a separate product with its own license) - -Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al. -Copyright 2003-2024 - Ronald Oussoren - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - ## pyparsing (3.2.3) - MIT License pyparsing module - Classes and methods to define and execute parsing grammars @@ -26727,22 +24188,6 @@ Apache License ``` -## pytest-base-url (2.1.0) - Mozilla Public License 2.0 (MPL 2.0) - -pytest plugin for URL based testing - -* URL: https://github.com/pytest-dev/pytest-base-url -* Author(s): Dave Hunt , Jim Brannlund - -### License Text - -``` -This Source Code Form is subject to the terms of the Mozilla Public -License, v. 2.0. If a copy of the MPL was not distributed with this -file, You can obtain one at http://mozilla.org/MPL/2.0/. - -``` - ## pytest-cov (6.1.1) - MIT License Pytest plugin for measuring coverage. @@ -26875,38 +24320,6 @@ SOFTWARE. ``` -## pytest-html (4.1.1) - MIT License - -pytest plugin for generating HTML reports - -* URL: https://github.com/pytest-dev/pytest-html -* Author(s): Dave Hunt , Jim Brannlund - -### License Text - -``` -This Source Code Form is subject to the terms of the Mozilla Public -License, v. 2.0. If a copy of the MPL was not distributed with this -file, You can obtain one at http://mozilla.org/MPL/2.0/. - -``` - -## pytest-metadata (3.1.1) - Mozilla Public License 2.0 (MPL 2.0) - -pytest plugin for test session metadata - -* URL: https://github.com/pytest-dev/pytest-metadata -* Author(s): Dave Hunt , Jim Brannlund - -### License Text - -``` -This Source Code Form is subject to the terms of the Mozilla Public -License, v. 2.0. If a copy of the MPL was not distributed with this -file, You can obtain one at http://mozilla.org/MPL/2.0/. - -``` - ## pytest-regressions (2.7.0) - MIT License Easy to use fixtures to write regression tests. @@ -26943,22 +24356,6 @@ THE SOFTWARE. ``` -## pytest-selenium (4.1.0) - Mozilla Public License 2.0 (MPL 2.0) - -pytest plugin for Selenium - -* URL: https://github.com/pytest-dev/pytest-selenium -* Author(s): Dave Hunt , Jim Brannlund - -### License Text - -``` -This Source Code Form is subject to the terms of the Mozilla Public -License, v. 2.0. If a copy of the MPL was not distributed with this -file, You can obtain one at http://mozilla.org/MPL/2.0/. - -``` - ## pytest-subprocess (1.5.3) - MIT License A plugin to fake subprocess for pytest @@ -27030,56 +24427,6 @@ THE SOFTWARE. ``` -## pytest-variables (3.1.0) - Mozilla Public License 2.0 (MPL 2.0) - -pytest plugin for providing variables to tests/fixtures - -* URL: https://github.com/pytest-dev/pytest-variables -* Author(s): Dave Hunt , Jim Brannlund - -### License Text - -``` -This Source Code Form is subject to the terms of the Mozilla Public -License, v. 2.0. If a copy of the MPL was not distributed with this -file, You can obtain one at http://mozilla.org/MPL/2.0/. - -``` - -## pytest-watcher (0.4.3) - MIT License - -Automatically rerun your tests on file modifications - -* URL: https://github.com/olzhasar/pytest-watcher -* Author(s): Olzhas Arystanov - -### License Text - -``` -MIT License - -Copyright (c) 2021 Olzhas Arystanov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - ## pytest-xdist (3.6.1) - MIT License pytest xdist plugin for distributed testing, most importantly across multiple CPUs @@ -27221,39 +24568,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## python-engineio (4.12.0) - MIT License - -Engine.IO server and client for Python - -* URL: https://github.com/miguelgrinberg/python-engineio -* Author(s): Miguel Grinberg - -### License Text - -``` -The MIT License (MIT) - -Copyright (c) 2015 Miguel Grinberg - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - ## python-json-logger (3.3.0) - BSD License JSON Log Formatter for the Python Logging Package @@ -27313,39 +24627,6 @@ See the License for the specific language governing permissions and limitations under the License. -``` - -## python-socketio (5.13.0) - MIT License - -Socket.IO server and client for Python - -* URL: https://github.com/miguelgrinberg/python-socketio -* Author(s): Miguel Grinberg - -### License Text - -``` -The MIT License (MIT) - -Copyright (c) 2015 Miguel Grinberg - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## pytz (2025.2) - MIT License @@ -27381,48 +24662,6 @@ DEALINGS IN THE SOFTWARE. ``` -## pywebview (5.4) - BSD License - -Build GUI for your Python program with JavaScript, HTML, and CSS - -* URL: https://pywebview.flowrl.com/ -* Author(s): Roman Sirokov - -### License Text - -``` -BSD 3-Clause License - -Copyright (c) 2014-2017, Roman Sirokov -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -``` - ## pyzmq (26.4.0) - BSD License Python bindings for 0MQ @@ -27804,239 +25043,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` -## retrying (1.3.4) - Apache Software License - -Retrying - -* URL: https://github.com/groodt/retrying -* Author(s): Greg Roodt - -### License Text - -``` - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -``` - -### Notice - -``` -Copyright 2013 Ray Holder - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - ## rfc3339-validator (0.1.4) - MIT License A pure python RFC3339 validator @@ -28499,7 +25505,7 @@ ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of com ``` -## ruff (0.11.6) - MIT License +## ruff (0.11.5) - MIT License An extremely fast Python linter and code formatter, written in Rust. @@ -30133,253 +27139,7 @@ Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. ``` -## s5cmd (0.2.0) - MIT License - -This project provides the infrastructure to build s5cmd Python wheels. - -* URL: https://github.com/jcfr/s5cmd-python-distributions -* Author(s): Jean-Christophe Fillion-Robin - -### License Text - -``` -Copyright 2024 Jean-Christophe Fillion-Robin - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - -## selenium (4.31.0) - Apache Software License - -Official Python bindings for Selenium WebDriver - -* URL: https://www.selenium.dev - -### License Text - -``` - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2025 Software Freedom Conservancy (SFC) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -``` - -## sentry-sdk (2.26.1) - BSD License +## sentry-sdk (2.25.1) - BSD License Python client for Sentry (https://sentry.io) @@ -30459,49 +27219,6 @@ The following files include code from opensource projects ``` -## shapely (2.1.0) - BSD License - -Manipulation and analysis of geometric objects - -* URL: https://github.com/shapely/shapely -* Author(s): Sean Gillies -* Maintainer(s): Shapely contributors - -### License Text - -``` -BSD 3-Clause License - -Copyright (c) 2007, Sean C. Gillies. 2019, Casper van der Wel. 2007-2022, Shapely Contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -``` - ## shellingham (1.5.4) - ISC License (ISCL) Tool to Detect Surrounding Shell @@ -30528,40 +27245,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` -## simple-websocket (1.1.0) - MIT License - -Simple WebSocket server and client for Python - -* URL: https://github.com/miguelgrinberg/simple-websocket -* Author(s): Miguel Grinberg - -### License Text - -``` -MIT License - -Copyright (c) 2021 Miguel Grinberg - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - ## six (1.17.0) - MIT License Python 2 and 3 compatibility utilities @@ -30893,40 +27576,6 @@ IN THE SOFTWARE. ``` -## sphinx-click (6.0.0) - MIT License - -Sphinx extension that automatically documents click applications - -* URL: https://github.com/click-contrib/sphinx-click -* Author(s): Stephen Finucane - -### License Text - -``` -The MIT License - -Copyright (c) 2017 Stephen Finucane http://that.guru/ - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -``` - ## sphinx-copybutton (0.5.2) - MIT License Add a copy button to each of your code cells. @@ -32472,56 +29121,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## trio (0.30.0) - UNKNOWN - -A friendly Python library for async concurrency and I/O - -* URL: https://github.com/python-trio/trio -* Author(s): "Nathaniel J. Smith" - -### License Text - -``` -This software is made available under the terms of *either* of the -licenses found in LICENSE.APACHE2 or LICENSE.MIT. Contributions to -Trio are made under the terms of *both* these licenses. - -``` - -## trio-websocket (0.12.2) - MIT License - -WebSocket library for Trio - -* URL: https://github.com/python-trio/trio-websocket -* Author(s): Mark E. Haase - -### License Text - -``` -The MIT License (MIT) - -Copyright (c) 2018 Hyperion Gray - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -``` - ## typer (0.15.2) - MIT License Typer, build great CLIs. Easy to code. Based on Python type hints. @@ -33784,41 +30383,6 @@ https://opensource.apple.com/source/tcl/tcl-14/tcl/license.terms ``` -## universal_pathlib (0.2.6) - MIT License - -pathlib api extended to use fsspec backends - -* URL: https://github.com/fsspec/universal_pathlib -* Author(s): Andrew Fulton -* Maintainer(s): Norman Rzepka - -### License Text - -``` -MIT License - -Copyright (c) 2022, Andrew Fulton - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - ## uptime (3.0.1) - BSD License Cross-platform uptime library @@ -34393,40 +30957,6 @@ Copyright (C) 2016-present the uvloop authors and contributors. ``` -## vbuild (0.8.2) - MIT License - -A simple module to extract html/script/style from a vuejs '.vue' file (can minimize/es2015 compliant js) ... just py2 or py3, NO nodejs ! - -* URL: https://github.com/manatlan/vbuild -* Author(s): manatlan - -### License Text - -``` -MIT License - -Copyright (c) 2018 manatlan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - ## virtualenv (20.30.0) - MIT License Virtual Python Environment builder @@ -34976,281 +31506,6 @@ POSSIBILITY OF SUCH DAMAGE. ``` -## wsidicom (0.26.0) - Apache Software License - -Tools for handling DICOM based whole scan images - -* URL: https://github.com/imi-bigpicture/wsidicom -* Author(s): Erik O Gabrielsson - -## wsproto (1.2.0) - MIT License - -WebSockets state-machine based protocol implementation - -* URL: https://github.com/python-hyper/wsproto/ -* Author(s): Benno Rice - -### License Text - -``` -The MIT License (MIT) - -Copyright (c) 2017 Benno Rice and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -``` - -## yarl (1.20.0) - Apache Software License - -Yet another URL library - -* URL: https://github.com/aio-libs/yarl -* Author(s): Andrew Svetlov -* Maintainer(s): aiohttp team - -### License Text - -``` - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -``` - -### Notice - -``` - Copyright 2016-2021, Andrew Svetlov and aio-libs team - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -``` - ## zipp (3.21.0) - MIT License Backport of pathlib-compatible object wrapper for zip files diff --git a/CLI_REFERENCE.md b/CLI_REFERENCE.md index a49655d3..84fa802c 100644 --- a/CLI_REFERENCE.md +++ b/CLI_REFERENCE.md @@ -445,7 +445,7 @@ $ aignostics idc download [OPTIONS] SOURCE [TARGET] **Arguments**: * `SOURCE`: Filename of manifest, identifier, or comma-separate set of identifiers [required] -* `[TARGET]`: target directory for download [default: /Users/helmut/Code/python-sdk] +* `[TARGET]`: target directory for download [default: /Users/akunft/dev/python-sdk] **Options**: diff --git a/docs/source/_static/openapi_v1.json b/docs/source/_static/openapi_v1.json index a208b229..0fc1004e 100644 --- a/docs/source/_static/openapi_v1.json +++ b/docs/source/_static/openapi_v1.json @@ -1,4 +1,3 @@ -2025-04-22 08:55:00 INFO aignostics.aignostics.utils.boot ⭐ Booting aignostics v0.0.10 (project root /Users/helmut/Code/python-sdk, pid 13261), parent 'python3.13' (pid 11950) boot.py:84 { "openapi": "3.1.0", "info": { diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index ad9003e0..27e46245 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -1,4 +1,3 @@ -2025-04-22 08:54:57 INFO aignostics.aignostics.utils.boot ⭐ Booting aignostics v0.0.10 (project root /Users/helmut/Code/python-sdk, pid 13186), parent 'python3.13' (pid 11950) boot.py:84 components: schemas: ApplicationReadResponse: diff --git a/tests/aignostics/client/scheduled_test.py b/tests/aignostics/client/scheduled_test.py index 5e29d259..0c19fb90 100644 --- a/tests/aignostics/client/scheduled_test.py +++ b/tests/aignostics/client/scheduled_test.py @@ -7,8 +7,10 @@ import tempfile from pathlib import Path +from typing import Any import pytest +from _pytest.fixtures import FixtureRequest from aignx.codegen.models import ( ApplicationRunStatus, InputArtifactCreationRequest, @@ -18,10 +20,43 @@ import aignostics.client from aignostics.client._utils import calculate_file_crc32c, generate_signed_url, mime_type_to_file_ending +from aignostics.client.resources.runs import ApplicationRun + + +def _decorate_with_metadata( + item: ItemCreationRequest, artifact_name_to_metadata: dict[str, dict[str, Any]] +) -> ItemCreationRequest: + for input_artifact in item.input_artifacts: + if input_artifact.name in artifact_name_to_metadata: + input_artifact.metadata.update(artifact_name_to_metadata[input_artifact.name]) + return item + + +def single_spot_payload() -> list[ItemCreationRequest]: + """Generates a payload using a single spot.""" + return [ + ItemCreationRequest( + reference="1", + input_artifacts=[ + InputArtifactCreationRequest( + name="user_slide", + download_url=generate_signed_url( + "gs://platform-api-application-test-data/heta/slides/8fafc17d-a5cc-4e9d-a982-030b1486ca88.tiff" + ), + metadata={ + "checksum_crc32c": "5onqtA==", + "base_mpp": 0.26268186053789266, + "width": 7447, + "height": 7196, + }, + ) + ], + ), + ] def three_spots_payload() -> list[ItemCreationRequest]: - """Generates a payload for the two task dummy application using three spots.""" + """Generates a payload using three spots.""" return [ ItemCreationRequest( reference="1", @@ -77,49 +112,86 @@ def three_spots_payload() -> list[ItemCreationRequest]: ] -@pytest.mark.timeout(240) @pytest.mark.scheduled -def test_two_task_dummy_app() -> None: +@pytest.mark.parametrize( + ("timeout", "application_version_id", "payload"), + [ + (240, "two-task-dummy:v0.35.0", three_spots_payload()), + ( + 3600, + "h-e-tme:v0.36.0", + [ + _decorate_with_metadata( + item, + { + "user_slide": { + "cancer": {"type": "lung", "tissue": "lung"}, + } + }, + ) + for item in single_spot_payload() + ], + ), + ], +) +def test_application_runs( + timeout: int, application_version_id: str, payload: list[ItemCreationRequest], request: FixtureRequest +) -> None: """Test the two-task dummy application. This test creates an application run using a predefined application version and input samples. It then downloads the results to a temporary directory and performs various checks to ensure the application run completed successfully and the results are valid. + Args: + timeout (int): Timeout for the test in seconds. + application_version_id (str): The application version ID to use for the test. + payload (list[ItemCreationRequest]): The payload to use for the application run. + request (FixtureRequest): The pytest request object. + Raises: AssertionError: If any of the validation checks fail. """ - application_version = "two-task-dummy:v0.35.0" + request.node.add_marker(pytest.mark.timeout(timeout)) + platform = aignostics.client.Client(cache_token=False) - application_run = platform.runs.create(application_version, items=three_spots_payload()) + application_run = platform.runs.create(application_version_id, items=payload) with tempfile.TemporaryDirectory() as temp_dir: - temp_path = Path(temp_dir) application_run.download_to_folder(temp_dir) + # validate the output + _validate_output(application_run, Path(temp_dir)) + - assert application_run.status().status == ApplicationRunStatus.COMPLETED, ( - "Application run did not finish in completed status" - ) - - run_result_folder = temp_path / application_run.application_run_id - assert run_result_folder.exists(), "Application run result folder does not exist" - - run_results = application_run.results() - - for item in run_results: - # validate status - assert item.status == ItemStatus.SUCCEEDED - # validate results - item_dir = run_result_folder / item.reference - assert item_dir.exists(), f"Result folder for item {item.reference} does not exist" - - for artifact in item.output_artifacts: - assert artifact.download_url is not None, f"{artifact} should provide an download url" - # check if file exists - file_ending = mime_type_to_file_ending(artifact.mime_type) - file_path = item_dir / f"{artifact.name}{file_ending}" - assert file_path.exists(), f"Artifact {artifact} was not downloaded" - # validate checksum - checksum = artifact.metadata["checksum_crc32c"] - file_checksum = calculate_file_crc32c(file_path) - assert file_checksum == checksum, f"Metadata checksum != file checksum {checksum} <> {file_checksum}" +def _validate_output(application_run: ApplicationRun, output_base_folder: Path) -> None: + """Validate the output of an application run. + + This function checks if the application run has completed successfully and verifies the output artifact checksum + + Args: + application_run (ApplicationRun): The application run to validate. + output_base_folder (Path): The base folder where the output is stored. + """ + assert application_run.status().status == ApplicationRunStatus.COMPLETED, ( + "Application run did not finish in completed status" + ) + + run_result_folder = output_base_folder / application_run.application_run_id + assert run_result_folder.exists(), "Application run result folder does not exist" + + run_results = application_run.results() + + for item in run_results: + # validate status + assert item.status == ItemStatus.SUCCEEDED + # validate results + item_dir = run_result_folder / item.reference + assert item_dir.exists(), f"Result folder for item {item.reference} does not exist" + for artifact in item.output_artifacts: + assert artifact.download_url is not None, f"{artifact} should provide an download url" + file_ending = mime_type_to_file_ending(artifact.mime_type) + file_path = item_dir / f"{artifact.name}{file_ending}" + assert file_path.exists(), f"Artifact {artifact} was not downloaded" + checksum = artifact.metadata["checksum_crc32c"] + file_checksum = calculate_file_crc32c(file_path) + assert file_checksum == checksum, f"Metadata checksum != file checksum {checksum} <> {file_checksum}" From 6039f485888b20c61c2be95812189abd75a6fe6d Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Fri, 25 Apr 2025 09:21:39 +0200 Subject: [PATCH 102/110] security(vulnerability): force fix in h11 --- API_REFERENCE_v1.md | 3274 ++++++++------------ ATTRIBUTIONS.md | 4398 +++++++++++++++++++++++++-- CLI_REFERENCE.md | 2 +- docs/source/_static/openapi_v1.yaml | 291 +- pyproject.toml | 1 + 5 files changed, 5608 insertions(+), 2358 deletions(-) diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md index 8425b45f..37e264b8 100644 --- a/API_REFERENCE_v1.md +++ b/API_REFERENCE_v1.md @@ -1,2063 +1,1213 @@ # API v1 Reference -## Aignostics Platform API reference v1.0.0 - -> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. - -Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. -The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via -`+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. - -Base URLs: - -* [/api](/api) - -## Authentication - -- oAuth2 authentication. - - - Flow: authorizationCode - - Authorization URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize) - - Token URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token) - -|Scope|Scope Description| -|---|---| - -## Public - -### list_applications_v1_applications_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/api/v1/applications', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/applications', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications` - -*List Applications* - -Returns the list of the applications, available to the caller. - -The application is available if any of the version of the application is assigned to the -user organization. To switch between organizations, the user should re-login and choose the -needed organization. - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "h-e-tme", - "description": "string", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ] - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Applications V1 Applications Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Applications V1 Applications Get|[[ApplicationReadResponse](#schemaapplicationreadresponse)]|false|none|none| -|» ApplicationReadResponse|[ApplicationReadResponse](#schemaapplicationreadresponse)|false|none|none| -|»» application_id|string|true|none|Application ID| -|»» description|string|true|none|Application documentations| -|»» name|string|true|none|Application display name| -|»» regulatory_classes|[string]|true|none|Regulatory class, to which the applications compliance| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### list_versions_by_application_id_v1_applications__application_id__versions_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/api/v1/applications/{application_id}/versions', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/applications/{application_id}/versions', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/applications/{application_id}/versions` - -*List Versions By Application Id* - -Returns the list of the application versions for this application, available to the caller. - -The application version is available if it is assigned to the user's organization. - -The application versions are assigned to the organization by the Aignostics admin. To -assign or unassign a version from your organization, please contact Aignostics support team. - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_id|path|string|true|none| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|version|query|any|false|none| -|include|query|any|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_id": "string", - "application_version_id": "h-e-tme:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Versions By Application Id V1 Applications Application Id Versions Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| -|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| -|»» application_id|string|true|none|Application ID| -|»» application_version_id|string|true|none|Application version ID| -|»» changelog|string|true|none|Description of the changes relative to the previous version| -|»» flow_id|any|false|none|Flow ID, used internally by the platform| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string(uuid)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|List of the input fields, provided by the User| -|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|List of the output fields, generated by the application| -|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| -|»»»» metadata_schema|object|true|none|none| -|»»»» mime_type|string|true|none|none| -|»»»» name|string|true|none|none| -|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| -|»» version|string|true|none|Semantic version of the application| - -##### Enumerated Values - -|Property|Value| -|---|---| -|scope|item| -|scope|global| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### list_application_runs_v1_runs_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/api/v1/runs', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/runs', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs` - -*List Application Runs* - -The endpoint returns the application runs triggered by the caller. After the application run -is created by POST /v1/runs, it becomes available for the current endpoint - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_id|query|any|false|Optional application ID filter| -|application_version|query|any|false|Optional application version filter| -|include|query|any|false|Request optional output values. Used internally by the platform| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "string", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "string", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Application Runs V1 Runs Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Application Runs V1 Runs Get|[[RunReadResponse](#schemarunreadresponse)]|false|none|none| -|» RunReadResponse|[RunReadResponse](#schemarunreadresponse)|false|none|none| -|»» application_run_id|string(uuid)|true|none|UUID of the application| -|»» application_version_id|string|true|none|ID of the application version| -|»» organization_id|string|true|none|Organization of the owner of the application run| -|»» status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| -|»» triggered_at|string(date-time)|true|none|Timestamp showing when the application run was triggered| -|»» triggered_by|string|true|none|Id of the user who triggered the application run| -|»» user_payload|any|false|none|Field used internally by the Platform| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| -|»»»» application_id|string|true|none|none| -|»»»» application_run_id|string(uuid)|true|none|none| -|»»»» global_output_artifacts|any|true|none|none| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|object|false|none|none| -|»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| -|»»»»»»» data|[TransferUrls](#schematransferurls)|true|none|none| -|»»»»»»»» download_url|string(uri)|true|none|none| -|»»»»»»»» upload_url|string(uri)|true|none|none| -|»»»»»»» metadata|[TransferUrls](#schematransferurls)|true|none|none| -|»»»»»»» output_artifact_id|string(uuid)|true|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»» items|[[PayloadItem](#schemapayloaditem)]|true|none|none| -|»»»»» PayloadItem|[PayloadItem](#schemapayloaditem)|false|none|none| -|»»»»»» input_artifacts|object|true|none|none| -|»»»»»»» PayloadInputArtifact|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| -|»»»»»»»» download_url|string(uri)|true|none|none| -|»»»»»»»» input_artifact_id|string(uuid)|false|none|none| -|»»»»»»»» metadata|object|true|none|none| -|»»»»»» item_id|string(uuid)|true|none|none| -|»»»»»» output_artifacts|object|true|none|none| -|»»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|status|canceled_system| -|status|canceled_user| -|status|completed| -|status|completed_with_error| -|status|received| -|status|rejected| -|status|running| -|status|scheduled| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### create_application_run_v1_runs_post - - - -> Code samples - -```python -import requests -headers = { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.post('/api/v1/runs', headers = headers) - -print(r.json()) - -``` - -```javascript -const inputBody = '{ - "application_version_id": "h-e-tme:v1.2.3", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -}'; -const headers = { - 'Content-Type':'application/json', - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/runs', -{ - method: 'POST', - body: inputBody, - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/runs` - -*Create Application Run* - -The endpoint is used to process the input items by the chosen application version. The endpoint -returns the `application_run_id`. The processing fo the items is done asynchronously. - -To check the status or cancel the execution, use the /v1/runs/{application_run_id} endpoint. - -#### Payload - -The payload includes `application_version_id` and `items` base fields. - -`application_version_id` is the id used for `/v1/versions/{application_id}` endpoint. - -`items` includes the list of the items to process (slides, in case of HETA application). -Every item has a set of standard fields defined by the API, plus the metadata, specific to the -chosen application. - -Example payload structure with the comments: -``` -{ - application_version_id: "heta:v1.0.0", - items: [{ - "reference": "slide_1" Body parameter - -```json -{ - "application_version_id": "h-e-tme:v1.2.3", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -} -``` - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|body|body|[RunCreationRequest](#schemaruncreationrequest)|true|none| - -> Example responses - -> 201 Response - -```json -{ - "application_run_id": "Application run id" -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[RunCreationResponse](#schemaruncreationresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### get_run_v1_runs__application_run_id__get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/api/v1/runs/{application_run_id}', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/runs/{application_run_id}', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs/{application_run_id}` - -*Get Run* - -Returns the details of the application run. The application run is available as soon as it is -created via `POST /runs/` endpoint. To download the items results, call -`/runs/{application_run_id}/results`. - -The application is only available to the user who triggered it, regardless of the role. - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| -|include|query|any|false|none| - -> Example responses - -> 200 Response - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "string", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "string", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[RunReadResponse](#schemarunreadresponse)| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### cancel_application_run_v1_runs__application_run_id__cancel_post - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.post('/api/v1/runs/{application_run_id}/cancel', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/runs/{application_run_id}/cancel', -{ - method: 'POST', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`POST /v1/runs/{application_run_id}/cancel` - -*Cancel Application Run* - -The application run can be canceled by the user who created the application run. - -The execution can be canceled any time while the application is not in a final state. The -pending items will not be processed and will not add to the cost. - -When the application is canceled, the already completed items stay available for download. - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| - -> Example responses - -> 202 Response - -```json -null -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### delete_application_run_results_v1_runs__application_run_id__results_delete - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.delete('/api/v1/runs/{application_run_id}/results', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/runs/{application_run_id}/results', -{ - method: 'DELETE', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`DELETE /v1/runs/{application_run_id}/results` - -*Delete Application Run Results* - -Delete the application run results. It can only be called when the application is in a final -state (meaning it's not in `received` or `pending` states). To delete the results of the running -artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel the application run. - -The output results are deleted automatically 30 days after the application run is finished. - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| - -> Example responses - -> 422 Response - -```json -{ - "detail": [ - { - "loc": [ - "string" - ], - "msg": "string", - "type": "string" - } - ] -} -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|Successful Response|None| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -### list_run_results_v1_runs__application_run_id__results_get - - - -> Code samples - -```python -import requests -headers = { - 'Accept': 'application/json', - 'Authorization': 'Bearer {access-token}' -} - -r = requests.get('/api/v1/runs/{application_run_id}/results', headers = headers) - -print(r.json()) - -``` - -```javascript - -const headers = { - 'Accept':'application/json', - 'Authorization':'Bearer {access-token}' -}; - -fetch('/api/v1/runs/{application_run_id}/results', -{ - method: 'GET', - - headers: headers -}) -.then(function(res) { - return res.json(); -}).then(function(body) { - console.log(body); -}); - -``` - -`GET /v1/runs/{application_run_id}/results` - -*List Run Results* - -Get the list of the results for the run items - -#### Parameters - -|Name|In|Type|Required|Description| -|---|---|---|---|---| -|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| -|item_id__in|query|any|false|Filter for items ids| -|reference__in|query|any|false|Filter for items by their reference from the input payload| -|status__in|query|any|false|Filter for items in certain statuses| -|page|query|integer|false|none| -|page_size|query|integer|false|none| -|sort|query|any|false|none| - -> Example responses - -> 200 Response - -```json -[ - { - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "error": "string", - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": [ - { - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - ], - "reference": "string", - "status": "pending" - } -] -``` - -#### Responses - -|Status|Meaning|Description|Schema| -|---|---|---|---| -|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| -|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| -|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| - -#### Response Schema - -Status Code **200** - -*Response List Run Results V1 Runs Application Run Id Results Get* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|Response List Run Results V1 Runs Application Run Id Results Get|[[ItemResultReadResponse](#schemaitemresultreadresponse)]|false|none|none| -|» ItemResultReadResponse|[ItemResultReadResponse](#schemaitemresultreadresponse)|false|none|none| -|»» application_run_id|string(uuid)|true|none|Application run UUID to which the item belongs| -|»» error|any|true|none|The error message in case the item is in `error_system` or `error_user` state| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|string|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»» item_id|string(uuid)|true|none|Item UUID generated by the Platform| -|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|The list of the results generated by the application algorithm. The number of files and theirtypes depend on the particular application version, call `/v1/versions/{version_id}` to getthe details.| -|»»» OutputArtifactResultReadResponse|[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)|false|none|none| -|»»»» download_url|any|true|none|The download URL to the output file. The URL is valid for 1 hour after the endpoint is called.A new URL is generated every time the endpoint is called.| - -*anyOf* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|string(uri)|false|none|none| - -*or* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»»» *anonymous*|null|false|none|none| - -*continued* - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|»»»» metadata|object|true|none|The metadata of the output artifact, provided by the application| -|»»»» mime_type|string|true|none|The mime type of the output file| -|»»»» name|string|true|none|Name of the output from the output schema from the `/v1/versions/{version_id}` endpoint.| -|»»»» output_artifact_id|string(uuid)|true|none|The Id of the artifact. Used internally| -|»» reference|string|true|none|The reference of the item from the user payload| -|»» status|[ItemStatus](#schemaitemstatus)|true|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|status|pending| -|status|canceled_user| -|status|canceled_system| -|status|error_user| -|status|error_system| -|status|succeeded| - - -To perform this operation, you must be authenticated by means of one of the following methods: -OAuth2AuthorizationCodeBearer - - -## Schemas - -### ApplicationReadResponse - - - - - - -```json -{ - "application_id": "h-e-tme", - "description": "string", - "name": "HETA", - "regulatory_classes": [ - "RuO" - ] -} - -``` - -ApplicationReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string|true|none|Application ID| -|description|string|true|none|Application documentations| -|name|string|true|none|Application display name| -|regulatory_classes|[string]|true|none|Regulatory class, to which the applications compliance| - -### ApplicationRunStatus - - - - - - -```json -"canceled_system" - -``` - -ApplicationRunStatus - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ApplicationRunStatus|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ApplicationRunStatus|canceled_system| -|ApplicationRunStatus|canceled_user| -|ApplicationRunStatus|completed| -|ApplicationRunStatus|completed_with_error| -|ApplicationRunStatus|received| -|ApplicationRunStatus|rejected| -|ApplicationRunStatus|running| -|ApplicationRunStatus|scheduled| - -### ApplicationVersionReadResponse - - - - - - -```json -{ - "application_id": "string", - "application_version_id": "h-e-tme:v0.0.1", - "changelog": "string", - "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", - "input_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" - } - ], - "output_artifacts": [ - { - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" - } - ], - "version": "string" -} - -``` - -ApplicationVersionReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string|true|none|Application ID| -|application_version_id|string|true|none|Application version ID| -|changelog|string|true|none|Description of the changes relative to the previous version| -|flow_id|any|false|none|Flow ID, used internally by the platform| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uuid)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|List of the input fields, provided by the User| -|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|List of the output fields, generated by the application| -|version|string|true|none|Semantic version of the application| - -### HTTPValidationError - - - - - - -```json -{ - "detail": [ - { - "loc": [ - "string" - ], - "msg": "string", - "type": "string" - } - ] -} - -``` - -HTTPValidationError - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|detail|[[ValidationError](#schemavalidationerror)]|false|none|none| - -### InputArtifactCreationRequest - - - - - - -```json -{ - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" -} - -``` - -InputArtifactCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) to the input artifact file. The URL should be valid for at least 6 days from the payload submission time.| -|metadata|object|true|none|The metadata of the artifact, required by the application version. The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. The schema is located in `input_artifacts.[].metadata_schema`| -|name|string|true|none|The artifact name according to the application version. List of required artifacts is returned by `/v1/versions/{application_version_id}`. The artifact names are located in the `input_artifacts.[].name` value| - -### InputArtifactReadResponse - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "image/tiff", - "name": "string" -} - -``` - -InputArtifactReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| - -### ItemCreationRequest - - - - - - -```json -{ - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" -} - -``` - -ItemCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|All the input files of the item, required by the application version| -|reference|string|true|none|The ID of the slide provided by the caller. The reference should be unique across all items of the application run| - -### ItemResultReadResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "error": "string", - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": [ - { - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - ], - "reference": "string", - "status": "pending" -} - -``` - -ItemResultReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|Application run UUID to which the item belongs| -|error|any|true|none|The error message in case the item is in `error_system` or `error_user` state| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|item_id|string(uuid)|true|none|Item UUID generated by the Platform| -|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|The list of the results generated by the application algorithm. The number of files and theirtypes depend on the particular application version, call `/v1/versions/{version_id}` to getthe details.| -|reference|string|true|none|The reference of the item from the user payload| -|status|[ItemStatus](#schemaitemstatus)|true|none|When the item is not processed yet, the status is set to `pending`.When the item is successfully finished, status is set to `succeeded`, and the processing resultsbecome available for download in `output_artifacts` field.When the item processing is failed because the provided item is invalid, the status is set to`error_user`. When the item processing failed because of the error in the model or platform,the status is set to `error_system`. When the application_run is canceled, the status of allpending items is set to either `cancelled_user` or `cancelled_system`.| - -### ItemStatus - - - - - - -```json -"pending" - -``` - -ItemStatus - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|ItemStatus|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|ItemStatus|pending| -|ItemStatus|canceled_user| -|ItemStatus|canceled_system| -|ItemStatus|error_user| -|ItemStatus|error_system| -|ItemStatus|succeeded| - -### OutputArtifactReadResponse - - - - - - -```json -{ - "metadata_schema": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "scope": "item" -} - -``` - -OutputArtifactReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata_schema|object|true|none|none| -|mime_type|string|true|none|none| -|name|string|true|none|none| -|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| - -### OutputArtifactResultReadResponse - - - - - - -```json -{ - "download_url": "http://example.com", - "metadata": {}, - "mime_type": "application/vnd.apache.parquet", - "name": "string", - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" -} - -``` - -OutputArtifactResultReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|any|true|none|The download URL to the output file. The URL is valid for 1 hour after the endpoint is called.A new URL is generated every time the endpoint is called.| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string(uri)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|metadata|object|true|none|The metadata of the output artifact, provided by the application| -|mime_type|string|true|none|The mime type of the output file| -|name|string|true|none|Name of the output from the output schema from the `/v1/versions/{version_id}` endpoint.| -|output_artifact_id|string(uuid)|true|none|The Id of the artifact. Used internally| - -### OutputArtifactScope - - - - - - -```json -"item" - -``` - -OutputArtifactScope - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|OutputArtifactScope|string|false|none|none| - -##### Enumerated Values - -|Property|Value| -|---|---| -|OutputArtifactScope|item| -|OutputArtifactScope|global| - -### PayloadInputArtifact - - - - - - -```json -{ - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} -} - -``` - -PayloadInputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|input_artifact_id|string(uuid)|false|none|none| -|metadata|object|true|none|none| - -### PayloadItem - - - - - - -```json -{ - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } -} - -``` - -PayloadItem - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|input_artifacts|object|true|none|none| -|» **additionalProperties**|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| -|item_id|string(uuid)|true|none|none| -|output_artifacts|object|true|none|none| -|» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -### PayloadOutputArtifact - - - - - - -```json -{ - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" -} - -``` - -PayloadOutputArtifact - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|data|[TransferUrls](#schematransferurls)|true|none|none| -|metadata|[TransferUrls](#schematransferurls)|true|none|none| -|output_artifact_id|string(uuid)|true|none|none| - -### RunCreationRequest - - - - - - -```json -{ - "application_version_id": "h-e-tme:v1.2.3", - "items": [ - { - "input_artifacts": [ - { - "download_url": "https://example.com/case-no-1-slide.tiff", - "metadata": { - "checksum_crc32c": "752f9554", - "height": 2000, - "height_mpp": 0.5, - "width": 10000, - "width_mpp": 0.5 - }, - "name": "slide" - } - ], - "reference": "case-no-1" - } - ] -} - -``` - -RunCreationRequest - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_version_id|string|true|none|Application version ID| -|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|List of the items to process by the application| - -### RunCreationResponse - - - - - - -```json -{ - "application_run_id": "Application run id" -} - -``` - -RunCreationResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|false|none|none| - -### RunReadResponse - - - - - - -```json -{ - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "application_version_id": "string", - "organization_id": "string", - "status": "canceled_system", - "triggered_at": "2019-08-24T14:15:22Z", - "triggered_by": "string", - "user_payload": { - "application_id": "string", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] - } -} - -``` - -RunReadResponse - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_run_id|string(uuid)|true|none|UUID of the application| -|application_version_id|string|true|none|ID of the application version| -|organization_id|string|true|none|Organization of the owner of the application run| -|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|When the application run request is received by the Platform, the `status` of it is set to`received`. Then it is transitioned to `scheduled`, when it is scheduled for the processing.When the application run is scheduled, it will process the input items and generate the resultincrementally. As soon as the first result is generated, the state is changed to `running`.The results can be downloaded via `/v1/runs/{run_id}/results` endpoint.When all items are processed and all results are generated, the application status is set to`completed`. If the processing is done, but some items fail, the status is set to`completed_with_error`.When the application run request is rejected by the Platform before scheduling, it is transferredto `rejected`. When the application run reaches the threshold of number of failed items, the wholeapplication run is set to `canceled_system` and the remaining pending items are not processed.When the application run fails, the finished item results are available for download.If the application run is canceled by calling `POST /v1/runs/{run_id}/cancel` endpoint, theprocessing of the items is stopped, and the application status is set to `cancelled_user`| -|triggered_at|string(date-time)|true|none|Timestamp showing when the application run was triggered| -|triggered_by|string|true|none|Id of the user who triggered the application run| -|user_payload|any|false|none|Field used internally by the Platform| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -### TransferUrls - - - - - - -```json -{ - "download_url": "http://example.com", - "upload_url": "http://example.com" -} - -``` - -TransferUrls - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|download_url|string(uri)|true|none|none| -|upload_url|string(uri)|true|none|none| - -### UserPayload - - - - - - -```json -{ - "application_id": "string", - "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", - "global_output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - }, - "items": [ - { - "input_artifacts": { - "property1": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - }, - "property2": { - "download_url": "http://example.com", - "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", - "metadata": {} - } - }, - "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", - "output_artifacts": { - "property1": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - }, - "property2": { - "data": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "metadata": { - "download_url": "http://example.com", - "upload_url": "http://example.com" - }, - "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" - } - } - } - ] -} - -``` - -UserPayload - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|application_id|string|true|none|none| -|application_run_id|string(uuid)|true|none|none| -|global_output_artifacts|any|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|object|false|none|none| -|»» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|null|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|items|[[PayloadItem](#schemapayloaditem)]|true|none|none| - -### ValidationError - - - - - - -```json -{ - "loc": [ - "string" - ], - "msg": "string", - "type": "string" -} - -``` - -ValidationError - -#### Properties - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|loc|[anyOf]|true|none|none| - -anyOf - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|string|false|none|none| - -or - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|» *anonymous*|integer|false|none|none| - -continued - -|Name|Type|Required|Restrictions|Description| -|---|---|---|---|---| -|msg|string|true|none|none| -|type|string|true|none|none| +--- +title: is chosen, and which user data +language_tabs: +toc_footers: [] +includes: [] +search: true +highlight_theme: darkula +--- + + + + + + + + + - h-e-tme + title: Application Id + type: string + description: + description: Application documentations + title: Description + type: string + name: + description: Application display name + examples: + - HETA + title: Name + type: string + regulatory_classes: + description: Regulatory class, to which the applications compliance + examples: + - - RuO + items: + type: string + title: Regulatory Classes + type: array + required: + - application_id + - name + - regulatory_classes + - description + title: ApplicationReadResponse + type: object + ApplicationRunStatus: + enum: + - canceled_system + - canceled_user + - completed + - completed_with_error + - received + - rejected + - running + - scheduled + title: ApplicationRunStatus + type: string + ApplicationVersionReadResponse: + properties: + application_id: + description: Application ID + title: Application Id + type: string + application_version_id: + description: Application version ID + examples: + - h-e-tme:v0.0.1 + title: Application Version Id + type: string + changelog: + description: Description of the changes relative to the previous +version + title: Changelog + type: string + flow_id: + anyOf: + - format: uuid + type: string + - type: 'null' + description: Flow ID, used internally by the platform + title: Flow Id + input_artifacts: + description: List of the input fields, provided by the User + items: + $ref: '#/components/schemas/InputArtifactReadResponse' + title: Input Artifacts + type: array + output_artifacts: + description: List of the output fields, generated by the application + items: + $ref: '#/components/schemas/OutputArtifactReadResponse' + title: Output Artifacts + type: array + version: + description: Semantic version of the application + title: Version + type: string + required: + - application_version_id + - version + - application_id + - changelog + - input_artifacts + - output_artifacts + title: ApplicationVersionReadResponse + type: object + HTTPValidationError: + properties: + detail: + items: + $ref: '#/components/schemas/ValidationError' + title: Detail + type: array + title: HTTPValidationError + type: object + InputArtifactCreationRequest: + properties: + download_url: + description: '[Signed +URL](https://cloud.google.com/cdn/docs/using-signed-urls) + to the input artifact file. The URL should be valid for at least 6 +days + from the payload submission time.' + examples: + - https://example.com/case-no-1-slide.tiff + format: uri + maxLength: 2083 + minLength: 1 + title: Download Url + type: string + metadata: + description: The metadata of the artifact, required by the application +version. + The JSON schema of the metadata can be requested by +`/v1/versions/{application_version_id}`. + The schema is located in `input_artifacts.[].metadata_schema` + examples: + - checksum_crc32c: 752f9554 + height: 2000 + height_mpp: 0.5 + width: 10000 + width_mpp: 0.5 + title: Metadata + type: object + name: + description: The artifact name according to the application version. +List + of required artifacts is returned by +`/v1/versions/{application_version_id}`. + The artifact names are located in the `input_artifacts.[].name` +value + examples: + - slide + title: Name + type: string + required: + - name + - download_url + - metadata + title: InputArtifactCreationRequest + type: object + InputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - image/tiff + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + required: + - name + - mime_type + - metadata_schema + title: InputArtifactReadResponse + type: object + ItemCreationRequest: + properties: + input_artifacts: + description: All the input files of the item, required by the +application + version + items: + $ref: '#/components/schemas/InputArtifactCreationRequest' + title: Input Artifacts + type: array + reference: + description: The ID of the slide provided by the caller. The reference +should + be unique across all items of the application run + examples: + - case-no-1 + title: Reference + type: string + required: + - reference + - input_artifacts + title: ItemCreationRequest + type: object + ItemResultReadResponse: + properties: + application_run_id: + description: Application run UUID to which the item belongs + format: uuid + title: Application Run Id + type: string + error: + anyOf: + - type: string + - type: 'null' + description: "\nThe error message in case the item is in +`error_system`\ + \ or `error_user` state\n " + title: Error + item_id: + description: Item UUID generated by the Platform + format: uuid + title: Item Id + type: string + output_artifacts: + description: "\nThe list of the results generated by the application +algorithm.\ + \ The number of files and their\ntypes depend on the particular +application\ + \ version, call `/v1/versions/{version_id}` to get\nthe details.\n +" + items: + $ref: '#/components/schemas/OutputArtifactResultReadResponse' + title: Output Artifacts + type: array + reference: + description: The reference of the item from the user payload + title: Reference + type: string + status: + $ref: '#/components/schemas/ItemStatus' + description: "\nWhen the item is not processed yet, the status is set +to\ + \ `pending`.\n\nWhen the item is successfully finished, status is +set\ + \ to `succeeded`, and the processing results\nbecome available for +download\ + \ in `output_artifacts` field.\n\nWhen the item processing is failed +because\ + \ the provided item is invalid, the status is set to\n`error_user`. +When\ + \ the item processing failed because of the error in the model or +platform,\n\ + the status is set to `error_system`. When the application_run is +canceled,\ + \ the status of all\npending items is set to either `cancelled_user` +or\ + \ `cancelled_system`.\n " + required: + - item_id + - application_run_id + - reference + - status + - error + - output_artifacts + title: ItemResultReadResponse + type: object + ItemStatus: + enum: + - pending + - canceled_user + - canceled_system + - error_user + - error_system + - succeeded + title: ItemStatus + type: string + OutputArtifactReadResponse: + properties: + metadata_schema: + title: Metadata Schema + type: object + mime_type: + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + title: Name + type: string + scope: + $ref: '#/components/schemas/OutputArtifactScope' + required: + - name + - mime_type + - metadata_schema + - scope + title: OutputArtifactReadResponse + type: object + OutputArtifactResultReadResponse: + properties: + download_url: + anyOf: + - format: uri + maxLength: 2083 + minLength: 1 + type: string + - type: 'null' + description: "\nThe download URL to the output file. The URL is valid +for\ + \ 1 hour after the endpoint is called.\nA new URL is generated every +time\ + \ the endpoint is called.\n " + title: Download Url + metadata: + description: The metadata of the output artifact, provided by the +application + title: Metadata + type: object + mime_type: + description: The mime type of the output file + examples: + - application/vnd.apache.parquet + pattern: ^\w+\/\w+[-+.|\w+]+\w+$ + title: Mime Type + type: string + name: + description: "\nName of the output from the output schema from the +`/v1/versions/{version_id}`\ + \ endpoint.\n " + title: Name + type: string + output_artifact_id: + description: The Id of the artifact. Used internally + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - name + - mime_type + - metadata + - download_url + title: OutputArtifactResultReadResponse + type: object + OutputArtifactScope: + enum: + - item + - global + title: OutputArtifactScope + type: string + PayloadInputArtifact: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + input_artifact_id: + format: uuid + title: Input Artifact Id + type: string + metadata: + title: Metadata + type: object + required: + - metadata + - download_url + title: PayloadInputArtifact + type: object + PayloadItem: + properties: + input_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadInputArtifact' + title: Input Artifacts + type: object + item_id: + format: uuid + title: Item Id + type: string + output_artifacts: + additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + title: Output Artifacts + type: object + required: + - item_id + - input_artifacts + - output_artifacts + title: PayloadItem + type: object + PayloadOutputArtifact: + properties: + data: + $ref: '#/components/schemas/TransferUrls' + metadata: + $ref: '#/components/schemas/TransferUrls' + output_artifact_id: + format: uuid + title: Output Artifact Id + type: string + required: + - output_artifact_id + - data + - metadata + title: PayloadOutputArtifact + type: object + RunCreationRequest: + description: 'Application run payload. It describes which application +version + is chosen, and which user data + +> components: + +> schemas: + +> ApplicationReadResponse: + +> properties: + +> application_id: + +> description: Application ID + +> examples: + + should be processed.' + properties: + application_version_id: + description: Application version ID + examples: + - h-e-tme:v1.2.3 + title: Application Version Id + type: string + items: + description: List of the items to process by the application + items: + $ref: '#/components/schemas/ItemCreationRequest' + title: Items + type: array + required: + - application_version_id + - items + title: RunCreationRequest + type: object + RunCreationResponse: + properties: + application_run_id: + default: Application run id + format: uuid + title: Application Run Id + type: string + title: RunCreationResponse + type: object + RunReadResponse: + properties: + application_run_id: + description: UUID of the application + format: uuid + title: Application Run Id + type: string + application_version_id: + description: ID of the application version + title: Application Version Id + type: string + organization_id: + description: Organization of the owner of the application run + title: Organization Id + type: string + status: + $ref: '#/components/schemas/ApplicationRunStatus' + description: "\nWhen the application run request is received by the +Platform,\ + \ the `status` of it is set to\n`received`. Then it is transitioned +to\ + \ `scheduled`, when it is scheduled for the processing.\nWhen the +application\ + \ run is scheduled, it will process the input items and generate the +result\n\ + incrementally. As soon as the first result is generated, the state +is\ + \ changed to `running`.\nThe results can be downloaded via +`/v1/runs/{run_id}/results`\ + \ endpoint.\nWhen all items are processed and all results are +generated,\ + \ the application status is set to\n`completed`. If the processing +is\ + \ done, but some items fail, the status is set +to\n`completed_with_error`.\n\ + \nWhen the application run request is rejected by the Platform +before\ + \ scheduling, it is transferred\nto `rejected`. When the application +run\ + \ reaches the threshold of number of failed items, the +whole\napplication\ + \ run is set to `canceled_system` and the remaining pending items +are\ + \ not processed.\nWhen the application run fails, the finished item +results\ + \ are available for download.\n\nIf the application run is canceled +by\ + \ calling `POST /v1/runs/{run_id}/cancel` endpoint, the\nprocessing +of\ + \ the items is stopped, and the application status is set to +`cancelled_user`\n\ + \ " + triggered_at: + description: Timestamp showing when the application run was triggered + format: date-time + title: Triggered At + type: string + triggered_by: + description: Id of the user who triggered the application run + title: Triggered By + type: string + user_payload: + anyOf: + - $ref: '#/components/schemas/UserPayload' + - type: 'null' + description: Field used internally by the Platform + required: + - application_run_id + - application_version_id + - organization_id + - status + - triggered_at + - triggered_by + title: RunReadResponse + type: object + TransferUrls: + properties: + download_url: + format: uri + minLength: 1 + title: Download Url + type: string + upload_url: + format: uri + minLength: 1 + title: Upload Url + type: string + required: + - upload_url + - download_url + title: TransferUrls + type: object + UserPayload: + properties: + application_id: + title: Application Id + type: string + application_run_id: + format: uuid + title: Application Run Id + type: string + global_output_artifacts: + anyOf: + - additionalProperties: + $ref: '#/components/schemas/PayloadOutputArtifact' + type: object + - type: 'null' + title: Global Output Artifacts + items: + items: + $ref: '#/components/schemas/PayloadItem' + title: Items + type: array + required: + - application_id + - application_run_id + - global_output_artifacts + - items + title: UserPayload + type: object + ValidationError: + properties: + loc: + items: + anyOf: + - type: string + - type: integer + title: Location + type: array + msg: + title: Message + type: string + type: + title: Error Type + type: string + required: + - loc + - msg + - type + title: ValidationError + type: object + securitySchemes: + OAuth2AuthorizationCodeBearer: + flows: + authorizationCode: + authorizationUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize + scopes: {} + tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token + type: oauth2 +info: + description: ' + + Pagination is done via `page` and `page_size`. Sorting via `sort` query +parameter. + + The `sort` query parameter can be provided multiple times. The sorting +direction + can be indicated via + + `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`.' + title: Aignostics Platform API reference + version: 1.0.0 +openapi: 3.1.0 +paths: + /v1/applications: + get: + description: 'Returns the list of the applications, available to the +caller. + + + The application is available if any of the version of the application is +assigned + to the + + user organization. To switch between organizations, the user should +re-login + and choose the + + needed organization.' + operationId: list_applications_v1_applications_get + parameters: + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationReadResponse' + title: Response List Applications V1 Applications Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Applications + tags: + - Public + /v1/applications/{application_id}/versions: + get: + description: 'Returns the list of the application versions for this +application, + available to the caller. + + + The application version is available if it is assigned to the user''s +organization. + + + The application versions are assigned to the organization by the +Aignostics + admin. To + + assign or unassign a version from your organization, please contact +Aignostics + support team.' + operationId: +list_versions_by_application_id_v1_applications__application_id__versions_get + parameters: + - in: path + name: application_id + required: true + schema: + title: Application Id + type: string + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: version + required: false + schema: + anyOf: + - type: string + - type: 'null' + title: Version + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ApplicationVersionReadResponse' + title: Response List Versions By Application Id V1 Applications +Application + Id Versions Get + type: array + description: Successful Response + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Versions By Application Id + tags: + - Public + /v1/runs: + get: + description: 'The endpoint returns the application runs triggered by the +caller. + After the application run + + is created by POST /v1/runs, it becomes available for the current +endpoint' + operationId: list_application_runs_v1_runs_get + parameters: + - description: Optional application ID filter + in: query + name: application_id + required: false + schema: + anyOf: + - type: string + - type: 'null' + description: Optional application ID filter + title: Application Id + - description: Optional application version filter + in: query + name: application_version + required: false + schema: + anyOf: + - type: string + - type: 'null' + description: Optional application version filter + title: Application Version + - description: Request optional output values. Used internally by the +platform + in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + description: Request optional output values. Used internally by the +platform + title: Include + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/RunReadResponse' + title: Response List Application Runs V1 Runs Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Application Runs + tags: + - Public + post: + description: "The endpoint is used to process the input items by the +chosen\ + \ application version. The endpoint\nreturns the `application_run_id`. +The\ + \ processing fo the items is done asynchronously.\n\nTo check the status +or\ + \ cancel the execution, use the /v1/runs/{application_run_id} +endpoint.\n\n\ + ### Payload\n\nThe payload includes `application_version_id` and `items` +base\ + \ fields.\n\n`application_version_id` is the id used for +`/v1/versions/{application_id}`\ + \ endpoint.\n\n`items` includes the list of the items to process +(slides,\ + \ in case of HETA application).\nEvery item has a set of standard fields +defined\ + \ by the API, plus the metadata, specific to the\nchosen +application.\n\n\ + Example payload structure with the comments:\n```\n{\n +application_version_id:\ + \ \"heta:v1.0.0\",\n items: [{\n \"reference\": \"slide_1\" +<--\ + \ Input ID to connect the input and the output artifact\n +\"input_artifacts\"\ + : [{\n \"name\": \"input_slide\" <-- Name of the artifact +defined\ + \ by the application (For HETA it is\"input_slide\")\n +\"download_url\"\ + : \"https://...\" <-- signed URL to the input file in the S3 or GCS. +Should\ + \ be valid for more than 6 days\n \"metadata\": { <-- The +metadata\ + \ fields defined by the application. (The example fields set for a slide +files\ + \ are provided)\n \"checksum_crc32c\": \"abc12==\",\n +\ + \ \"mime_type\": \"image/tiff\",\n \"height\": +100,\n\ + \ \"weight\": 500,\n \"mpp\": 0.543\n +\ + \ }\n }]\n }]\n}\n```\n\n### Response\n\nThe endpoint +returns\ + \ the application run UUID. After that the job is scheduled for +the\nexecution\ + \ in the background.\n\nTo check the status of the run call +`v1/runs/{application_run_id}`.\n\ + \n### Rejection\n\nApart from the authentication, authorization and +malformed\ + \ input error, the request can be\nrejected when the quota limit is +exceeded.\ + \ More details on quotas is described in the\ndocumentation" + operationId: create_application_run_v1_runs_post + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationRequest' + required: true + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/RunCreationResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Create Application Run + tags: + - Public + /v1/runs/{application_run_id}: + get: + description: 'Returns the details of the application run. The application +run + is available as soon as it is + + created via `POST /runs/` endpoint. To download the items results, call + + `/runs/{application_run_id}/results`. + + + The application is only available to the user who triggered it, +regardless + of the role.' + operationId: get_run_v1_runs__application_run_id__get + parameters: + - description: Application run id, returned by `POST /runs/` endpoint + in: path + name: application_run_id + required: true + schema: + description: Application run id, returned by `POST /runs/` endpoint + format: uuid + title: Application Run Id + type: string + - in: query + name: include + required: false + schema: + anyOf: + - maxItems: 1 + minItems: 1 + prefixItems: + - type: string + type: array + - type: 'null' + title: Include + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RunReadResponse' + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Get Run + tags: + - Public + /v1/runs/{application_run_id}/cancel: + post: + description: 'The application run can be canceled by the user who created +the + application run. + + + The execution can be canceled any time while the application is not in a +final + state. The + + pending items will not be processed and will not add to the cost. + + + When the application is canceled, the already completed items stay +available + for download.' + operationId: +cancel_application_run_v1_runs__application_run_id__cancel_post + parameters: + - description: Application run id, returned by `POST /runs/` endpoint + in: path + name: application_run_id + required: true + schema: + description: Application run id, returned by `POST /runs/` endpoint + format: uuid + title: Application Run Id + type: string + responses: + '202': + content: + application/json: + schema: {} + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Cancel Application Run + tags: + - Public + /v1/runs/{application_run_id}/results: + delete: + description: 'Delete the application run results. It can only be called +when + the application is in a final + + state (meaning it''s not in `received` or `pending` states). To delete +the + results of the running + + artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to +cancel + the application run. + + + The output results are deleted automatically 30 days after the +application + run is finished.' + operationId: +delete_application_run_results_v1_runs__application_run_id__results_delete + parameters: + - description: Application run id, returned by `POST /runs/` endpoint + in: path + name: application_run_id + required: true + schema: + description: Application run id, returned by `POST /runs/` endpoint + format: uuid + title: Application Run Id + type: string + responses: + '204': + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: Delete Application Run Results + tags: + - Public + get: + description: Get the list of the results for the run items + operationId: list_run_results_v1_runs__application_run_id__results_get + parameters: + - description: Application run id, returned by `POST /runs/` endpoint + in: path + name: application_run_id + required: true + schema: + description: Application run id, returned by `POST /runs/` endpoint + format: uuid + title: Application Run Id + type: string + - description: Filter for items ids + in: query + name: item_id__in + required: false + schema: + anyOf: + - items: + format: uuid + type: string + type: array + - type: 'null' + description: Filter for items ids + title: Item Id In + - description: Filter for items by their reference from the input payload + in: query + name: reference__in + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + description: Filter for items by their reference from the input +payload + title: Reference In + - description: Filter for items in certain statuses + in: query + name: status__in + required: false + schema: + anyOf: + - items: + $ref: '#/components/schemas/ItemStatus' + type: array + - type: 'null' + description: Filter for items in certain statuses + title: Status In + - in: query + name: page + required: false + schema: + default: 1 + minimum: 1 + title: Page + type: integer + - in: query + name: page_size + required: false + schema: + default: 50 + maximum: 100 + minimum: 5 + title: Page Size + type: integer + - in: query + name: sort + required: false + schema: + anyOf: + - items: + type: string + type: array + - type: 'null' + title: Sort + responses: + '200': + content: + application/json: + schema: + items: + $ref: '#/components/schemas/ItemResultReadResponse' + title: Response List Run Results V1 Runs Application Run Id +Results + Get + type: array + description: Successful Response + '404': + description: Application run not found + '422': + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPValidationError' + description: Validation Error + security: + - OAuth2AuthorizationCodeBearer: [] + summary: List Run Results + tags: + - Public +servers: +- url: /api diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index 9c820085..3f6a33fd 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -297,6 +297,41 @@ SOFTWARE. ``` +## PySocks (1.7.1) - BSD + +A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. + +* URL: https://github.com/Anorov/PySocks +* Author(s): Anorov + +### License Text + +``` +Copyright 2006 Dan-Haim. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +3. Neither the name of Dan Haim nor the names of his contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY DAN HAIM "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL DAN HAIM OR HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMANGE. + +``` + ## PyYAML (6.0.2) - MIT License YAML parser and emitter for Python @@ -470,6 +505,761 @@ SOFTWARE. ``` +## aiofiles (24.1.0) - Apache Software License + +File support for asyncio. + +* URL: https://github.com/Tinche/aiofiles +* Author(s): Tin Tvrtkovic + +### License Text + +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +``` + +### Notice + +``` +Asyncio support for files +Copyright 2016 Tin Tvrtkovic + +``` + +## aiohappyeyeballs (2.6.1) - Python Software Foundation License + +Happy Eyeballs for asyncio + +* URL: https://github.com/aio-libs/aiohappyeyeballs +* Author(s): J. Nick Koston + +### License Text + +``` +A. HISTORY OF THE SOFTWARE +========================== + +Python was created in the early 1990s by Guido van Rossum at Stichting +Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands +as a successor of a language called ABC. Guido remains Python's +principal author, although it includes many contributions from others. + +In 1995, Guido continued his work on Python at the Corporation for +National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) +in Reston, Virginia where he released several versions of the +software. + +In May 2000, Guido and the Python core development team moved to +BeOpen.com to form the BeOpen PythonLabs team. In October of the same +year, the PythonLabs team moved to Digital Creations, which became +Zope Corporation. In 2001, the Python Software Foundation (PSF, see +https://www.python.org/psf/) was formed, a non-profit organization +created specifically to own Python-related Intellectual Property. +Zope Corporation was a sponsoring member of the PSF. + +All Python releases are Open Source (see https://opensource.org for +the Open Source Definition). Historically, most, but not all, Python +releases have also been GPL-compatible; the table below summarizes +the various releases. + + Release Derived Year Owner GPL- + from compatible? (1) + + 0.9.0 thru 1.2 1991-1995 CWI yes + 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes + 1.6 1.5.2 2000 CNRI no + 2.0 1.6 2000 BeOpen.com no + 1.6.1 1.6 2001 CNRI yes (2) + 2.1 2.0+1.6.1 2001 PSF no + 2.0.1 2.0+1.6.1 2001 PSF yes + 2.1.1 2.1+2.0.1 2001 PSF yes + 2.1.2 2.1.1 2002 PSF yes + 2.1.3 2.1.2 2002 PSF yes + 2.2 and above 2.1.1 2001-now PSF yes + +Footnotes: + +(1) GPL-compatible doesn't mean that we're distributing Python under + the GPL. All Python licenses, unlike the GPL, let you distribute + a modified version without making your changes open source. The + GPL-compatible licenses make it possible to combine Python with + other software that is released under the GPL; the others don't. + +(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, + because its license has a choice of law clause. According to + CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 + is "not incompatible" with the GPL. + +Thanks to the many outside volunteers who have worked under Guido's +direction to make these releases possible. + + +B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON +=============================================================== + +Python software and documentation are licensed under the +Python Software Foundation License Version 2. + +Starting with Python 3.8.6, examples, recipes, and other code in +the documentation are dual licensed under the PSF License Version 2 +and the Zero-Clause BSD license. + +Some software incorporated into Python is under different licenses. +The licenses are listed with code falling under that license. + + +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 +-------------------------------------------- + +1. This LICENSE AGREEMENT is between the Python Software Foundation +("PSF"), and the Individual or Organization ("Licensee") accessing and +otherwise using this software ("Python") in source or binary form and +its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, PSF hereby +grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, +analyze, test, perform and/or display publicly, prepare derivative works, +distribute, and otherwise use Python alone or in any derivative version, +provided, however, that PSF's License Agreement and PSF's notice of copyright, +i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation; +All Rights Reserved" are retained in Python alone or in any derivative version +prepared by Licensee. + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python. + +4. PSF is making Python available to Licensee on an "AS IS" +basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. Nothing in this License Agreement shall be deemed to create any +relationship of agency, partnership, or joint venture between PSF and +Licensee. This License Agreement does not grant permission to use PSF +trademarks or trade name in a trademark sense to endorse or promote +products or services of Licensee, or any third party. + +8. By copying, installing or otherwise using Python, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 +------------------------------------------- + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + +1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an +office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the +Individual or Organization ("Licensee") accessing and otherwise using +this software in source or binary form and its associated +documentation ("the Software"). + +2. Subject to the terms and conditions of this BeOpen Python License +Agreement, BeOpen hereby grants Licensee a non-exclusive, +royalty-free, world-wide license to reproduce, analyze, test, perform +and/or display publicly, prepare derivative works, distribute, and +otherwise use the Software alone or in any derivative version, +provided, however, that the BeOpen Python License is retained in the +Software, alone or in any derivative version prepared by Licensee. + +3. BeOpen is making the Software available to Licensee on an "AS IS" +basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE +SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS +AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY +DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +5. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +6. This License Agreement shall be governed by and interpreted in all +respects by the law of the State of California, excluding conflict of +law provisions. Nothing in this License Agreement shall be deemed to +create any relationship of agency, partnership, or joint venture +between BeOpen and Licensee. This License Agreement does not grant +permission to use BeOpen trademarks or trade names in a trademark +sense to endorse or promote products or services of Licensee, or any +third party. As an exception, the "BeOpen Python" logos available at +http://www.pythonlabs.com/logos.html may be used according to the +permissions granted on that web page. + +7. By copying, installing or otherwise using the software, Licensee +agrees to be bound by the terms and conditions of this License +Agreement. + + +CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 +--------------------------------------- + +1. This LICENSE AGREEMENT is between the Corporation for National +Research Initiatives, having an office at 1895 Preston White Drive, +Reston, VA 20191 ("CNRI"), and the Individual or Organization +("Licensee") accessing and otherwise using Python 1.6.1 software in +source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI +hereby grants Licensee a nonexclusive, royalty-free, world-wide +license to reproduce, analyze, test, perform and/or display publicly, +prepare derivative works, distribute, and otherwise use Python 1.6.1 +alone or in any derivative version, provided, however, that CNRI's +License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) +1995-2001 Corporation for National Research Initiatives; All Rights +Reserved" are retained in Python 1.6.1 alone or in any derivative +version prepared by Licensee. Alternately, in lieu of CNRI's License +Agreement, Licensee may substitute the following text (omitting the +quotes): "Python 1.6.1 is made available subject to the terms and +conditions in CNRI's License Agreement. This Agreement together with +Python 1.6.1 may be located on the internet using the following +unique, persistent identifier (known as a handle): 1895.22/1013. This +Agreement may also be obtained from a proxy server on the internet +using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on +or incorporates Python 1.6.1 or any part thereof, and wants to make +the derivative work available to others as provided herein, then +Licensee hereby agrees to include in any such work a brief summary of +the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" +basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND +DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS +FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT +INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON +1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS +A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, +OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material +breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal +intellectual property law of the United States, including without +limitation the federal copyright law, and, to the extent such +U.S. federal law does not apply, by the law of the Commonwealth of +Virginia, excluding Virginia's conflict of law provisions. +Notwithstanding the foregoing, with regard to derivative works based +on Python 1.6.1 that incorporate non-separable material that was +previously distributed under the GNU General Public License (GPL), the +law of the Commonwealth of Virginia shall govern this License +Agreement only as to issues arising under or with respect to +Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this +License Agreement shall be deemed to create any relationship of +agency, partnership, or joint venture between CNRI and Licensee. This +License Agreement does not grant permission to use CNRI trademarks or +trade name in a trademark sense to endorse or promote products or +services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, +installing or otherwise using Python 1.6.1, Licensee agrees to be +bound by the terms and conditions of this License Agreement. + + ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 +-------------------------------------------------- + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, +The Netherlands. All rights reserved. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION +---------------------------------------------------------------------- + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +``` + +## aiohttp (3.11.16) - Apache Software License + +Async http client/server framework (asyncio) + +* URL: https://github.com/aio-libs/aiohttp +* Maintainer(s): aiohttp team + +### License Text + +``` + Copyright aio-libs contributors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## aiosignal (1.3.2) - Apache Software License + +aiosignal: a list of registered asynchronous callbacks + +* URL: https://github.com/aio-libs/aiosignal +* Maintainer(s): aiohttp team + +### License Text + +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013-2019 Nikolay Kim and Andrew Svetlov + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + ## alabaster (1.0.0) - BSD License A light, configurable Sphinx theme @@ -2044,6 +2834,395 @@ Isaac Muse ``` +## bidict (0.23.1) - Mozilla Public License 2.0 (MPL 2.0) + +The bidirectional mapping library for Python. + +* URL: https://github.com/jab/bidict +* Author(s): Joshua Bronson + +### License Text + +``` +Mozilla Public License Version 2.0 +================================== + +Copyright 2009-2024 Joshua Bronson. All rights reserved. + + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + +``` + ## bleach (6.2.0) - Apache Software License An easy safelist-based HTML-sanitizing tool. @@ -2140,7 +3319,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## boto3 (1.37.28) - Apache Software License +## boto3 (1.38.1) - Apache Software License The AWS SDK for Python @@ -2338,7 +3517,7 @@ Copyright 2013-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. ``` -## botocore (1.37.28) - Apache Software License +## botocore (1.38.1) - Apache Software License Low-level, data-driven core of boto 3. @@ -2594,6 +3773,38 @@ one at http://mozilla.org/MPL/2.0/. ``` +## bottle (0.13.2) - MIT License + +Fast and simple WSGI-framework for small web-applications. + +* URL: http://bottlepy.org/ +* Author(s): Marcel Hellkamp + +### License Text + +``` +Copyright (c) 2009-2024, Marcel Hellkamp. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## bracex (2.5.post1) - MIT License Bash style brace expander. @@ -2628,7 +3839,7 @@ SOFTWARE. ``` -## bump-my-version (1.1.1) - MIT License +## bump-my-version (1.1.2) - MIT License Version bump your Python project @@ -3391,6 +4602,47 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## cloudpathlib (0.21.0) - MIT License + +pathlib-style classes for cloud storage services. + +* URL: https://github.com/drivendataorg/cloudpathlib +* Author(s): DrivenData + +### License Text + +``` +MIT License + +Copyright (c) 2020 DrivenData Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## cloudpickle (3.1.1) - BSD License + +Pickler class to extend the standard pickle.Pickler functionality + +* URL: https://github.com/cloudpipe/cloudpickle +* Author(s): The cloudpickle developer team + ## colorama (0.4.6) - BSD License Cross-platform colored terminal text. @@ -4806,6 +6058,27 @@ limitations under the License. ``` +## dicomweb-client (0.59.3) - MIT License + +Client for DICOMweb RESTful services. + +* URL: https://github.com/ImagingDataCommons/dicomweb-client +* Author(s): Markus D. Herrmann +* Maintainer(s): Markus D. Herrmann, Christopher P. Bridge, Steve Pieper + +### License Text + +``` +Copyright 2020 MGH Computational Pathology + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + ## dict2css (0.3.0.post1) - MIT License A μ-library for constructing cascading style sheets from Python dictionaries. @@ -5388,6 +6661,278 @@ OR OTHER DEALINGS IN THE SOFTWARE. ``` +## duckdb (1.2.1) - MIT License + +DuckDB in-process database + +* URL: https://www.duckdb.org +* Maintainer(s): Hannes Muehleisen + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +------------------------------------------------------------------------------------ +This product bundles various third-party components under other open source licenses. +This section summarizes those components and their licenses. See licenses/ +for text of these licenses. + + +Apache Software Foundation License 2.0 +-------------------------------------- + +common/network-common/src/main/java/org/apache/spark/network/util/LimitedInputStream.java +core/src/main/java/org/apache/spark/util/collection/TimSort.java +core/src/main/resources/org/apache/spark/ui/static/bootstrap* +core/src/main/resources/org/apache/spark/ui/static/vis* +docs/js/vendor/bootstrap.js +connector/spark-ganglia-lgpl/src/main/java/com/codahale/metrics/ganglia/GangliaReporter.java + + +Python Software Foundation License +---------------------------------- + +python/docs/source/_static/copybutton.js + +BSD 3-Clause +------------ + +python/lib/py4j-*-src.zip +python/pyspark/cloudpickle/*.py +python/pyspark/join.py +core/src/main/resources/org/apache/spark/ui/static/d3.min.js + +The CSS style for the navigation sidebar of the documentation was originally +submitted by Óscar Nájera for the scikit-learn project. The scikit-learn project +is distributed under the 3-Clause BSD license. + + +MIT License +----------- + +core/src/main/resources/org/apache/spark/ui/static/dagre-d3.min.js +core/src/main/resources/org/apache/spark/ui/static/*dataTables* +core/src/main/resources/org/apache/spark/ui/static/graphlib-dot.min.js +core/src/main/resources/org/apache/spark/ui/static/jquery* +core/src/main/resources/org/apache/spark/ui/static/sorttable.js +docs/js/vendor/anchor.min.js +docs/js/vendor/jquery* +docs/js/vendor/modernizer* + + +Creative Commons CC0 1.0 Universal Public Domain Dedication +----------------------------------------------------------- +(see LICENSE-CC0.txt) + +data/mllib/images/kittens/29.5.a_b_EGDP022204.jpg +data/mllib/images/kittens/54893.jpg +data/mllib/images/kittens/DP153539.jpg +data/mllib/images/kittens/DP802813.jpg +data/mllib/images/multi-channel/chr30.4.184.jpg +``` + ## email_validator (2.2.0) - The Unlicense (Unlicense) A robust email address syntax and deliverability validation library. @@ -5428,7 +6973,7 @@ For more information, please refer to ``` -## enum-tools (0.12.0) - GNU Lesser General Public License v3 or later (LGPLv3+) +## enum-tools (0.13.0) - GNU Lesser General Public License v3 or later (LGPLv3+) Tools to expand Python's enum module. @@ -6237,6 +7782,262 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice ``` +## frozenlist (1.6.0) - Apache-2.0 + +A list-like structure which implements collections.abc.MutableSequence + +* URL: https://github.com/aio-libs/frozenlist +* Maintainer(s): aiohttp team + +### License Text + +``` +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013-2019 Nikolay Kim and Andrew Svetlov + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## fsspec (2024.12.0) - BSD License + +File-system specification + +* URL: https://github.com/fsspec/filesystem_spec +* Maintainer(s): Martin Durant + +### License Text + +``` +BSD 3-Clause License + +Copyright (c) 2018, Martin Durant +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + ## furo (2024.8.6) - MIT License A clean customisable Sphinx documentation theme. @@ -6546,7 +8347,7 @@ Google API client core library ``` -## google-auth (2.38.0) - Apache Software License +## google-auth (2.39.0) - Apache Software License Google Authentication Library @@ -7835,7 +9636,7 @@ Common protobufs used in Google APIs ``` -## h11 (0.14.0) - MIT License +## h11 (0.16.0) - MIT License A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 @@ -7870,6 +9671,27 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` +## highdicom (0.25.1) - MIT License + +High-level DICOM abstractions. + +* URL: https://github.com/imagingdatacommons/highdicom +* Author(s): Markus D. Herrmann, Christopher P. Bridge +* Maintainer(s): Markus D. Herrmann, Christopher P. Bridge + +### License Text + +``` +Copyright 2020 MGH Computational Pathology + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + ## html5lib (1.1) - MIT License HTML parser based on the WHATWG HTML specification @@ -8002,6 +9824,72 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ``` +## idc-index (0.8.6) - MIT License + +Package to query and download data from an index of ImagingDataCommons + +* URL: https://github.com/ImagingDataCommons/idc-index +* Author(s): Andrey Fedorov , Vamsi Thiriveedhi + +### License Text + +``` +MIT License + +Copyright (c) 2023 Imaging Data Commons + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## idc-index-data (20.0.3) - MIT License + +ImagingDataCommons index to query and download data. + +* URL: https://github.com/ImagingDataCommons/idc-index-data +* Author(s): Andrey Fedorov , Vamsi Thiriveedhi , Jean-Christophe Fillion-Robin + +### License Text + +``` +Copyright 2024 Andrey Fedorov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## identify (2.6.9) - MIT License File identification library for Python @@ -8078,6 +9966,40 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## ifaddr (0.2.0) - MIT License + +Cross-platform network interface and IP address enumeration library + +* URL: https://github.com/pydron/ifaddr +* Author(s): Stefan C. Mueller + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2014 Stefan C. Mueller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## imagesize (1.4.1) - MIT License Getting image size from png/jpeg/jpeg2000/gif file @@ -10019,7 +11941,7 @@ license-expression is a comprehensive utility library to parse, compare, simplif ``` -## logfire (3.13.1) - MIT License +## logfire (3.14.1) - MIT License The best Python observability tool! 🪵🔥 @@ -10096,7 +12018,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## marimo (0.12.8) - Apache Software License +## marimo (0.13.1) - Apache Software License A library for making reactive notebooks and apps @@ -10344,6 +12266,112 @@ SOFTWARE. ``` +## markdown2 (2.5.3) - MIT License + +A fast and complete Python implementation of Markdown + +* URL: https://github.com/trentm/python-markdown2 +* Author(s): Trent Mick +* Maintainer(s): Trent Mick + +### License Text + +``` +This implementation of Markdown is licensed under the MIT License: + + The MIT License + + Copyright (c) 2012 Trent Mick + Copyright (c) 2010 ActiveState Software Inc. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to permit + persons to whom the Software is furnished to do so, subject to the + following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +All files in a *source package* of markdown2 (i.e. those available on +pypi.python.org and the Google Code project "downloads" page) are under the +MIT license. However, in the *subversion repository* there are some files +(used for performance and testing purposes) that are under different licenses +as follows: + +- perf/recipes.pprint + + Python License. This file includes a number of real-world examples of + Markdown from the ActiveState Python Cookbook, used for doing some + performance testing of markdown2.py. + +- test/php-markdown-cases/... + test/php-markdown-extra-cases/... + + GPL. These are from the MDTest package announced here: + http://six.pairlist.net/pipermail/markdown-discuss/2007-July/000674.html + +- test/markdown.py + + GPL 2 or BSD. A copy (currently old) of Python-Markdown -- the other + Python Markdown implementation. + +- test/markdown.php + + BSD-style. This is PHP Markdown + (http://michelf.com/projects/php-markdown/). + +- test/Markdown.pl: BSD-style + + A copy of Perl Markdown (http://daringfireball.net/projects/markdown/). + + +``` + +## marshmallow (3.26.1) - MIT License + +A lightweight library for converting complex datatypes to and from native Python datatypes. + +* URL: https://github.com/marshmallow-code/marshmallow +* Author(s): Steven Loria +* Maintainer(s): Steven Loria , Jérôme Lafréchoux , Jared Deckard + +### License Text + +``` +Copyright Steven Loria and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## matplotlib (3.10.1) - Python Software Foundation License Python plotting package @@ -10642,6 +12670,32 @@ Copyright (C) 2008-2011 INADA Naoki ``` +## multidict (6.4.3) - Apache Software License + +multidict implementation + +* URL: https://github.com/aio-libs/multidict +* Author(s): Andrew Svetlov + +### License Text + +``` + Copyright 2016 Andrew Svetlov and aio-libs contributors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + ## mypy (1.15.0) - MIT License Optional static typing for Python @@ -11159,6 +13213,40 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## nicegui (2.15.0) - MIT License + +Create web-based user interfaces with Python. The nice way. + +* URL: https://github.com/zauberzeug/nicegui +* Author(s): Zauberzeug GmbH + +### License Text + +``` +MIT License + +Copyright (c) 2021 Zauberzeug GmbH + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## nodeenv (1.9.1) - BSD License Node.js virtual environment builder @@ -16602,6 +18690,22 @@ limitations under the License. ``` +## outcome (1.3.0.post0) - Apache Software License; MIT License + +Capture the outcome of Python function calls. + +* URL: https://github.com/python-trio/outcome +* Author(s): Frazer McLean + +### License Text + +``` +This software is made available under the terms of *either* of the +licenses found in LICENSE.APACHE2 or LICENSE.MIT. Contributions to are +made under the terms of *both* these licenses. + +``` + ## overrides (7.7.0) - Apache License, Version 2.0 A decorator to automatically detect mismatch when overriding a method. @@ -20080,162 +22184,429 @@ A tool for scanning Python environments for known vulnerabilities END OF TERMS AND CONDITIONS -``` - -## platformdirs (4.3.7) - MIT License - -A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. - -* URL: https://github.com/tox-dev/platformdirs -* Maintainer(s): Bernát Gábor , Julian Berman , Ofek Lev , Ronny Pfannschmidt - -### License Text +``` + +## platformdirs (4.3.7) - MIT License + +A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. + +* URL: https://github.com/tox-dev/platformdirs +* Maintainer(s): Bernát Gábor , Julian Berman , Ofek Lev , Ronny Pfannschmidt + +### License Text + +``` +MIT License + +Copyright (c) 2010-202x The platformdirs developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## pluggy (1.5.0) - MIT License + +plugin and hook calling mechanisms for python + +* URL: https://github.com/pytest-dev/pluggy +* Author(s): Holger Krekel + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2015 holger krekel (rather uses bitbucket/hpk42) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## pre_commit (4.2.0) - MIT License + +A framework for managing and maintaining multi-language pre-commit hooks. + +* URL: https://github.com/pre-commit/pre-commit +* Author(s): Anthony Sottile + +### License Text + +``` +Copyright (c) 2014 pre-commit dev team: Anthony Sottile, Ken Struys + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + +## prettytable (3.16.0) - UNKNOWN + +A simple Python library for easily displaying tabular data in a visually appealing ASCII table format + +* URL: https://github.com/prettytable/prettytable +* Author(s): Luke Maurits +* Maintainer(s): Hugo van Kemenade + +### License Text + +``` +# Copyright (c) 2009-2014 Luke Maurits +# All rights reserved. +# With contributions from: +# * Chris Clark +# * Klein Stephane +# * John Filleau +# * Vladimir Vrzić +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +``` + +## prometheus_client (0.21.1) - Apache Software License + +Python client for the Prometheus monitoring system. + +* URL: https://github.com/prometheus/client_python +* Author(s): Brian Brazil + +### License Text + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. -``` -MIT License + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright (c) 2010-202x The platformdirs developers + Copyright [yyyy] [name of copyright owner] -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## pluggy (1.5.0) - MIT License - -plugin and hook calling mechanisms for python - -* URL: https://github.com/pytest-dev/pluggy -* Author(s): Holger Krekel - -### License Text +### Notice ``` -The MIT License (MIT) - -Copyright (c) 2015 holger krekel (rather uses bitbucket/hpk42) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +Prometheus instrumentation library for Python applications +Copyright 2015 The Prometheus Authors -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +This product bundles decorator 4.0.10 which is available under a "2-clause BSD" +license. For details, see prometheus_client/decorator.py. ``` -## pre_commit (4.2.0) - MIT License +## prompt_toolkit (3.0.50) - BSD License -A framework for managing and maintaining multi-language pre-commit hooks. +Library for building powerful interactive command lines in Python -* URL: https://github.com/pre-commit/pre-commit -* Author(s): Anthony Sottile +* URL: https://github.com/prompt-toolkit/python-prompt-toolkit +* Author(s): Jonathan Slenders ### License Text ``` -Copyright (c) 2014 pre-commit dev team: Anthony Sottile, Ken Struys - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -``` +Copyright (c) 2014, Jonathan Slenders +All rights reserved. -## prettytable (3.16.0) - UNKNOWN +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: -A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -* URL: https://github.com/prettytable/prettytable -* Author(s): Luke Maurits -* Maintainer(s): Hugo van Kemenade +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. -### License Text +* Neither the name of the {organization} nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. -``` -# Copyright (c) 2009-2014 Luke Maurits -# All rights reserved. -# With contributions from: -# * Chris Clark -# * Klein Stephane -# * John Filleau -# * Vladimir Vrzić -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * The name of the author may not be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## prometheus_client (0.21.1) - Apache Software License +## propcache (0.3.1) - Apache Software License -Python client for the Prometheus monitoring system. +Accelerated property cache -* URL: https://github.com/prometheus/client_python -* Author(s): Brian Brazil +* URL: https://github.com/aio-libs/propcache +* Author(s): Andrew Svetlov +* Maintainer(s): aiohttp team ### License Text ``` + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -20443,51 +22814,19 @@ Python client for the Prometheus monitoring system. ### Notice ``` -Prometheus instrumentation library for Python applications -Copyright 2015 The Prometheus Authors - -This product bundles decorator 4.0.10 which is available under a "2-clause BSD" -license. For details, see prometheus_client/decorator.py. - -``` + Copyright 2016-2021, Andrew Svetlov and aio-libs team -## prompt_toolkit (3.0.50) - BSD License - -Library for building powerful interactive command lines in Python - -* URL: https://github.com/prompt-toolkit/python-prompt-toolkit -* Author(s): Jonathan Slenders - -### License Text - -``` -Copyright (c) 2014, Jonathan Slenders -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -* Neither the name of the {organization} nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + http://www.apache.org/licenses/LICENSE-2.0 -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` @@ -20749,6 +23088,50 @@ of the input file used when generating it. This code is not standalone and requires a support library to be linked with it. This support library is itself covered by the above license. +``` + +## proxy_tools (0.1.0) - MIT License + +Proxy Implementation + +* URL: http://github.com/jtushman/proxy_tools +* Author(s): Jonathan Tushman + +## pscript (0.7.7) - BSD License + +Python to JavaScript compiler. + +* URL: http://pscript.readthedocs.io +* Author(s): Almar Klein and contributors + +### License Text + +``` +Copyright (c) 2015-2020, PScript developers +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + ``` ## psutil (7.0.0) - BSD License @@ -23654,7 +26037,7 @@ SOFTWARE. ``` -## pydantic-settings (2.8.1) - MIT License +## pydantic-settings (2.9.1) - MIT License Settings management using Pydantic @@ -23748,6 +26131,85 @@ Widget for deck.gl maps ``` +## pydicom (3.0.1) - MIT License + +A pure Python package for reading and writing DICOM data + +* URL: https://github.com/pydicom/pydicom +* Author(s): Darcy Mason and contributors + +### License Text + +``` +License file for pydicom, a pure-python DICOM library + +Copyright (c) 2008-2020 Darcy Mason and pydicom contributors + +Except for portions outlined below, pydicom is released under an MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Portions of pydicom (private dictionary file(s)) were generated from the +private dictionary of the GDCM library, released under the following license: + + Program: GDCM (Grassroots DICOM). A DICOM library + +Copyright (c) 2006-2016 Mathieu Malaterre +Copyright (c) 1993-2005 CREATIS +(CREATIS = Centre de Recherche et d'Applications en Traitement de l'Image) +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither name of Mathieu Malaterre, or CREATIS, nor the names of any + contributors (CNRS, INSERM, UCB, Universite Lyon I), may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + +## pyjpegls (1.5.1) - MIT License + +JPEG-LS for Python via CharLS C++ Library + +* URL: https://github.com/pydicom/pyjpegls +* Author(s): pydicom contributors + ## pymdown-extensions (10.14.3) - MIT License Extension pack for Python Markdown. @@ -23874,6 +26336,90 @@ Complete Legal Terms: http://opensource.org/licenses/MIT ``` +## pyobjc-core (11.0) - MIT License + +Python<->ObjC Interoperability Module + +* URL: https://github.com/ronaldoussoren/pyobjc +* Author(s): Ronald Oussoren, bbum, SteveM, LeleG, many others stretching back through the reaches of time... +* Maintainer(s): Ronald Oussoren + +## pyobjc-framework-Cocoa (11.0) - MIT License + +Wrappers for the Cocoa frameworks on macOS + +* URL: https://github.com/ronaldoussoren/pyobjc +* Author(s): Ronald Oussoren + +### License Text + +``` +(This is the MIT license, note that libffi-src is a separate product with its own license) + +Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al. +Copyright 2003-2024 - Ronald Oussoren + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + +## pyobjc-framework-Quartz (11.0) - MIT License + +Wrappers for the Quartz frameworks on macOS + +* URL: https://github.com/ronaldoussoren/pyobjc +* Author(s): Ronald Oussoren + +### License Text + +``` +(This is the MIT license, note that libffi-src is a separate product with its own license) + +Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al. +Copyright 2003-2024 - Ronald Oussoren + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + +## pyobjc-framework-Security (11.0) - MIT License + +Wrappers for the framework Security on macOS + +* URL: https://github.com/ronaldoussoren/pyobjc +* Author(s): Ronald Oussoren + +## pyobjc-framework-WebKit (11.0) - MIT License + +Wrappers for the framework WebKit on macOS + +* URL: https://github.com/ronaldoussoren/pyobjc +* Author(s): Ronald Oussoren + +### License Text + +``` +(This is the MIT license, note that libffi-src is a separate product with its own license) + +Copyright 2002, 2003 - Bill Bumgarner, Ronald Oussoren, Steve Majewski, Lele Gaifax, et.al. +Copyright 2003-2024 - Ronald Oussoren + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + ## pyparsing (3.2.3) - MIT License pyparsing module - Classes and methods to define and execute parsing grammars @@ -24188,6 +26734,22 @@ Apache License ``` +## pytest-base-url (2.1.0) - Mozilla Public License 2.0 (MPL 2.0) + +pytest plugin for URL based testing + +* URL: https://github.com/pytest-dev/pytest-base-url +* Author(s): Dave Hunt , Jim Brannlund + +### License Text + +``` +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +``` + ## pytest-cov (6.1.1) - MIT License Pytest plugin for measuring coverage. @@ -24320,6 +26882,38 @@ SOFTWARE. ``` +## pytest-html (4.1.1) - MIT License + +pytest plugin for generating HTML reports + +* URL: https://github.com/pytest-dev/pytest-html +* Author(s): Dave Hunt , Jim Brannlund + +### License Text + +``` +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +``` + +## pytest-metadata (3.1.1) - Mozilla Public License 2.0 (MPL 2.0) + +pytest plugin for test session metadata + +* URL: https://github.com/pytest-dev/pytest-metadata +* Author(s): Dave Hunt , Jim Brannlund + +### License Text + +``` +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +``` + ## pytest-regressions (2.7.0) - MIT License Easy to use fixtures to write regression tests. @@ -24356,6 +26950,22 @@ THE SOFTWARE. ``` +## pytest-selenium (4.1.0) - Mozilla Public License 2.0 (MPL 2.0) + +pytest plugin for Selenium + +* URL: https://github.com/pytest-dev/pytest-selenium +* Author(s): Dave Hunt , Jim Brannlund + +### License Text + +``` +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +``` + ## pytest-subprocess (1.5.3) - MIT License A plugin to fake subprocess for pytest @@ -24427,6 +27037,56 @@ THE SOFTWARE. ``` +## pytest-variables (3.1.0) - Mozilla Public License 2.0 (MPL 2.0) + +pytest plugin for providing variables to tests/fixtures + +* URL: https://github.com/pytest-dev/pytest-variables +* Author(s): Dave Hunt , Jim Brannlund + +### License Text + +``` +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. + +``` + +## pytest-watcher (0.4.3) - MIT License + +Automatically rerun your tests on file modifications + +* URL: https://github.com/olzhasar/pytest-watcher +* Author(s): Olzhas Arystanov + +### License Text + +``` +MIT License + +Copyright (c) 2021 Olzhas Arystanov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## pytest-xdist (3.6.1) - MIT License pytest xdist plugin for distributed testing, most importantly across multiple CPUs @@ -24568,6 +27228,39 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## python-engineio (4.12.0) - MIT License + +Engine.IO server and client for Python + +* URL: https://github.com/miguelgrinberg/python-engineio +* Author(s): Miguel Grinberg + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2015 Miguel Grinberg + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +``` + ## python-json-logger (3.3.0) - BSD License JSON Log Formatter for the Python Logging Package @@ -24627,6 +27320,39 @@ See the License for the specific language governing permissions and limitations under the License. +``` + +## python-socketio (5.13.0) - MIT License + +Socket.IO server and client for Python + +* URL: https://github.com/miguelgrinberg/python-socketio +* Author(s): Miguel Grinberg + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2015 Miguel Grinberg + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + ``` ## pytz (2025.2) - MIT License @@ -24662,6 +27388,48 @@ DEALINGS IN THE SOFTWARE. ``` +## pywebview (5.4) - BSD License + +Build GUI for your Python program with JavaScript, HTML, and CSS + +* URL: https://pywebview.flowrl.com/ +* Author(s): Roman Sirokov + +### License Text + +``` +BSD 3-Clause License + +Copyright (c) 2014-2017, Roman Sirokov +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + ## pyzmq (26.4.0) - BSD License Python bindings for 0MQ @@ -25013,33 +27781,266 @@ Python HTTP for Humans. incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. -``` +``` + +## requests-oauthlib (2.0.0) - BSD License + +OAuthlib authentication support for Requests. + +* URL: https://github.com/requests/requests-oauthlib +* Author(s): Kenneth Reitz + +### License Text + +``` +ISC License + +Copyright (c) 2014 Kenneth Reitz. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +``` + +## retrying (1.3.4) - Apache Software License + +Retrying + +* URL: https://github.com/groodt/retrying +* Author(s): Greg Roodt + +### License Text + +``` + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS -## requests-oauthlib (2.0.0) - BSD License + APPENDIX: How to apply the Apache License to your work. -OAuthlib authentication support for Requests. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -* URL: https://github.com/requests/requests-oauthlib -* Author(s): Kenneth Reitz + Copyright [yyyy] [name of copyright owner] -### License Text + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -ISC License -Copyright (c) 2014 Kenneth Reitz. +### Notice -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +``` +Copyright 2013 Ray Holder -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` @@ -25404,7 +28405,7 @@ THE SOFTWARE. ``` -## rsa (4.9) - Apache Software License +## rsa (4.9.1) - Apache Software License Pure-Python RSA implementation @@ -25505,7 +28506,7 @@ ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of com ``` -## ruff (0.11.5) - MIT License +## ruff (0.11.6) - MIT License An extremely fast Python linter and code formatter, written in Rust. @@ -26916,7 +29917,7 @@ are: ``` -## s3transfer (0.11.4) - Apache Software License +## s3transfer (0.12.0) - Apache Software License An Amazon S3 Transfer Manager @@ -27131,15 +30132,476 @@ An Amazon S3 Transfer Manager ``` -### Notice +### Notice + +``` +s3transfer +Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +``` + +## s5cmd (0.2.0) - MIT License + +This project provides the infrastructure to build s5cmd Python wheels. + +* URL: https://github.com/jcfr/s5cmd-python-distributions +* Author(s): Jean-Christophe Fillion-Robin + +### License Text + +``` +Copyright 2024 Jean-Christophe Fillion-Robin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + +## scalene (1.5.51) - Apache Software License + +Scalene: A high-resolution, low-overhead CPU, GPU, and memory profiler for Python with AI-powered optimization suggestions + +* URL: https://github.com/plasma-umass/scalene +* Author(s): Emery Berger , Sam Stern , Juan Altmayer Pizzorno + +### License Text + +``` + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +## selenium (4.31.0) - Apache Software License + +Official Python bindings for Selenium WebDriver + +* URL: https://www.selenium.dev + +### License Text ``` -s3transfer -Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2025 Software Freedom Conservancy (SFC) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## sentry-sdk (2.25.1) - BSD License +## sentry-sdk (2.27.0) - BSD License Python client for Sentry (https://sentry.io) @@ -27219,6 +30681,49 @@ The following files include code from opensource projects ``` +## shapely (2.1.0) - BSD License + +Manipulation and analysis of geometric objects + +* URL: https://github.com/shapely/shapely +* Author(s): Sean Gillies +* Maintainer(s): Shapely contributors + +### License Text + +``` +BSD 3-Clause License + +Copyright (c) 2007, Sean C. Gillies. 2019, Casper van der Wel. 2007-2022, Shapely Contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +``` + ## shellingham (1.5.4) - ISC License (ISCL) Tool to Detect Surrounding Shell @@ -27245,6 +30750,40 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` +## simple-websocket (1.1.0) - MIT License + +Simple WebSocket server and client for Python + +* URL: https://github.com/miguelgrinberg/simple-websocket +* Author(s): Miguel Grinberg + +### License Text + +``` +MIT License + +Copyright (c) 2021 Miguel Grinberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## six (1.17.0) - MIT License Python 2 and 3 compatibility utilities @@ -27576,6 +31115,40 @@ IN THE SOFTWARE. ``` +## sphinx-click (6.0.0) - MIT License + +Sphinx extension that automatically documents click applications + +* URL: https://github.com/click-contrib/sphinx-click +* Author(s): Stephen Finucane + +### License Text + +``` +The MIT License + +Copyright (c) 2017 Stephen Finucane http://that.guru/ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## sphinx-copybutton (0.5.2) - MIT License Add a copy button to each of your code cells. @@ -29121,6 +32694,56 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## trio (0.30.0) - UNKNOWN + +A friendly Python library for async concurrency and I/O + +* URL: https://github.com/python-trio/trio +* Author(s): "Nathaniel J. Smith" + +### License Text + +``` +This software is made available under the terms of *either* of the +licenses found in LICENSE.APACHE2 or LICENSE.MIT. Contributions to +Trio are made under the terms of *both* these licenses. + +``` + +## trio-websocket (0.12.2) - MIT License + +WebSocket library for Trio + +* URL: https://github.com/python-trio/trio-websocket +* Author(s): Mark E. Haase + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2018 Hyperion Gray + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +``` + ## typer (0.15.2) - MIT License Typer, build great CLIs. Easy to code. Based on Python type hints. @@ -30383,6 +34006,41 @@ https://opensource.apple.com/source/tcl/tcl-14/tcl/license.terms ``` +## universal_pathlib (0.2.6) - MIT License + +pathlib api extended to use fsspec backends + +* URL: https://github.com/fsspec/universal_pathlib +* Author(s): Andrew Fulton +* Maintainer(s): Norman Rzepka + +### License Text + +``` +MIT License + +Copyright (c) 2022, Andrew Fulton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## uptime (3.0.1) - BSD License Cross-platform uptime library @@ -30957,6 +34615,40 @@ Copyright (C) 2016-present the uvloop authors and contributors. ``` +## vbuild (0.8.2) - MIT License + +A simple module to extract html/script/style from a vuejs '.vue' file (can minimize/es2015 compliant js) ... just py2 or py3, NO nodejs ! + +* URL: https://github.com/manatlan/vbuild +* Author(s): manatlan + +### License Text + +``` +MIT License + +Copyright (c) 2018 manatlan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## virtualenv (20.30.0) - MIT License Virtual Python Environment builder @@ -31429,6 +35121,41 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## wheel (0.45.1) - MIT License + +A built-package format for Python + +* URL: https://github.com/pypa/wheel +* Author(s): Daniel Holth +* Maintainer(s): Alex Grönholm + +### License Text + +``` +MIT License + +Copyright (c) 2012 Daniel Holth and contributors + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +``` + ## widgetsnbextension (4.0.13) - BSD License Jupyter interactive widgets for Jupyter Notebook @@ -31506,6 +35233,281 @@ POSSIBILITY OF SUCH DAMAGE. ``` +## wsidicom (0.26.0) - Apache Software License + +Tools for handling DICOM based whole scan images + +* URL: https://github.com/imi-bigpicture/wsidicom +* Author(s): Erik O Gabrielsson + +## wsproto (1.2.0) - MIT License + +WebSockets state-machine based protocol implementation + +* URL: https://github.com/python-hyper/wsproto/ +* Author(s): Benno Rice + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2017 Benno Rice and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +## yarl (1.20.0) - Apache Software License + +Yet another URL library + +* URL: https://github.com/aio-libs/yarl +* Author(s): Andrew Svetlov +* Maintainer(s): aiohttp team + +### License Text + +``` + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + +### Notice + +``` + Copyright 2016-2021, Andrew Svetlov and aio-libs team + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + ## zipp (3.21.0) - MIT License Backport of pathlib-compatible object wrapper for zip files diff --git a/CLI_REFERENCE.md b/CLI_REFERENCE.md index 84fa802c..a49655d3 100644 --- a/CLI_REFERENCE.md +++ b/CLI_REFERENCE.md @@ -445,7 +445,7 @@ $ aignostics idc download [OPTIONS] SOURCE [TARGET] **Arguments**: * `SOURCE`: Filename of manifest, identifier, or comma-separate set of identifiers [required] -* `[TARGET]`: target directory for download [default: /Users/akunft/dev/python-sdk] +* `[TARGET]`: target directory for download [default: /Users/helmut/Code/python-sdk] **Options**: diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index 27e46245..37d8ab32 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -58,7 +58,8 @@ components: title: Application Version Id type: string changelog: - description: Description of the changes relative to the previous version + description: Description of the changes relative to the previous +version title: Changelog type: string flow_id: @@ -105,8 +106,10 @@ components: InputArtifactCreationRequest: properties: download_url: - description: '[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) - to the input artifact file. The URL should be valid for at least 6 days + description: '[Signed +URL](https://cloud.google.com/cdn/docs/using-signed-urls) + to the input artifact file. The URL should be valid for at least 6 +days from the payload submission time.' examples: - https://example.com/case-no-1-slide.tiff @@ -116,8 +119,10 @@ components: title: Download Url type: string metadata: - description: The metadata of the artifact, required by the application version. - The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. + description: The metadata of the artifact, required by the application +version. + The JSON schema of the metadata can be requested by +`/v1/versions/{application_version_id}`. The schema is located in `input_artifacts.[].metadata_schema` examples: - checksum_crc32c: 752f9554 @@ -128,9 +133,12 @@ components: title: Metadata type: object name: - description: The artifact name according to the application version. List - of required artifacts is returned by `/v1/versions/{application_version_id}`. - The artifact names are located in the `input_artifacts.[].name` value + description: The artifact name according to the application version. +List + of required artifacts is returned by +`/v1/versions/{application_version_id}`. + The artifact names are located in the `input_artifacts.[].name` +value examples: - slide title: Name @@ -164,14 +172,16 @@ components: ItemCreationRequest: properties: input_artifacts: - description: All the input files of the item, required by the application + description: All the input files of the item, required by the +application version items: $ref: '#/components/schemas/InputArtifactCreationRequest' title: Input Artifacts type: array reference: - description: The ID of the slide provided by the caller. The reference should + description: The ID of the slide provided by the caller. The reference +should be unique across all items of the application run examples: - case-no-1 @@ -193,7 +203,8 @@ components: anyOf: - type: string - type: 'null' - description: "\nThe error message in case the item is in `error_system`\ + description: "\nThe error message in case the item is in +`error_system`\ \ or `error_user` state\n " title: Error item_id: @@ -202,9 +213,12 @@ components: title: Item Id type: string output_artifacts: - description: "\nThe list of the results generated by the application algorithm.\ - \ The number of files and their\ntypes depend on the particular application\ - \ version, call `/v1/versions/{version_id}` to get\nthe details.\n " + description: "\nThe list of the results generated by the application +algorithm.\ + \ The number of files and their\ntypes depend on the particular +application\ + \ version, call `/v1/versions/{version_id}` to get\nthe details.\n +" items: $ref: '#/components/schemas/OutputArtifactResultReadResponse' title: Output Artifacts @@ -215,14 +229,22 @@ components: type: string status: $ref: '#/components/schemas/ItemStatus' - description: "\nWhen the item is not processed yet, the status is set to\ - \ `pending`.\n\nWhen the item is successfully finished, status is set\ - \ to `succeeded`, and the processing results\nbecome available for download\ - \ in `output_artifacts` field.\n\nWhen the item processing is failed because\ - \ the provided item is invalid, the status is set to\n`error_user`. When\ - \ the item processing failed because of the error in the model or platform,\n\ - the status is set to `error_system`. When the application_run is canceled,\ - \ the status of all\npending items is set to either `cancelled_user` or\ + description: "\nWhen the item is not processed yet, the status is set +to\ + \ `pending`.\n\nWhen the item is successfully finished, status is +set\ + \ to `succeeded`, and the processing results\nbecome available for +download\ + \ in `output_artifacts` field.\n\nWhen the item processing is failed +because\ + \ the provided item is invalid, the status is set to\n`error_user`. +When\ + \ the item processing failed because of the error in the model or +platform,\n\ + the status is set to `error_system`. When the application_run is +canceled,\ + \ the status of all\npending items is set to either `cancelled_user` +or\ \ `cancelled_system`.\n " required: - item_id @@ -275,12 +297,15 @@ components: minLength: 1 type: string - type: 'null' - description: "\nThe download URL to the output file. The URL is valid for\ - \ 1 hour after the endpoint is called.\nA new URL is generated every time\ + description: "\nThe download URL to the output file. The URL is valid +for\ + \ 1 hour after the endpoint is called.\nA new URL is generated every +time\ \ the endpoint is called.\n " title: Download Url metadata: - description: The metadata of the output artifact, provided by the application + description: The metadata of the output artifact, provided by the +application title: Metadata type: object mime_type: @@ -291,7 +316,8 @@ components: title: Mime Type type: string name: - description: "\nName of the output from the output schema from the `/v1/versions/{version_id}`\ + description: "\nName of the output from the output schema from the +`/v1/versions/{version_id}`\ \ endpoint.\n " title: Name type: string @@ -372,7 +398,8 @@ components: title: PayloadOutputArtifact type: object RunCreationRequest: - description: 'Application run payload. It describes which application version + description: 'Application run payload. It describes which application +version is chosen, and which user data should be processed.' @@ -420,23 +447,40 @@ components: type: string status: $ref: '#/components/schemas/ApplicationRunStatus' - description: "\nWhen the application run request is received by the Platform,\ - \ the `status` of it is set to\n`received`. Then it is transitioned to\ - \ `scheduled`, when it is scheduled for the processing.\nWhen the application\ - \ run is scheduled, it will process the input items and generate the result\n\ - incrementally. As soon as the first result is generated, the state is\ - \ changed to `running`.\nThe results can be downloaded via `/v1/runs/{run_id}/results`\ - \ endpoint.\nWhen all items are processed and all results are generated,\ - \ the application status is set to\n`completed`. If the processing is\ - \ done, but some items fail, the status is set to\n`completed_with_error`.\n\ - \nWhen the application run request is rejected by the Platform before\ - \ scheduling, it is transferred\nto `rejected`. When the application run\ - \ reaches the threshold of number of failed items, the whole\napplication\ - \ run is set to `canceled_system` and the remaining pending items are\ - \ not processed.\nWhen the application run fails, the finished item results\ - \ are available for download.\n\nIf the application run is canceled by\ - \ calling `POST /v1/runs/{run_id}/cancel` endpoint, the\nprocessing of\ - \ the items is stopped, and the application status is set to `cancelled_user`\n\ + description: "\nWhen the application run request is received by the +Platform,\ + \ the `status` of it is set to\n`received`. Then it is transitioned +to\ + \ `scheduled`, when it is scheduled for the processing.\nWhen the +application\ + \ run is scheduled, it will process the input items and generate the +result\n\ + incrementally. As soon as the first result is generated, the state +is\ + \ changed to `running`.\nThe results can be downloaded via +`/v1/runs/{run_id}/results`\ + \ endpoint.\nWhen all items are processed and all results are +generated,\ + \ the application status is set to\n`completed`. If the processing +is\ + \ done, but some items fail, the status is set +to\n`completed_with_error`.\n\ + \nWhen the application run request is rejected by the Platform +before\ + \ scheduling, it is transferred\nto `rejected`. When the application +run\ + \ reaches the threshold of number of failed items, the +whole\napplication\ + \ run is set to `canceled_system` and the remaining pending items +are\ + \ not processed.\nWhen the application run fails, the finished item +results\ + \ are available for download.\n\nIf the application run is canceled +by\ + \ calling `POST /v1/runs/{run_id}/cancel` endpoint, the\nprocessing +of\ + \ the items is stopped, and the application status is set to +`cancelled_user`\n\ \ " triggered_at: description: Timestamp showing when the application run was triggered @@ -538,9 +582,11 @@ components: info: description: ' - Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. + Pagination is done via `page` and `page_size`. Sorting via `sort` query +parameter. - The `sort` query parameter can be provided multiple times. The sorting direction + The `sort` query parameter can be provided multiple times. The sorting +direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`.' @@ -550,13 +596,16 @@ openapi: 3.1.0 paths: /v1/applications: get: - description: 'Returns the list of the applications, available to the caller. + description: 'Returns the list of the applications, available to the +caller. - The application is available if any of the version of the application is assigned + The application is available if any of the version of the application is +assigned to the - user organization. To switch between organizations, the user should re-login + user organization. To switch between organizations, the user should +re-login and choose the needed organization.' @@ -612,19 +661,24 @@ paths: - Public /v1/applications/{application_id}/versions: get: - description: 'Returns the list of the application versions for this application, + description: 'Returns the list of the application versions for this +application, available to the caller. - The application version is available if it is assigned to the user''s organization. + The application version is available if it is assigned to the user''s +organization. - The application versions are assigned to the organization by the Aignostics + The application versions are assigned to the organization by the +Aignostics admin. To - assign or unassign a version from your organization, please contact Aignostics + assign or unassign a version from your organization, please contact +Aignostics support team.' - operationId: list_versions_by_application_id_v1_applications__application_id__versions_get + operationId: +list_versions_by_application_id_v1_applications__application_id__versions_get parameters: - in: path name: application_id @@ -686,7 +740,8 @@ paths: schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications Application + title: Response List Versions By Application Id V1 Applications +Application Id Versions Get type: array description: Successful Response @@ -703,10 +758,12 @@ paths: - Public /v1/runs: get: - description: 'The endpoint returns the application runs triggered by the caller. + description: 'The endpoint returns the application runs triggered by the +caller. After the application run - is created by POST /v1/runs, it becomes available for the current endpoint' + is created by POST /v1/runs, it becomes available for the current +endpoint' operationId: list_application_runs_v1_runs_get parameters: - description: Optional application ID filter @@ -729,7 +786,8 @@ paths: - type: 'null' description: Optional application version filter title: Application Version - - description: Request optional output values. Used internally by the platform + - description: Request optional output values. Used internally by the +platform in: query name: include required: false @@ -741,7 +799,8 @@ paths: - type: string type: array - type: 'null' - description: Request optional output values. Used internally by the platform + description: Request optional output values. Used internally by the +platform title: Include - in: query name: page @@ -794,31 +853,56 @@ paths: tags: - Public post: - description: "The endpoint is used to process the input items by the chosen\ - \ application version. The endpoint\nreturns the `application_run_id`. The\ - \ processing fo the items is done asynchronously.\n\nTo check the status or\ - \ cancel the execution, use the /v1/runs/{application_run_id} endpoint.\n\n\ - ### Payload\n\nThe payload includes `application_version_id` and `items` base\ - \ fields.\n\n`application_version_id` is the id used for `/v1/versions/{application_id}`\ - \ endpoint.\n\n`items` includes the list of the items to process (slides,\ - \ in case of HETA application).\nEvery item has a set of standard fields defined\ - \ by the API, plus the metadata, specific to the\nchosen application.\n\n\ - Example payload structure with the comments:\n```\n{\n application_version_id:\ - \ \"heta:v1.0.0\",\n items: [{\n \"reference\": \"slide_1\" <--\ - \ Input ID to connect the input and the output artifact\n \"input_artifacts\"\ - : [{\n \"name\": \"input_slide\" <-- Name of the artifact defined\ - \ by the application (For HETA it is\"input_slide\")\n \"download_url\"\ - : \"https://...\" <-- signed URL to the input file in the S3 or GCS. Should\ - \ be valid for more than 6 days\n \"metadata\": { <-- The metadata\ - \ fields defined by the application. (The example fields set for a slide files\ - \ are provided)\n \"checksum_crc32c\": \"abc12==\",\n \ - \ \"mime_type\": \"image/tiff\",\n \"height\": 100,\n\ - \ \"weight\": 500,\n \"mpp\": 0.543\n \ - \ }\n }]\n }]\n}\n```\n\n### Response\n\nThe endpoint returns\ - \ the application run UUID. After that the job is scheduled for the\nexecution\ - \ in the background.\n\nTo check the status of the run call `v1/runs/{application_run_id}`.\n\ - \n### Rejection\n\nApart from the authentication, authorization and malformed\ - \ input error, the request can be\nrejected when the quota limit is exceeded.\ + description: "The endpoint is used to process the input items by the +chosen\ + \ application version. The endpoint\nreturns the `application_run_id`. +The\ + \ processing fo the items is done asynchronously.\n\nTo check the status +or\ + \ cancel the execution, use the /v1/runs/{application_run_id} +endpoint.\n\n\ + ### Payload\n\nThe payload includes `application_version_id` and `items` +base\ + \ fields.\n\n`application_version_id` is the id used for +`/v1/versions/{application_id}`\ + \ endpoint.\n\n`items` includes the list of the items to process +(slides,\ + \ in case of HETA application).\nEvery item has a set of standard fields +defined\ + \ by the API, plus the metadata, specific to the\nchosen +application.\n\n\ + Example payload structure with the comments:\n```\n{\n +application_version_id:\ + \ \"heta:v1.0.0\",\n items: [{\n \"reference\": \"slide_1\" +<--\ + \ Input ID to connect the input and the output artifact\n +\"input_artifacts\"\ + : [{\n \"name\": \"input_slide\" <-- Name of the artifact +defined\ + \ by the application (For HETA it is\"input_slide\")\n +\"download_url\"\ + : \"https://...\" <-- signed URL to the input file in the S3 or GCS. +Should\ + \ be valid for more than 6 days\n \"metadata\": { <-- The +metadata\ + \ fields defined by the application. (The example fields set for a slide +files\ + \ are provided)\n \"checksum_crc32c\": \"abc12==\",\n +\ + \ \"mime_type\": \"image/tiff\",\n \"height\": +100,\n\ + \ \"weight\": 500,\n \"mpp\": 0.543\n +\ + \ }\n }]\n }]\n}\n```\n\n### Response\n\nThe endpoint +returns\ + \ the application run UUID. After that the job is scheduled for +the\nexecution\ + \ in the background.\n\nTo check the status of the run call +`v1/runs/{application_run_id}`.\n\ + \n### Rejection\n\nApart from the authentication, authorization and +malformed\ + \ input error, the request can be\nrejected when the quota limit is +exceeded.\ \ More details on quotas is described in the\ndocumentation" operationId: create_application_run_v1_runs_post requestBody: @@ -849,7 +933,8 @@ paths: - Public /v1/runs/{application_run_id}: get: - description: 'Returns the details of the application run. The application run + description: 'Returns the details of the application run. The application +run is available as soon as it is created via `POST /runs/` endpoint. To download the items results, call @@ -857,7 +942,8 @@ paths: `/runs/{application_run_id}/results`. - The application is only available to the user who triggered it, regardless + The application is only available to the user who triggered it, +regardless of the role.' operationId: get_run_v1_runs__application_run_id__get parameters: @@ -904,19 +990,23 @@ paths: - Public /v1/runs/{application_run_id}/cancel: post: - description: 'The application run can be canceled by the user who created the + description: 'The application run can be canceled by the user who created +the application run. - The execution can be canceled any time while the application is not in a final + The execution can be canceled any time while the application is not in a +final state. The pending items will not be processed and will not add to the cost. - When the application is canceled, the already completed items stay available + When the application is canceled, the already completed items stay +available for download.' - operationId: cancel_application_run_v1_runs__application_run_id__cancel_post + operationId: +cancel_application_run_v1_runs__application_run_id__cancel_post parameters: - description: Application run id, returned by `POST /runs/` endpoint in: path @@ -948,19 +1038,24 @@ paths: - Public /v1/runs/{application_run_id}/results: delete: - description: 'Delete the application run results. It can only be called when + description: 'Delete the application run results. It can only be called +when the application is in a final - state (meaning it''s not in `received` or `pending` states). To delete the + state (meaning it''s not in `received` or `pending` states). To delete +the results of the running - artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel + artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to +cancel the application run. - The output results are deleted automatically 30 days after the application + The output results are deleted automatically 30 days after the +application run is finished.' - operationId: delete_application_run_results_v1_runs__application_run_id__results_delete + operationId: +delete_application_run_results_v1_runs__application_run_id__results_delete parameters: - description: Application run id, returned by `POST /runs/` endpoint in: path @@ -1023,7 +1118,8 @@ paths: type: string type: array - type: 'null' - description: Filter for items by their reference from the input payload + description: Filter for items by their reference from the input +payload title: Reference In - description: Filter for items in certain statuses in: query @@ -1071,7 +1167,8 @@ paths: schema: items: $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id Results + title: Response List Run Results V1 Runs Application Run Id +Results Get type: array description: Successful Response diff --git a/pyproject.toml b/pyproject.toml index 022dbcc3..ff97294d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -177,6 +177,7 @@ packages = ["src/aignostics", "codegen/out/aignx"] [tool.uv] override-dependencies = [ # https://github.com/astral-sh/uv/issues/4422 + "h11>=0.16.0", # vulnerability "rfc3987; sys_platform == 'never'", # GPLv3 ] From 3dd2db68033113f236897b8cc49e844c59445390 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Fri, 25 Apr 2025 23:26:26 +0200 Subject: [PATCH 103/110] chore: Move aignostics.client -> aignostics.platform --- API_REFERENCE_v1.md | 3274 +++++++++++------ ATTRIBUTIONS.md | 273 +- CLI_REFERENCE.md | 2 +- README.md | 145 +- docs/partials/README_footer.md | 13 - docs/partials/README_header.md | 28 +- docs/partials/README_main.md | 104 +- docs/source/_static/openapi_v1.yaml | 291 +- docs/source/lib_reference.rst | 2 +- examples/notebook.ipynb | 52 +- examples/notebook.py | 49 +- examples/script.py | 4 +- src/aignostics/application/_cli.py | 6 +- src/aignostics/constants.py | 2 +- .../{client => platform}/__init__.py | 6 +- .../{client => platform}/_authentication.py | 6 +- .../{client => platform}/_client.py | 6 +- .../{client => platform}/_constants.py | 0 .../{client => platform}/_messages.py | 0 .../{client => platform}/_settings.py | 0 src/aignostics/{client => platform}/_utils.py | 0 .../resources/__init__.py | 0 .../resources/applications.py | 12 +- .../{client => platform}/resources/runs.py | 8 +- .../{client => platform}/resources/utils.py | 0 tests/aignostics/client/__init__.py | 1 - tests/aignostics/platform/__init__.py | 1 + .../authentication_test.py | 52 +- .../resources/applications_test.py | 4 +- .../resources/resource_utils_test.py | 2 +- .../resources/runs_test.py | 4 +- .../{client => platform}/scheduled_test.py | 54 +- .../{client => platform}/settings_test.py | 4 +- .../{client => platform}/utils_test.py | 4 +- uv.lock | 11 +- 35 files changed, 2387 insertions(+), 2033 deletions(-) rename src/aignostics/{client => platform}/__init__.py (94%) rename src/aignostics/{client => platform}/_authentication.py (98%) rename src/aignostics/{client => platform}/_client.py (92%) rename src/aignostics/{client => platform}/_constants.py (100%) rename src/aignostics/{client => platform}/_messages.py (100%) rename src/aignostics/{client => platform}/_settings.py (100%) rename src/aignostics/{client => platform}/_utils.py (100%) rename src/aignostics/{client => platform}/resources/__init__.py (100%) rename src/aignostics/{client => platform}/resources/applications.py (91%) rename src/aignostics/{client => platform}/resources/runs.py (97%) rename src/aignostics/{client => platform}/resources/utils.py (100%) delete mode 100644 tests/aignostics/client/__init__.py create mode 100644 tests/aignostics/platform/__init__.py rename tests/aignostics/{client => platform}/authentication_test.py (88%) rename tests/aignostics/{client => platform}/resources/applications_test.py (98%) rename tests/aignostics/{client => platform}/resources/resource_utils_test.py (97%) rename tests/aignostics/{client => platform}/resources/runs_test.py (98%) rename tests/aignostics/{client => platform}/scheduled_test.py (80%) rename tests/aignostics/{client => platform}/settings_test.py (98%) rename tests/aignostics/{client => platform}/utils_test.py (96%) diff --git a/API_REFERENCE_v1.md b/API_REFERENCE_v1.md index 37e264b8..8425b45f 100644 --- a/API_REFERENCE_v1.md +++ b/API_REFERENCE_v1.md @@ -1,1213 +1,2063 @@ # API v1 Reference ---- -title: is chosen, and which user data -language_tabs: -toc_footers: [] -includes: [] -search: true -highlight_theme: darkula ---- - - - - - - - - - - h-e-tme - title: Application Id - type: string - description: - description: Application documentations - title: Description - type: string - name: - description: Application display name - examples: - - HETA - title: Name - type: string - regulatory_classes: - description: Regulatory class, to which the applications compliance - examples: - - - RuO - items: - type: string - title: Regulatory Classes - type: array - required: - - application_id - - name - - regulatory_classes - - description - title: ApplicationReadResponse - type: object - ApplicationRunStatus: - enum: - - canceled_system - - canceled_user - - completed - - completed_with_error - - received - - rejected - - running - - scheduled - title: ApplicationRunStatus - type: string - ApplicationVersionReadResponse: - properties: - application_id: - description: Application ID - title: Application Id - type: string - application_version_id: - description: Application version ID - examples: - - h-e-tme:v0.0.1 - title: Application Version Id - type: string - changelog: - description: Description of the changes relative to the previous -version - title: Changelog - type: string - flow_id: - anyOf: - - format: uuid - type: string - - type: 'null' - description: Flow ID, used internally by the platform - title: Flow Id - input_artifacts: - description: List of the input fields, provided by the User - items: - $ref: '#/components/schemas/InputArtifactReadResponse' - title: Input Artifacts - type: array - output_artifacts: - description: List of the output fields, generated by the application - items: - $ref: '#/components/schemas/OutputArtifactReadResponse' - title: Output Artifacts - type: array - version: - description: Semantic version of the application - title: Version - type: string - required: - - application_version_id - - version - - application_id - - changelog - - input_artifacts - - output_artifacts - title: ApplicationVersionReadResponse - type: object - HTTPValidationError: - properties: - detail: - items: - $ref: '#/components/schemas/ValidationError' - title: Detail - type: array - title: HTTPValidationError - type: object - InputArtifactCreationRequest: - properties: - download_url: - description: '[Signed -URL](https://cloud.google.com/cdn/docs/using-signed-urls) - to the input artifact file. The URL should be valid for at least 6 -days - from the payload submission time.' - examples: - - https://example.com/case-no-1-slide.tiff - format: uri - maxLength: 2083 - minLength: 1 - title: Download Url - type: string - metadata: - description: The metadata of the artifact, required by the application -version. - The JSON schema of the metadata can be requested by -`/v1/versions/{application_version_id}`. - The schema is located in `input_artifacts.[].metadata_schema` - examples: - - checksum_crc32c: 752f9554 - height: 2000 - height_mpp: 0.5 - width: 10000 - width_mpp: 0.5 - title: Metadata - type: object - name: - description: The artifact name according to the application version. -List - of required artifacts is returned by -`/v1/versions/{application_version_id}`. - The artifact names are located in the `input_artifacts.[].name` -value - examples: - - slide - title: Name - type: string - required: - - name - - download_url - - metadata - title: InputArtifactCreationRequest - type: object - InputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - image/tiff - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - required: - - name - - mime_type - - metadata_schema - title: InputArtifactReadResponse - type: object - ItemCreationRequest: - properties: - input_artifacts: - description: All the input files of the item, required by the -application - version - items: - $ref: '#/components/schemas/InputArtifactCreationRequest' - title: Input Artifacts - type: array - reference: - description: The ID of the slide provided by the caller. The reference -should - be unique across all items of the application run - examples: - - case-no-1 - title: Reference - type: string - required: - - reference - - input_artifacts - title: ItemCreationRequest - type: object - ItemResultReadResponse: - properties: - application_run_id: - description: Application run UUID to which the item belongs - format: uuid - title: Application Run Id - type: string - error: - anyOf: - - type: string - - type: 'null' - description: "\nThe error message in case the item is in -`error_system`\ - \ or `error_user` state\n " - title: Error - item_id: - description: Item UUID generated by the Platform - format: uuid - title: Item Id - type: string - output_artifacts: - description: "\nThe list of the results generated by the application -algorithm.\ - \ The number of files and their\ntypes depend on the particular -application\ - \ version, call `/v1/versions/{version_id}` to get\nthe details.\n -" - items: - $ref: '#/components/schemas/OutputArtifactResultReadResponse' - title: Output Artifacts - type: array - reference: - description: The reference of the item from the user payload - title: Reference - type: string - status: - $ref: '#/components/schemas/ItemStatus' - description: "\nWhen the item is not processed yet, the status is set -to\ - \ `pending`.\n\nWhen the item is successfully finished, status is -set\ - \ to `succeeded`, and the processing results\nbecome available for -download\ - \ in `output_artifacts` field.\n\nWhen the item processing is failed -because\ - \ the provided item is invalid, the status is set to\n`error_user`. -When\ - \ the item processing failed because of the error in the model or -platform,\n\ - the status is set to `error_system`. When the application_run is -canceled,\ - \ the status of all\npending items is set to either `cancelled_user` -or\ - \ `cancelled_system`.\n " - required: - - item_id - - application_run_id - - reference - - status - - error - - output_artifacts - title: ItemResultReadResponse - type: object - ItemStatus: - enum: - - pending - - canceled_user - - canceled_system - - error_user - - error_system - - succeeded - title: ItemStatus - type: string - OutputArtifactReadResponse: - properties: - metadata_schema: - title: Metadata Schema - type: object - mime_type: - examples: - - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - title: Name - type: string - scope: - $ref: '#/components/schemas/OutputArtifactScope' - required: - - name - - mime_type - - metadata_schema - - scope - title: OutputArtifactReadResponse - type: object - OutputArtifactResultReadResponse: - properties: - download_url: - anyOf: - - format: uri - maxLength: 2083 - minLength: 1 - type: string - - type: 'null' - description: "\nThe download URL to the output file. The URL is valid -for\ - \ 1 hour after the endpoint is called.\nA new URL is generated every -time\ - \ the endpoint is called.\n " - title: Download Url - metadata: - description: The metadata of the output artifact, provided by the -application - title: Metadata - type: object - mime_type: - description: The mime type of the output file - examples: - - application/vnd.apache.parquet - pattern: ^\w+\/\w+[-+.|\w+]+\w+$ - title: Mime Type - type: string - name: - description: "\nName of the output from the output schema from the -`/v1/versions/{version_id}`\ - \ endpoint.\n " - title: Name - type: string - output_artifact_id: - description: The Id of the artifact. Used internally - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - name - - mime_type - - metadata - - download_url - title: OutputArtifactResultReadResponse - type: object - OutputArtifactScope: - enum: - - item - - global - title: OutputArtifactScope - type: string - PayloadInputArtifact: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - input_artifact_id: - format: uuid - title: Input Artifact Id - type: string - metadata: - title: Metadata - type: object - required: - - metadata - - download_url - title: PayloadInputArtifact - type: object - PayloadItem: - properties: - input_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadInputArtifact' - title: Input Artifacts - type: object - item_id: - format: uuid - title: Item Id - type: string - output_artifacts: - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - title: Output Artifacts - type: object - required: - - item_id - - input_artifacts - - output_artifacts - title: PayloadItem - type: object - PayloadOutputArtifact: - properties: - data: - $ref: '#/components/schemas/TransferUrls' - metadata: - $ref: '#/components/schemas/TransferUrls' - output_artifact_id: - format: uuid - title: Output Artifact Id - type: string - required: - - output_artifact_id - - data - - metadata - title: PayloadOutputArtifact - type: object - RunCreationRequest: - description: 'Application run payload. It describes which application -version - is chosen, and which user data - -> components: - -> schemas: - -> ApplicationReadResponse: - -> properties: - -> application_id: - -> description: Application ID - -> examples: - - should be processed.' - properties: - application_version_id: - description: Application version ID - examples: - - h-e-tme:v1.2.3 - title: Application Version Id - type: string - items: - description: List of the items to process by the application - items: - $ref: '#/components/schemas/ItemCreationRequest' - title: Items - type: array - required: - - application_version_id - - items - title: RunCreationRequest - type: object - RunCreationResponse: - properties: - application_run_id: - default: Application run id - format: uuid - title: Application Run Id - type: string - title: RunCreationResponse - type: object - RunReadResponse: - properties: - application_run_id: - description: UUID of the application - format: uuid - title: Application Run Id - type: string - application_version_id: - description: ID of the application version - title: Application Version Id - type: string - organization_id: - description: Organization of the owner of the application run - title: Organization Id - type: string - status: - $ref: '#/components/schemas/ApplicationRunStatus' - description: "\nWhen the application run request is received by the -Platform,\ - \ the `status` of it is set to\n`received`. Then it is transitioned -to\ - \ `scheduled`, when it is scheduled for the processing.\nWhen the -application\ - \ run is scheduled, it will process the input items and generate the -result\n\ - incrementally. As soon as the first result is generated, the state -is\ - \ changed to `running`.\nThe results can be downloaded via -`/v1/runs/{run_id}/results`\ - \ endpoint.\nWhen all items are processed and all results are -generated,\ - \ the application status is set to\n`completed`. If the processing -is\ - \ done, but some items fail, the status is set -to\n`completed_with_error`.\n\ - \nWhen the application run request is rejected by the Platform -before\ - \ scheduling, it is transferred\nto `rejected`. When the application -run\ - \ reaches the threshold of number of failed items, the -whole\napplication\ - \ run is set to `canceled_system` and the remaining pending items -are\ - \ not processed.\nWhen the application run fails, the finished item -results\ - \ are available for download.\n\nIf the application run is canceled -by\ - \ calling `POST /v1/runs/{run_id}/cancel` endpoint, the\nprocessing -of\ - \ the items is stopped, and the application status is set to -`cancelled_user`\n\ - \ " - triggered_at: - description: Timestamp showing when the application run was triggered - format: date-time - title: Triggered At - type: string - triggered_by: - description: Id of the user who triggered the application run - title: Triggered By - type: string - user_payload: - anyOf: - - $ref: '#/components/schemas/UserPayload' - - type: 'null' - description: Field used internally by the Platform - required: - - application_run_id - - application_version_id - - organization_id - - status - - triggered_at - - triggered_by - title: RunReadResponse - type: object - TransferUrls: - properties: - download_url: - format: uri - minLength: 1 - title: Download Url - type: string - upload_url: - format: uri - minLength: 1 - title: Upload Url - type: string - required: - - upload_url - - download_url - title: TransferUrls - type: object - UserPayload: - properties: - application_id: - title: Application Id - type: string - application_run_id: - format: uuid - title: Application Run Id - type: string - global_output_artifacts: - anyOf: - - additionalProperties: - $ref: '#/components/schemas/PayloadOutputArtifact' - type: object - - type: 'null' - title: Global Output Artifacts - items: - items: - $ref: '#/components/schemas/PayloadItem' - title: Items - type: array - required: - - application_id - - application_run_id - - global_output_artifacts - - items - title: UserPayload - type: object - ValidationError: - properties: - loc: - items: - anyOf: - - type: string - - type: integer - title: Location - type: array - msg: - title: Message - type: string - type: - title: Error Type - type: string - required: - - loc - - msg - - type - title: ValidationError - type: object - securitySchemes: - OAuth2AuthorizationCodeBearer: - flows: - authorizationCode: - authorizationUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize - scopes: {} - tokenUrl: https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token - type: oauth2 -info: - description: ' - - Pagination is done via `page` and `page_size`. Sorting via `sort` query -parameter. - - The `sort` query parameter can be provided multiple times. The sorting -direction - can be indicated via - - `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`.' - title: Aignostics Platform API reference - version: 1.0.0 -openapi: 3.1.0 -paths: - /v1/applications: - get: - description: 'Returns the list of the applications, available to the -caller. - - - The application is available if any of the version of the application is -assigned - to the - - user organization. To switch between organizations, the user should -re-login - and choose the - - needed organization.' - operationId: list_applications_v1_applications_get - parameters: - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationReadResponse' - title: Response List Applications V1 Applications Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Applications - tags: - - Public - /v1/applications/{application_id}/versions: - get: - description: 'Returns the list of the application versions for this -application, - available to the caller. - - - The application version is available if it is assigned to the user''s -organization. - - - The application versions are assigned to the organization by the -Aignostics - admin. To - - assign or unassign a version from your organization, please contact -Aignostics - support team.' - operationId: -list_versions_by_application_id_v1_applications__application_id__versions_get - parameters: - - in: path - name: application_id - required: true - schema: - title: Application Id - type: string - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: version - required: false - schema: - anyOf: - - type: string - - type: 'null' - title: Version - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications -Application - Id Versions Get - type: array - description: Successful Response - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Versions By Application Id - tags: - - Public - /v1/runs: - get: - description: 'The endpoint returns the application runs triggered by the -caller. - After the application run - - is created by POST /v1/runs, it becomes available for the current -endpoint' - operationId: list_application_runs_v1_runs_get - parameters: - - description: Optional application ID filter - in: query - name: application_id - required: false - schema: - anyOf: - - type: string - - type: 'null' - description: Optional application ID filter - title: Application Id - - description: Optional application version filter - in: query - name: application_version - required: false - schema: - anyOf: - - type: string - - type: 'null' - description: Optional application version filter - title: Application Version - - description: Request optional output values. Used internally by the -platform - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - description: Request optional output values. Used internally by the -platform - title: Include - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/RunReadResponse' - title: Response List Application Runs V1 Runs Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Application Runs - tags: - - Public - post: - description: "The endpoint is used to process the input items by the -chosen\ - \ application version. The endpoint\nreturns the `application_run_id`. -The\ - \ processing fo the items is done asynchronously.\n\nTo check the status -or\ - \ cancel the execution, use the /v1/runs/{application_run_id} -endpoint.\n\n\ - ### Payload\n\nThe payload includes `application_version_id` and `items` -base\ - \ fields.\n\n`application_version_id` is the id used for -`/v1/versions/{application_id}`\ - \ endpoint.\n\n`items` includes the list of the items to process -(slides,\ - \ in case of HETA application).\nEvery item has a set of standard fields -defined\ - \ by the API, plus the metadata, specific to the\nchosen -application.\n\n\ - Example payload structure with the comments:\n```\n{\n -application_version_id:\ - \ \"heta:v1.0.0\",\n items: [{\n \"reference\": \"slide_1\" -<--\ - \ Input ID to connect the input and the output artifact\n -\"input_artifacts\"\ - : [{\n \"name\": \"input_slide\" <-- Name of the artifact -defined\ - \ by the application (For HETA it is\"input_slide\")\n -\"download_url\"\ - : \"https://...\" <-- signed URL to the input file in the S3 or GCS. -Should\ - \ be valid for more than 6 days\n \"metadata\": { <-- The -metadata\ - \ fields defined by the application. (The example fields set for a slide -files\ - \ are provided)\n \"checksum_crc32c\": \"abc12==\",\n -\ - \ \"mime_type\": \"image/tiff\",\n \"height\": -100,\n\ - \ \"weight\": 500,\n \"mpp\": 0.543\n -\ - \ }\n }]\n }]\n}\n```\n\n### Response\n\nThe endpoint -returns\ - \ the application run UUID. After that the job is scheduled for -the\nexecution\ - \ in the background.\n\nTo check the status of the run call -`v1/runs/{application_run_id}`.\n\ - \n### Rejection\n\nApart from the authentication, authorization and -malformed\ - \ input error, the request can be\nrejected when the quota limit is -exceeded.\ - \ More details on quotas is described in the\ndocumentation" - operationId: create_application_run_v1_runs_post - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationRequest' - required: true - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/RunCreationResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Create Application Run - tags: - - Public - /v1/runs/{application_run_id}: - get: - description: 'Returns the details of the application run. The application -run - is available as soon as it is - - created via `POST /runs/` endpoint. To download the items results, call - - `/runs/{application_run_id}/results`. - - - The application is only available to the user who triggered it, -regardless - of the role.' - operationId: get_run_v1_runs__application_run_id__get - parameters: - - description: Application run id, returned by `POST /runs/` endpoint - in: path - name: application_run_id - required: true - schema: - description: Application run id, returned by `POST /runs/` endpoint - format: uuid - title: Application Run Id - type: string - - in: query - name: include - required: false - schema: - anyOf: - - maxItems: 1 - minItems: 1 - prefixItems: - - type: string - type: array - - type: 'null' - title: Include - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/RunReadResponse' - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Get Run - tags: - - Public - /v1/runs/{application_run_id}/cancel: - post: - description: 'The application run can be canceled by the user who created -the - application run. - - - The execution can be canceled any time while the application is not in a -final - state. The - - pending items will not be processed and will not add to the cost. - - - When the application is canceled, the already completed items stay -available - for download.' - operationId: -cancel_application_run_v1_runs__application_run_id__cancel_post - parameters: - - description: Application run id, returned by `POST /runs/` endpoint - in: path - name: application_run_id - required: true - schema: - description: Application run id, returned by `POST /runs/` endpoint - format: uuid - title: Application Run Id - type: string - responses: - '202': - content: - application/json: - schema: {} - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Cancel Application Run - tags: - - Public - /v1/runs/{application_run_id}/results: - delete: - description: 'Delete the application run results. It can only be called -when - the application is in a final - - state (meaning it''s not in `received` or `pending` states). To delete -the - results of the running - - artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to -cancel - the application run. - - - The output results are deleted automatically 30 days after the -application - run is finished.' - operationId: -delete_application_run_results_v1_runs__application_run_id__results_delete - parameters: - - description: Application run id, returned by `POST /runs/` endpoint - in: path - name: application_run_id - required: true - schema: - description: Application run id, returned by `POST /runs/` endpoint - format: uuid - title: Application Run Id - type: string - responses: - '204': - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: Delete Application Run Results - tags: - - Public - get: - description: Get the list of the results for the run items - operationId: list_run_results_v1_runs__application_run_id__results_get - parameters: - - description: Application run id, returned by `POST /runs/` endpoint - in: path - name: application_run_id - required: true - schema: - description: Application run id, returned by `POST /runs/` endpoint - format: uuid - title: Application Run Id - type: string - - description: Filter for items ids - in: query - name: item_id__in - required: false - schema: - anyOf: - - items: - format: uuid - type: string - type: array - - type: 'null' - description: Filter for items ids - title: Item Id In - - description: Filter for items by their reference from the input payload - in: query - name: reference__in - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - description: Filter for items by their reference from the input -payload - title: Reference In - - description: Filter for items in certain statuses - in: query - name: status__in - required: false - schema: - anyOf: - - items: - $ref: '#/components/schemas/ItemStatus' - type: array - - type: 'null' - description: Filter for items in certain statuses - title: Status In - - in: query - name: page - required: false - schema: - default: 1 - minimum: 1 - title: Page - type: integer - - in: query - name: page_size - required: false - schema: - default: 50 - maximum: 100 - minimum: 5 - title: Page Size - type: integer - - in: query - name: sort - required: false - schema: - anyOf: - - items: - type: string - type: array - - type: 'null' - title: Sort - responses: - '200': - content: - application/json: - schema: - items: - $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id -Results - Get - type: array - description: Successful Response - '404': - description: Application run not found - '422': - content: - application/json: - schema: - $ref: '#/components/schemas/HTTPValidationError' - description: Validation Error - security: - - OAuth2AuthorizationCodeBearer: [] - summary: List Run Results - tags: - - Public -servers: -- url: /api +## Aignostics Platform API reference v1.0.0 + +> Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu. + +Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. +The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via +`+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`. + +Base URLs: + +* [/api](/api) + +## Authentication + +- oAuth2 authentication. + + - Flow: authorizationCode + - Authorization URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/authorize) + - Token URL = [https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token](https://dev-8ouohmmrbuh2h4vu.eu.auth0.com/oauth/token) + +|Scope|Scope Description| +|---|---| + +## Public + +### list_applications_v1_applications_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/api/v1/applications', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/applications', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications` + +*List Applications* + +Returns the list of the applications, available to the caller. + +The application is available if any of the version of the application is assigned to the +user organization. To switch between organizations, the user should re-login and choose the +needed organization. + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "h-e-tme", + "description": "string", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ] + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Applications V1 Applications Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Applications V1 Applications Get|[[ApplicationReadResponse](#schemaapplicationreadresponse)]|false|none|none| +|» ApplicationReadResponse|[ApplicationReadResponse](#schemaapplicationreadresponse)|false|none|none| +|»» application_id|string|true|none|Application ID| +|»» description|string|true|none|Application documentations| +|»» name|string|true|none|Application display name| +|»» regulatory_classes|[string]|true|none|Regulatory class, to which the applications compliance| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### list_versions_by_application_id_v1_applications__application_id__versions_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/api/v1/applications/{application_id}/versions', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/applications/{application_id}/versions', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/applications/{application_id}/versions` + +*List Versions By Application Id* + +Returns the list of the application versions for this application, available to the caller. + +The application version is available if it is assigned to the user's organization. + +The application versions are assigned to the organization by the Aignostics admin. To +assign or unassign a version from your organization, please contact Aignostics support team. + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|path|string|true|none| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|version|query|any|false|none| +|include|query|any|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_id": "string", + "application_version_id": "h-e-tme:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Versions By Application Id V1 Applications Application Id Versions Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Versions By Application Id V1 Applications Application Id Versions Get|[[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)]|false|none|none| +|» ApplicationVersionReadResponse|[ApplicationVersionReadResponse](#schemaapplicationversionreadresponse)|false|none|none| +|»» application_id|string|true|none|Application ID| +|»» application_version_id|string|true|none|Application version ID| +|»» changelog|string|true|none|Description of the changes relative to the previous version| +|»» flow_id|any|false|none|Flow ID, used internally by the platform| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string(uuid)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|List of the input fields, provided by the User| +|»»» InputArtifactReadResponse|[InputArtifactReadResponse](#schemainputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»» output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|List of the output fields, generated by the application| +|»»» OutputArtifactReadResponse|[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)|false|none|none| +|»»»» metadata_schema|object|true|none|none| +|»»»» mime_type|string|true|none|none| +|»»»» name|string|true|none|none| +|»»»» scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| +|»» version|string|true|none|Semantic version of the application| + +##### Enumerated Values + +|Property|Value| +|---|---| +|scope|item| +|scope|global| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### list_application_runs_v1_runs_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/api/v1/runs', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/runs', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs` + +*List Application Runs* + +The endpoint returns the application runs triggered by the caller. After the application run +is created by POST /v1/runs, it becomes available for the current endpoint + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_id|query|any|false|Optional application ID filter| +|application_version|query|any|false|Optional application version filter| +|include|query|any|false|Request optional output values. Used internally by the platform| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "string", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "string", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Application Runs V1 Runs Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Application Runs V1 Runs Get|[[RunReadResponse](#schemarunreadresponse)]|false|none|none| +|» RunReadResponse|[RunReadResponse](#schemarunreadresponse)|false|none|none| +|»» application_run_id|string(uuid)|true|none|UUID of the application| +|»» application_version_id|string|true|none|ID of the application version| +|»» organization_id|string|true|none|Organization of the owner of the application run| +|»» status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|none| +|»» triggered_at|string(date-time)|true|none|Timestamp showing when the application run was triggered| +|»» triggered_by|string|true|none|Id of the user who triggered the application run| +|»» user_payload|any|false|none|Field used internally by the Platform| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| +|»»»» application_id|string|true|none|none| +|»»»» application_run_id|string(uuid)|true|none|none| +|»»»» global_output_artifacts|any|true|none|none| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|object|false|none|none| +|»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| +|»»»»»»» data|[TransferUrls](#schematransferurls)|true|none|none| +|»»»»»»»» download_url|string(uri)|true|none|none| +|»»»»»»»» upload_url|string(uri)|true|none|none| +|»»»»»»» metadata|[TransferUrls](#schematransferurls)|true|none|none| +|»»»»»»» output_artifact_id|string(uuid)|true|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»» items|[[PayloadItem](#schemapayloaditem)]|true|none|none| +|»»»»» PayloadItem|[PayloadItem](#schemapayloaditem)|false|none|none| +|»»»»»» input_artifacts|object|true|none|none| +|»»»»»»» PayloadInputArtifact|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| +|»»»»»»»» download_url|string(uri)|true|none|none| +|»»»»»»»» input_artifact_id|string(uuid)|false|none|none| +|»»»»»»»» metadata|object|true|none|none| +|»»»»»» item_id|string(uuid)|true|none|none| +|»»»»»» output_artifacts|object|true|none|none| +|»»»»»»» PayloadOutputArtifact|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|status|canceled_system| +|status|canceled_user| +|status|completed| +|status|completed_with_error| +|status|received| +|status|rejected| +|status|running| +|status|scheduled| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### create_application_run_v1_runs_post + + + +> Code samples + +```python +import requests +headers = { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.post('/api/v1/runs', headers = headers) + +print(r.json()) + +``` + +```javascript +const inputBody = '{ + "application_version_id": "h-e-tme:v1.2.3", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +}'; +const headers = { + 'Content-Type':'application/json', + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/runs', +{ + method: 'POST', + body: inputBody, + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/runs` + +*Create Application Run* + +The endpoint is used to process the input items by the chosen application version. The endpoint +returns the `application_run_id`. The processing fo the items is done asynchronously. + +To check the status or cancel the execution, use the /v1/runs/{application_run_id} endpoint. + +#### Payload + +The payload includes `application_version_id` and `items` base fields. + +`application_version_id` is the id used for `/v1/versions/{application_id}` endpoint. + +`items` includes the list of the items to process (slides, in case of HETA application). +Every item has a set of standard fields defined by the API, plus the metadata, specific to the +chosen application. + +Example payload structure with the comments: +``` +{ + application_version_id: "heta:v1.0.0", + items: [{ + "reference": "slide_1" Body parameter + +```json +{ + "application_version_id": "h-e-tme:v1.2.3", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +} +``` + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|body|body|[RunCreationRequest](#schemaruncreationrequest)|true|none| + +> Example responses + +> 201 Response + +```json +{ + "application_run_id": "Application run id" +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|Successful Response|[RunCreationResponse](#schemaruncreationresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### get_run_v1_runs__application_run_id__get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/api/v1/runs/{application_run_id}', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/runs/{application_run_id}', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs/{application_run_id}` + +*Get Run* + +Returns the details of the application run. The application run is available as soon as it is +created via `POST /runs/` endpoint. To download the items results, call +`/runs/{application_run_id}/results`. + +The application is only available to the user who triggered it, regardless of the role. + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| +|include|query|any|false|none| + +> Example responses + +> 200 Response + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "string", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "string", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|[RunReadResponse](#schemarunreadresponse)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### cancel_application_run_v1_runs__application_run_id__cancel_post + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.post('/api/v1/runs/{application_run_id}/cancel', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/runs/{application_run_id}/cancel', +{ + method: 'POST', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`POST /v1/runs/{application_run_id}/cancel` + +*Cancel Application Run* + +The application run can be canceled by the user who created the application run. + +The execution can be canceled any time while the application is not in a final state. The +pending items will not be processed and will not add to the cost. + +When the application is canceled, the already completed items stay available for download. + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| + +> Example responses + +> 202 Response + +```json +null +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|202|[Accepted](https://tools.ietf.org/html/rfc7231#section-6.3.3)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### delete_application_run_results_v1_runs__application_run_id__results_delete + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.delete('/api/v1/runs/{application_run_id}/results', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/runs/{application_run_id}/results', +{ + method: 'DELETE', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`DELETE /v1/runs/{application_run_id}/results` + +*Delete Application Run Results* + +Delete the application run results. It can only be called when the application is in a final +state (meaning it's not in `received` or `pending` states). To delete the results of the running +artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel the application run. + +The output results are deleted automatically 30 days after the application run is finished. + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| + +> Example responses + +> 422 Response + +```json +{ + "detail": [ + { + "loc": [ + "string" + ], + "msg": "string", + "type": "string" + } + ] +} +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|Successful Response|None| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +### list_run_results_v1_runs__application_run_id__results_get + + + +> Code samples + +```python +import requests +headers = { + 'Accept': 'application/json', + 'Authorization': 'Bearer {access-token}' +} + +r = requests.get('/api/v1/runs/{application_run_id}/results', headers = headers) + +print(r.json()) + +``` + +```javascript + +const headers = { + 'Accept':'application/json', + 'Authorization':'Bearer {access-token}' +}; + +fetch('/api/v1/runs/{application_run_id}/results', +{ + method: 'GET', + + headers: headers +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); + +``` + +`GET /v1/runs/{application_run_id}/results` + +*List Run Results* + +Get the list of the results for the run items + +#### Parameters + +|Name|In|Type|Required|Description| +|---|---|---|---|---| +|application_run_id|path|string(uuid)|true|Application run id, returned by `POST /runs/` endpoint| +|item_id__in|query|any|false|Filter for items ids| +|reference__in|query|any|false|Filter for items by their reference from the input payload| +|status__in|query|any|false|Filter for items in certain statuses| +|page|query|integer|false|none| +|page_size|query|integer|false|none| +|sort|query|any|false|none| + +> Example responses + +> 200 Response + +```json +[ + { + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": [ + { + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + ], + "reference": "string", + "status": "pending" + } +] +``` + +#### Responses + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|Successful Response|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|Application run not found|None| +|422|[Unprocessable Entity](https://tools.ietf.org/html/rfc2518#section-10.3)|Validation Error|[HTTPValidationError](#schemahttpvalidationerror)| + +#### Response Schema + +Status Code **200** + +*Response List Run Results V1 Runs Application Run Id Results Get* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|Response List Run Results V1 Runs Application Run Id Results Get|[[ItemResultReadResponse](#schemaitemresultreadresponse)]|false|none|none| +|» ItemResultReadResponse|[ItemResultReadResponse](#schemaitemresultreadresponse)|false|none|none| +|»» application_run_id|string(uuid)|true|none|Application run UUID to which the item belongs| +|»» error|any|true|none|The error message in case the item is in `error_system` or `error_user` state| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|string|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»» item_id|string(uuid)|true|none|Item UUID generated by the Platform| +|»» output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|The list of the results generated by the application algorithm. The number of files and theirtypes depend on the particular application version, call `/v1/versions/{version_id}` to getthe details.| +|»»» OutputArtifactResultReadResponse|[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)|false|none|none| +|»»»» download_url|any|true|none|The download URL to the output file. The URL is valid for 1 hour after the endpoint is called.A new URL is generated every time the endpoint is called.| + +*anyOf* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|string(uri)|false|none|none| + +*or* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»»» *anonymous*|null|false|none|none| + +*continued* + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|»»»» metadata|object|true|none|The metadata of the output artifact, provided by the application| +|»»»» mime_type|string|true|none|The mime type of the output file| +|»»»» name|string|true|none|Name of the output from the output schema from the `/v1/versions/{version_id}` endpoint.| +|»»»» output_artifact_id|string(uuid)|true|none|The Id of the artifact. Used internally| +|»» reference|string|true|none|The reference of the item from the user payload| +|»» status|[ItemStatus](#schemaitemstatus)|true|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|status|pending| +|status|canceled_user| +|status|canceled_system| +|status|error_user| +|status|error_system| +|status|succeeded| + + +To perform this operation, you must be authenticated by means of one of the following methods: +OAuth2AuthorizationCodeBearer + + +## Schemas + +### ApplicationReadResponse + + + + + + +```json +{ + "application_id": "h-e-tme", + "description": "string", + "name": "HETA", + "regulatory_classes": [ + "RuO" + ] +} + +``` + +ApplicationReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string|true|none|Application ID| +|description|string|true|none|Application documentations| +|name|string|true|none|Application display name| +|regulatory_classes|[string]|true|none|Regulatory class, to which the applications compliance| + +### ApplicationRunStatus + + + + + + +```json +"canceled_system" + +``` + +ApplicationRunStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ApplicationRunStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ApplicationRunStatus|canceled_system| +|ApplicationRunStatus|canceled_user| +|ApplicationRunStatus|completed| +|ApplicationRunStatus|completed_with_error| +|ApplicationRunStatus|received| +|ApplicationRunStatus|rejected| +|ApplicationRunStatus|running| +|ApplicationRunStatus|scheduled| + +### ApplicationVersionReadResponse + + + + + + +```json +{ + "application_id": "string", + "application_version_id": "h-e-tme:v0.0.1", + "changelog": "string", + "flow_id": "0746f03b-16cc-49fb-9833-df3713d407d2", + "input_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" + } + ], + "output_artifacts": [ + { + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" + } + ], + "version": "string" +} + +``` + +ApplicationVersionReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string|true|none|Application ID| +|application_version_id|string|true|none|Application version ID| +|changelog|string|true|none|Description of the changes relative to the previous version| +|flow_id|any|false|none|Flow ID, used internally by the platform| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uuid)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifactReadResponse](#schemainputartifactreadresponse)]|true|none|List of the input fields, provided by the User| +|output_artifacts|[[OutputArtifactReadResponse](#schemaoutputartifactreadresponse)]|true|none|List of the output fields, generated by the application| +|version|string|true|none|Semantic version of the application| + +### HTTPValidationError + + + + + + +```json +{ + "detail": [ + { + "loc": [ + "string" + ], + "msg": "string", + "type": "string" + } + ] +} + +``` + +HTTPValidationError + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|detail|[[ValidationError](#schemavalidationerror)]|false|none|none| + +### InputArtifactCreationRequest + + + + + + +```json +{ + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" +} + +``` + +InputArtifactCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) to the input artifact file. The URL should be valid for at least 6 days from the payload submission time.| +|metadata|object|true|none|The metadata of the artifact, required by the application version. The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. The schema is located in `input_artifacts.[].metadata_schema`| +|name|string|true|none|The artifact name according to the application version. List of required artifacts is returned by `/v1/versions/{application_version_id}`. The artifact names are located in the `input_artifacts.[].name` value| + +### InputArtifactReadResponse + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "image/tiff", + "name": "string" +} + +``` + +InputArtifactReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| + +### ItemCreationRequest + + + + + + +```json +{ + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" +} + +``` + +ItemCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|[[InputArtifactCreationRequest](#schemainputartifactcreationrequest)]|true|none|All the input files of the item, required by the application version| +|reference|string|true|none|The ID of the slide provided by the caller. The reference should be unique across all items of the application run| + +### ItemResultReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "error": "string", + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": [ + { + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + ], + "reference": "string", + "status": "pending" +} + +``` + +ItemResultReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|Application run UUID to which the item belongs| +|error|any|true|none|The error message in case the item is in `error_system` or `error_user` state| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|item_id|string(uuid)|true|none|Item UUID generated by the Platform| +|output_artifacts|[[OutputArtifactResultReadResponse](#schemaoutputartifactresultreadresponse)]|true|none|The list of the results generated by the application algorithm. The number of files and theirtypes depend on the particular application version, call `/v1/versions/{version_id}` to getthe details.| +|reference|string|true|none|The reference of the item from the user payload| +|status|[ItemStatus](#schemaitemstatus)|true|none|When the item is not processed yet, the status is set to `pending`.When the item is successfully finished, status is set to `succeeded`, and the processing resultsbecome available for download in `output_artifacts` field.When the item processing is failed because the provided item is invalid, the status is set to`error_user`. When the item processing failed because of the error in the model or platform,the status is set to `error_system`. When the application_run is canceled, the status of allpending items is set to either `cancelled_user` or `cancelled_system`.| + +### ItemStatus + + + + + + +```json +"pending" + +``` + +ItemStatus + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ItemStatus|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|ItemStatus|pending| +|ItemStatus|canceled_user| +|ItemStatus|canceled_system| +|ItemStatus|error_user| +|ItemStatus|error_system| +|ItemStatus|succeeded| + +### OutputArtifactReadResponse + + + + + + +```json +{ + "metadata_schema": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "scope": "item" +} + +``` + +OutputArtifactReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata_schema|object|true|none|none| +|mime_type|string|true|none|none| +|name|string|true|none|none| +|scope|[OutputArtifactScope](#schemaoutputartifactscope)|true|none|none| + +### OutputArtifactResultReadResponse + + + + + + +```json +{ + "download_url": "http://example.com", + "metadata": {}, + "mime_type": "application/vnd.apache.parquet", + "name": "string", + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" +} + +``` + +OutputArtifactResultReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|any|true|none|The download URL to the output file. The URL is valid for 1 hour after the endpoint is called.A new URL is generated every time the endpoint is called.| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string(uri)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|metadata|object|true|none|The metadata of the output artifact, provided by the application| +|mime_type|string|true|none|The mime type of the output file| +|name|string|true|none|Name of the output from the output schema from the `/v1/versions/{version_id}` endpoint.| +|output_artifact_id|string(uuid)|true|none|The Id of the artifact. Used internally| + +### OutputArtifactScope + + + + + + +```json +"item" + +``` + +OutputArtifactScope + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|OutputArtifactScope|string|false|none|none| + +##### Enumerated Values + +|Property|Value| +|---|---| +|OutputArtifactScope|item| +|OutputArtifactScope|global| + +### PayloadInputArtifact + + + + + + +```json +{ + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} +} + +``` + +PayloadInputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|input_artifact_id|string(uuid)|false|none|none| +|metadata|object|true|none|none| + +### PayloadItem + + + + + + +```json +{ + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } +} + +``` + +PayloadItem + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|input_artifacts|object|true|none|none| +|» **additionalProperties**|[PayloadInputArtifact](#schemapayloadinputartifact)|false|none|none| +|item_id|string(uuid)|true|none|none| +|output_artifacts|object|true|none|none| +|» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +### PayloadOutputArtifact + + + + + + +```json +{ + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" +} + +``` + +PayloadOutputArtifact + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|data|[TransferUrls](#schematransferurls)|true|none|none| +|metadata|[TransferUrls](#schematransferurls)|true|none|none| +|output_artifact_id|string(uuid)|true|none|none| + +### RunCreationRequest + + + + + + +```json +{ + "application_version_id": "h-e-tme:v1.2.3", + "items": [ + { + "input_artifacts": [ + { + "download_url": "https://example.com/case-no-1-slide.tiff", + "metadata": { + "checksum_crc32c": "752f9554", + "height": 2000, + "height_mpp": 0.5, + "width": 10000, + "width_mpp": 0.5 + }, + "name": "slide" + } + ], + "reference": "case-no-1" + } + ] +} + +``` + +RunCreationRequest + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_version_id|string|true|none|Application version ID| +|items|[[ItemCreationRequest](#schemaitemcreationrequest)]|true|none|List of the items to process by the application| + +### RunCreationResponse + + + + + + +```json +{ + "application_run_id": "Application run id" +} + +``` + +RunCreationResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|false|none|none| + +### RunReadResponse + + + + + + +```json +{ + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "application_version_id": "string", + "organization_id": "string", + "status": "canceled_system", + "triggered_at": "2019-08-24T14:15:22Z", + "triggered_by": "string", + "user_payload": { + "application_id": "string", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] + } +} + +``` + +RunReadResponse + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_run_id|string(uuid)|true|none|UUID of the application| +|application_version_id|string|true|none|ID of the application version| +|organization_id|string|true|none|Organization of the owner of the application run| +|status|[ApplicationRunStatus](#schemaapplicationrunstatus)|true|none|When the application run request is received by the Platform, the `status` of it is set to`received`. Then it is transitioned to `scheduled`, when it is scheduled for the processing.When the application run is scheduled, it will process the input items and generate the resultincrementally. As soon as the first result is generated, the state is changed to `running`.The results can be downloaded via `/v1/runs/{run_id}/results` endpoint.When all items are processed and all results are generated, the application status is set to`completed`. If the processing is done, but some items fail, the status is set to`completed_with_error`.When the application run request is rejected by the Platform before scheduling, it is transferredto `rejected`. When the application run reaches the threshold of number of failed items, the wholeapplication run is set to `canceled_system` and the remaining pending items are not processed.When the application run fails, the finished item results are available for download.If the application run is canceled by calling `POST /v1/runs/{run_id}/cancel` endpoint, theprocessing of the items is stopped, and the application status is set to `cancelled_user`| +|triggered_at|string(date-time)|true|none|Timestamp showing when the application run was triggered| +|triggered_by|string|true|none|Id of the user who triggered the application run| +|user_payload|any|false|none|Field used internally by the Platform| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|[UserPayload](#schemauserpayload)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +### TransferUrls + + + + + + +```json +{ + "download_url": "http://example.com", + "upload_url": "http://example.com" +} + +``` + +TransferUrls + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|download_url|string(uri)|true|none|none| +|upload_url|string(uri)|true|none|none| + +### UserPayload + + + + + + +```json +{ + "application_id": "string", + "application_run_id": "53c0c6ed-e767-49c4-ad7c-b1a749bf7dfe", + "global_output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + }, + "items": [ + { + "input_artifacts": { + "property1": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + }, + "property2": { + "download_url": "http://example.com", + "input_artifact_id": "a4134709-460b-44b6-99b2-2d637f889159", + "metadata": {} + } + }, + "item_id": "4d8cd62e-a579-4dae-af8c-3172f96f8f7c", + "output_artifacts": { + "property1": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + }, + "property2": { + "data": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "metadata": { + "download_url": "http://example.com", + "upload_url": "http://example.com" + }, + "output_artifact_id": "3f78e99c-5d35-4282-9e82-63c422f3af1b" + } + } + } + ] +} + +``` + +UserPayload + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|application_id|string|true|none|none| +|application_run_id|string(uuid)|true|none|none| +|global_output_artifacts|any|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|object|false|none|none| +|»» **additionalProperties**|[PayloadOutputArtifact](#schemapayloadoutputartifact)|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|null|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|items|[[PayloadItem](#schemapayloaditem)]|true|none|none| + +### ValidationError + + + + + + +```json +{ + "loc": [ + "string" + ], + "msg": "string", + "type": "string" +} + +``` + +ValidationError + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|loc|[anyOf]|true|none|none| + +anyOf + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|string|false|none|none| + +or + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|» *anonymous*|integer|false|none|none| + +continued + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|msg|string|true|none|none| +|type|string|true|none|none| diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index 3f6a33fd..a57dcee2 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -3319,7 +3319,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## boto3 (1.38.1) - Apache Software License +## boto3 (1.37.28) - Apache Software License The AWS SDK for Python @@ -3517,7 +3517,7 @@ Copyright 2013-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. ``` -## botocore (1.38.1) - Apache Software License +## botocore (1.37.28) - Apache Software License Low-level, data-driven core of boto 3. @@ -4636,13 +4636,6 @@ SOFTWARE. ``` -## cloudpickle (3.1.1) - BSD License - -Pickler class to extend the standard pickle.Pickler functionality - -* URL: https://github.com/cloudpipe/cloudpickle -* Author(s): The cloudpickle developer team - ## colorama (0.4.6) - BSD License Cross-platform colored terminal text. @@ -8347,7 +8340,7 @@ Google API client core library ``` -## google-auth (2.39.0) - Apache Software License +## google-auth (2.38.0) - Apache Software License Google Authentication Library @@ -11941,7 +11934,7 @@ license-expression is a comprehensive utility library to parse, compare, simplif ``` -## logfire (3.14.1) - MIT License +## logfire (3.13.1) - MIT License The best Python observability tool! 🪵🔥 @@ -12018,7 +12011,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## marimo (0.13.1) - Apache Software License +## marimo (0.13.0) - Apache Software License A library for making reactive notebooks and apps @@ -28405,7 +28398,7 @@ THE SOFTWARE. ``` -## rsa (4.9.1) - Apache Software License +## rsa (4.9) - Apache Software License Pure-Python RSA implementation @@ -29917,7 +29910,7 @@ are: ``` -## s3transfer (0.12.0) - Apache Software License +## s3transfer (0.11.4) - Apache Software License An Amazon S3 Transfer Manager @@ -30172,221 +30165,6 @@ SOFTWARE. ``` -## scalene (1.5.51) - Apache Software License - -Scalene: A high-resolution, low-overhead CPU, GPU, and memory profiler for Python with AI-powered optimization suggestions - -* URL: https://github.com/plasma-umass/scalene -* Author(s): Emery Berger , Sam Stern , Juan Altmayer Pizzorno - -### License Text - -``` - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -``` - ## selenium (4.31.0) - Apache Software License Official Python bindings for Selenium WebDriver @@ -30601,7 +30379,7 @@ Official Python bindings for Selenium WebDriver ``` -## sentry-sdk (2.27.0) - BSD License +## sentry-sdk (2.26.1) - BSD License Python client for Sentry (https://sentry.io) @@ -35121,41 +34899,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## wheel (0.45.1) - MIT License - -A built-package format for Python - -* URL: https://github.com/pypa/wheel -* Author(s): Daniel Holth -* Maintainer(s): Alex Grönholm - -### License Text - -``` -MIT License - -Copyright (c) 2012 Daniel Holth and contributors - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -``` - ## widgetsnbextension (4.0.13) - BSD License Jupyter interactive widgets for Jupyter Notebook diff --git a/CLI_REFERENCE.md b/CLI_REFERENCE.md index a49655d3..84fa802c 100644 --- a/CLI_REFERENCE.md +++ b/CLI_REFERENCE.md @@ -445,7 +445,7 @@ $ aignostics idc download [OPTIONS] SOURCE [TARGET] **Arguments**: * `SOURCE`: Filename of manifest, identifier, or comma-separate set of identifiers [required] -* `[TARGET]`: target directory for download [default: /Users/helmut/Code/python-sdk] +* `[TARGET]`: target directory for download [default: /Users/akunft/dev/python-sdk] **Options**: diff --git a/README.md b/README.md index d3f2bc19..7ceaca0d 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,21 @@ [//]: # (README.md generated from docs/partials/README_*.md) -# 🔬 Aignostics Python SDK +# 🔬Aignostics Python SDK [![License](https://img.shields.io/github/license/aignostics/python-sdk?logo=opensourceinitiative&logoColor=3DA639&labelColor=414042&color=A41831)](https://github.com/aignostics/python-sdk/blob/main/LICENSE) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/aignostics.svg?logo=python&color=204361&labelColor=1E2933)](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) [![CI](https://github.com/aignostics/python-sdk/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/aignostics/python-sdk/actions/workflows/test-and-report.yml) -[![Read the Docs](https://img.shields.io/readthedocs/aignostics)](https://aignostics.readthedocs.io/en/latest/) [![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) [![Security](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) [![Maintainability](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) -[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) -[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) -[![Dependabot](https://img.shields.io/badge/dependabot-active-brightgreen?style=flat-square&logo=dependabot)](https://github.com/aignostics/python-sdk/security/dependabot) -[![Renovate enabled](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://github.com/aignostics/python-sdk/issues?q=is%3Aissue%20state%3Aopen%20Dependency%20Dashboard) [![Coverage](https://codecov.io/gh/aignostics/python-sdk/graph/badge.svg?token=SX34YRP30E)](https://codecov.io/gh/aignostics/python-sdk) -[![Ruff](https://img.shields.io/badge/style-Ruff-blue?color=D6FF65)](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) -[![MyPy](https://img.shields.io/badge/mypy-checked-blue)](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) -[![GitHub - Version](https://img.shields.io/github/v/release/aignostics/python-sdk?label=GitHub&style=flat&labelColor=1C2C2E&color=blue&logo=GitHub&logoColor=white)](https://github.com/aignostics/python-sdk/releases) -[![GitHub - Commits](https://img.shields.io/github/commit-activity/m/aignostics/python-sdk/main?label=commits&style=flat&labelColor=1C2C2E&color=blue&logo=GitHub&logoColor=white)](https://github.com/aignostics/python-sdk/commits/main/) -[![PyPI - Version](https://img.shields.io/pypi/v/aignostics.svg?label=PyPI&logo=pypi&logoColor=%23FFD243&labelColor=%230073B7&color=FDFDFD)](https://pypi.python.org/pypi/aignostics) -[![PyPI - Status](https://img.shields.io/pypi/status/aignostics?logo=pypi&logoColor=%23FFD243&labelColor=%230073B7&color=FDFDFD)](https://pypi.python.org/pypi/aignostics) -[![Docker - Version](https://img.shields.io/docker/v/helmuthva/aignostics-python-sdk?sort=semver&label=Docker&logo=docker&logoColor=white&labelColor=1354D4&color=10151B)](https://hub.docker.com/r/helmuthva/aignostics-python-sdk/tags) -[![Docker - Size](https://img.shields.io/docker/image-size/helmuthva/aignostics-python-sdk?sort=semver&arch=arm64&label=image&logo=docker&logoColor=white&labelColor=1354D4&color=10151B)](https://hub.docker.com/r/helmuthva/aignostics-python-sdk/) -[![Copier](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-grayscale-inverted-border-orange.json)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template) -[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE3IDE2VjdsLTYgNU0yIDlWOGwxLTFoMWw0IDMgOC04aDFsNCAyIDEgMXYxNGwtMSAxLTQgMmgtMWwtOC04LTQgM0gzbC0xLTF2LTFsMy0zIi8+PC9zdmc+)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/aignostics/python-sdk) -[![Open in GitHub Codespaces](https://img.shields.io/static/v1?label=GitHub%20Codespaces&message=Open&color=blue&logo=github)](https://github.com/codespaces/new/aignostics/python-sdk) -[![Better Stack Badge](https://uptime.betterstack.com/status-badges/v1/monitor/1vtu1.svg)](https://aignostics.betteruptime.com/) -> [!TIP] -> 📚 [Online documentation](https://aignostics.readthedocs.io/en/latest/) - 📖 -> [PDF Manual](https://aignostics.readthedocs.io/_/downloads/en/latest/pdf/) - -> [!NOTE] -> 🧠 This project was scaffolded using the template -> [oe-python-template](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template) -> with [copier](https://copier.readthedocs.io/). - --- @@ -132,17 +106,15 @@ to learn about all commands and options available. ## Use in Python Notebooks -We provided example notebooks to help you get started with the Python SDK. -Before you can start, you need to setup your authentication information: - -**Authentication:** -The SDK uses the [OAuth2](https://oauth.net/2/) protocol for authentication. +> [!IMPORTANT] +> Before you get started, you need to set up your authentication credentials if you did not yet do so! Please visit -[your personal dashboard on the aignostics platform](https://platform.aignostics.com/getting-started/quick-start) -and look at the `Enterprise Integration` section to obtain your personal client information. +[your personal dashboard on the aignostics platform website](https://platform.aignostics.com/getting-started/quick-start) +and follow the steps outlined in the `Use in Python Notebooks` section. -**Examples:** The notebooks showcase the interaction with the Aignostics platform using our test application. -To run one them, please follow the steps shown below to (i) clone this repository and start either the [Jupyter](https://docs.jupyter.org/en/latest/index.html) ([examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb)) or +We provide Jupyter and Marimo notebooks to help you get started with the SDK. +The notebooks showcase the interaction with the Aignostics platform using our test application. +To run one them, please follow the steps outlined in the snippet below to clone this repository and start either the [Jupyter](https://docs.jupyter.org/en/latest/index.html) ([examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb)) or [Marimo](https://marimo.io/) ([examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py)) notebook: ```shell @@ -158,6 +130,12 @@ uv run marimo edit examples/notebook.py ## Using the Python SDK in your Codebase +> [!IMPORTANT] +> Before you get started, you need to set up your authentication credentials if you did not yet do so! +Please visit +[your personal dashboard on the aignostics platform website](https://platform.aignostics.com/getting-started/quick-start) +and follow the steps outlined in the `Enterprise Integration` section. + Next to using the CLI and notebooks, you can also use the Python SDK in your codebase. The following sections outline how to install the SDK and interact with it. @@ -185,30 +163,30 @@ pip install aignostics The following snippet shows how to use the Python SDK to trigger an application run: ```python -import aignostics.client as platform +from aignostics import platform # initialize the client client = platform.Client() # trigger an application run application_run = client.runs.create( - application_version="two-task-dummy:v0.35.0", - items=[ - platform.Item( - reference="slide-1", - input_artifacts=[ - platform.InputArtifact( - name="user_slide", - download_url="
", - metadata={ - "checksum_crc32c": "AAAAAA==", - "base_mpp": 0.25, - "width": 1000, - "height": 1000, - }, - ) - ], - ), - ], + application_version="two-task-dummy:v0.35.0", + items=[ + platform.InputItem( + reference="slide-1", + input_artifacts=[ + platform.InputArtifact( + name="user_slide", + download_url="", + metadata={ + "checksum_crc32c": "AAAAAA==", + "base_mpp": 0.25, + "width": 1000, + "height": 1000, + }, + ) + ], + ), + ], ) # wait for the results and download incrementally as they become available application_run.download_to_folder("path/to/download/folder") @@ -218,29 +196,16 @@ Please look at the notebooks in the `example` folder for a more detailed example [client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) to learn about all classes and methods. -#### Application Run Payloads - -The payload expected to trigger an application run is specified by the -`RunCreationRequest` pydantic model: - -```python -RunCreationRequest( - application_version=..., - items=[ - ItemCreationRequest(...), - ItemCreationRequest(...) - ] -) -``` +#### Defining the input for an application run -Next to the application version of the application you want to run, it defines -the items you want to be processed as `ItemCreationRequest` objects: +Next to the `application_version` of the application you want to run, you have to define +the input items you want to process in the run. The input items are defined as follows: ```python -ItemCreationRequest( +platform.InputItem( reference="1", input_artifacts=[ - InputArtifactCreationRequest( + platform.InputArtifact( name="user_slide", # defined by the application version input_artifact schema download_url="", metadata={ # defined by the application version input_artifact schema @@ -256,7 +221,7 @@ ItemCreationRequest( For each item you want to process, you need to provide a unique `reference` string. This is used to identify the item in the results later on. The -`input_artifacts` field is a list of `InputArtifactCreationRequest` objects, +`input_artifacts` field is a list of `InputArtifact` objects, which defines what data & metadata you need to provide for each item. The required artifacts depend on the application version you want to run - in the case of test application, there is only one artifact required, which is the @@ -277,25 +242,6 @@ Self-signed URLs for files in google storage buckets can be generated using the [required credentials](https://cloud.google.com/docs/authentication/application-default-credentials) for the Google Storage Bucket** -## Run with Docker - -We recommend to run the CLI natively on your notebook, as explained above. If -required you can run the CLI as a Docker container: - -```shell -# TODO (Helmut): Explain about the environment -docker run helmuthva/aignostics-python-sdk --help -docker run helmuthva/aignostics-python-sdk system health -``` - -Running via docker compose is supported as well. The .env is passed through from -the host to the Docker container automatically. - -```shell -docker compose run aignostics --help -docker compose run aignostics system health -``` - ## API Concepts @@ -407,19 +353,6 @@ When the application run is cancelled, either by the system or by the user, only - Our [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) provide a complete log of recent improvements and changes. -- In case you want to help us improve 🔬 Aignostics Python SDK: The - [contribution guidelines](https://aignostics.readthedocs.io/en/latest/contributing.html) - explain how to setup your development environment and create pull requests. - We gratefully acknowledge the [open source projects](https://aignostics.readthedocs.io/en/latest/attributions.html) that this project builds upon. Thank you to all these wonderful contributors! - -## Star History - - - - - - Star History Chart - - diff --git a/docs/partials/README_footer.md b/docs/partials/README_footer.md index 98e6a62d..8d95308b 100644 --- a/docs/partials/README_footer.md +++ b/docs/partials/README_footer.md @@ -15,19 +15,6 @@ - Our [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) provide a complete log of recent improvements and changes. -- In case you want to help us improve 🔬 Aignostics Python SDK: The - [contribution guidelines](https://aignostics.readthedocs.io/en/latest/contributing.html) - explain how to setup your development environment and create pull requests. - We gratefully acknowledge the [open source projects](https://aignostics.readthedocs.io/en/latest/attributions.html) that this project builds upon. Thank you to all these wonderful contributors! - -## Star History - - - - - - Star History Chart - - diff --git a/docs/partials/README_header.md b/docs/partials/README_header.md index ae285fb9..38c085e8 100644 --- a/docs/partials/README_header.md +++ b/docs/partials/README_header.md @@ -1,42 +1,16 @@ -# 🔬 Aignostics Python SDK +# 🔬Aignostics Python SDK [![License](https://img.shields.io/github/license/aignostics/python-sdk?logo=opensourceinitiative&logoColor=3DA639&labelColor=414042&color=A41831)](https://github.com/aignostics/python-sdk/blob/main/LICENSE) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/aignostics.svg?logo=python&color=204361&labelColor=1E2933)](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) [![CI](https://github.com/aignostics/python-sdk/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/aignostics/python-sdk/actions/workflows/test-and-report.yml) -[![Read the Docs](https://img.shields.io/readthedocs/aignostics)](https://aignostics.readthedocs.io/en/latest/) [![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) [![Security](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) [![Maintainability](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) -[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=sqale_index)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) -[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) -[![Dependabot](https://img.shields.io/badge/dependabot-active-brightgreen?style=flat-square&logo=dependabot)](https://github.com/aignostics/python-sdk/security/dependabot) -[![Renovate enabled](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://github.com/aignostics/python-sdk/issues?q=is%3Aissue%20state%3Aopen%20Dependency%20Dashboard) [![Coverage](https://codecov.io/gh/aignostics/python-sdk/graph/badge.svg?token=SX34YRP30E)](https://codecov.io/gh/aignostics/python-sdk) -[![Ruff](https://img.shields.io/badge/style-Ruff-blue?color=D6FF65)](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) -[![MyPy](https://img.shields.io/badge/mypy-checked-blue)](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) -[![GitHub - Version](https://img.shields.io/github/v/release/aignostics/python-sdk?label=GitHub&style=flat&labelColor=1C2C2E&color=blue&logo=GitHub&logoColor=white)](https://github.com/aignostics/python-sdk/releases) -[![GitHub - Commits](https://img.shields.io/github/commit-activity/m/aignostics/python-sdk/main?label=commits&style=flat&labelColor=1C2C2E&color=blue&logo=GitHub&logoColor=white)](https://github.com/aignostics/python-sdk/commits/main/) -[![PyPI - Version](https://img.shields.io/pypi/v/aignostics.svg?label=PyPI&logo=pypi&logoColor=%23FFD243&labelColor=%230073B7&color=FDFDFD)](https://pypi.python.org/pypi/aignostics) -[![PyPI - Status](https://img.shields.io/pypi/status/aignostics?logo=pypi&logoColor=%23FFD243&labelColor=%230073B7&color=FDFDFD)](https://pypi.python.org/pypi/aignostics) -[![Docker - Version](https://img.shields.io/docker/v/helmuthva/aignostics-python-sdk?sort=semver&label=Docker&logo=docker&logoColor=white&labelColor=1354D4&color=10151B)](https://hub.docker.com/r/helmuthva/aignostics-python-sdk/tags) -[![Docker - Size](https://img.shields.io/docker/image-size/helmuthva/aignostics-python-sdk?sort=semver&arch=arm64&label=image&logo=docker&logoColor=white&labelColor=1354D4&color=10151B)](https://hub.docker.com/r/helmuthva/aignostics-python-sdk/) -[![Copier](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-grayscale-inverted-border-orange.json)](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template) -[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTE3IDE2VjdsLTYgNU0yIDlWOGwxLTFoMWw0IDMgOC04aDFsNCAyIDEgMXYxNGwtMSAxLTQgMmgtMWwtOC04LTQgM0gzbC0xLTF2LTFsMy0zIi8+PC9zdmc+)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/aignostics/python-sdk) -[![Open in GitHub Codespaces](https://img.shields.io/static/v1?label=GitHub%20Codespaces&message=Open&color=blue&logo=github)](https://github.com/codespaces/new/aignostics/python-sdk) -[![Better Stack Badge](https://uptime.betterstack.com/status-badges/v1/monitor/1vtu1.svg)](https://aignostics.betteruptime.com/) -> [!TIP] -> 📚 [Online documentation](https://aignostics.readthedocs.io/en/latest/) - 📖 -> [PDF Manual](https://aignostics.readthedocs.io/_/downloads/en/latest/pdf/) - -> [!NOTE] -> 🧠 This project was scaffolded using the template -> [oe-python-template](https://github.com/helmut-hoffer-von-ankershoffen/oe-python-template) -> with [copier](https://copier.readthedocs.io/). - --- diff --git a/docs/partials/README_main.md b/docs/partials/README_main.md index f12f6d3a..5adb1fcc 100644 --- a/docs/partials/README_main.md +++ b/docs/partials/README_main.md @@ -85,17 +85,15 @@ to learn about all commands and options available. ## Use in Python Notebooks -We provided example notebooks to help you get started with the Python SDK. -Before you can start, you need to setup your authentication information: - -**Authentication:** -The SDK uses the [OAuth2](https://oauth.net/2/) protocol for authentication. +> [!IMPORTANT] +> Before you get started, you need to set up your authentication credentials if you did not yet do so! Please visit -[your personal dashboard on the aignostics platform](https://platform.aignostics.com/getting-started/quick-start) -and look at the `Enterprise Integration` section to obtain your personal client information. +[your personal dashboard on the aignostics platform website](https://platform.aignostics.com/getting-started/quick-start) +and follow the steps outlined in the `Use in Python Notebooks` section. -**Examples:** The notebooks showcase the interaction with the Aignostics platform using our test application. -To run one them, please follow the steps shown below to (i) clone this repository and start either the [Jupyter](https://docs.jupyter.org/en/latest/index.html) ([examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb)) or +We provide Jupyter and Marimo notebooks to help you get started with the SDK. +The notebooks showcase the interaction with the Aignostics platform using our test application. +To run one them, please follow the steps outlined in the snippet below to clone this repository and start either the [Jupyter](https://docs.jupyter.org/en/latest/index.html) ([examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb)) or [Marimo](https://marimo.io/) ([examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py)) notebook: ```shell @@ -111,6 +109,12 @@ uv run marimo edit examples/notebook.py ## Using the Python SDK in your Codebase +> [!IMPORTANT] +> Before you get started, you need to set up your authentication credentials if you did not yet do so! +Please visit +[your personal dashboard on the aignostics platform website](https://platform.aignostics.com/getting-started/quick-start) +and follow the steps outlined in the `Enterprise Integration` section. + Next to using the CLI and notebooks, you can also use the Python SDK in your codebase. The following sections outline how to install the SDK and interact with it. @@ -138,30 +142,30 @@ pip install aignostics The following snippet shows how to use the Python SDK to trigger an application run: ```python -import aignostics.client as platform +from aignostics import platform # initialize the client client = platform.Client() # trigger an application run application_run = client.runs.create( - application_version="two-task-dummy:v0.35.0", - items=[ - platform.Item( - reference="slide-1", - input_artifacts=[ - platform.InputArtifact( - name="user_slide", - download_url="", - metadata={ - "checksum_crc32c": "AAAAAA==", - "base_mpp": 0.25, - "width": 1000, - "height": 1000, - }, - ) - ], - ), - ], + application_version="two-task-dummy:v0.35.0", + items=[ + platform.InputItem( + reference="slide-1", + input_artifacts=[ + platform.InputArtifact( + name="user_slide", + download_url="", + metadata={ + "checksum_crc32c": "AAAAAA==", + "base_mpp": 0.25, + "width": 1000, + "height": 1000, + }, + ) + ], + ), + ], ) # wait for the results and download incrementally as they become available application_run.download_to_folder("path/to/download/folder") @@ -171,29 +175,16 @@ Please look at the notebooks in the `example` folder for a more detailed example [client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) to learn about all classes and methods. -#### Application Run Payloads - -The payload expected to trigger an application run is specified by the -`RunCreationRequest` pydantic model: - -```python -RunCreationRequest( - application_version=..., - items=[ - ItemCreationRequest(...), - ItemCreationRequest(...) - ] -) -``` +#### Defining the input for an application run -Next to the application version of the application you want to run, it defines -the items you want to be processed as `ItemCreationRequest` objects: +Next to the `application_version` of the application you want to run, you have to define +the input items you want to process in the run. The input items are defined as follows: ```python -ItemCreationRequest( +platform.InputItem( reference="1", input_artifacts=[ - InputArtifactCreationRequest( + platform.InputArtifact( name="user_slide", # defined by the application version input_artifact schema download_url="", metadata={ # defined by the application version input_artifact schema @@ -209,7 +200,7 @@ ItemCreationRequest( For each item you want to process, you need to provide a unique `reference` string. This is used to identify the item in the results later on. The -`input_artifacts` field is a list of `InputArtifactCreationRequest` objects, +`input_artifacts` field is a list of `InputArtifact` objects, which defines what data & metadata you need to provide for each item. The required artifacts depend on the application version you want to run - in the case of test application, there is only one artifact required, which is the @@ -229,22 +220,3 @@ Self-signed URLs for files in google storage buckets can be generated using the **We expect that you provide the [required credentials](https://cloud.google.com/docs/authentication/application-default-credentials) for the Google Storage Bucket** - -## Run with Docker - -We recommend to run the CLI natively on your notebook, as explained above. If -required you can run the CLI as a Docker container: - -```shell -# TODO (Helmut): Explain about the environment -docker run helmuthva/aignostics-python-sdk --help -docker run helmuthva/aignostics-python-sdk system health -``` - -Running via docker compose is supported as well. The .env is passed through from -the host to the Docker container automatically. - -```shell -docker compose run aignostics --help -docker compose run aignostics system health -``` diff --git a/docs/source/_static/openapi_v1.yaml b/docs/source/_static/openapi_v1.yaml index 37d8ab32..27e46245 100644 --- a/docs/source/_static/openapi_v1.yaml +++ b/docs/source/_static/openapi_v1.yaml @@ -58,8 +58,7 @@ components: title: Application Version Id type: string changelog: - description: Description of the changes relative to the previous -version + description: Description of the changes relative to the previous version title: Changelog type: string flow_id: @@ -106,10 +105,8 @@ version InputArtifactCreationRequest: properties: download_url: - description: '[Signed -URL](https://cloud.google.com/cdn/docs/using-signed-urls) - to the input artifact file. The URL should be valid for at least 6 -days + description: '[Signed URL](https://cloud.google.com/cdn/docs/using-signed-urls) + to the input artifact file. The URL should be valid for at least 6 days from the payload submission time.' examples: - https://example.com/case-no-1-slide.tiff @@ -119,10 +116,8 @@ days title: Download Url type: string metadata: - description: The metadata of the artifact, required by the application -version. - The JSON schema of the metadata can be requested by -`/v1/versions/{application_version_id}`. + description: The metadata of the artifact, required by the application version. + The JSON schema of the metadata can be requested by `/v1/versions/{application_version_id}`. The schema is located in `input_artifacts.[].metadata_schema` examples: - checksum_crc32c: 752f9554 @@ -133,12 +128,9 @@ version. title: Metadata type: object name: - description: The artifact name according to the application version. -List - of required artifacts is returned by -`/v1/versions/{application_version_id}`. - The artifact names are located in the `input_artifacts.[].name` -value + description: The artifact name according to the application version. List + of required artifacts is returned by `/v1/versions/{application_version_id}`. + The artifact names are located in the `input_artifacts.[].name` value examples: - slide title: Name @@ -172,16 +164,14 @@ value ItemCreationRequest: properties: input_artifacts: - description: All the input files of the item, required by the -application + description: All the input files of the item, required by the application version items: $ref: '#/components/schemas/InputArtifactCreationRequest' title: Input Artifacts type: array reference: - description: The ID of the slide provided by the caller. The reference -should + description: The ID of the slide provided by the caller. The reference should be unique across all items of the application run examples: - case-no-1 @@ -203,8 +193,7 @@ should anyOf: - type: string - type: 'null' - description: "\nThe error message in case the item is in -`error_system`\ + description: "\nThe error message in case the item is in `error_system`\ \ or `error_user` state\n " title: Error item_id: @@ -213,12 +202,9 @@ should title: Item Id type: string output_artifacts: - description: "\nThe list of the results generated by the application -algorithm.\ - \ The number of files and their\ntypes depend on the particular -application\ - \ version, call `/v1/versions/{version_id}` to get\nthe details.\n -" + description: "\nThe list of the results generated by the application algorithm.\ + \ The number of files and their\ntypes depend on the particular application\ + \ version, call `/v1/versions/{version_id}` to get\nthe details.\n " items: $ref: '#/components/schemas/OutputArtifactResultReadResponse' title: Output Artifacts @@ -229,22 +215,14 @@ application\ type: string status: $ref: '#/components/schemas/ItemStatus' - description: "\nWhen the item is not processed yet, the status is set -to\ - \ `pending`.\n\nWhen the item is successfully finished, status is -set\ - \ to `succeeded`, and the processing results\nbecome available for -download\ - \ in `output_artifacts` field.\n\nWhen the item processing is failed -because\ - \ the provided item is invalid, the status is set to\n`error_user`. -When\ - \ the item processing failed because of the error in the model or -platform,\n\ - the status is set to `error_system`. When the application_run is -canceled,\ - \ the status of all\npending items is set to either `cancelled_user` -or\ + description: "\nWhen the item is not processed yet, the status is set to\ + \ `pending`.\n\nWhen the item is successfully finished, status is set\ + \ to `succeeded`, and the processing results\nbecome available for download\ + \ in `output_artifacts` field.\n\nWhen the item processing is failed because\ + \ the provided item is invalid, the status is set to\n`error_user`. When\ + \ the item processing failed because of the error in the model or platform,\n\ + the status is set to `error_system`. When the application_run is canceled,\ + \ the status of all\npending items is set to either `cancelled_user` or\ \ `cancelled_system`.\n " required: - item_id @@ -297,15 +275,12 @@ or\ minLength: 1 type: string - type: 'null' - description: "\nThe download URL to the output file. The URL is valid -for\ - \ 1 hour after the endpoint is called.\nA new URL is generated every -time\ + description: "\nThe download URL to the output file. The URL is valid for\ + \ 1 hour after the endpoint is called.\nA new URL is generated every time\ \ the endpoint is called.\n " title: Download Url metadata: - description: The metadata of the output artifact, provided by the -application + description: The metadata of the output artifact, provided by the application title: Metadata type: object mime_type: @@ -316,8 +291,7 @@ application title: Mime Type type: string name: - description: "\nName of the output from the output schema from the -`/v1/versions/{version_id}`\ + description: "\nName of the output from the output schema from the `/v1/versions/{version_id}`\ \ endpoint.\n " title: Name type: string @@ -398,8 +372,7 @@ application title: PayloadOutputArtifact type: object RunCreationRequest: - description: 'Application run payload. It describes which application -version + description: 'Application run payload. It describes which application version is chosen, and which user data should be processed.' @@ -447,40 +420,23 @@ version type: string status: $ref: '#/components/schemas/ApplicationRunStatus' - description: "\nWhen the application run request is received by the -Platform,\ - \ the `status` of it is set to\n`received`. Then it is transitioned -to\ - \ `scheduled`, when it is scheduled for the processing.\nWhen the -application\ - \ run is scheduled, it will process the input items and generate the -result\n\ - incrementally. As soon as the first result is generated, the state -is\ - \ changed to `running`.\nThe results can be downloaded via -`/v1/runs/{run_id}/results`\ - \ endpoint.\nWhen all items are processed and all results are -generated,\ - \ the application status is set to\n`completed`. If the processing -is\ - \ done, but some items fail, the status is set -to\n`completed_with_error`.\n\ - \nWhen the application run request is rejected by the Platform -before\ - \ scheduling, it is transferred\nto `rejected`. When the application -run\ - \ reaches the threshold of number of failed items, the -whole\napplication\ - \ run is set to `canceled_system` and the remaining pending items -are\ - \ not processed.\nWhen the application run fails, the finished item -results\ - \ are available for download.\n\nIf the application run is canceled -by\ - \ calling `POST /v1/runs/{run_id}/cancel` endpoint, the\nprocessing -of\ - \ the items is stopped, and the application status is set to -`cancelled_user`\n\ + description: "\nWhen the application run request is received by the Platform,\ + \ the `status` of it is set to\n`received`. Then it is transitioned to\ + \ `scheduled`, when it is scheduled for the processing.\nWhen the application\ + \ run is scheduled, it will process the input items and generate the result\n\ + incrementally. As soon as the first result is generated, the state is\ + \ changed to `running`.\nThe results can be downloaded via `/v1/runs/{run_id}/results`\ + \ endpoint.\nWhen all items are processed and all results are generated,\ + \ the application status is set to\n`completed`. If the processing is\ + \ done, but some items fail, the status is set to\n`completed_with_error`.\n\ + \nWhen the application run request is rejected by the Platform before\ + \ scheduling, it is transferred\nto `rejected`. When the application run\ + \ reaches the threshold of number of failed items, the whole\napplication\ + \ run is set to `canceled_system` and the remaining pending items are\ + \ not processed.\nWhen the application run fails, the finished item results\ + \ are available for download.\n\nIf the application run is canceled by\ + \ calling `POST /v1/runs/{run_id}/cancel` endpoint, the\nprocessing of\ + \ the items is stopped, and the application status is set to `cancelled_user`\n\ \ " triggered_at: description: Timestamp showing when the application run was triggered @@ -582,11 +538,9 @@ of\ info: description: ' - Pagination is done via `page` and `page_size`. Sorting via `sort` query -parameter. + Pagination is done via `page` and `page_size`. Sorting via `sort` query parameter. - The `sort` query parameter can be provided multiple times. The sorting -direction + The `sort` query parameter can be provided multiple times. The sorting direction can be indicated via `+` (ascending) or `-` (descending) (e.g. `/v1/applications?sort=+name)`.' @@ -596,16 +550,13 @@ openapi: 3.1.0 paths: /v1/applications: get: - description: 'Returns the list of the applications, available to the -caller. + description: 'Returns the list of the applications, available to the caller. - The application is available if any of the version of the application is -assigned + The application is available if any of the version of the application is assigned to the - user organization. To switch between organizations, the user should -re-login + user organization. To switch between organizations, the user should re-login and choose the needed organization.' @@ -661,24 +612,19 @@ re-login - Public /v1/applications/{application_id}/versions: get: - description: 'Returns the list of the application versions for this -application, + description: 'Returns the list of the application versions for this application, available to the caller. - The application version is available if it is assigned to the user''s -organization. + The application version is available if it is assigned to the user''s organization. - The application versions are assigned to the organization by the -Aignostics + The application versions are assigned to the organization by the Aignostics admin. To - assign or unassign a version from your organization, please contact -Aignostics + assign or unassign a version from your organization, please contact Aignostics support team.' - operationId: -list_versions_by_application_id_v1_applications__application_id__versions_get + operationId: list_versions_by_application_id_v1_applications__application_id__versions_get parameters: - in: path name: application_id @@ -740,8 +686,7 @@ list_versions_by_application_id_v1_applications__application_id__versions_get schema: items: $ref: '#/components/schemas/ApplicationVersionReadResponse' - title: Response List Versions By Application Id V1 Applications -Application + title: Response List Versions By Application Id V1 Applications Application Id Versions Get type: array description: Successful Response @@ -758,12 +703,10 @@ Application - Public /v1/runs: get: - description: 'The endpoint returns the application runs triggered by the -caller. + description: 'The endpoint returns the application runs triggered by the caller. After the application run - is created by POST /v1/runs, it becomes available for the current -endpoint' + is created by POST /v1/runs, it becomes available for the current endpoint' operationId: list_application_runs_v1_runs_get parameters: - description: Optional application ID filter @@ -786,8 +729,7 @@ endpoint' - type: 'null' description: Optional application version filter title: Application Version - - description: Request optional output values. Used internally by the -platform + - description: Request optional output values. Used internally by the platform in: query name: include required: false @@ -799,8 +741,7 @@ platform - type: string type: array - type: 'null' - description: Request optional output values. Used internally by the -platform + description: Request optional output values. Used internally by the platform title: Include - in: query name: page @@ -853,56 +794,31 @@ platform tags: - Public post: - description: "The endpoint is used to process the input items by the -chosen\ - \ application version. The endpoint\nreturns the `application_run_id`. -The\ - \ processing fo the items is done asynchronously.\n\nTo check the status -or\ - \ cancel the execution, use the /v1/runs/{application_run_id} -endpoint.\n\n\ - ### Payload\n\nThe payload includes `application_version_id` and `items` -base\ - \ fields.\n\n`application_version_id` is the id used for -`/v1/versions/{application_id}`\ - \ endpoint.\n\n`items` includes the list of the items to process -(slides,\ - \ in case of HETA application).\nEvery item has a set of standard fields -defined\ - \ by the API, plus the metadata, specific to the\nchosen -application.\n\n\ - Example payload structure with the comments:\n```\n{\n -application_version_id:\ - \ \"heta:v1.0.0\",\n items: [{\n \"reference\": \"slide_1\" -<--\ - \ Input ID to connect the input and the output artifact\n -\"input_artifacts\"\ - : [{\n \"name\": \"input_slide\" <-- Name of the artifact -defined\ - \ by the application (For HETA it is\"input_slide\")\n -\"download_url\"\ - : \"https://...\" <-- signed URL to the input file in the S3 or GCS. -Should\ - \ be valid for more than 6 days\n \"metadata\": { <-- The -metadata\ - \ fields defined by the application. (The example fields set for a slide -files\ - \ are provided)\n \"checksum_crc32c\": \"abc12==\",\n -\ - \ \"mime_type\": \"image/tiff\",\n \"height\": -100,\n\ - \ \"weight\": 500,\n \"mpp\": 0.543\n -\ - \ }\n }]\n }]\n}\n```\n\n### Response\n\nThe endpoint -returns\ - \ the application run UUID. After that the job is scheduled for -the\nexecution\ - \ in the background.\n\nTo check the status of the run call -`v1/runs/{application_run_id}`.\n\ - \n### Rejection\n\nApart from the authentication, authorization and -malformed\ - \ input error, the request can be\nrejected when the quota limit is -exceeded.\ + description: "The endpoint is used to process the input items by the chosen\ + \ application version. The endpoint\nreturns the `application_run_id`. The\ + \ processing fo the items is done asynchronously.\n\nTo check the status or\ + \ cancel the execution, use the /v1/runs/{application_run_id} endpoint.\n\n\ + ### Payload\n\nThe payload includes `application_version_id` and `items` base\ + \ fields.\n\n`application_version_id` is the id used for `/v1/versions/{application_id}`\ + \ endpoint.\n\n`items` includes the list of the items to process (slides,\ + \ in case of HETA application).\nEvery item has a set of standard fields defined\ + \ by the API, plus the metadata, specific to the\nchosen application.\n\n\ + Example payload structure with the comments:\n```\n{\n application_version_id:\ + \ \"heta:v1.0.0\",\n items: [{\n \"reference\": \"slide_1\" <--\ + \ Input ID to connect the input and the output artifact\n \"input_artifacts\"\ + : [{\n \"name\": \"input_slide\" <-- Name of the artifact defined\ + \ by the application (For HETA it is\"input_slide\")\n \"download_url\"\ + : \"https://...\" <-- signed URL to the input file in the S3 or GCS. Should\ + \ be valid for more than 6 days\n \"metadata\": { <-- The metadata\ + \ fields defined by the application. (The example fields set for a slide files\ + \ are provided)\n \"checksum_crc32c\": \"abc12==\",\n \ + \ \"mime_type\": \"image/tiff\",\n \"height\": 100,\n\ + \ \"weight\": 500,\n \"mpp\": 0.543\n \ + \ }\n }]\n }]\n}\n```\n\n### Response\n\nThe endpoint returns\ + \ the application run UUID. After that the job is scheduled for the\nexecution\ + \ in the background.\n\nTo check the status of the run call `v1/runs/{application_run_id}`.\n\ + \n### Rejection\n\nApart from the authentication, authorization and malformed\ + \ input error, the request can be\nrejected when the quota limit is exceeded.\ \ More details on quotas is described in the\ndocumentation" operationId: create_application_run_v1_runs_post requestBody: @@ -933,8 +849,7 @@ exceeded.\ - Public /v1/runs/{application_run_id}: get: - description: 'Returns the details of the application run. The application -run + description: 'Returns the details of the application run. The application run is available as soon as it is created via `POST /runs/` endpoint. To download the items results, call @@ -942,8 +857,7 @@ run `/runs/{application_run_id}/results`. - The application is only available to the user who triggered it, -regardless + The application is only available to the user who triggered it, regardless of the role.' operationId: get_run_v1_runs__application_run_id__get parameters: @@ -990,23 +904,19 @@ regardless - Public /v1/runs/{application_run_id}/cancel: post: - description: 'The application run can be canceled by the user who created -the + description: 'The application run can be canceled by the user who created the application run. - The execution can be canceled any time while the application is not in a -final + The execution can be canceled any time while the application is not in a final state. The pending items will not be processed and will not add to the cost. - When the application is canceled, the already completed items stay -available + When the application is canceled, the already completed items stay available for download.' - operationId: -cancel_application_run_v1_runs__application_run_id__cancel_post + operationId: cancel_application_run_v1_runs__application_run_id__cancel_post parameters: - description: Application run id, returned by `POST /runs/` endpoint in: path @@ -1038,24 +948,19 @@ cancel_application_run_v1_runs__application_run_id__cancel_post - Public /v1/runs/{application_run_id}/results: delete: - description: 'Delete the application run results. It can only be called -when + description: 'Delete the application run results. It can only be called when the application is in a final - state (meaning it''s not in `received` or `pending` states). To delete -the + state (meaning it''s not in `received` or `pending` states). To delete the results of the running - artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to -cancel + artifacts, first call `POST /v1/runs/{application_run_id}/cancel` to cancel the application run. - The output results are deleted automatically 30 days after the -application + The output results are deleted automatically 30 days after the application run is finished.' - operationId: -delete_application_run_results_v1_runs__application_run_id__results_delete + operationId: delete_application_run_results_v1_runs__application_run_id__results_delete parameters: - description: Application run id, returned by `POST /runs/` endpoint in: path @@ -1118,8 +1023,7 @@ delete_application_run_results_v1_runs__application_run_id__results_delete type: string type: array - type: 'null' - description: Filter for items by their reference from the input -payload + description: Filter for items by their reference from the input payload title: Reference In - description: Filter for items in certain statuses in: query @@ -1167,8 +1071,7 @@ payload schema: items: $ref: '#/components/schemas/ItemResultReadResponse' - title: Response List Run Results V1 Runs Application Run Id -Results + title: Response List Run Results V1 Runs Application Run Id Results Get type: array description: Successful Response diff --git a/docs/source/lib_reference.rst b/docs/source/lib_reference.rst index 9f0a1872..1e6d90b2 100644 --- a/docs/source/lib_reference.rst +++ b/docs/source/lib_reference.rst @@ -1,7 +1,7 @@ Library Reference ================= -.. automodule:: aignostics.client +.. automodule:: aignostics.platform :members: .. automodule:: aignostics.application diff --git a/examples/notebook.ipynb b/examples/notebook.ipynb index 0dad07af..6266dc08 100644 --- a/examples/notebook.ipynb +++ b/examples/notebook.ipynb @@ -13,7 +13,7 @@ "**NOTE:** By default, the client caches the access token in your operation systems application cache folder. If you do not want to store the access token, please initialize the client like this:\n", "\n", "```python\n", - "import aignostics.client as platform\n", + "import aignostics.platform as platform\n", "# initialize the client\n", "client = platform.Client(cache_token=False)\n", "```\n", @@ -47,7 +47,7 @@ "cell_type": "code", "metadata": {}, "source": [ - "import aignostics.client as platform\n", + "from aignostics import platform\n", "\n", "# initialize the client\n", "client = platform.Client(cache_token=False)" @@ -76,17 +76,17 @@ "execution_count": null }, { - "cell_type": "markdown", "metadata": {}, + "cell_type": "markdown", "source": [ "# List all available versions of an application\n", "\n", - "Now that we know the applications that are available, we can list all the versions of a specific application. In this case, we will use the `TwoTask Dummy Application` as an example, which has the `application_id`: `ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed`. Using the `application_id`, we can list all the versions of the application:" + "Now that we know the applications that are available, we can list all the versions of a specific application. In this case, we will use the `TwoTask Dummy Application` as an example, which has the `application_id`: `two-task-dummy`. Using the `application_id`, we can list all the versions of the application:" ] }, { - "cell_type": "code", "metadata": {}, + "cell_type": "code", "source": [ "application_versions = client.applications.versions.list(application=\"two-task-dummy\")\n", "# visualize\n", @@ -96,17 +96,17 @@ "execution_count": null }, { - "cell_type": "markdown", "metadata": {}, + "cell_type": "markdown", "source": [ "# Inspect the application version details\n", "\n", - "Now that we have the list of versions, we can inspect the details of a specific version. While we could directly use the list of application version returned by the `list` method, we want to directly query details for a specific application version. In this case, we will use version `0.0.3`, which has the `application_version_id`: `60e7b441-307a-4b41-8a97-5b02e7bc73a4`. We use the `application_version_id` to retrieve further details about the application version:" + "Now that we have the list of versions, we can inspect the details of a specific version. While we could directly use the list of application version returned by the `list` method, we want to directly query details for a specific application version. In this case, we will use version `0.35.0`, which has the `application_version_id`: `two-task-dummy:v0.35.0`. We use the `application_version_id` to retrieve further details about the application version:" ] }, { - "cell_type": "code", "metadata": {}, + "cell_type": "code", "source": [ "from IPython.display import JSON\n", "\n", @@ -125,17 +125,17 @@ "source": [ "# Trigger an application run\n", "\n", - "Now, let's trigger an application run for the `TwoTask Dummy Application`. We will use the `application_version_id` that we retrieved in the previous step. To create an application run, we need to provide a payload that consists of 1 or more items. We provide the Pydantic model `Item` an item and the data that comes with it:\n", + "Now, let's trigger an application run for the `Test Application`. We will use the `application_version_id` that we retrieved in the previous step. To create an application run, we need to provide a payload that consists of 1 or more items. We provide the Pydantic model `InputItem` an item and the data that comes with it:\n", "```python\n", - "Item(\n", + "platform.InputItem(\n", " reference=\"\",\n", - " input_artifacts=[InputArtifactCreationRequest]\n", + " input_artifacts=[platform.InputArtifact]\n", ")\n", "```\n", "The `InputArtifact` defines the actual data that you provide aka. in this case the image that you want to be processed. The expected values are defined by the application version and have to align with the `input_artifacts` schema of the application version. In the case of the two task dummy application, we only require a single artifact per item, which is the image to process on. The artifact name is defined as `user_slide`. The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. In addition to the image data itself, you have to provide the metadata defined in the input artifact schema, i.e., `checksum_crc32c`, `base_mpp`, `width`, and `height`. The metadata is used to validate the input data and is required for the processing of the image. The following example shows how to create an item with a single input artifact:\n", "\n", "```python\n", - "InputArtifact(\n", + "platform.InputArtifact(\n", " name=\"user_slide\", # as defined by the application version input_artifact schema\n", " download_url=\"\",\n", " metadata={\n", @@ -149,25 +149,23 @@ ] }, { - "cell_type": "code", "metadata": {}, + "cell_type": "code", "source": [ "application_run = client.runs.create(\n", - " application_version=\"two-task-dummy:v0.35.0\",\n", + " application_version=\"two-task-dummy:v0.0.5\",\n", " items=[\n", - " platform.Item(\n", + " platform.InputItem(\n", " reference=\"wsi-1\",\n", " input_artifacts=[\n", " platform.InputArtifact(\n", " name=\"user_slide\",\n", - " download_url=platform.generate_signed_url(\n", - " \"gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff\"\n", - " ),\n", + " download_url=platform.generate_signed_url(\"\"),\n", " metadata={\n", - " \"checksum_crc32c\": \"N+LWCg==\",\n", - " \"base_mpp\": 0.46499982,\n", - " \"width\": 3728,\n", - " \"height\": 3640,\n", + " \"checksum_crc32c\": \"AAAAAA==\",\n", + " \"base_mpp\": 0.25,\n", + " \"width\": 10000,\n", + " \"height\": 10000,\n", " },\n", " )\n", " ],\n", @@ -224,14 +222,14 @@ "execution_count": null }, { - "cell_type": "code", "metadata": {}, + "cell_type": "code", "source": [ "import tempfile\n", "\n", - "from aignostics.client.resources.runs import ApplicationRun\n", + "from aignostics.platform.resources.runs import ApplicationRun\n", "\n", - "application_run = ApplicationRun.for_application_run_id(\"0c1e20fe-b9f9-477a-8608-1fbd40aec723\")\n", + "application_run = ApplicationRun.for_application_run_id(\"\")\n", "# download\n", "\n", "download_folder = tempfile.gettempdir()\n", @@ -241,9 +239,9 @@ "execution_count": null }, { - "cell_type": "code", "metadata": {}, - "source": [], + "cell_type": "code", + "source": "", "outputs": [], "execution_count": null } diff --git a/examples/notebook.py b/examples/notebook.py index 5d37eaeb..f0a98ae7 100644 --- a/examples/notebook.py +++ b/examples/notebook.py @@ -6,13 +6,10 @@ # ] # /// - import marimo -from aignostics.utils import __version__ - -__generated_with = "0.12.8" -app = marimo.App(app_title=f"🔬 Aignostics Python SDK v{__version__}", width="full") +__generated_with = "0.13.0" +app = marimo.App(width="full") @app.cell @@ -55,12 +52,12 @@ def show(models: BaseModel | list[BaseModel]) -> pd.DataFrame: else: items = (a.model_dump() for a in models) return pd.DataFrame(items) - return BaseModel, pd, show + return (show,) @app.cell def _(): - import aignostics.client as platform + from aignostics import platform # initialize the client client = platform.Client(cache_token=False) return client, platform @@ -83,7 +80,7 @@ def _(client, show): applications = client.applications.list() # visualize show(applications) - return (applications,) + return @app.cell @@ -92,7 +89,7 @@ def _(mo): r""" # List all available versions of an application - Now that we know the applications that are available, we can list all the versions of a specific application. In this case, we will use the `TwoTask Dummy Application` as an example, which has the `application_id`: `ee5566d2-d3cb-4303-9e23-8a5ab3e5b8ed`. Using the `application_id`, we can list all the versions of the application: + Now that we know the applications that are available, we can list all the versions of a specific application. In this case, we will use the `TwoTask Dummy Application` as an example, which has the `application_id`: `two-task-dummy`. Using the `application_id`, we can list all the versions of the application: """ ) return @@ -103,7 +100,7 @@ def _(client, show): application_versions = client.applications.versions.list(application="two-task-dummy") # visualize show(application_versions) - return (application_versions,) + return @app.cell @@ -112,7 +109,7 @@ def _(mo): r""" # Inspect the application version details - Now that we have the list of versions, we can inspect the details of a specific version. While we could directly use the list of application version returned by the `list` method, we want to directly query details for a specific application version. In this case, we will use version `0.0.3`, which has the `application_version_id`: `60e7b441-307a-4b41-8a97-5b02e7bc73a4`. We use the `application_version_id` to retrieve further details about the application version: + Now that we have the list of versions, we can inspect the details of a specific version. While we could directly use the list of application version returned by the `list` method, we want to directly query details for a specific application version. In this case, we will use version `0.35.0`, which has the `application_version_id`: `two-task-dummy:v0.35.0`. We use the `application_version_id` to retrieve further details about the application version: """ ) return @@ -124,7 +121,7 @@ def _(client): # view the `input_artifacts` to get insights in the required fields of the application version payload two_task_app.input_artifacts[0].to_json() - return (two_task_app,) + return @app.cell @@ -133,17 +130,17 @@ def _(mo): r""" # Trigger an application run - Now, let's trigger an application run for the `TwoTask Dummy Application`. We will use the `application_version_id` that we retrieved in the previous step. To create an application run, we need to provide a payload that consists of 1 or more items. We provide the Pydantic model `Item` an item and the data that comes with it: + Now, let's trigger an application run for the `Test Application`. We will use the `application_version_id` that we retrieved in the previous step. To create an application run, we need to provide a payload that consists of 1 or more items. We provide the Pydantic model `InputItem` an item and the data that comes with it: ```python - Item( + platform.InputItem( reference="", - input_artifacts=[InputArtifactCreationRequest] + input_artifacts=[platform.InputArtifact] ) ``` - The `InputArtifactCreationRequest` defines the actual data that you provide aka. in this case the image that you want to be processed. The expected values are defined by the application version and have to align with the `input_artifacts` schema of the application version. In the case of the two task dummy application, we only require a single artifact per item, which is the image to process on. The artifact name is defined as `user_slide`. The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. In addition to the image data itself, you have to provide the metadata defined in the input artifact schema, i.e., `checksum_crc32c`, `base_mpp`, `width`, and `height`. The metadata is used to validate the input data and is required for the processing of the image. The following example shows how to create an item with a single input artifact: + The `InputArtifact` defines the actual data that you provide aka. in this case the image that you want to be processed. The expected values are defined by the application version and have to align with the `input_artifacts` schema of the application version. In the case of the two task dummy application, we only require a single artifact per item, which is the image to process on. The artifact name is defined as `user_slide`. The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. In addition to the image data itself, you have to provide the metadata defined in the input artifact schema, i.e., `checksum_crc32c`, `base_mpp`, `width`, and `height`. The metadata is used to validate the input data and is required for the processing of the image. The following example shows how to create an item with a single input artifact: ```python - InputArtifact( + platform.InputArtifact( name="user_slide", # as defined by the application version input_artifact schema download_url="", metadata={ @@ -164,19 +161,17 @@ def _(client, platform): application_run = client.runs.create( application_version="two-task-dummy:v0.0.5", items=[ - platform.Item( + platform.InputItem( reference="wsi-1", input_artifacts=[ platform.InputArtifact( name="user_slide", - download_url=platform.generate_signed_url( - "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" - ), + download_url=platform.generate_signed_url(""), metadata={ - "checksum_crc32c": "N+LWCg==", - "base_mpp": 0.46499982, - "width": 3728, - "height": 3640, + "checksum_crc32c": "AAAAAA==", + "base_mpp": 0.25, + "width": 10000, + "height": 10000, }, ) ], @@ -205,7 +200,7 @@ def _(mo): def _(application_run): download_folder = "/tmp/" application_run.download_to_folder(download_folder) - return (download_folder,) + return @app.cell @@ -226,7 +221,7 @@ def _(client): application_runs = client.runs.list() for run in application_runs: print(run) - return application_runs, run + return @app.cell diff --git a/examples/script.py b/examples/script.py index b8823384..87987565 100644 --- a/examples/script.py +++ b/examples/script.py @@ -2,7 +2,7 @@ import tempfile -import aignostics.client as platform +from aignostics import platform # initialize the client client = platform.Client() @@ -11,7 +11,7 @@ application_run = client.runs.create( application_version="two-task-dummy:v0.35.0", items=[ - platform.Item( + platform.InputItem( reference="1", input_artifacts=[ platform.InputArtifact( diff --git a/src/aignostics/application/_cli.py b/src/aignostics/application/_cli.py index a861a301..e3ab35c8 100644 --- a/src/aignostics/application/_cli.py +++ b/src/aignostics/application/_cli.py @@ -2,7 +2,7 @@ import typer -import aignostics.client +import aignostics.platform from aignostics.utils import console, get_logger logger = get_logger(__name__) @@ -40,7 +40,7 @@ def bucket_purge() -> None: @cli.command("list") def application_list() -> None: """List available applications.""" - client = aignostics.client.Client() + client = aignostics.platform.Client() applications = client.applications.list() console.print(applications) @@ -72,7 +72,7 @@ def run_submit() -> None: @run_app.command("list") def run_list() -> None: """List runs.""" - client = aignostics.client.Client() + client = aignostics.platform.Client() runs = client.runs.list() console.print(runs) diff --git a/src/aignostics/constants.py b/src/aignostics/constants.py index c8b691a6..f1cb18f0 100644 --- a/src/aignostics/constants.py +++ b/src/aignostics/constants.py @@ -2,7 +2,7 @@ from pathlib import Path -MODULES_TO_INSTRUMENT = ["aignostics.client", "aignostics.application"] +MODULES_TO_INSTRUMENT = ["aignostics.platform", "aignostics.application"] API_VERSIONS = { "v1": "1.0.0", diff --git a/src/aignostics/client/__init__.py b/src/aignostics/platform/__init__.py similarity index 94% rename from src/aignostics/client/__init__.py rename to src/aignostics/platform/__init__.py index 79c2f517..a3ee1e09 100644 --- a/src/aignostics/client/__init__.py +++ b/src/aignostics/platform/__init__.py @@ -10,10 +10,10 @@ InputArtifactCreationRequest as InputArtifact, ) from aignx.codegen.models import ( - ItemCreationRequest as Item, + ItemCreationRequest as InputItem, ) -from aignostics.client._utils import generate_signed_url +from aignostics.platform._utils import generate_signed_url from ._client import Client from ._constants import ( @@ -71,7 +71,7 @@ "UNKNOWN_ENDPOINT_URL", "Client", "InputArtifact", - "Item", + "InputItem", "Settings", "calculate_file_crc32c", "download_file", diff --git a/src/aignostics/client/_authentication.py b/src/aignostics/platform/_authentication.py similarity index 98% rename from src/aignostics/client/_authentication.py rename to src/aignostics/platform/_authentication.py index cbaef585..a8227b23 100644 --- a/src/aignostics/client/_authentication.py +++ b/src/aignostics/platform/_authentication.py @@ -14,10 +14,10 @@ from pydantic import BaseModel, SecretStr from requests_oauthlib import OAuth2Session -from ._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI -from ._settings import settings +from aignostics.platform._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI +from aignostics.platform._settings import settings -CALLBACK_PORT_RETRY_COUNT = 5 +CALLBACK_PORT_RETRY_COUNT = 10 class AuthenticationResult(BaseModel): diff --git a/src/aignostics/client/_client.py b/src/aignostics/platform/_client.py similarity index 92% rename from src/aignostics/client/_client.py rename to src/aignostics/platform/_client.py index c7e10ea5..f7690dae 100644 --- a/src/aignostics/client/_client.py +++ b/src/aignostics/platform/_client.py @@ -2,9 +2,9 @@ from aignx.codegen.api_client import ApiClient from aignx.codegen.configuration import Configuration -from aignostics.client._authentication import get_token -from aignostics.client.resources.applications import Applications -from aignostics.client.resources.runs import Runs +from aignostics.platform._authentication import get_token +from aignostics.platform.resources.applications import Applications +from aignostics.platform.resources.runs import Runs from ._constants import API_ROOT_DEV, API_ROOT_PRODUCTION, API_ROOT_STAGING from ._settings import settings diff --git a/src/aignostics/client/_constants.py b/src/aignostics/platform/_constants.py similarity index 100% rename from src/aignostics/client/_constants.py rename to src/aignostics/platform/_constants.py diff --git a/src/aignostics/client/_messages.py b/src/aignostics/platform/_messages.py similarity index 100% rename from src/aignostics/client/_messages.py rename to src/aignostics/platform/_messages.py diff --git a/src/aignostics/client/_settings.py b/src/aignostics/platform/_settings.py similarity index 100% rename from src/aignostics/client/_settings.py rename to src/aignostics/platform/_settings.py diff --git a/src/aignostics/client/_utils.py b/src/aignostics/platform/_utils.py similarity index 100% rename from src/aignostics/client/_utils.py rename to src/aignostics/platform/_utils.py diff --git a/src/aignostics/client/resources/__init__.py b/src/aignostics/platform/resources/__init__.py similarity index 100% rename from src/aignostics/client/resources/__init__.py rename to src/aignostics/platform/resources/__init__.py diff --git a/src/aignostics/client/resources/applications.py b/src/aignostics/platform/resources/applications.py similarity index 91% rename from src/aignostics/client/resources/applications.py rename to src/aignostics/platform/resources/applications.py index 80480e32..5e7e1dfe 100644 --- a/src/aignostics/client/resources/applications.py +++ b/src/aignostics/platform/resources/applications.py @@ -1,4 +1,4 @@ -"""Applications resource module for the Aignostics client. +"""Applications resource module for the Aignostics platform. This module provides classes for interacting with application resources in the Aignostics API. It includes functionality for listing applications and managing application versions. @@ -10,7 +10,7 @@ from aignx.codegen.api.public_api import PublicApi from aignx.codegen.models import ApplicationReadResponse, ApplicationVersionReadResponse -from aignostics.client.resources.utils import paginate +from aignostics.platform.resources.utils import paginate class Versions: @@ -22,10 +22,10 @@ class Versions: APPLICATION_VERSION_REGEX = re.compile(r"(?P[^:]+):v?(?P[^:]+)") def __init__(self, api: PublicApi) -> None: - """Initializes the Versions resource with the API client. + """Initializes the Versions resource with the API platform. Args: - api: The configured API client. + api: The configured API platform. """ self._api = api @@ -92,10 +92,10 @@ class Applications: """ def __init__(self, api: PublicApi) -> None: - """Initializes the Applications resource with the API client. + """Initializes the Applications resource with the API platform. Args: - api: The configured API client. + api: The configured API platform. """ self._api = api self.versions: Versions = Versions(self._api) diff --git a/src/aignostics/client/resources/runs.py b/src/aignostics/platform/resources/runs.py similarity index 97% rename from src/aignostics/client/resources/runs.py rename to src/aignostics/platform/resources/runs.py index e3ac6850..1c540eef 100644 --- a/src/aignostics/client/resources/runs.py +++ b/src/aignostics/platform/resources/runs.py @@ -23,9 +23,9 @@ from jsonschema.exceptions import ValidationError from jsonschema.validators import validate -from aignostics.client._utils import calculate_file_crc32c, download_file, mime_type_to_file_ending -from aignostics.client.resources.applications import Versions -from aignostics.client.resources.utils import paginate +from aignostics.platform._utils import calculate_file_crc32c, download_file, mime_type_to_file_ending +from aignostics.platform.resources.applications import Versions +from aignostics.platform.resources.utils import paginate class ApplicationRun: @@ -54,7 +54,7 @@ def for_application_run_id(cls, application_run_id: str) -> "ApplicationRun": Returns: ApplicationRun: The initialized ApplicationRun instance. """ - from aignostics.client import Client # noqa: PLC0415 + from aignostics.platform import Client # noqa: PLC0415 return cls(Client.get_api_client(cache_token=False), application_run_id) diff --git a/src/aignostics/client/resources/utils.py b/src/aignostics/platform/resources/utils.py similarity index 100% rename from src/aignostics/client/resources/utils.py rename to src/aignostics/platform/resources/utils.py diff --git a/tests/aignostics/client/__init__.py b/tests/aignostics/client/__init__.py deleted file mode 100644 index 185dfe7f..00000000 --- a/tests/aignostics/client/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Tests of client module.""" diff --git a/tests/aignostics/platform/__init__.py b/tests/aignostics/platform/__init__.py new file mode 100644 index 00000000..5db06796 --- /dev/null +++ b/tests/aignostics/platform/__init__.py @@ -0,0 +1 @@ +"""Tests of platform module.""" diff --git a/tests/aignostics/client/authentication_test.py b/tests/aignostics/platform/authentication_test.py similarity index 88% rename from tests/aignostics/client/authentication_test.py rename to tests/aignostics/platform/authentication_test.py index c9021ed7..014a77b5 100644 --- a/tests/aignostics/client/authentication_test.py +++ b/tests/aignostics/platform/authentication_test.py @@ -12,7 +12,7 @@ from pydantic import SecretStr from requests_oauthlib import OAuth2Session -from aignostics.client._authentication import ( +from aignostics.platform._authentication import ( _authenticate, _can_open_browser, _ensure_local_port_is_available, @@ -21,7 +21,7 @@ get_token, verify_and_decode_token, ) -from aignostics.client._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI +from aignostics.platform._messages import AUTHENTICATION_FAILED, INVALID_REDIRECT_URI @pytest.fixture @@ -31,12 +31,12 @@ def mock_settings() -> MagicMock: Yields: MagicMock: A mock of the authentication settings. """ - with patch("aignostics.client._authentication.settings") as mock_settings: + with patch("aignostics.platform._authentication.settings") as mock_settings: settings = MagicMock() # Using tmp_path in a controlled test environment is acceptable for testing settings.token_file = Path("mock_token_path") # Avoid hardcoded /tmp path - settings.client_id_interactive = SecretStr("test-interactive-client-id") - settings.client_id_device = SecretStr("test-device-client-id") + settings.client_id_interactive = SecretStr("test-interactive-platform-id") + settings.client_id_device = SecretStr("test-device-platform-id") settings.scope_elements = "openid profile" settings.redirect_uri = "http://localhost:8989/callback" settings.authorization_base_url = "https://test.auth/authorize" @@ -86,7 +86,7 @@ def mock_can_open_browser() -> None: Yields: None: This fixture doesn't yield a value. """ - with patch("aignostics.client._authentication._can_open_browser", return_value=False): + with patch("aignostics.platform._authentication._can_open_browser", return_value=False): yield @@ -130,9 +130,9 @@ def test_get_token_from_cache_expired(mock_settings, expired_token) -> None: with ( patch.object(Path, "exists", return_value=True), patch.object(Path, "read_text", return_value=expired_token), - patch("aignostics.client._authentication._authenticate", return_value="new.token"), + patch("aignostics.platform._authentication._authenticate", return_value="new.token"), patch( - "aignostics.client._authentication.verify_and_decode_token", + "aignostics.platform._authentication.verify_and_decode_token", return_value={"exp": int(time.time()) + 3600}, ), patch.object(Path, "write_text", mock_write_text), @@ -149,9 +149,9 @@ def test_get_token_no_cache(mock_settings) -> None: mock_write_text = MagicMock() with ( - patch("aignostics.client._authentication._authenticate", return_value="new.token"), + patch("aignostics.platform._authentication._authenticate", return_value="new.token"), patch( - "aignostics.client._authentication.verify_and_decode_token", + "aignostics.platform._authentication.verify_and_decode_token", return_value={"exp": int(time.time()) + 3600}, ), patch.object(Path, "write_text", mock_write_text), @@ -168,7 +168,7 @@ def test_authenticate_uses_refresh_token_when_available(mock_settings) -> None: mock_settings.return_value.refresh_token = SecretStr("test-refresh-token") with patch( - "aignostics.client._authentication._token_from_refresh_token", return_value="refreshed.token" + "aignostics.platform._authentication._token_from_refresh_token", return_value="refreshed.token" ) as mock_refresh: token = _authenticate(use_device_flow=False) assert token == "refreshed.token" # noqa: S105 - Test credential @@ -180,9 +180,9 @@ def test_authenticate_uses_browser_flow_when_available(mock_settings) -> None: mock_settings.return_value.refresh_token = None with ( - patch("aignostics.client._authentication._can_open_browser", return_value=True), + patch("aignostics.platform._authentication._can_open_browser", return_value=True), patch( - "aignostics.client._authentication._perform_authorization_code_with_pkce_flow", + "aignostics.platform._authentication._perform_authorization_code_with_pkce_flow", return_value="browser.token", ) as mock_browser, ): @@ -196,8 +196,10 @@ def test_authenticate_falls_back_to_device_flow(mock_settings) -> None: mock_settings.return_value.refresh_token = None with ( - patch("aignostics.client._authentication._can_open_browser", return_value=False), - patch("aignostics.client._authentication._perform_device_flow", return_value="device.token") as mock_device, + patch("aignostics.platform._authentication._can_open_browser", return_value=False), + patch( + "aignostics.platform._authentication._perform_device_flow", return_value="device.token" + ) as mock_device, ): token = _authenticate(use_device_flow=True) assert token == "device.token" # noqa: S105 - Test credential @@ -209,8 +211,8 @@ def test_authenticate_raises_error_on_failure(mock_settings) -> None: mock_settings.return_value.refresh_token = None with ( - patch("aignostics.client._authentication._can_open_browser", return_value=False), - patch("aignostics.client._authentication._perform_device_flow", return_value=None), + patch("aignostics.platform._authentication._can_open_browser", return_value=False), + patch("aignostics.platform._authentication._perform_device_flow", return_value=None), pytest.raises(RuntimeError, match=AUTHENTICATION_FAILED), ): _authenticate(use_device_flow=True) @@ -257,7 +259,7 @@ def test_can_open_browser_true() -> None: # We need to override the autouse fixture here with ( patch("webbrowser.get", return_value=MagicMock()), - patch("aignostics.client._authentication._can_open_browser", wraps=_can_open_browser), + patch("aignostics.platform._authentication._can_open_browser", wraps=_can_open_browser), ): assert _can_open_browser() is True @@ -304,10 +306,10 @@ def __exit__(self, *args) -> None: mock_auth_result.error = None with ( - patch("aignostics.client._authentication.OAuth2Session", return_value=mock_session), - patch("aignostics.client._authentication.HTTPServer", MockHTTPServer), + patch("aignostics.platform._authentication.OAuth2Session", return_value=mock_session), + patch("aignostics.platform._authentication.HTTPServer", MockHTTPServer), patch("urllib.parse.urlparse", return_value=mock_redirect_parsed), - patch("aignostics.client._authentication.AuthenticationResult", return_value=mock_auth_result), + patch("aignostics.platform._authentication.AuthenticationResult", return_value=mock_auth_result), ): # Simulate a successful server response by making handle_request set the token def handle_request_side_effect(): @@ -331,7 +333,7 @@ def test_perform_authorization_code_flow_invalid_redirect(mock_settings) -> None mock_session = MagicMock(spec=OAuth2Session) mock_session.authorization_url.return_value = ("https://test.auth/authorize?code_challenge=abc", None) - with patch("aignostics.client._authentication.OAuth2Session", return_value=mock_session): + with patch("aignostics.platform._authentication.OAuth2Session", return_value=mock_session): # Create a mock redirect URI with invalid hostname/port mock_redirect_parsed = MagicMock() mock_redirect_parsed.hostname = None # Invalid hostname @@ -375,10 +377,10 @@ def __exit__(self, *args) -> None: mock_auth_result.error = "Authentication failed" with ( - patch("aignostics.client._authentication.OAuth2Session", return_value=mock_session), - patch("aignostics.client._authentication.HTTPServer", MockHTTPServer), + patch("aignostics.platform._authentication.OAuth2Session", return_value=mock_session), + patch("aignostics.platform._authentication.HTTPServer", MockHTTPServer), patch("urllib.parse.urlparse", return_value=mock_redirect_parsed), - patch("aignostics.client._authentication.AuthenticationResult", return_value=mock_auth_result), + patch("aignostics.platform._authentication.AuthenticationResult", return_value=mock_auth_result), ): # Simulate a failed server response def handle_request_side_effect(): diff --git a/tests/aignostics/client/resources/applications_test.py b/tests/aignostics/platform/resources/applications_test.py similarity index 98% rename from tests/aignostics/client/resources/applications_test.py rename to tests/aignostics/platform/resources/applications_test.py index c4731f28..beb3857f 100644 --- a/tests/aignostics/client/resources/applications_test.py +++ b/tests/aignostics/platform/resources/applications_test.py @@ -11,8 +11,8 @@ from aignx.codegen.models import ApplicationVersionReadResponse from aignx.codegen.models.application_read_response import ApplicationReadResponse -from aignostics.client.resources.applications import Applications, Versions -from aignostics.client.resources.utils import PAGE_SIZE +from aignostics.platform.resources.applications import Applications, Versions +from aignostics.platform.resources.utils import PAGE_SIZE API_ERROR = "API error" diff --git a/tests/aignostics/client/resources/resource_utils_test.py b/tests/aignostics/platform/resources/resource_utils_test.py similarity index 97% rename from tests/aignostics/client/resources/resource_utils_test.py rename to tests/aignostics/platform/resources/resource_utils_test.py index a509bcc3..4bda0b04 100644 --- a/tests/aignostics/client/resources/resource_utils_test.py +++ b/tests/aignostics/platform/resources/resource_utils_test.py @@ -6,7 +6,7 @@ from unittest.mock import Mock -from aignostics.client.resources.utils import PAGE_SIZE, paginate +from aignostics.platform.resources.utils import PAGE_SIZE, paginate def test_paginate_stops_when_results_less_than_page_size() -> None: diff --git a/tests/aignostics/client/resources/runs_test.py b/tests/aignostics/platform/resources/runs_test.py similarity index 98% rename from tests/aignostics/client/resources/runs_test.py rename to tests/aignostics/platform/resources/runs_test.py index 6266af3b..9f3012a8 100644 --- a/tests/aignostics/client/resources/runs_test.py +++ b/tests/aignostics/platform/resources/runs_test.py @@ -16,8 +16,8 @@ RunReadResponse, ) -from aignostics.client.resources.runs import ApplicationRun, Runs -from aignostics.client.resources.utils import PAGE_SIZE +from aignostics.platform.resources.runs import ApplicationRun, Runs +from aignostics.platform.resources.utils import PAGE_SIZE @pytest.fixture diff --git a/tests/aignostics/client/scheduled_test.py b/tests/aignostics/platform/scheduled_test.py similarity index 80% rename from tests/aignostics/client/scheduled_test.py rename to tests/aignostics/platform/scheduled_test.py index 0c19fb90..122064f4 100644 --- a/tests/aignostics/client/scheduled_test.py +++ b/tests/aignostics/platform/scheduled_test.py @@ -11,36 +11,30 @@ import pytest from _pytest.fixtures import FixtureRequest -from aignx.codegen.models import ( - ApplicationRunStatus, - InputArtifactCreationRequest, - ItemCreationRequest, - ItemStatus, -) +from aignx.codegen.models import ApplicationRunStatus, ItemStatus -import aignostics.client -from aignostics.client._utils import calculate_file_crc32c, generate_signed_url, mime_type_to_file_ending -from aignostics.client.resources.runs import ApplicationRun +from aignostics import platform +from aignostics.platform.resources.runs import ApplicationRun def _decorate_with_metadata( - item: ItemCreationRequest, artifact_name_to_metadata: dict[str, dict[str, Any]] -) -> ItemCreationRequest: + item: platform.InputItem, artifact_name_to_metadata: dict[str, dict[str, Any]] +) -> platform.InputItem: for input_artifact in item.input_artifacts: if input_artifact.name in artifact_name_to_metadata: input_artifact.metadata.update(artifact_name_to_metadata[input_artifact.name]) return item -def single_spot_payload() -> list[ItemCreationRequest]: +def single_spot_payload() -> list[platform.InputItem]: """Generates a payload using a single spot.""" return [ - ItemCreationRequest( + platform.InputItem( reference="1", input_artifacts=[ - InputArtifactCreationRequest( + platform.InputArtifact( name="user_slide", - download_url=generate_signed_url( + download_url=platform.generate_signed_url( "gs://platform-api-application-test-data/heta/slides/8fafc17d-a5cc-4e9d-a982-030b1486ca88.tiff" ), metadata={ @@ -55,15 +49,15 @@ def single_spot_payload() -> list[ItemCreationRequest]: ] -def three_spots_payload() -> list[ItemCreationRequest]: +def three_spots_payload() -> list[platform.InputItem]: """Generates a payload using three spots.""" return [ - ItemCreationRequest( + platform.InputItem( reference="1", input_artifacts=[ - InputArtifactCreationRequest( + platform.InputArtifact( name="user_slide", - download_url=generate_signed_url( + download_url=platform.generate_signed_url( "gs://aignx-storage-service-dev/sample_data_formatted/9375e3ed-28d2-4cf3-9fb9-8df9d11a6627.tiff" ), metadata={ @@ -75,12 +69,12 @@ def three_spots_payload() -> list[ItemCreationRequest]: ) ], ), - ItemCreationRequest( + platform.InputItem( reference="2", input_artifacts=[ - InputArtifactCreationRequest( + platform.InputArtifact( name="user_slide", - download_url=generate_signed_url( + download_url=platform.generate_signed_url( "gs://aignx-storage-service-dev/sample_data_formatted/8c7b079e-8b8a-4036-bfde-5818352b503a.tiff" ), metadata={ @@ -92,12 +86,12 @@ def three_spots_payload() -> list[ItemCreationRequest]: ) ], ), - ItemCreationRequest( + platform.InputItem( reference="3", input_artifacts=[ - InputArtifactCreationRequest( + platform.InputArtifact( name="user_slide", - download_url=generate_signed_url( + download_url=platform.generate_signed_url( "gs://aignx-storage-service-dev/sample_data_formatted/1f4f366f-a2c5-4407-9f5e-23400b22d50e.tiff" ), metadata={ @@ -135,7 +129,7 @@ def three_spots_payload() -> list[ItemCreationRequest]: ], ) def test_application_runs( - timeout: int, application_version_id: str, payload: list[ItemCreationRequest], request: FixtureRequest + timeout: int, application_version_id: str, payload: list[platform.InputItem], request: FixtureRequest ) -> None: """Test the two-task dummy application. @@ -154,8 +148,8 @@ def test_application_runs( """ request.node.add_marker(pytest.mark.timeout(timeout)) - platform = aignostics.client.Client(cache_token=False) - application_run = platform.runs.create(application_version_id, items=payload) + client = platform.Client(cache_token=False) + application_run = client.runs.create(application_version_id, items=payload) with tempfile.TemporaryDirectory() as temp_dir: application_run.download_to_folder(temp_dir) @@ -189,9 +183,9 @@ def _validate_output(application_run: ApplicationRun, output_base_folder: Path) assert item_dir.exists(), f"Result folder for item {item.reference} does not exist" for artifact in item.output_artifacts: assert artifact.download_url is not None, f"{artifact} should provide an download url" - file_ending = mime_type_to_file_ending(artifact.mime_type) + file_ending = platform.mime_type_to_file_ending(artifact.mime_type) file_path = item_dir / f"{artifact.name}{file_ending}" assert file_path.exists(), f"Artifact {artifact} was not downloaded" checksum = artifact.metadata["checksum_crc32c"] - file_checksum = calculate_file_crc32c(file_path) + file_checksum = platform.calculate_file_crc32c(file_path) assert file_checksum == checksum, f"Metadata checksum != file checksum {checksum} <> {file_checksum}" diff --git a/tests/aignostics/client/settings_test.py b/tests/aignostics/platform/settings_test.py similarity index 98% rename from tests/aignostics/client/settings_test.py rename to tests/aignostics/platform/settings_test.py index 3ef580b7..63ae09c2 100644 --- a/tests/aignostics/client/settings_test.py +++ b/tests/aignostics/platform/settings_test.py @@ -8,7 +8,7 @@ import pytest from pydantic import SecretStr -from aignostics.client import ( +from aignostics.platform import ( API_ROOT_DEV, API_ROOT_PRODUCTION, API_ROOT_STAGING, @@ -53,7 +53,7 @@ def mock_env_vars(): # noqa: ANN201 @pytest.fixture def reset_cached_settings(): # noqa: ANN201 """Reset the cached authentication settings.""" - from aignostics.client._settings import __cached_settings + from aignostics.platform._settings import __cached_settings # Store original original = __cached_settings diff --git a/tests/aignostics/client/utils_test.py b/tests/aignostics/platform/utils_test.py similarity index 96% rename from tests/aignostics/client/utils_test.py rename to tests/aignostics/platform/utils_test.py index c91b9001..5e6a3da2 100644 --- a/tests/aignostics/client/utils_test.py +++ b/tests/aignostics/platform/utils_test.py @@ -1,8 +1,8 @@ -"""Tests for the client utility functions.""" +"""Tests for the platform utility functions.""" import pytest -from aignostics.client import mime_type_to_file_ending +from aignostics.platform import mime_type_to_file_ending class TestMimeTypeToFileEnding: diff --git a/uv.lock b/uv.lock index acf90c55..848f2c43 100644 --- a/uv.lock +++ b/uv.lock @@ -8,7 +8,10 @@ resolution-markers = [ ] [manifest] -overrides = [{ name = "rfc3987", marker = "sys_platform == 'never'" }] +overrides = [ + { name = "h11", specifier = ">=0.16.0" }, + { name = "rfc3987", marker = "sys_platform == 'never'" }, +] [[package]] name = "aignostics" @@ -1668,11 +1671,11 @@ wheels = [ [[package]] name = "h11" -version = "0.14.0" +version = "0.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, ] [[package]] From 673ba5d7a19c2ac2b0dfcca6bd3706d4873392e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Helmut=20Hoffer=20von=20Ankershoffen=20n=C3=A9=20Oertel?= Date: Sun, 27 Apr 2025 10:46:27 +0200 Subject: [PATCH 104/110] Lazy Load, CI, Diagnostics Inherited from oe-python-template: 1. Lazy load a few libs to minimize latency of CLI 2. Refactor CI/CD to run audit, lint, test in parallel, and join for publish to package resp. Docker 3. A bit more diagnostics info --- .copier-answers.yml | 2 +- .dockerignore | 4 +- .github/workflows/_audit.yml | 49 + ...-build-publish.yml => _docker-publish.yml} | 28 +- ...dev_tools.bash => _install_dev_tools.bash} | 4 +- .../workflows/_install_dev_tools_project.bash | 16 + .github/workflows/_lint.yml | 35 + ...blish-release.yml => _package-publish.yml} | 14 +- .github/workflows/_scheduled-test.yml | 98 + .../{test-and-report.yml => _test.yml} | 101 +- .github/workflows/ci-cd.yml | 73 + .../workflows/install_dev_tools_project.bash | 16 - .github/workflows/test-scheduled.yml | 50 +- .gitignore | 14 +- .readthedocs.yml | 2 +- ATTRIBUTIONS.md | 1021 ++-- CLI_REFERENCE.md | 38 +- CONTRIBUTING.md | 4 +- Dockerfile | 4 +- Makefile | 23 +- README.md | 108 +- SERVICE_CONNECTIONS.md | 22 +- docs/partials/README_footer.md | 36 +- docs/partials/README_header.md | 11 +- docs/partials/README_main.md | 61 +- examples/__init__.py | 2 +- install.sh | 166 +- noxfile.py | 212 +- pyproject.toml | 18 +- runner/__init__.py | 1 + watch_gui.py => runner/gui_watch.py | 0 runner/scalene.py | 5 + src/aignostics/__init__.py | 2 +- src/aignostics/application/_cli.py | 32 +- src/aignostics/application/_gui.py | 8 +- src/aignostics/cli.py | 7 +- src/aignostics/constants.py | 13 +- src/aignostics/idc/_cli.py | 3 +- src/aignostics/platform/_utils.py | 3 +- src/aignostics/system/_cli.py | 3 +- src/aignostics/system/_gui.py | 4 +- src/aignostics/system/_service.py | 163 +- src/aignostics/utils/__init__.py | 5 +- src/aignostics/utils/_constants.py | 10 +- src/aignostics/utils/_di.py | 6 + src/aignostics/utils/_gui.py | 204 +- src/aignostics/utils/_log.py | 53 +- src/aignostics/utils/_notebook.py | 19 +- src/aignostics/utils/_sentry.py | 103 +- tests/aignostics/__init__.py | 2 +- tests/aignostics/cli_test.py | 2 +- tests/aignostics/platform/scheduled_test.py | 1 + tests/aignostics/system/cli_test.py | 35 +- tests/aignostics/utils/cli_test.py | 126 + tests/aignostics/utils/di_test.py | 171 + tests/aignostics/utils/gui_test.py | 122 + tests/aignostics/utils/log_test.py | 128 + tests/aignostics/utils/sentry_test.py | 157 + tests/aignostics/utils/settings_test.py | 118 + tests/conftest.py | 5 + uv.lock | 5033 +++++++++-------- 61 files changed, 5407 insertions(+), 3369 deletions(-) create mode 100644 .github/workflows/_audit.yml rename .github/workflows/{docker-image-build-publish.yml => _docker-publish.yml} (90%) rename .github/workflows/{install_dev_tools.bash => _install_dev_tools.bash} (81%) create mode 100755 .github/workflows/_install_dev_tools_project.bash create mode 100644 .github/workflows/_lint.yml rename .github/workflows/{package-build-publish-release.yml => _package-publish.yml} (89%) create mode 100644 .github/workflows/_scheduled-test.yml rename .github/workflows/{test-and-report.yml => _test.yml} (64%) create mode 100644 .github/workflows/ci-cd.yml delete mode 100755 .github/workflows/install_dev_tools_project.bash create mode 100644 runner/__init__.py rename watch_gui.py => runner/gui_watch.py (100%) create mode 100644 runner/scalene.py create mode 100644 tests/aignostics/utils/cli_test.py create mode 100644 tests/aignostics/utils/di_test.py create mode 100644 tests/aignostics/utils/gui_test.py create mode 100644 tests/aignostics/utils/log_test.py create mode 100644 tests/aignostics/utils/sentry_test.py create mode 100644 tests/aignostics/utils/settings_test.py diff --git a/.copier-answers.yml b/.copier-answers.yml index cdcbfe54..da4994ca 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.13.13 +_commit: v0.16.10 _src_path: gh:helmut-hoffer-von-ankershoffen/oe-python-template attestations_enabled: false author_email: helmut@aignostics.com diff --git a/.dockerignore b/.dockerignore index a679fff3..5884a836 100644 --- a/.dockerignore +++ b/.dockerignore @@ -86,9 +86,11 @@ docker-compose.yml # Copier **/*.rej - # Vercel **/.vercel +# Scalene +profile.json +profile.html # Application specific diff --git a/.github/workflows/_audit.yml b/.github/workflows/_audit.yml new file mode 100644 index 00000000..e0007f36 --- /dev/null +++ b/.github/workflows/_audit.yml @@ -0,0 +1,49 @@ +name: "Audit" + +on: + workflow_call: + # No inputs needed at this time + +jobs: + audit: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + packages: read + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + + - name: Install uv + uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1 + with: + version: "0.6.3" + enable-cache: true + cache-dependency-glob: uv.lock + + - name: Install dev tools + shell: bash + run: .github/workflows/_install_dev_tools.bash + + - name: Install Python, venv and dependencies + run: uv sync --all-extras --frozen --link-mode=copy + + - name: Audit + run: make audit + + - name: Upload audit results + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + if: ${{ always() && (env.GITHUB_WORKFLOW_RUNTIME != 'ACT') }} + with: + name: audit-results + path: | + reports/sbom.json + reports/sbom.spdx + reports/licenses.csv + reports/licenses.json + reports/licenses_grouped.json + reports/vulnerabilities.json + retention-days: 30 diff --git a/.github/workflows/docker-image-build-publish.yml b/.github/workflows/_docker-publish.yml similarity index 90% rename from .github/workflows/docker-image-build-publish.yml rename to .github/workflows/_docker-publish.yml index 9212c06f..9a0f1eab 100644 --- a/.github/workflows/docker-image-build-publish.yml +++ b/.github/workflows/_docker-publish.yml @@ -1,32 +1,30 @@ -name: "Build and publish Docker image to docker.io and ghcr.io" +name: "Publish Docker Image" on: - push: - tags: - - "v*.*.*" - - -env: - DOCKER_IO_REGISTRY: docker.io - DOCKER_IO_IMAGE_NAME_ALL: helmuthva/aignostics-python-sdk - DOCKER_IO_IMAGE_NAME_SLIM: helmuthva/aignostics-python-sdk-slim - + workflow_call: + # No inputs needed at this time jobs: - docker_image_build_publish: + docker_publish: runs-on: ubuntu-latest permissions: - packages: write - contents: read attestations: write + contents: read id-token: write + packages: write + + env: + DOCKER_IO_REGISTRY: docker.io + DOCKER_IO_IMAGE_NAME_ALL: helmuthva/aignostics-python-sdk + DOCKER_IO_IMAGE_NAME_SLIM: helmuthva/aignostics-python-sdk-slim + steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install dev tools shell: bash - run: .github/workflows/install_dev_tools.bash + run: .github/workflows/_install_dev_tools.bash - name: Set up QEMU uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 diff --git a/.github/workflows/install_dev_tools.bash b/.github/workflows/_install_dev_tools.bash similarity index 81% rename from .github/workflows/install_dev_tools.bash rename to .github/workflows/_install_dev_tools.bash index 74312834..3024d5c7 100755 --- a/.github/workflows/install_dev_tools.bash +++ b/.github/workflows/_install_dev_tools.bash @@ -13,8 +13,8 @@ log "Starting installation of development tools..." wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add - echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list sudo apt-get update -sudo apt-get install -y curl jq xsltproc gnupg2 imagemagick trivy +sudo apt-get install --no-install-recommends -y curl gnupg2 imagemagick jq trivy xsltproc -.github/workflows/install_dev_tools_project.bash +.github/workflows/_install_dev_tools_project.bash log "Completed installation of development tools." diff --git a/.github/workflows/_install_dev_tools_project.bash b/.github/workflows/_install_dev_tools_project.bash new file mode 100755 index 00000000..5515f39c --- /dev/null +++ b/.github/workflows/_install_dev_tools_project.bash @@ -0,0 +1,16 @@ +#!/bin/bash + +set -e # Exit immediately if a command exits with a non-zero status +set -o pipefail # Return value of a pipeline is the value of the last command to exit with a non-zero status + +# Log function for better debugging +log() { +echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')] $*" +} + +log "Starting installation of development tools specific to Aignostics Python SDK..." + +# Add your project specific installation commands below +# sudo apt-get install --no-install-recommends -y YOUR_PACKAGE + +log "Completed installation of development tools specific to Aignostics Python SDK." diff --git a/.github/workflows/_lint.yml b/.github/workflows/_lint.yml new file mode 100644 index 00000000..0a636ab9 --- /dev/null +++ b/.github/workflows/_lint.yml @@ -0,0 +1,35 @@ +name: "Lint" + +on: + workflow_call: + # No inputs needed at this time + +jobs: + lint: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + packages: read + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + + - name: Install uv + uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1 + with: + version: "0.6.3" + enable-cache: true + cache-dependency-glob: uv.lock + + - name: Install dev tools + shell: bash + run: .github/workflows/_install_dev_tools.bash + + - name: Install Python, venv and dependencies + run: uv sync --all-extras --frozen --link-mode=copy + + - name: Lint + run: make lint diff --git a/.github/workflows/package-build-publish-release.yml b/.github/workflows/_package-publish.yml similarity index 89% rename from .github/workflows/package-build-publish-release.yml rename to .github/workflows/_package-publish.yml index d54cacd1..cffef4f6 100644 --- a/.github/workflows/package-build-publish-release.yml +++ b/.github/workflows/_package-publish.yml @@ -1,13 +1,11 @@ -name: "Build package, publish to PyPI, create GitHub release" +name: "Publish Package" on: - push: - tags: - - "v*.*.*" + workflow_call: + # No inputs needed at this time jobs: - package_build_publish_release: - environment: release + package_publish: runs-on: ubuntu-latest permissions: contents: write @@ -27,7 +25,7 @@ jobs: - name: Install dev tools shell: bash - run: .github/workflows/install_dev_tools.bash + run: .github/workflows/_install_dev_tools.bash - name: Docs run: make docs @@ -62,7 +60,7 @@ jobs: run: | gh release create ${{ github.ref_name }} ./dist/* ./reports/* \ --notes-file ${{ steps.git-cliff.outputs.changelog }} - + - name: Allow other workflows to trigger on release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/_scheduled-test.yml b/.github/workflows/_scheduled-test.yml new file mode 100644 index 00000000..29d34682 --- /dev/null +++ b/.github/workflows/_scheduled-test.yml @@ -0,0 +1,98 @@ +name: "Scheduled Test" + +on: + workflow_call: + # No inputs needed at this time + +jobs: + test-scheduled: + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + + - name: Install uv + uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1 + with: + version: "0.6.3" + enable-cache: true + cache-dependency-glob: uv.lock + + - name: Install dev tools + shell: bash + run: .github/workflows/_install_dev_tools.bash + + - name: Install Python, venv and dependencies + run: uv sync --all-extras --frozen --link-mode=copy + + - name: Create .env file + uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 + with: + envkey_AIGNOSTICS_LOGFIRE_TOKEN: "${{ secrets.AIGNOSTICS_LOGFIRE_TOKEN }}" + envkey_AIGNOSTICS_SENTRY_DSN: "${{ secrets.AIGNOSTICS_SENTRY_DSN }}" + envkey_AIGNOSTICS_API_ROOT: https://platform.aignostics.com + envkey_AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_ID_DEVICE }} + envkey_AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} + envkey_AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} + fail_on_empty: false + + - name: Set up GCP credentials for bucket access + run: | + echo "${{ secrets.GCP_CREDENTIALS }}" | base64 -d > credentials.json + echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV + + - name: Audit + run: make audit + + - name: Test / scheduled + run: | + set +e + make test_scheduled + EXIT_CODE=$? + # Show test execution in GitHub Job summary + found_files=0 + for file in reports/pytest_*.md; do + if [ -f "$file" ]; then + cat "$file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + found_files=1 + fi + done + if [ $found_files -eq 0 ]; then + echo "# All scheduled tests passed" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + fi + # Show test coverage in GitHub Job summary + if [ -f "reports/coverage.md" ]; then + cat "reports/coverage.md" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "# No test coverage computed." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + fi + exit $EXIT_CODE + + - name: Upload test results + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + if: ${{ always() && (env.GITHUB_WORKFLOW_RUNTIME != 'ACT') }} + with: + name: test-results-scheduled + path: | + reports/mypy_junit.xml + reports/sbom.json + reports/sbom.spdx + reports/licenses.csv + reports/licenses.json + reports/licenses_grouped.json + reports/vulnerabilities.json + reports/junit.xml + reports/coverage.xml + reports/coverage.md + reports/coverage_html + aignostics.log + retention-days: 7 diff --git a/.github/workflows/test-and-report.yml b/.github/workflows/_test.yml similarity index 64% rename from .github/workflows/test-and-report.yml rename to .github/workflows/_test.yml index 0354d983..ce50d9a6 100644 --- a/.github/workflows/test-and-report.yml +++ b/.github/workflows/_test.yml @@ -1,20 +1,17 @@ -name: "CI" +name: "Test" on: - push: - branches: - - "**" - pull_request: - branches: [main] - + workflow_call: + # No inputs needed at this time + jobs: test: runs-on: ubuntu-latest permissions: - packages: write - contents: read attestations: write + contents: read id-token: write + packages: write steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -30,7 +27,7 @@ jobs: - name: Install dev tools shell: bash - run: .github/workflows/install_dev_tools.bash + run: .github/workflows/_install_dev_tools.bash - name: Install Python, venv and dependencies run: uv sync --all-extras --frozen --link-mode=copy @@ -54,7 +51,6 @@ jobs: - name: Create .env file uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 with: - envkey_ENV: "TEST" envkey_AIGNOSTICS_LOGFIRE_TOKEN: "${{ secrets.AIGNOSTICS_LOGFIRE_TOKEN }}" envkey_AIGNOSTICS_SENTRY_DSN: "${{ secrets.AIGNOSTICS_SENTRY_DSN }}" envkey_AIGNOSTICS_API_ROOT: https://platform.aignostics.com @@ -63,6 +59,11 @@ jobs: envkey_AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} fail_on_empty: false + - name: Set up GCP credentials for bucket access + run: | + echo "${{ secrets.GCP_CREDENTIALS }}" | base64 -d > credentials.json + echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV + - name: Validate installation run: | OUTPUT=$(uv run --no-dev aignostics --help) @@ -71,25 +72,68 @@ jobs: exit 1 fi - - name: Set up GCP credentials for bucket access + - name: Smoke tests run: | - echo "${{ secrets.GCP_CREDENTIALS }}" | base64 -d > credentials.json - echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV + uv run --no-dev aignostics --help + uv run --all-extras aignostics system info + uv run --all-extras aignostics system health - - name: Smoke tests + - name: Test / regular run: | - uv run --no-dev aignostics system health - uv run --no-dev aignostics system info - - - name: Lint - run: make lint + set +e + make test + EXIT_CODE=$? + # Show test execution in GitHub Job summary + found_files=0 + for file in reports/pytest_*.md; do + if [ -f "$file" ]; then + cat "$file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + found_files=1 + fi + done + if [ $found_files -eq 0 ]; then + echo "# All regular tests passed" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + fi + # Show test coverage in GitHub Job summary + if [ -f "reports/coverage.md" ]; then + cat "reports/coverage.md" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "# No test coverage computed." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + fi + exit $EXIT_CODE - - name: Audit - run: make audit + - name: Test / long running + run: | + set +e + make test_long_running + EXIT_CODE=$? + # Show test execution in GitHub Job summary + found_files=0 + for file in reports/pytest_*.md; do + if [ -f "$file" ]; then + cat "$file" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + found_files=1 + fi + done + if [ $found_files -eq 0 ]; then + echo "# All long running tests passed" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + fi + # Show test coverage in GitHub Job summary + if [ -f "reports/coverage.md" ]; then + cat "reports/coverage.md" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + else + echo "# No test coverage computed." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + fi + exit $EXIT_CODE - - name: Test - run: make test - - name: Upload test results uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 if: ${{ always() && (env.GITHUB_WORKFLOW_RUNTIME != 'ACT') }} @@ -97,14 +141,9 @@ jobs: name: test-results path: | reports/mypy_junit.xml - reports/sbom.json - reports/sbom.spdx - reports/licenses.csv - reports/licenses.json - reports/licenses_grouped.json - reports/vulnerabilities.json reports/junit.xml reports/coverage.xml + reports/coverage.md reports/coverage_html aignostics.log retention-days: 30 diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml new file mode 100644 index 00000000..ca85f162 --- /dev/null +++ b/.github/workflows/ci-cd.yml @@ -0,0 +1,73 @@ +name: "CI/CD" + +on: + push: + branches: + - "**" + tags: + - "v*.*.*" + pull_request: + branches: [main] + types: [opened, synchronize, reopened] + release: + types: [created] + +jobs: + + lint: + if: (!contains(github.event.head_commit.message, '[skip ci]')) + uses: ./.github/workflows/_lint.yml + permissions: + contents: read + id-token: write + packages: read + secrets: inherit + + audit: + if: (!contains(github.event.head_commit.message, '[skip ci]')) + uses: ./.github/workflows/_audit.yml + permissions: + contents: read + id-token: write + packages: read + secrets: inherit + + test: + if: (!contains(github.event.head_commit.message, '[skip ci]')) + uses: ./.github/workflows/_test.yml + permissions: + attestations: write + contents: read + id-token: write + packages: write + secrets: inherit + + + + + + package_publish: + + needs: [lint, audit, test] + + uses: ./.github/workflows/_package-publish.yml + if: (startsWith(github.ref, 'refs/tags/v') && (!contains(github.event.head_commit.message, '[skip ci]'))) + permissions: + contents: write + packages: read + secrets: inherit + + docker_publish: + + needs: [lint, audit, test] + + if: (startsWith(github.ref, 'refs/tags/v') && (!contains(github.event.head_commit.message, '[skip ci]'))) + uses: ./.github/workflows/_docker-publish.yml + permissions: + attestations: write + contents: read + id-token: write + packages: write + secrets: inherit + + diff --git a/.github/workflows/install_dev_tools_project.bash b/.github/workflows/install_dev_tools_project.bash deleted file mode 100755 index 57d27c35..00000000 --- a/.github/workflows/install_dev_tools_project.bash +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -e # Exit immediately if a command exits with a non-zero status -set -o pipefail # Return value of a pipeline is the value of the last command to exit with a non-zero status - -# Log function for better debugging -log() { - echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')] $*" -} - -log "Starting installation of development tools specific to Aignostics Python SDK..." - -# Add your project specific installation commands here -# sudo apt-get install -y curl jq xsltproc gnupg2 imagemagick trivy - -log "Completed installation of development tools specific to Aignostics Python SDK." diff --git a/.github/workflows/test-scheduled.yml b/.github/workflows/test-scheduled.yml index 6b2d2fe3..1472e2a1 100644 --- a/.github/workflows/test-scheduled.yml +++ b/.github/workflows/test-scheduled.yml @@ -1,4 +1,4 @@ -name: "CI Scheduled" +name: "Scheduled Testing" on: schedule: @@ -6,52 +6,8 @@ on: jobs: test-scheduled: - runs-on: ubuntu-latest + uses: ./.github/workflows/_scheduled-test.yml permissions: contents: read id-token: write - steps: - - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - fetch-depth: 0 - - - name: Install uv - uses: astral-sh/setup-uv@f94ec6bedd8674c4426838e6b50417d36b6ab231 # v5.3.1 - with: - version: "0.6.3" - enable-cache: true - cache-dependency-glob: uv.lock - - - name: Install Python, venv and dependencies - run: uv sync --all-extras --frozen --link-mode=copy - - - name: Create .env file - uses: SpicyPizza/create-envfile@ace6d4f5d7802b600276c23ca417e669f1a06f6f # v2.0.3 - with: - envkey_ENV: "TEST" - envkey_AIGNOSTICS_LOGFIRE_TOKEN: "${{ secrets.AIGNOSTICS_LOGFIRE_TOKEN }}" - envkey_AIGNOSTICS_SENTRY_DSN: "${{ secrets.AIGNOSTICS_SENTRY_DSN }}" - envkey_AIGNOSTICS_API_ROOT: https://platform.aignostics.com - envkey_AIGNOSTICS_CLIENT_ID_DEVICE: ${{ secrets.AIGNOSTICS_CLIENT_ID_DEVICE }} - envkey_AIGNOSTICS_CLIENT_ID_INTERACTIVE: ${{ secrets.AIGNOSTICS_CLIENT_ID_INTERACTIVE }} - envkey_AIGNOSTICS_REFRESH_TOKEN: ${{ secrets.AIGNOSTICS_REFRESH_TOKEN }} - fail_on_empty: false - - - name: Set up GCP credentials for bucket access - run: | - echo "${{ secrets.GCP_CREDENTIALS }}" | base64 -d > credentials.json - echo "GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/credentials.json" >> $GITHUB_ENV - - - name: Run scheduled tests - id: scheduled_tests - run: | - make test_scheduled - # Provide heartbeat to bettertack for monitoring/alerting - exit_code=$? - if [ $exit_code -eq 0 ]; then - curl -s https://uptime.betterstack.com/api/v1/heartbeat/${{ secrets.BETTERUPTIME_HEARTBEAT_PYTHONSDK_SCHEDULED_E2E_TEST_ON_GITHUB_ID }} - else - curl -s https://uptime.betterstack.com/api/v1/heartbeat/${{ secrets.BETTERUPTIME_HEARTBEAT_PYTHONSDK_SCHEDULED_E2E_TEST_ON_GITHUB_ID }}/$exit_code - fi - exit $exit_code + secrets: inherit diff --git a/.gitignore b/.gitignore index 7813293e..01cf6cd9 100644 --- a/.gitignore +++ b/.gitignore @@ -3,10 +3,10 @@ # Environment .env .env.* +!.env.example +.envrc ENV/ env/ -.envrc -!.env.example ## secrets .secret @@ -80,13 +80,11 @@ node_modules/ # Copier *.rej +# Scalene +profile.json +profile.html -# Application specific -tests/reports/**/* -**/__marimo__ -**/.ipynb_checkpoints -data/* -!data/.gitkeep +# Application specific diff --git a/.readthedocs.yml b/.readthedocs.yml index 6a35f743..e7fab944 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,4 +1,4 @@ -# Read the Docs configuration file for {{ project_name }} +# Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index a57dcee2..b66d8c9e 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -30,6 +30,41 @@ limitations under the License. ``` +## DataProperty (1.1.0) - MIT License + +Python library for extract property from data. + +* URL: https://github.com/thombashi/DataProperty +* Author(s): Tsuyoshi Hombashi +* Maintainer(s): Tsuyoshi Hombashi + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2016-2024 Tsuyoshi Hombashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## Deprecated (1.2.18) - MIT License Python @deprecated decorator to deprecate old python classes, functions or methods. @@ -178,7 +213,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## Markdown (3.7) - BSD License +## Markdown (3.8) - UNKNOWN Python implementation of John Gruber's Markdown. @@ -1020,7 +1055,7 @@ PERFORMANCE OF THIS SOFTWARE. ``` -## aiohttp (3.11.16) - Apache Software License +## aiohttp (3.11.18) - Apache Software License Async http client/server framework (asyncio) @@ -2790,7 +2825,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## beautifulsoup4 (4.13.3) - MIT License +## beautifulsoup4 (4.13.4) - MIT License Screen-scraping library @@ -3319,7 +3354,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## boto3 (1.37.28) - Apache Software License +## boto3 (1.38.3) - Apache Software License The AWS SDK for Python @@ -3517,7 +3552,7 @@ Copyright 2013-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. ``` -## botocore (1.37.28) - Apache Software License +## botocore (1.38.3) - Apache Software License Low-level, data-driven core of boto 3. @@ -3773,7 +3808,7 @@ one at http://mozilla.org/MPL/2.0/. ``` -## bottle (0.13.2) - MIT License +## bottle (0.13.3) - MIT License Fast and simple WSGI-framework for small web-applications. @@ -3906,7 +3941,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## certifi (2025.1.31) - Mozilla Public License 2.0 (MPL 2.0) +## certifi (2025.4.26) - Mozilla Public License 2.0 (MPL 2.0) Python package for providing Mozilla's CA Bundle. @@ -4636,6 +4671,13 @@ SOFTWARE. ``` +## cloudpickle (3.1.1) - BSD License + +Pickler class to extend the standard pickle.Pickler functionality + +* URL: https://github.com/cloudpipe/cloudpickle +* Author(s): The cloudpickle developer team + ## colorama (0.4.6) - BSD License Cross-platform colored terminal text. @@ -4751,7 +4793,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## contourpy (1.3.1) - BSD License +## contourpy (1.3.2) - BSD License Python library for calculating contours of 2D quadrilateral grids @@ -4763,7 +4805,7 @@ Python library for calculating contours of 2D quadrilateral grids ``` BSD 3-Clause License -Copyright (c) 2021-2024, ContourPy Developers. +Copyright (c) 2021-2025, ContourPy Developers. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -5217,7 +5259,7 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## cyclonedx-bom (5.3.0) - Apache Software License +## cyclonedx-bom (6.0.0) - Apache Software License CycloneDX Software Bill of Materials (SBOM) generator for Python projects and environments @@ -5449,7 +5491,7 @@ Alias for package 'cyclonedx-bom' * URL: https://github.com/CycloneDX/cyclonedx-python/#package_aliases/cyclonedx-py -## cyclonedx-python-lib (8.9.0) - Apache Software License +## cyclonedx-python-lib (9.1.0) - Apache Software License Python library for CycloneDX @@ -5675,7 +5717,7 @@ CycloneDX community (https://cyclonedx.org/). ``` -## debugpy (1.8.13) - MIT License +## debugpy (1.8.14) - MIT License An implementation of the Debug Adapter Protocol for Python @@ -8340,7 +8382,7 @@ Google API client core library ``` -## google-auth (2.38.0) - Apache Software License +## google-auth (2.39.0) - Apache Software License Google Authentication Library @@ -9414,7 +9456,7 @@ Utilities for Google Media Downloads and Resumable Uploads ``` -## googleapis-common-protos (1.69.2) - Apache Software License +## googleapis-common-protos (1.70.0) - Apache Software License Common protobufs used in Google APIs @@ -9718,7 +9760,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## httpcore (1.0.7) - BSD License +## httpcore (1.0.9) - BSD License A minimal low-level HTTP client. @@ -9883,7 +9925,7 @@ SOFTWARE. ``` -## identify (2.6.9) - MIT License +## identify (2.6.10) - MIT File identification library for Python @@ -10317,7 +10359,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## ipython (9.0.2) - BSD License +## ipython (9.2.0) - BSD License IPython: Productive Interactive Computing @@ -10414,7 +10456,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## ipywidgets (8.1.5) - BSD License +## ipywidgets (8.1.6) - BSD License Jupyter interactive widgets @@ -10992,7 +11034,7 @@ THE SOFTWARE. ``` -## jsonschema-specifications (2024.10.1) - MIT License +## jsonschema-specifications (2025.4.1) - UNKNOWN The JSON Schema meta-schemas and vocabularies, exposed as a Registry @@ -11368,7 +11410,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## jupyterlab (4.3.6) - BSD License +## jupyterlab (4.4.1) - BSD License JupyterLab computational environment @@ -11378,7 +11420,7 @@ JupyterLab computational environment ### License Text ``` -Copyright (c) 2015-2024 Project Jupyter Contributors +Copyright (c) 2015-2025 Project Jupyter Contributors All rights reserved. Redistribution and use in source and binary forms, with or without @@ -11494,7 +11536,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## jupyterlab_widgets (3.0.13) - BSD License +## jupyterlab_widgets (3.0.14) - BSD License Jupyter interactive widgets for JupyterLab @@ -11934,7 +11976,7 @@ license-expression is a comprehensive utility library to parse, compare, simplif ``` -## logfire (3.13.1) - MIT License +## logfire (3.14.1) - MIT License The best Python observability tool! 🪵🔥 @@ -11968,7 +12010,7 @@ SOFTWARE. ``` -## lxml (5.3.2) - BSD License +## lxml (5.4.0) - BSD License Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. @@ -12011,7 +12053,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## marimo (0.13.0) - Apache Software License +## marimo (0.13.2) - Apache Software License A library for making reactive notebooks and apps @@ -12518,6 +12560,40 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` +## mbstrdecoder (1.1.4) - MIT License + +mbstrdecoder is a Python library for multi-byte character string decoder + +* URL: https://github.com/thombashi/mbstrdecoder +* Author(s): Tsuyoshi Hombashi + +### License Text + +``` +MIT License + +Copyright (c) 2016 Tsuyoshi Hombashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## mdurl (0.1.2) - MIT License Markdown URL utilities @@ -12604,7 +12680,7 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ``` -## more-itertools (10.6.0) - MIT License +## more-itertools (10.7.0) - MIT License More routines for operating on iterables, beyond itertools @@ -12931,12 +13007,12 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` -## mypy-extensions (1.0.0) - MIT License +## mypy_extensions (1.1.0) - UNKNOWN Type system extensions for programs checked with the mypy type checker. * URL: https://github.com/python/mypy_extensions -* Author(s): The mypy developers +* Author(s): The mypy developers ### License Text @@ -12971,7 +13047,7 @@ DEALINGS IN THE SOFTWARE. ``` -## narwhals (1.33.0) - MIT License +## narwhals (1.36.0) - MIT License Extremely lightweight compatibility layer between dataframe libraries @@ -13285,7 +13361,7 @@ DAMAGE. ``` -## notebook (7.3.3) - BSD License +## notebook (7.4.1) - BSD License Jupyter Notebook - A web-based notebook environment for interactive computing @@ -13585,7 +13661,7 @@ Flexible test automation. ``` -## numpy (2.2.4) - BSD License +## numpy (2.2.5) - BSD License Fundamental package for array computing in Python @@ -14610,7 +14686,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## opentelemetry-api (1.32.0) - Apache Software License +## opentelemetry-api (1.32.1) - Apache Software License OpenTelemetry Python API @@ -14824,7 +14900,7 @@ OpenTelemetry Python API ``` -## opentelemetry-exporter-otlp-proto-common (1.32.0) - Apache Software License +## opentelemetry-exporter-otlp-proto-common (1.32.1) - Apache Software License OpenTelemetry Protobuf encoding @@ -15038,7 +15114,7 @@ OpenTelemetry Protobuf encoding ``` -## opentelemetry-exporter-otlp-proto-http (1.32.0) - Apache Software License +## opentelemetry-exporter-otlp-proto-http (1.32.1) - Apache Software License OpenTelemetry Collector Protobuf over HTTP Exporter @@ -15252,7 +15328,7 @@ OpenTelemetry Collector Protobuf over HTTP Exporter ``` -## opentelemetry-instrumentation (0.53b0) - Apache Software License +## opentelemetry-instrumentation (0.53b1) - Apache Software License Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python @@ -15466,7 +15542,7 @@ Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python ``` -## opentelemetry-instrumentation-asgi (0.53b0) - Apache Software License +## opentelemetry-instrumentation-asgi (0.53b1) - Apache Software License ASGI instrumentation for OpenTelemetry @@ -15680,7 +15756,7 @@ ASGI instrumentation for OpenTelemetry ``` -## opentelemetry-instrumentation-dbapi (0.53b0) - Apache Software License +## opentelemetry-instrumentation-dbapi (0.53b1) - Apache Software License OpenTelemetry Database API instrumentation @@ -15894,7 +15970,7 @@ OpenTelemetry Database API instrumentation ``` -## opentelemetry-instrumentation-fastapi (0.53b0) - Apache Software License +## opentelemetry-instrumentation-fastapi (0.53b1) - Apache Software License OpenTelemetry FastAPI Instrumentation @@ -16108,7 +16184,7 @@ OpenTelemetry FastAPI Instrumentation ``` -## opentelemetry-instrumentation-httpx (0.53b0) - Apache Software License +## opentelemetry-instrumentation-httpx (0.53b1) - Apache Software License OpenTelemetry HTTPX Instrumentation @@ -16322,7 +16398,7 @@ OpenTelemetry HTTPX Instrumentation ``` -## opentelemetry-instrumentation-jinja2 (0.53b0) - Apache Software License +## opentelemetry-instrumentation-jinja2 (0.53b1) - Apache Software License OpenTelemetry jinja2 instrumentation @@ -16536,7 +16612,7 @@ OpenTelemetry jinja2 instrumentation ``` -## opentelemetry-instrumentation-requests (0.53b0) - Apache Software License +## opentelemetry-instrumentation-requests (0.53b1) - Apache Software License OpenTelemetry requests instrumentation @@ -16750,7 +16826,7 @@ OpenTelemetry requests instrumentation ``` -## opentelemetry-instrumentation-sqlite3 (0.53b0) - Apache Software License +## opentelemetry-instrumentation-sqlite3 (0.53b1) - Apache Software License OpenTelemetry SQLite3 instrumentation @@ -16964,7 +17040,7 @@ OpenTelemetry SQLite3 instrumentation ``` -## opentelemetry-instrumentation-system-metrics (0.53b0) - Apache Software License +## opentelemetry-instrumentation-system-metrics (0.53b1) - Apache Software License OpenTelemetry System Metrics Instrumentation @@ -17178,7 +17254,7 @@ OpenTelemetry System Metrics Instrumentation ``` -## opentelemetry-instrumentation-tornado (0.53b0) - Apache Software License +## opentelemetry-instrumentation-tornado (0.53b1) - Apache Software License Tornado instrumentation for OpenTelemetry @@ -17392,7 +17468,7 @@ Tornado instrumentation for OpenTelemetry ``` -## opentelemetry-instrumentation-urllib (0.53b0) - Apache Software License +## opentelemetry-instrumentation-urllib (0.53b1) - Apache Software License OpenTelemetry urllib instrumentation @@ -17606,7 +17682,7 @@ OpenTelemetry urllib instrumentation ``` -## opentelemetry-instrumentation-urllib3 (0.53b0) - Apache Software License +## opentelemetry-instrumentation-urllib3 (0.53b1) - Apache Software License OpenTelemetry urllib3 instrumentation @@ -17820,7 +17896,7 @@ OpenTelemetry urllib3 instrumentation ``` -## opentelemetry-proto (1.32.0) - Apache Software License +## opentelemetry-proto (1.32.1) - Apache Software License OpenTelemetry Python Proto @@ -18034,7 +18110,7 @@ OpenTelemetry Python Proto ``` -## opentelemetry-sdk (1.32.0) - Apache Software License +## opentelemetry-sdk (1.32.1) - Apache Software License OpenTelemetry Python SDK @@ -18248,7 +18324,7 @@ OpenTelemetry Python SDK ``` -## opentelemetry-semantic-conventions (0.53b0) - Apache Software License +## opentelemetry-semantic-conventions (0.53b1) - Apache Software License OpenTelemetry Semantic Conventions @@ -18462,7 +18538,7 @@ OpenTelemetry Semantic Conventions ``` -## opentelemetry-util-http (0.53b0) - Apache Software License +## opentelemetry-util-http (0.53b1) - Apache Software License Web util for OpenTelemetry @@ -20339,6 +20415,40 @@ Agreement. ``` +## pathvalidate (3.2.3) - MIT License + +pathvalidate is a Python library to sanitize/validate a string such as filenames/file-paths/etc. + +* URL: https://github.com/thombashi/pathvalidate +* Author(s): Tsuyoshi Hombashi + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2016-2025 Tsuyoshi Hombashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## pexpect (4.9.0) - ISC License (ISCL) Pexpect allows easy control of interactive console applications. @@ -20372,7 +20482,7 @@ ISC LICENSE ``` -## pillow (11.1.0) - CMU License (MIT-CMU) +## pillow (11.2.1) - UNKNOWN Python Imaging Library (Fork) @@ -20704,351 +20814,6 @@ Legal Terms --- end of FTL.TXT --- --------------------------------------------------------------------------- - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - --------------------------------------------------------------------------- - The following license details are part of `src/bdf/README`: ~~~ @@ -21728,7 +21493,7 @@ the FAQ for more information on the distribution of modified source versions. ``` -## pip (25.0.1) - MIT License +## pip (25.1) - MIT License The PyPA recommended tool for installing Python packages. @@ -22548,11 +22313,11 @@ license. For details, see prometheus_client/decorator.py. ``` -## prompt_toolkit (3.0.50) - BSD License +## prompt_toolkit (3.0.51) - BSD License Library for building powerful interactive command lines in Python -* URL: https://github.com/prompt-toolkit/python-prompt-toolkit +* URL: UNKNOWN * Author(s): Jonathan Slenders ### License Text @@ -23232,7 +22997,7 @@ SOFTWARE. ``` -## py-serializable (1.1.2) - Apache Software License +## py-serializable (2.0.0) - Apache Software License Library for serializing and deserializing Python Objects to and from JSON and XML. @@ -26444,7 +26209,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## pyright (1.1.399) - MIT +## pyright (1.1.400) - MIT Command line wrapper for pyright @@ -26479,6 +26244,40 @@ SOFTWARE. ``` +## pytablewriter (1.2.1) - MIT License + +pytablewriter is a Python library to write a table in various formats: AsciiDoc / CSV / Elasticsearch / HTML / JavaScript / JSON / LaTeX / LDJSON / LTSV / Markdown / MediaWiki / NumPy / Excel / Pandas / Python / reStructuredText / SQLite / TOML / TSV / YAML. + +* URL: https://github.com/thombashi/pytablewriter +* Author(s): Tsuyoshi Hombashi + +### License Text + +``` +The MIT License (MIT) + +Copyright (c) 2016-2025 Tsuyoshi Hombashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## pytest (8.3.5) - MIT License pytest: simple powerful testing with Python @@ -26891,6 +26690,40 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. ``` +## pytest-md-report (0.6.3) - MIT License + +A pytest plugin to generate test outcomes reports with markdown table format. + +* URL: https://github.com/thombashi/pytest-md-report +* Author(s): Tsuyoshi Hombashi + +### License Text + +``` +MIT License + +Copyright (c) 2020-2025 Tsuyoshi Hombashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## pytest-metadata (3.1.1) - Mozilla Public License 2.0 (MPL 2.0) pytest plugin for test session metadata @@ -28174,7 +28007,7 @@ SOFTWARE. ``` -## rich-toolkit (0.14.1) - MIT License +## rich-toolkit (0.14.3) - MIT License Rich toolkit for building command-line applications @@ -28398,7 +28231,7 @@ THE SOFTWARE. ``` -## rsa (4.9) - Apache Software License +## rsa (4.9.1) - Apache Software License Pure-Python RSA implementation @@ -28499,7 +28332,7 @@ ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of com ``` -## ruff (0.11.6) - MIT License +## ruff (0.11.7) - MIT License An extremely fast Python linter and code formatter, written in Rust. @@ -29910,7 +29743,7 @@ are: ``` -## s3transfer (0.11.4) - Apache Software License +## s3transfer (0.12.0) - Apache Software License An Amazon S3 Transfer Manager @@ -30165,6 +29998,221 @@ SOFTWARE. ``` +## scalene (1.5.51) - Apache Software License + +Scalene: A high-resolution, low-overhead CPU, GPU, and memory profiler for Python with AI-powered optimization suggestions + +* URL: https://github.com/plasma-umass/scalene +* Author(s): Emery Berger , Sam Stern , Juan Altmayer Pizzorno + +### License Text + +``` + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +``` + ## selenium (4.31.0) - Apache Software License Official Python bindings for Selenium WebDriver @@ -30379,7 +30427,7 @@ Official Python bindings for Selenium WebDriver ``` -## sentry-sdk (2.26.1) - BSD License +## sentry-sdk (2.27.0) - BSD License Python client for Sentry (https://sentry.io) @@ -30413,7 +30461,7 @@ SOFTWARE. ``` -## setuptools (78.1.0) - MIT License +## setuptools (79.0.1) - UNKNOWN Easily download, build, install, upgrade, and uninstall Python packages @@ -30756,7 +30804,7 @@ limitations under the License. ``` -## soupsieve (2.6) - MIT License +## soupsieve (2.7) - MIT License A modern CSS selector implementation for Beautiful Soup. @@ -30768,7 +30816,7 @@ A modern CSS selector implementation for Beautiful Soup. ``` MIT License -Copyright (c) 2018 - 2024 Isaac Muse +Copyright (c) 2018 - 2025 Isaac Muse Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -30826,7 +30874,7 @@ THE SOFTWARE. ``` -## sphinx-autodoc-typehints (3.1.0) - MIT License +## sphinx-autodoc-typehints (3.2.0) - MIT License Type hints (PEP 484) support for the Sphinx autodoc extension @@ -31455,7 +31503,7 @@ license: ``` -## starlette (0.46.1) - BSD License +## starlette (0.46.2) - BSD License The little ASGI library that shines. @@ -31716,6 +31764,40 @@ Sphinx plugin which renders a OpenAPI specification with Swagger ``` +## tabledata (1.3.4) - MIT License + +tabledata is a Python library to represent tabular data. Used for pytablewriter/pytablereader/SimpleSQLite/etc. + +* URL: https://github.com/thombashi/tabledata +* Author(s): Tsuyoshi Hombashi + +### License Text + +``` +MIT License + +Copyright (c) 2017-2024 Tsuyoshi Hombashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## tabulate (0.9.0) - MIT License Pretty-print tabular data @@ -31749,6 +31831,40 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` +## tcolorpy (0.1.7) - MIT License + +tcolopy is a Python library to apply true color for terminal text. + +* URL: https://github.com/thombashi/tcolorpy +* Author(s): Tsuyoshi Hombashi + +### License Text + +``` +MIT License + +Copyright (c) 2020-2024 Tsuyoshi Hombashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## tenacity (9.1.2) - Apache Software License Retry code until it succeeds @@ -32522,6 +32638,40 @@ THE SOFTWARE. ``` +## typepy (1.3.4) - MIT License + +typepy is a Python library for variable type checker/validator/converter at a run time. + +* URL: https://github.com/thombashi/typepy +* Author(s): Tsuyoshi Hombashi + +### License Text + +``` +MIT License + +Copyright (c) 2017-2024 Tsuyoshi Hombashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` + ## typer (0.15.2) - MIT License Typer, build great CLIs. Easy to code. Based on Python type hints. @@ -33337,7 +33487,7 @@ SOFTWARE. ``` -## typing_extensions (4.13.1) - UNKNOWN +## typing_extensions (4.13.2) - UNKNOWN Backported and Experimental Type Hints for Python 3.8+ @@ -33888,7 +34038,7 @@ SOFTWARE. ``` -## urllib3 (2.3.0) - MIT License +## urllib3 (2.4.0) - UNKNOWN HTTP library with thread-safe connection pooling, file post, and more. @@ -33923,7 +34073,7 @@ SOFTWARE. ``` -## uv (0.6.12) - Apache Software License; MIT License +## uv (0.6.17) - Apache Software License; MIT License An extremely fast Python package and project manager, written in Rust. @@ -34137,7 +34287,7 @@ An extremely fast Python package and project manager, written in Rust. ``` -## uvicorn (0.34.0) - BSD License +## uvicorn (0.34.2) - BSD License The lightning-fast ASGI server. @@ -34489,7 +34639,7 @@ limitations under the License. ``` -## watchfiles (1.0.4) - MIT License +## watchfiles (1.0.5) - MIT License Simple, modern and high performance file watching and code reload in python. @@ -34899,7 +35049,42 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` -## widgetsnbextension (4.0.13) - BSD License +## wheel (0.45.1) - MIT License + +A built-package format for Python + +* URL: https://github.com/pypa/wheel +* Author(s): Daniel Holth +* Maintainer(s): Alex Grönholm + +### License Text + +``` +MIT License + +Copyright (c) 2012 Daniel Holth and contributors + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +``` + +## widgetsnbextension (4.0.14) - BSD License Jupyter interactive widgets for Jupyter Notebook @@ -34976,7 +35161,7 @@ POSSIBILITY OF SUCH DAMAGE. ``` -## wsidicom (0.26.0) - Apache Software License +## wsidicom (0.27.0) - Apache Software License Tools for handling DICOM based whole scan images diff --git a/CLI_REFERENCE.md b/CLI_REFERENCE.md index 84fa802c..812f7680 100644 --- a/CLI_REFERENCE.md +++ b/CLI_REFERENCE.md @@ -18,15 +18,15 @@ $ aignostics [OPTIONS] COMMAND [ARGS]... **Commands**: -* `gui`: Start graphical user interface (GUI) in... -* `notebook`: Start notebook in web browser. -* `application`: Application commands -* `idc`: Commands to query and download... -* `system`: System commands +* `gui`: Open graphical user interface (GUI). +* `notebook`: Run notebook server. +* `application`: Run applications on Aignostics platform. +* `idc`: Download datasets from Image Data Commons... +* `system`: Determine health, info and further... ## `aignostics gui` -Start graphical user interface (GUI) in native window. +Open graphical user interface (GUI). **Usage**: @@ -40,7 +40,7 @@ $ aignostics gui [OPTIONS] ## `aignostics notebook` -Start notebook in web browser. +Run notebook server. **Usage**: @@ -56,7 +56,7 @@ $ aignostics notebook [OPTIONS] ## `aignostics application` -Application commands +Run applications on Aignostics platform. **Usage**: @@ -70,6 +70,7 @@ $ aignostics application [OPTIONS] COMMAND [ARGS]... **Commands**: +* `e2e`: E2E test. * `list`: List available applications. * `describe`: Describe application. * `bucket`: Transfer bucket provide by platform @@ -77,6 +78,20 @@ $ aignostics application [OPTIONS] COMMAND [ARGS]... * `metadata`: Metadata required as input for applications * `run`: Runs of applications +### `aignostics application e2e` + +E2E test. + +**Usage**: + +```console +$ aignostics application e2e [OPTIONS] +``` + +**Options**: + +* `--help`: Show this message and exit. + ### `aignostics application list` List available applications. @@ -358,7 +373,7 @@ $ aignostics application run result delete [OPTIONS] ## `aignostics idc` -Commands to query and download collections, cases, studies and series of Image Data Commons (IDC) Portal of the National Institute of Cancer (NIC) +Download datasets from Image Data Commons (IDC) Portal of National Institute of Cancer (NIC). **Usage**: @@ -445,7 +460,7 @@ $ aignostics idc download [OPTIONS] SOURCE [TARGET] **Arguments**: * `SOURCE`: Filename of manifest, identifier, or comma-separate set of identifiers [required] -* `[TARGET]`: target directory for download [default: /Users/akunft/dev/python-sdk] +* `[TARGET]`: target directory for download [default: /Users/helmut/Code/python-sdk] **Options**: @@ -455,7 +470,7 @@ $ aignostics idc download [OPTIONS] SOURCE [TARGET] ## `aignostics system` -System commands +Determine health, info and further utillities. **Usage**: @@ -523,6 +538,7 @@ Start the web server, hosting the graphical web application and/or webservice AP Args: host (str): Host to bind the server to. port (int): Port to bind the server to. + watch (bool): Enable auto-reload on changes of source code. open_browser (bool): Open app in browser after starting the server. **Usage**: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index df8acd1d..e22008ec 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -130,7 +130,7 @@ Notes: To run the GUI in the browser with hot reloading, use the following command: ```shell -make watch_gui +make gui_watch ``` ### Running GitHub CI Workflow locally @@ -141,7 +141,7 @@ make act Notes: 1. Workflow defined in `.github/workflows/*.yml` -2. test-and-report.yml calls all build steps defined in noxfile.py +2. ci-cd.yml calls all build steps defined in noxfile.py ### Docker diff --git a/Dockerfile b/Dockerfile index 73465366..1601eba5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -81,7 +81,7 @@ RUN --mount=type=cache,target=/root/.cache/uv \ # Base of our build targets FROM base AS target -ENV AIGNOSTICS_PYTHON_SDK_RUNNING_IN_CONTAINER=1 +ENV AIGNOSTICS_RUNNING_IN_CONTAINER=1 # We don't want to run the app as root RUN < +[![Uptime](https://uptime.betterstack.com/status-badges/v2/monitor/1wbqa.svg)](https://aignostics.betteruptime.com) --- @@ -56,7 +53,7 @@ more about how we achieve ### Run your first AI workflow in 30 minutes Go to -[your personal dashboard on the aignostics platform](https://platform.aignostics.com) +[your personal dashboard on the Aignostics Platform](https://platform.aignostics.com) and scroll to the "Python SDK" section. Copy the personalized install script shown in that section, and execute it in your terminal - we support MacOS and Linux. This will update or install the [uv package manager](...) and install the @@ -106,16 +103,21 @@ to learn about all commands and options available. ## Use in Python Notebooks -> [!IMPORTANT] -> Before you get started, you need to set up your authentication credentials if you did not yet do so! -Please visit -[your personal dashboard on the aignostics platform website](https://platform.aignostics.com/getting-started/quick-start) -and follow the steps outlined in the `Use in Python Notebooks` section. +> [!IMPORTANT]\ +> Before you get started, you need to set up your authentication credentials if +> you did not yet do so! Please visit +> [your personal dashboard on the Aignostics Platform website](https://platform.aignostics.com/getting-started/quick-start) +> and follow the steps outlined in the `Use in Python Notebooks` section. We provide Jupyter and Marimo notebooks to help you get started with the SDK. -The notebooks showcase the interaction with the Aignostics platform using our test application. -To run one them, please follow the steps outlined in the snippet below to clone this repository and start either the [Jupyter](https://docs.jupyter.org/en/latest/index.html) ([examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb)) or -[Marimo](https://marimo.io/) ([examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py)) notebook: +The notebooks showcase the interaction with the Aignostics Platform using our +test application. To run one them, please follow the steps outlined in the +snippet below to clone this repository and start either the +[Jupyter](https://docs.jupyter.org/en/latest/index.html) +([examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb)) +or [Marimo](https://marimo.io/) +([examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py)) +notebook: ```shell # clone the `python-sdk` repository @@ -130,20 +132,23 @@ uv run marimo edit examples/notebook.py ## Using the Python SDK in your Codebase -> [!IMPORTANT] -> Before you get started, you need to set up your authentication credentials if you did not yet do so! -Please visit -[your personal dashboard on the aignostics platform website](https://platform.aignostics.com/getting-started/quick-start) -and follow the steps outlined in the `Enterprise Integration` section. +> [!IMPORTANT]\ +> Before you get started, you need to set up your authentication credentials if +> you did not yet do so! Please visit +> [your personal dashboard on the Aignostics Platform website](https://platform.aignostics.com/getting-started/quick-start) +> and follow the steps outlined in the `Enterprise Integration` section. Next to using the CLI and notebooks, you can also use the Python SDK in your -codebase. The following sections outline how to install the SDK and interact with it. +codebase. The following sections outline how to install the SDK and interact +with it. ### Installation + Adding Aignostics Python SDK to your codebase as a dependency is easy. You can directly add the dependency via your favourite package manager: -**Install with [uv](https://docs.astral.sh/uv/):** If you don't have uv installed follow +**Install with [uv](https://docs.astral.sh/uv/):** If you don't have uv +installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). ```shell @@ -160,7 +165,8 @@ pip install aignostics ### Usage -The following snippet shows how to use the Python SDK to trigger an application run: +The following snippet shows how to use the Python SDK to trigger an application +run: ```python from aignostics import platform @@ -192,14 +198,16 @@ application_run = client.runs.create( application_run.download_to_folder("path/to/download/folder") ``` -Please look at the notebooks in the `example` folder for a more detailed example and read the +Please look at the notebooks in the `example` folder for a more detailed example +and read the [client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) to learn about all classes and methods. #### Defining the input for an application run -Next to the `application_version` of the application you want to run, you have to define -the input items you want to process in the run. The input items are defined as follows: +Next to the `application_version` of the application you want to run, you have +to define the input items you want to process in the run. The input items are +defined as follows: ```python platform.InputItem( @@ -221,11 +229,11 @@ platform.InputItem( For each item you want to process, you need to provide a unique `reference` string. This is used to identify the item in the results later on. The -`input_artifacts` field is a list of `InputArtifact` objects, -which defines what data & metadata you need to provide for each item. The -required artifacts depend on the application version you want to run - in the -case of test application, there is only one artifact required, which is the -image to process on. The artifact name is defined as `user_slide`. +`input_artifacts` field is a list of `InputArtifact` objects, which defines what +data & metadata you need to provide for each item. The required artifacts depend +on the application version you want to run - in the case of test application, +there is only one artifact required, which is the image to process on. The +artifact name is defined as `user_slide`. The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. @@ -338,21 +346,21 @@ When the application run is cancelled, either by the system or by the user, only ## Further Reading -- Inspect our - [security policy](https://aignostics.readthedocs.io/en/latest/security.html) - with detailed documentation of checks, tools and principles. -- Check out the - [CLI reference](https://aignostics.readthedocs.io/en/latest/cli_reference.html) - with detailed documentation of all CLI commands and options. -- Check out the - [library reference](https://aignostics.readthedocs.io/en/latest/lib_reference.html) - with detailed documentation of public classes and functions. -- Check out the - [API reference](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) - with detailed documentation of all API operations and parameters. -- Our - [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) - provide a complete log of recent improvements and changes. -- We gratefully acknowledge the - [open source projects](https://aignostics.readthedocs.io/en/latest/attributions.html) - that this project builds upon. Thank you to all these wonderful contributors! +1. Inspect our + [security policy](https://aignostics.readthedocs.io/en/latest/security.html) + with detailed documentation of checks, tools and principles. +2. Check out the + [CLI reference](https://aignostics.readthedocs.io/en/latest/cli_reference.html) + with detailed documentation of all CLI commands and options. +3. Check out the + [library reference](https://aignostics.readthedocs.io/en/latest/lib_reference.html) + with detailed documentation of public classes and functions. +4. Check out the + [API reference](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) + with detailed documentation of all API operations and parameters. +5. Our + [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) + provide a complete log of recent improvements and changes. +6. We gratefully acknowledge the + [open source projects](https://aignostics.readthedocs.io/en/latest/attributions.html) + that this project builds upon. Thank you to all these wonderful contributors! diff --git a/SERVICE_CONNECTIONS.md b/SERVICE_CONNECTIONS.md index 9bf543b0..1de905e6 100644 --- a/SERVICE_CONNECTIONS.md +++ b/SERVICE_CONNECTIONS.md @@ -105,14 +105,24 @@ ## Uptime monitoring with betterstack +### Monitoring your API and display uptime on status page and in GitHub 1. Goto https://betterstack.com/ and sign-in - it's free for up to 10 monitors and one status page -2. Create a monitor pointing to the `/api/v1/healthz` endpoint of your API on - your production environment. -3. Create a status page in betterstack and add the monitor you created -4. Goto Advanced Settings / Github badge for your monitor on Betterstack and - copy the badge for yaml -5. Run copier update and paste the snippet when asked for it +2. Go to Uptime > Monitors and create a monitor, pointing to the `/api/v1/healthz` endpoint of your API on + your production environment: (a) . Copy the URL into the "URL to monitor" field. (b) Set "Alert us when" to "URL returns HTTP status other then", + (c) )select "200" from drop down "Expected HTTP status codes". (d) Click "Create monitor" at the bottom of the page. +3. Go to Uptime > Status pages and create a status page for your project. Add the monitor you created in step #2 to the page. +4. Go to Uptime > Monitors, select the monitor you created in step #2. (a) Click "Configure", and scroll down to "Advanced Settings" / "Github badge". + Click "Copy to clipboard" for a badge of your liking, (b) `copier update --trust` and paste the snippet when asked for it + +### Monitoring your scheduled tests +1. Go to https://betterstack.com/ and sign-in. +2. Goto Uptime > Heartbeat and hit "Create heartbeat". +3. Set "What service will this heartbeat track? to "Aignostics Python SDK / Scheduled tests" +4. Change "Expect a heartbeat every" in case you changed cron setting in your `.github/workflows/test-scheduled.yml`. If you did not change, the efault of 1 day is fine. +5. Click "Create heartbeat" at the bottom of the page. +6. Click "Copy to clipboard' next to "Make a HEAD, GET, or a POST request to the following URL". +7. Goto https://github.com/aignostics/python-sdk/settings/secrets/actions/new and create a new repository secret called `BETTERSTACK_HEARTBEAT_TEST_SCHEDULED_URL`, pasting the URL from your clipboard as value. ## Deploying webservice to Vercel as serverless function (optional) diff --git a/docs/partials/README_footer.md b/docs/partials/README_footer.md index 8d95308b..544bb00f 100644 --- a/docs/partials/README_footer.md +++ b/docs/partials/README_footer.md @@ -1,20 +1,20 @@ ## Further Reading -- Inspect our - [security policy](https://aignostics.readthedocs.io/en/latest/security.html) - with detailed documentation of checks, tools and principles. -- Check out the - [CLI reference](https://aignostics.readthedocs.io/en/latest/cli_reference.html) - with detailed documentation of all CLI commands and options. -- Check out the - [library reference](https://aignostics.readthedocs.io/en/latest/lib_reference.html) - with detailed documentation of public classes and functions. -- Check out the - [API reference](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) - with detailed documentation of all API operations and parameters. -- Our - [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) - provide a complete log of recent improvements and changes. -- We gratefully acknowledge the - [open source projects](https://aignostics.readthedocs.io/en/latest/attributions.html) - that this project builds upon. Thank you to all these wonderful contributors! +1. Inspect our + [security policy](https://aignostics.readthedocs.io/en/latest/security.html) + with detailed documentation of checks, tools and principles. +2. Check out the + [CLI reference](https://aignostics.readthedocs.io/en/latest/cli_reference.html) + with detailed documentation of all CLI commands and options. +3. Check out the + [library reference](https://aignostics.readthedocs.io/en/latest/lib_reference.html) + with detailed documentation of public classes and functions. +4. Check out the + [API reference](https://aignostics.readthedocs.io/en/latest/api_reference_v1.html) + with detailed documentation of all API operations and parameters. +5. Our + [release notes](https://aignostics.readthedocs.io/en/latest/release-notes.html) + provide a complete log of recent improvements and changes. +6. We gratefully acknowledge the + [open source projects](https://aignostics.readthedocs.io/en/latest/attributions.html) + that this project builds upon. Thank you to all these wonderful contributors! diff --git a/docs/partials/README_header.md b/docs/partials/README_header.md index 38c085e8..1f3769b4 100644 --- a/docs/partials/README_header.md +++ b/docs/partials/README_header.md @@ -1,16 +1,13 @@ # 🔬Aignostics Python SDK [![License](https://img.shields.io/github/license/aignostics/python-sdk?logo=opensourceinitiative&logoColor=3DA639&labelColor=414042&color=A41831)](https://github.com/aignostics/python-sdk/blob/main/LICENSE) -[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/aignostics.svg?logo=python&color=204361&labelColor=1E2933)](https://github.com/aignostics/python-sdk/blob/main/noxfile.py) -[![CI](https://github.com/aignostics/python-sdk/actions/workflows/test-and-report.yml/badge.svg)](https://github.com/aignostics/python-sdk/actions/workflows/test-and-report.yml) +[![Python Version](https://img.shields.io/pypi/pyversions/aignostics.svg?logo=python&color=204361&labelColor=1E2933)](https://pypi.org/project/aignostics/) +[![CI/CD](https://github.com/aignostics/python-sdk/actions/workflows/ci-cd.yml/badge.svg)](https://github.com/aignostics/python-sdk/actions/workflows/ci-cd.yml) +[![Docs](https://img.shields.io/readthedocs/aignostics)](https://aignostics.readthedocs.io/en/latest/) [![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) [![Security](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) [![Maintainability](https://sonarcloud.io/api/project_badges/measure?project=aignostics_python-sdk&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=aignostics_python-sdk) [![Coverage](https://codecov.io/gh/aignostics/python-sdk/graph/badge.svg?token=SX34YRP30E)](https://codecov.io/gh/aignostics/python-sdk) - - +[![Uptime](https://uptime.betterstack.com/status-badges/v2/monitor/1wbqa.svg)](https://aignostics.betteruptime.com) --- diff --git a/docs/partials/README_main.md b/docs/partials/README_main.md index 5adb1fcc..e0eb66c4 100644 --- a/docs/partials/README_main.md +++ b/docs/partials/README_main.md @@ -35,7 +35,7 @@ more about how we achieve ### Run your first AI workflow in 30 minutes Go to -[your personal dashboard on the aignostics platform](https://platform.aignostics.com) +[your personal dashboard on the Aignostics Platform](https://platform.aignostics.com) and scroll to the "Python SDK" section. Copy the personalized install script shown in that section, and execute it in your terminal - we support MacOS and Linux. This will update or install the [uv package manager](...) and install the @@ -85,16 +85,21 @@ to learn about all commands and options available. ## Use in Python Notebooks -> [!IMPORTANT] -> Before you get started, you need to set up your authentication credentials if you did not yet do so! -Please visit -[your personal dashboard on the aignostics platform website](https://platform.aignostics.com/getting-started/quick-start) -and follow the steps outlined in the `Use in Python Notebooks` section. +> [!IMPORTANT]\ +> Before you get started, you need to set up your authentication credentials if +> you did not yet do so! Please visit +> [your personal dashboard on the Aignostics Platform website](https://platform.aignostics.com/getting-started/quick-start) +> and follow the steps outlined in the `Use in Python Notebooks` section. We provide Jupyter and Marimo notebooks to help you get started with the SDK. -The notebooks showcase the interaction with the Aignostics platform using our test application. -To run one them, please follow the steps outlined in the snippet below to clone this repository and start either the [Jupyter](https://docs.jupyter.org/en/latest/index.html) ([examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb)) or -[Marimo](https://marimo.io/) ([examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py)) notebook: +The notebooks showcase the interaction with the Aignostics Platform using our +test application. To run one them, please follow the steps outlined in the +snippet below to clone this repository and start either the +[Jupyter](https://docs.jupyter.org/en/latest/index.html) +([examples/notebook.ipynb](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.ipynb)) +or [Marimo](https://marimo.io/) +([examples/notebook.py](https://github.com/aignostics/python-sdk/blob/main/examples/notebook.py)) +notebook: ```shell # clone the `python-sdk` repository @@ -109,20 +114,23 @@ uv run marimo edit examples/notebook.py ## Using the Python SDK in your Codebase -> [!IMPORTANT] -> Before you get started, you need to set up your authentication credentials if you did not yet do so! -Please visit -[your personal dashboard on the aignostics platform website](https://platform.aignostics.com/getting-started/quick-start) -and follow the steps outlined in the `Enterprise Integration` section. +> [!IMPORTANT]\ +> Before you get started, you need to set up your authentication credentials if +> you did not yet do so! Please visit +> [your personal dashboard on the Aignostics Platform website](https://platform.aignostics.com/getting-started/quick-start) +> and follow the steps outlined in the `Enterprise Integration` section. Next to using the CLI and notebooks, you can also use the Python SDK in your -codebase. The following sections outline how to install the SDK and interact with it. +codebase. The following sections outline how to install the SDK and interact +with it. ### Installation + Adding Aignostics Python SDK to your codebase as a dependency is easy. You can directly add the dependency via your favourite package manager: -**Install with [uv](https://docs.astral.sh/uv/):** If you don't have uv installed follow +**Install with [uv](https://docs.astral.sh/uv/):** If you don't have uv +installed follow [these instructions](https://docs.astral.sh/uv/getting-started/installation/). ```shell @@ -139,7 +147,8 @@ pip install aignostics ### Usage -The following snippet shows how to use the Python SDK to trigger an application run: +The following snippet shows how to use the Python SDK to trigger an application +run: ```python from aignostics import platform @@ -171,14 +180,16 @@ application_run = client.runs.create( application_run.download_to_folder("path/to/download/folder") ``` -Please look at the notebooks in the `example` folder for a more detailed example and read the +Please look at the notebooks in the `example` folder for a more detailed example +and read the [client reference documentation](https://aignostics.readthedocs.io/en/latest/lib_reference.html) to learn about all classes and methods. #### Defining the input for an application run -Next to the `application_version` of the application you want to run, you have to define -the input items you want to process in the run. The input items are defined as follows: +Next to the `application_version` of the application you want to run, you have +to define the input items you want to process in the run. The input items are +defined as follows: ```python platform.InputItem( @@ -200,11 +211,11 @@ platform.InputItem( For each item you want to process, you need to provide a unique `reference` string. This is used to identify the item in the results later on. The -`input_artifacts` field is a list of `InputArtifact` objects, -which defines what data & metadata you need to provide for each item. The -required artifacts depend on the application version you want to run - in the -case of test application, there is only one artifact required, which is the -image to process on. The artifact name is defined as `user_slide`. +`input_artifacts` field is a list of `InputArtifact` objects, which defines what +data & metadata you need to provide for each item. The required artifacts depend +on the application version you want to run - in the case of test application, +there is only one artifact required, which is the image to process on. The +artifact name is defined as `user_slide`. The `download_url` is a signed URL that allows the Aignostics Platform to download the image data later during processing. diff --git a/examples/__init__.py b/examples/__init__.py index 3e405801..dc5a3f02 100644 --- a/examples/__init__.py +++ b/examples/__init__.py @@ -1 +1 @@ -"""Example scripts demonstrating the usage of the Aignostics Python SDK.""" +"""Example scripts demonstrating the usage of Aignostics Python SDK.""" diff --git a/install.sh b/install.sh index a098685b..cd1bede9 100755 --- a/install.sh +++ b/install.sh @@ -1,31 +1,59 @@ #!/bin/sh # shellcheck shell=sh +# Default environment is "local" +ENV="local" + +# Parse command line arguments +i=0 +while [ $i -lt $# ]; do + i=$((i + 1)) + arg="${!i}" + + case $arg in + --env=*) + ENV="${arg#*=}" + ;; + --env) + i=$((i + 1)) + if [ $i -le $# ]; then + ENV="${!i}" + fi + ;; + *) + # Unknown option + ;; + esac +done + echo "Installing dev tools to enable project management with oe-python-template and derivatives ..." +echo "Environment: $ENV" +# Format: "tool;package;url;environments" +# environments is a comma-separated list of environments where the tool should be installed +# If environments is empty, tool is installed in all environments +# Defaul environment is "local" LINUX_APT_TOOLS=( - "curl;curl;https://curl.se/" + "curl;curl;https://curl.se/;" ) BREW_TOOLS=( - "uv;uv;https://docs.astral.sh/uv/" - "git;git;https://git-scm.com/" - "gpg;gnupg;https://gnupg.org/" - "gmake;make;https://www.gnu.org/software/make/" - "jq;jq;https://jqlang.org/" - "xmllint;libxml2;https://en.wikipedia.org/wiki/Libxml2" - "act;act;https://nektosact.com/" - "pinact;pinact;https://github.com/suzuki-shunsuke/pinact" - "trivy;trivy;https://trivy.dev/latest/" - "pnpm;pnpm;https://pnpm.io/" - "magick;imagemagick;https://imagemagick.org/" - "nixpacks;nixpacks;https://nixpacks.com/" - "openapi-generator;openapi-generator;https://github.com/OpenAPITools/openapi-generator" - + "act;act;https://nektosact.com/;local" + "git;git;https://git-scm.com/;local" + "gmake;make;https://www.gnu.org/software/make/;" + "gpg;gnupg;https://gnupg.org/;" + "jq;jq;https://jqlang.org/;" + "magick;imagemagick;https://imagemagick.org/;" + "nixpacks;nixpacks;https://nixpacks.com/;" + "pinact;pinact;https://github.com/suzuki-shunsuke/pinact;local" + "pnpm;pnpm;https://pnpm.io/;" + "trivy;trivy;https://trivy.dev/latest/;" + "uv;uv;https://docs.astral.sh/uv/;local" + "xmllint;libxml2;https://en.wikipedia.org/wiki/Libxml2;" ) MAC_BREW_TOOLS=( - "pinentry-mac;pinentry-mac;https://github.com/GPGTools/pinentry" + "pinentry-mac;pinentry-mac;https://github.com/GPGTools/pinentry;local" ) LINUX_BREW_TOOLS=( @@ -33,14 +61,41 @@ LINUX_BREW_TOOLS=( ) UV_TOOLS=( - "copier;copier;https://copier.readthedocs.io/" + "copier;copier;https://copier.readthedocs.io/;local" ) +# Function to check if a tool should be installed in the current environment +should_install_in_env() { + local environments=$1 + + # If environments is empty, install in all environments + if [ -z "$environments" ]; then + return 0 # true + fi + + # Check if the current environment is in the list + IFS=',' read -ra ENV_LIST <<< "$environments" + for e in "${ENV_LIST[@]}"; do + if [ "$e" = "$ENV" ]; then + return 0 # true + fi + done + + return 1 # false +} + # Function to install/update brew tools install_or_upgrade_brew_tool() { local tool=$1 local package=$2 local url=$3 + local environments=$4 + + # Check if the tool should be installed in the current environment + if ! should_install_in_env "$environments"; then + echo "Skipping $tool installation (not needed in $ENV environment)" + return + fi if command -v "$tool" &> /dev/null; then tool_path=$(command -v "$tool") @@ -61,19 +116,34 @@ install_or_update_linux_apt_tool() { local tool=$1 local package=$2 local url=$3 + local environments=$4 + + # Check if the tool should be installed in the current environment + if ! should_install_in_env "$environments"; then + echo "Skipping $tool installation (not needed in $ENV environment)" + return + fi if command -v "$tool" &> /dev/null; then echo "$tool already installed at $(command -v "$tool"), skipping..." else echo "Installing $tool... # $url" - sudo apt-get update -y && sudo apt-get install "$package" -y + sudo apt-get update -y && sudo apt-get install --no-install-recommends "$package" -y fi } # Function to install/update tools via uv install_or_update_uv_tool() { local tool=$1 + local package=$2 local url=$3 + local environments=$4 + + # Check if the tool should be installed in the current environment + if ! should_install_in_env "$environments"; then + echo "Skipping $tool installation (not needed in $ENV environment)" + return + fi if command -v "$tool" &> /dev/null; then echo "$tool already installed at $(command -v "$tool"), updating..." @@ -87,44 +157,52 @@ install_or_update_uv_tool() { # Install/update Linux packages if [[ "$OSTYPE" == "linux-gnu"* ]]; then for tool_entry in "${LINUX_APT_TOOLS[@]}"; do - IFS=";" read -r tool package url <<< "$tool_entry" - install_or_update_linux_apt_tool "$tool" "$package" "$url" + IFS=";" read -r tool package url environments <<< "$tool_entry" + install_or_update_linux_apt_tool "$tool" "$package" "$url" "$environments" done fi # Install/update Homebrew itself if ! command -v brew &> /dev/null; then - echo "Installing Homebrew... # https://brew.sh/" - /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -else + # Check if we should install Homebrew in this environment + if [ "$ENV" = "local" ]; then + echo "Installing Homebrew... # https://brew.sh/" + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + else + echo "Skipping Homebrew installation (not needed in $ENV environment)" + fi +elif [ "$ENV" = "local" ]; then echo "Homebrew already installed at $(command -v brew), updating..." brew update fi -# Install/update Homebrew tools -for tool_entry in "${BREW_TOOLS[@]}"; do - IFS=";" read -r tool package url <<< "$tool_entry" - install_or_upgrade_brew_tool "$tool" "$package" "$url" -done - -# Install/update Homebrew tools for macOS -if [[ "$OSTYPE" == "darwin"* ]]; then - for tool_entry in "${MAC_BREW_TOOLS[@]}"; do - IFS=";" read -r tool package url <<< "$tool_entry" - install_or_upgrade_brew_tool "$tool" "$package" "$url" - done -fi - -# Install/update Homebrew tools for Linux -if [[ "$OSTYPE" == "linux-gnu"* ]]; then - for tool_entry in "${LINUX_BREW_TOOLS[@]}"; do - IFS=";" read -r tool package url <<< "$tool_entry" - install_or_upgrade_brew_tool "$tool" "$package" "$url" +# Only proceed with Homebrew tools if brew is available +if command -v brew &> /dev/null; then + # Install/update Homebrew tools + for tool_entry in "${BREW_TOOLS[@]}"; do + IFS=";" read -r tool package url environments <<< "$tool_entry" + install_or_upgrade_brew_tool "$tool" "$package" "$url" "$environments" done + + # Install/update Homebrew tools for macOS + if [[ "$OSTYPE" == "darwin"* ]]; then + for tool_entry in "${MAC_BREW_TOOLS[@]}"; do + IFS=";" read -r tool package url environments <<< "$tool_entry" + install_or_upgrade_brew_tool "$tool" "$package" "$url" "$environments" + done + fi + + # Install/update Homebrew tools for Linux + if [[ "$OSTYPE" == "linux-gnu"* ]]; then + for tool_entry in "${LINUX_BREW_TOOLS[@]}"; do + IFS=";" read -r tool package url environments <<< "$tool_entry" + install_or_upgrade_brew_tool "$tool" "$package" "$url" "$environments" + done + fi fi # Install/update UV tools for tool_entry in "${UV_TOOLS[@]}"; do - IFS=";" read -r tool package url <<< "$tool_entry" - install_or_update_uv_tool "$tool" "$url" + IFS=";" read -r tool package url environments <<< "$tool_entry" + install_or_update_uv_tool "$tool" "$package" "$url" "$environments" done diff --git a/noxfile.py b/noxfile.py index cb7c6760..a45bdc20 100644 --- a/noxfile.py +++ b/noxfile.py @@ -21,6 +21,8 @@ CLI_MODULE = "cli" API_VERSIONS = ["v1"] UTF8 = "utf-8" +PYTHON_VERSION = "3.13" +TEST_PYTHON_VERSIONS = ["3.11", "3.12", "3.13"] def _setup_venv(session: nox.Session, all_extras: bool = True) -> None: @@ -58,7 +60,7 @@ def _format_json_with_jq(session: nox.Session, path: str) -> None: session.run("mv", f"{path}.tmp", path, stdout=outfile, external=True) -@nox.session(python=["3.13"]) +@nox.session(python=[PYTHON_VERSION]) def lint(session: nox.Session) -> None: """Run code formatting checks, linting, and static type checking.""" _setup_venv(session, True) @@ -72,7 +74,7 @@ def lint(session: nox.Session) -> None: session.run("mypy", "src") -@nox.session(python=["3.13"]) +@nox.session(python=[PYTHON_VERSION]) def audit(session: nox.Session) -> None: """Run security audit and license checks.""" _setup_venv(session, True) @@ -396,7 +398,7 @@ def _generate_pdf_docs(session: nox.Session) -> None: session.error(f"Failed to parse latexmk version information: {e}") -@nox.session(python=["3.13"]) +@nox.session(python=[PYTHON_VERSION]) def docs(session: nox.Session) -> None: """Build documentation and concatenate README. @@ -432,7 +434,7 @@ def docs(session: nox.Session) -> None: _generate_pdf_docs(session) -@nox.session(python=["3.13"], default=False) +@nox.session(python=[PYTHON_VERSION], default=False) def docs_pdf(session: nox.Session) -> None: """Setup dev environment post project creation.""" # noqa: DOC501 _setup_venv(session, True) @@ -463,39 +465,155 @@ def docs_pdf(session: nox.Session) -> None: session.error(f"Failed to parse latexmk version information: {e}") -@nox.session(python=["3.11", "3.12", "3.13"]) -def test(session: nox.Session) -> None: - """Run tests with pytest.""" - _setup_venv(session) - session.run("rm", "-rf", ".coverage", external=True) +def _prepare_coverage(session: nox.Session) -> None: + """Clean coverage data unless keep-coverage flag is specified. + + Args: + session: The nox session + """ + if "--cov-append" not in session.posargs: + session.run("rm", "-rf", ".coverage", external=True) + + +def _extract_custom_marker(posargs: list[str]) -> tuple[str | None, list[str]]: + """Extract custom marker from pytest arguments. + + Args: + posargs: Command line arguments + + Returns: + Tuple of (custom_marker, filtered_posargs) + """ + custom_marker = None + new_posargs = [] + skip_next = False + + for i, arg in enumerate(posargs): + if skip_next: + skip_next = False + continue + + if arg == "-m" and i + 1 < len(posargs): + custom_marker = posargs[i + 1] + skip_next = True + elif arg != "-m" or i == 0 or posargs[i - 1] != "-m": + new_posargs.append(arg) + + return custom_marker, new_posargs + + +def _get_report_type(session: nox.Session, custom_marker: str | None) -> str: + """Generate report type string based on marker and Python version. + + Args: + session: The nox session + custom_marker: Optional pytest marker + + Returns: + Report type string + """ + # Create a report type based on marker + report_type = "regular" + if custom_marker: + # Replace spaces and special chars with underscores + report_type = re.sub(r"[\s\(\)]", "_", custom_marker).strip("_") + + # Add Python version to the report type + if isinstance(session.python, str): + python_version = f"py{session.python.replace('.', '')}" + else: + # Handle case where session.python is a list, bool, or None + python_version = f"py{session.python!s}" + + return f"{python_version}_{report_type}" + + +def _inject_headline(headline: str, file_name: str) -> None: + """Inject headline into file. + + - Checks if report file actually exists + - If so, injects headline + - If not, does nothing + + Args: + headline: Headline to inject as first line + file_name: Name of the report file + """ + file = Path(file_name) + if file.is_file(): + header = f"{headline}\n" + content = file.read_text(encoding=UTF8) + content = header + content + file.write_text(content, encoding=UTF8) + - # Build pytest arguments with skip_with_act filter if needed +def _run_pytest( + session: nox.Session, test_type: str, custom_marker: str | None, posargs: list[str], report_type: str +) -> None: + """Run pytest with specified arguments. + + Args: + session: The nox session + test_type: Type of test ('sequential' or 'not sequential') + custom_marker: Optional pytest marker + posargs: Additional pytest arguments + report_type: Report type string for output files + """ + is_sequential = test_type == "sequential" + + # Build base pytest arguments pytest_args = ["pytest", "--disable-warnings", JUNIT_XML, "-n", "auto", "--dist", "loadgroup"] + + # Add act environment filter if needed if _is_act_environment(): pytest_args.extend(["-k", NOT_SKIP_WITH_ACT]) - pytest_args.extend(["-m", "not sequential"]) - pytest_args.extend(session.posargs) + # Apply the appropriate marker + marker_value = f"{test_type}" + if custom_marker: + marker_value += f" and ({custom_marker})" + pytest_args.extend(["-m", marker_value]) + + # Add additional arguments + pytest_args.extend(posargs) + + # Report output as markdown for GitHub step summaries + report_file_name = f"reports/pytest_{report_type}_{'sequential' if is_sequential else 'parallel'}.md" + pytest_args.extend(["--md-report-output", report_file_name]) + + # Remove report file if it exists, + # as it's only generated for failing tests on the pytest run below + report_file = Path(report_file_name) + if report_file.is_file(): + report_file.unlink() + + # Run pytest with the constructed arguments session.run(*pytest_args) - # Sequential tests - sequential_args = [ - "pytest", - "--cov-append", - "--disable-warnings", - JUNIT_XML, - "-n", - "auto", - "--dist", - "loadgroup", - ] - if _is_act_environment(): - sequential_args.extend(["-k", NOT_SKIP_WITH_ACT]) - sequential_args.extend(["-m", "sequential"]) - sequential_args.extend(session.posargs) + # Inject headline into the report file indicating the report type + _inject_headline(f"# Failing tests with for test execution with {report_type}\n", report_file_name) + + +def _generate_coverage_report(session: nox.Session) -> None: + """Generate coverage report in markdown format. + + Args: + session: The nox session + """ + coverage_report_file_name = "reports/coverage.md" + with Path(coverage_report_file_name).open("w", encoding=UTF8) as outfile: + session.run("coverage", "report", "--format=markdown", stdout=outfile) + _inject_headline("# Coverage report", coverage_report_file_name) + - session.run(*sequential_args) +def _cleanup_test_execution(session: nox.Session) -> None: + """Clean up post test execution. + - Docker containers created by pytest-docker removed + + Args: + session: The nox session instance + """ session.run( "bash", "-c", @@ -507,6 +625,36 @@ def test(session: nox.Session) -> None: ) +@nox.session(python=TEST_PYTHON_VERSIONS) +def test(session: nox.Session) -> None: + """Run tests with pytest.""" + _setup_venv(session) + + # Conditionally clean coverage data + # Will remove .coverage file if --cov-append is not specified + _prepare_coverage(session) + + # Extract custom markers from posargs if present + custom_marker, filtered_posargs = _extract_custom_marker(session.posargs) + + # Determine report type from python version and custom marker + report_type = _get_report_type(session, custom_marker) + + # Run parallel tests + _run_pytest(session, "not sequential", custom_marker, filtered_posargs, report_type) + + # Run sequential tests + if "--cov-append" not in filtered_posargs: + filtered_posargs.extend(["--cov-append"]) + _run_pytest(session, "sequential", custom_marker, filtered_posargs, report_type) + + # Generate coverage report in markdown + _generate_coverage_report(session) + + # Clean up post test execution + _cleanup_test_execution(session) + + @nox.session(python=["3.13"], default=False) def setup(session: nox.Session) -> None: """Setup dev environment post project creation.""" @@ -543,10 +691,10 @@ def update_from_template(session: nox.Session) -> None: # In this case the template has been generated from a template session.run("copier", "update", "--trust", "--skip-answered", "--skip-tasks", external=True) - # Schedule the lint session to run after this session completes - session.notify("audit") - session.notify("docs") - session.notify("lint") + # Schedule the lint session to run after this session completes + session.notify("audit") + session.notify("docs") + session.notify("lint") @nox.session(default=False) diff --git a/pyproject.toml b/pyproject.toml index ff97294d..485569cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -64,7 +64,7 @@ requires-python = ">=3.11, <4.0" dependencies = [ # From Template "fastapi[standard,all]>=0.115.12", - "logfire[system-metrics]>=3.13.1", + "logfire[system-metrics]>=3.14.1", "nicegui[native]>=2.15.0", "opentelemetry-instrumentation-fastapi>=0.53b0", "opentelemetry-instrumentation-httpx>=0.53b0", @@ -76,7 +76,7 @@ dependencies = [ "opentelemetry-instrumentation-urllib3>=0.53b0", "psutil>=7.0.0", "pydantic-settings>=2.9.1", - "sentry-sdk>=2.26.1", + "sentry-sdk>=2.27.0", "typer>=0.15.1", "uptime>=3.0.1", # Custom @@ -99,10 +99,10 @@ dependencies = [ examples = [ "cloudpathlib>=0.21.0", "highdicom>=0.25.1", - "marimo>=0.13.0", - "matplotlib>=3.10.1", "jinja2>=3.1.6", "jupyter>=1.1.1", + "marimo>=0.13.0", + "matplotlib>=3.10.1", "shapely>=2.1.0", "streamlit>=1.44.1", "wsidicom>=0.26.0", @@ -132,6 +132,7 @@ dev = [ "pytest-cov>=6.1.1", "pytest-docker>=3.2.1", "pytest-env>=1.1.5", + "pytest-md-report>=0.6.3", "pytest-regressions>=2.7.0", "pytest-selenium>=4.1.0", "pytest-subprocess>=1.5.3", @@ -139,6 +140,7 @@ dev = [ "pytest-watcher>=0.4.3", "pytest-xdist[psutil]>=3.6.1", "ruff>=0.11.6", + "scalene>=1.5.51", "sphinx>=8.2.3", "sphinx-autobuild>=2024.10.3", "sphinx-copybutton>=0.5.2", @@ -177,7 +179,7 @@ packages = ["src/aignostics", "codegen/out/aignx"] [tool.uv] override-dependencies = [ # https://github.com/astral-sh/uv/issues/4422 - "h11>=0.16.0", # vulnerability + "h11>=0.16.0", # vulnerability "rfc3987; sys_platform == 'never'", # GPLv3 ] @@ -290,6 +292,12 @@ markers = [ # Custom # Nothing yet ] +md_report = true +md_report_output = "reports/pytest.md" +md_report_verbose = 1 +md_report_flavor = "github" +md_report_color = "never" +md_report_exclude_outcomes = ["passed", "skipped"] [tool.coverage.run] sigterm = true diff --git a/runner/__init__.py b/runner/__init__.py new file mode 100644 index 00000000..7160264e --- /dev/null +++ b/runner/__init__.py @@ -0,0 +1 @@ +"""Runners for the project.""" diff --git a/watch_gui.py b/runner/gui_watch.py similarity index 100% rename from watch_gui.py rename to runner/gui_watch.py diff --git a/runner/scalene.py b/runner/scalene.py new file mode 100644 index 00000000..56eb88b6 --- /dev/null +++ b/runner/scalene.py @@ -0,0 +1,5 @@ +"""Wrapper for scalene.""" + +from runpy import run_module + +run_module("aignostics.cli", run_name="cli") diff --git a/src/aignostics/__init__.py b/src/aignostics/__init__.py index 2e4b3883..e8b8d6bd 100644 --- a/src/aignostics/__init__.py +++ b/src/aignostics/__init__.py @@ -1,4 +1,4 @@ -"""Copier template to scaffold Python projects compliant with best practices and modern tooling.""" +"""Python SDK providing access to Aignostics AI services.""" from .constants import MODULES_TO_INSTRUMENT from .utils.boot import boot diff --git a/src/aignostics/application/_cli.py b/src/aignostics/application/_cli.py index e3ab35c8..55171245 100644 --- a/src/aignostics/application/_cli.py +++ b/src/aignostics/application/_cli.py @@ -7,7 +7,7 @@ logger = get_logger(__name__) -cli = typer.Typer(name="application", help="Application commands") +cli = typer.Typer(name="application", help="Run applications on Aignostics platform.") bucket_app = typer.Typer() cli.add_typer(bucket_app, name="bucket", help="Transfer bucket provide by platform") @@ -25,16 +25,12 @@ run_app.add_typer(result_app, name="result", help="Results of applications runs") -@bucket_app.command("ls") -def bucket_ls() -> None: - """List contents of tranfer bucket.""" - console.print("bucket ls") - - -@bucket_app.command("purge") -def bucket_purge() -> None: - """Purge content of transfer bucket.""" - console.print("bucket purged.") +@cli.command("e2e") +def application_e2e() -> None: + """E2E test.""" + client = aignostics.platform.Client() + applications = client.applications.list() + console.print(list(applications)) @cli.command("list") @@ -42,7 +38,7 @@ def application_list() -> None: """List available applications.""" client = aignostics.platform.Client() applications = client.applications.list() - console.print(applications) + console.print(list(applications)) @cli.command("describe") @@ -51,6 +47,18 @@ def application_describe() -> None: console.print("describe application") +@bucket_app.command("ls") +def bucket_ls() -> None: + """List contents of tranfer bucket.""" + console.print("bucket ls") + + +@bucket_app.command("purge") +def bucket_purge() -> None: + """Purge content of transfer bucket.""" + console.print("bucket purged.") + + @datasset_app.command("download") def dataset_download() -> None: """Download dataset.""" diff --git a/src/aignostics/application/_gui.py b/src/aignostics/application/_gui.py index 48090909..89ea17a1 100644 --- a/src/aignostics/application/_gui.py +++ b/src/aignostics/application/_gui.py @@ -2,8 +2,6 @@ from pathlib import Path -from nicegui import ui - from aignostics.utils import BasePageBuilder, GUILocalFilePicker from ._service import Service @@ -13,13 +11,17 @@ async def pick_file() -> None: """Open a file picker dialog and show notifier when closed again.""" - result = await GUILocalFilePicker(str(Path.cwd() / "examples"), multiple=True) + from nicegui import ui # noqa: PLC0415 + + result = await GUILocalFilePicker(str(Path.cwd() / "examples"), multiple=True) # type: ignore ui.notify(f"You chose {result}") class PageBuilder(BasePageBuilder): @staticmethod def register_pages() -> None: + from nicegui import ui # noqa: PLC0415 + @ui.page("/") def page_index() -> None: """Homepage of GUI.""" diff --git a/src/aignostics/cli.py b/src/aignostics/cli.py index c2d81f69..67aacc9b 100644 --- a/src/aignostics/cli.py +++ b/src/aignostics/cli.py @@ -12,14 +12,13 @@ logger = get_logger(__name__) cli = typer.Typer(help="Command Line Interface of Aignostics Python SDK") -prepare_cli(cli, f"🔬 Aignostics Python SDK v{__version__} - built with love in Berlin 🐻") if find_spec("nicegui") and find_spec("webview") and not __is_running_in_container__: @cli.command() def gui() -> None: - """Start graphical user interface (GUI) in native window.""" + """Open graphical user interface (GUI).""" from .utils import gui_run # noqa: PLC0415 gui_run(native=True, with_api=False, title="Aignostics Python SDK", icon="🔬") @@ -37,7 +36,7 @@ def notebook( host: Annotated[str, typer.Option(help="Host to bind the server to")] = "127.0.0.1", port: Annotated[int, typer.Option(help="Port to bind the server to")] = 8001, ) -> None: - """Start notebook in web browser.""" + """Run notebook server.""" console.print(f"Starting marimo notebook server at http://{host}:{port}") uvicorn.run( create_marimo_app(), @@ -46,6 +45,8 @@ def notebook( ) +prepare_cli(cli, f"🔬 Aignostics Python SDK v{__version__} - built with love in Berlin 🐻") + if __name__ == "__main__": # pragma: no cover try: cli() diff --git a/src/aignostics/constants.py b/src/aignostics/constants.py index f1cb18f0..c2d97b2e 100644 --- a/src/aignostics/constants.py +++ b/src/aignostics/constants.py @@ -1,12 +1,11 @@ -"""Constants for the Aignostics Python SDK.""" +"""Static configuration of Aignostics Python SDK.""" from pathlib import Path -MODULES_TO_INSTRUMENT = ["aignostics.platform", "aignostics.application"] - -API_VERSIONS = { - "v1": "1.0.0", -} - +# Configuration required by oe-python-template +API_VERSIONS: dict[str, str] = {"v1": "1.0.0"} +MODULES_TO_INSTRUMENT: list[str] = ["aignostics.platform", "aignostics.application"] NOTEBOOK_FOLDER = Path(__file__).parent.parent.parent / "examples" NOTEBOOK_APP = Path(__file__).parent.parent.parent / "examples" / "notebook.py" + +# Project specific configuration diff --git a/src/aignostics/idc/_cli.py b/src/aignostics/idc/_cli.py index f5f7a197..7becfc80 100644 --- a/src/aignostics/idc/_cli.py +++ b/src/aignostics/idc/_cli.py @@ -15,8 +15,7 @@ cli = typer.Typer( name="idc", - help="Commands to query and download collections, cases, studies and series " - "of Image Data Commons (IDC) Portal of the National Institute of Cancer (NIC)", + help="Download datasets from Image Data Commons (IDC) Portal of National Institute of Cancer (NIC).", ) diff --git a/src/aignostics/platform/_utils.py b/src/aignostics/platform/_utils.py index c7daddc2..e522858c 100644 --- a/src/aignostics/platform/_utils.py +++ b/src/aignostics/platform/_utils.py @@ -20,7 +20,6 @@ import google_crc32c import requests -from google.cloud import storage from tqdm.auto import tqdm EIGHT_MB = 8_388_608 @@ -94,6 +93,8 @@ def generate_signed_url(fully_qualified_gs_path: str) -> str: Raises: ValueError: If the GS path is invalid or the blob doesn't exist. """ + from google.cloud import storage # noqa: PLC0415, lazy loading for performance + pattern = r"gs://(?P[^/]+)/(?P.*)" m = re.fullmatch(pattern, fully_qualified_gs_path) if not m: diff --git a/src/aignostics/system/_cli.py b/src/aignostics/system/_cli.py index f8a2a8f0..4eb0cfd4 100644 --- a/src/aignostics/system/_cli.py +++ b/src/aignostics/system/_cli.py @@ -14,7 +14,7 @@ logger = get_logger(__name__) -cli = typer.Typer(name="system", help="System commands") +cli = typer.Typer(name="system", help="Determine health, info and further utillities.") _service = Service() @@ -94,6 +94,7 @@ def serve( Args: host (str): Host to bind the server to. port (int): Port to bind the server to. + watch (bool): Enable auto-reload on changes of source code. open_browser (bool): Open app in browser after starting the server. """ console.print(f"Starting web application server at http://{host}:{port}") diff --git a/src/aignostics/system/_gui.py b/src/aignostics/system/_gui.py index 2f82ebc2..33c1a124 100644 --- a/src/aignostics/system/_gui.py +++ b/src/aignostics/system/_gui.py @@ -1,7 +1,5 @@ """Homepage (index) of GUI.""" -from nicegui import ui - from ..utils import BasePageBuilder, __project_name__, __version__ # noqa: TID252 from ._service import Service @@ -9,6 +7,8 @@ class PageBuilder(BasePageBuilder): @staticmethod def register_pages() -> None: + from nicegui import ui # noqa: PLC0415 + @ui.page("/info") def page_info() -> None: """Homepage of GUI.""" diff --git a/src/aignostics/system/_service.py b/src/aignostics/system/_service.py index 24569a27..cae2c9ec 100644 --- a/src/aignostics/system/_service.py +++ b/src/aignostics/system/_service.py @@ -7,10 +7,12 @@ import sys import typing as t from pathlib import Path -from typing import Any +from socket import AF_INET, SOCK_DGRAM, socket +from typing import Any, NotRequired, TypedDict, cast +from urllib.error import HTTPError from pydantic_settings import BaseSettings -from uptime import boottime, uptime +from requests import get from ..utils import ( # noqa: TID252 UNHIDE_SENSITIVE_INFO, @@ -29,12 +31,32 @@ from ._exceptions import OpenAPISchemaError from ._settings import Settings -logger = get_logger(__name__) +log = get_logger(__name__) JsonType: t.TypeAlias = list["JsonValue"] | t.Mapping[str, "JsonValue"] JsonValue: t.TypeAlias = str | int | float | JsonType | None +class RuntimeDict(TypedDict, total=False): + """Type for runtime information dictionary.""" + + environment: str + username: str + process: dict[str, Any] + host: dict[str, Any] + python: dict[str, Any] + environ: dict[str, str] + + +class InfoDict(TypedDict, total=False): + """Type for the info dictionary.""" + + package: dict[str, Any] + runtime: RuntimeDict + settings: dict[str, Any] + __extra__: NotRequired[dict[str, Any]] + + class Service(BaseService): """System service.""" @@ -79,12 +101,47 @@ def is_token_valid(self, token: str) -> bool: Returns: bool: True if the token is valid, False otherwise. """ - logger.info(token) + log.info(token) if not self._settings.token: - logger.warning("Token is not set in settings.") + log.warning("Token is not set in settings.") return False return token == self._settings.token.get_secret_value() + @staticmethod + def _get_public_ipv4(timeout: int = 5) -> str | None: + """Get the public IPv4 address of the system. + + Args: + timeout (int): Timeout for the request in seconds. + + Returns: + str: The public IPv4 address. + """ + try: + response = get(url="https://api.ipify.org", timeout=timeout) + response.raise_for_status() + return response.text + except HTTPError as e: + message = f"Failed to get public IP: {e}" + log.exception(message) + return None + + @staticmethod + def _get_local_ipv4() -> str | None: + """Get the local IPv4 address of the system. + + Returns: + str: The local IPv4 address. + """ + try: + with socket(AF_INET, SOCK_DGRAM) as connection: + connection.connect((".".join(str(1) for _ in range(4)), 53)) + return str(connection.getsockname()[0]) + except Exception as e: + message = f"Failed to get local IP: {e}" + log.exception(message) + return None + @staticmethod def info(include_environ: bool = False, filter_secrets: bool = True) -> dict[str, Any]: """ @@ -99,8 +156,16 @@ def info(include_environ: bool = False, filter_secrets: bool = True) -> dict[str Returns: dict[str, Any]: Service configuration. """ + import psutil # noqa: PLC0415 + from uptime import boottime, uptime # noqa: PLC0415 + bootdatetime = boottime() - rtn = { + vmem = psutil.virtual_memory() + swap = psutil.swap_memory() + cpu_percent = psutil.cpu_percent(interval=5) + cpu_times_percent = psutil.cpu_times_percent(interval=5) + + rtn: InfoDict = { "package": { "version": __version__, "name": __project_name__, @@ -109,35 +174,73 @@ def info(include_environ: bool = False, filter_secrets: bool = True) -> dict[str }, "runtime": { "environment": __env__, + "username": pwd.getpwuid(os.getuid())[0], + "process": { + "command_line": " ".join(sys.argv), + "entry_point": sys.argv[0] if sys.argv else None, + "process_info": json.loads(get_process_info().model_dump_json()), + }, + "host": { + "os": { + "platform": platform.platform(), + "system": platform.system(), + "release": platform.release(), + "version": platform.version(), + }, + "machine": { + "cpu": { + "percent": cpu_percent, + "load_avg": psutil.getloadavg(), + "user": cpu_times_percent.user, + "system": cpu_times_percent.system, + "idle": cpu_times_percent.idle, + "arch": platform.machine(), + "processor": platform.processor(), + "count": os.cpu_count(), + "frequency": psutil.cpu_freq(), + }, + "memory": { + "percent": vmem.percent, + "total": vmem.total, + "available": vmem.available, + "used": vmem.used, + "free": vmem.free, + "active": vmem.active, + "inactive": vmem.inactive, + "wired": vmem.wired, + }, + "swap": { + "percent": swap.percent, + "total": swap.total, + "used": swap.used, + "free": swap.free, + }, + }, + "network": { + "hostname": platform.node(), + "local_ipv4": Service._get_local_ipv4(), + "public_ipv4": Service._get_public_ipv4(), + }, + "uptime": { + "seconds": uptime(), + "boottime": bootdatetime.isoformat() if bootdatetime else None, + }, + }, "python": { "version": platform.python_version(), "compiler": platform.python_compiler(), "implementation": platform.python_implementation(), "sys.path": sys.path, - }, - "interpreter_path": sys.executable, - "command_line": " ".join(sys.argv), - "entry_point": sys.argv[0] if sys.argv else None, - "process_info": json.loads(get_process_info().model_dump_json()), - "username": pwd.getpwuid(os.getuid())[0], - "host": { - "system": platform.system(), - "release": platform.release(), - "version": platform.version(), - "machine": platform.machine(), - "processor": platform.processor(), - "hostname": platform.node(), - "ip_address": platform.uname().node, - "cpu_count": os.cpu_count(), - "uptime": uptime(), - "boottime": bootdatetime.isoformat() if bootdatetime else None, + "interpreter_path": sys.executable, }, }, + "settings": {}, } + runtime = cast("RuntimeDict", rtn["runtime"]) if include_environ: if filter_secrets: - rtn["runtime"]["environ"] = { + runtime["environ"] = { k: v for k, v in os.environ.items() if not ( @@ -149,9 +252,9 @@ def info(include_environ: bool = False, filter_secrets: bool = True) -> dict[str ) } else: - rtn["runtime"]["environ"] = dict(os.environ) + runtime["environ"] = dict(os.environ) - settings = {} + settings: dict[str, Any] = {} for settings_class in locate_subclasses(BaseSettings): settings_instance = load_settings(settings_class) env_prefix = settings_instance.model_config.get("env_prefix", "") @@ -163,12 +266,16 @@ def info(include_environ: bool = False, filter_secrets: bool = True) -> dict[str settings[flat_key] = value rtn["settings"] = settings + # Convert the TypedDict to a regular dict before adding dynamic service keys + result_dict: dict[str, Any] = dict(rtn) + for service_class in locate_subclasses(BaseService): if service_class is not Service: service = service_class() - rtn[service.key()] = service.info() + result_dict[service.key()] = service.info() - return rtn + log.info("Service info: %s", result_dict) + return result_dict @staticmethod def openapi_schema() -> JsonType: diff --git a/src/aignostics/utils/__init__.py b/src/aignostics/utils/__init__.py index 3be2f11f..c4449bf7 100644 --- a/src/aignostics/utils/__init__.py +++ b/src/aignostics/utils/__init__.py @@ -11,12 +11,13 @@ __env_file__, __is_development_mode__, __is_running_in_container__, + __is_running_in_read_only_environment__, __project_name__, __project_path__, __repository_url__, __version__, ) -from ._di import locate_implementations, locate_subclasses +from ._di import load_modules, locate_implementations, locate_subclasses from ._health import Health from ._log import LogSettings, get_logger from ._logfire import LogfireSettings @@ -44,6 +45,7 @@ "__env_file__", "__is_development_mode__", "__is_running_in_container__", + "__is_running_in_read_only_environment__", "__project_name__", "__project_path__", "__repository_url__", @@ -52,6 +54,7 @@ "console", "get_logger", "get_process_info", + "load_modules", "load_settings", "locate_implementations", "locate_subclasses", diff --git a/src/aignostics/utils/_constants.py b/src/aignostics/utils/_constants.py index a5e20c2d..be1c10ca 100644 --- a/src/aignostics/utils/_constants.py +++ b/src/aignostics/utils/_constants.py @@ -1,4 +1,4 @@ -"""Constants used throughout.""" +"""Constants generated from the environment at runtime used throughout the project.""" import os import sys @@ -15,6 +15,14 @@ __is_development_mode__ = "uvx" not in sys.argv[0].lower() __is_running_in_container__ = os.getenv(f"{__project_name__.upper()}_RUNNING_IN_CONTAINER") +# Determine if we're running in a read-only runtime environment +READ_ONLY_ENV_INDICATORS = [ + f"{__project_name__.upper()}_RUNNING_IN_CONTAINER", + "VERCEL_ENV", + "RAILWAY_ENVIRONMENT", +] +__is_running_in_read_only_environment__ = any(os.getenv(env_var) is not None for env_var in READ_ONLY_ENV_INDICATORS) + # Determine environment we are deployed on ENV_VAR_MAPPINGS = { "ENV": lambda env: env, diff --git a/src/aignostics/utils/_di.py b/src/aignostics/utils/_di.py index ced5c194..cb459f4c 100644 --- a/src/aignostics/utils/_di.py +++ b/src/aignostics/utils/_di.py @@ -11,6 +11,12 @@ _subclass_cache: dict[Any, list[Any]] = {} +def load_modules() -> None: + package = importlib.import_module(__project_name__) + for _, name, _ in pkgutil.iter_modules(package.__path__): + importlib.import_module(f"{__project_name__}.{name}") + + def locate_implementations(_class: type[Any]) -> list[Any]: """ Dynamically discover all instances of some class. diff --git a/src/aignostics/utils/_gui.py b/src/aignostics/utils/_gui.py index a79e4c03..2680618f 100644 --- a/src/aignostics/utils/_gui.py +++ b/src/aignostics/utils/_gui.py @@ -3,9 +3,6 @@ from pathlib import Path from types import EllipsisType -from nicegui import app, events, ui -from nicegui import native as native_app - from ._constants import __is_running_in_container__, __project_name__ from ._di import locate_subclasses from ._log import get_logger @@ -58,6 +55,9 @@ def gui_run( # noqa: PLR0913, PLR0917 ValueError: If with_notebook is True but notebook_path is None, or trying to run native within container. """ + from nicegui import app, ui # noqa: PLC0415 + from nicegui import native as native_app # noqa: PLC0415 + if __is_running_in_container__ and native: message = "Native GUI cannot be run in a container. Please run with uvx or in browser." raise ValueError(message) @@ -81,98 +81,132 @@ def gui_run( # noqa: PLR0913, PLR0917 ) -class GUILocalFilePicker(ui.dialog): - def __init__( - self, +class GUILocalFilePicker: + """Local File Picker dialog class that lazy-loads NiceGUI dependencies.""" + + def __new__( # noqa: C901 + cls, directory: str, *, upper_limit: str | EllipsisType | None = ..., multiple: bool = False, show_hidden_files: bool = False, - ) -> None: - """Local File Picker. - - A simple file picker that allows selecting files from the local filesystem where NiceGUI is running. + ) -> "GUILocalFilePicker": + """Create a new instance with lazy-loaded dependencies. Args: directory: The directory to start in. upper_limit: The directory to stop at. None for no limit, default is same as starting directory. multiple: Whether to allow multiple files to be selected. show_hidden_files: Whether to show hidden files. + + Returns: + An instance of the dialog with lazy-loaded dependencies. """ - super().__init__() - - self.path = Path(directory).expanduser() - if upper_limit is None: - self.upper_limit = None - elif upper_limit is ...: - self.upper_limit = Path(directory).expanduser() - else: - self.upper_limit = Path(upper_limit).expanduser() - self.show_hidden_files = show_hidden_files - - with self, ui.card(): - self.add_drives_toggle() - self.grid = ( - ui.aggrid( + from nicegui import events, ui # noqa: PLC0415 + # Lazy import ui only when actually creating an instance + + # Define the actual implementation class with the imports available + class GUILocalFilePickerImpl(ui.dialog): + def __init__( + self, + directory: str, + *, + upper_limit: str | EllipsisType | None = ..., + multiple: bool = False, + show_hidden_files: bool = False, + ) -> None: + """Local File Picker. + + A simple file picker that allows selecting files from the local filesystem where NiceGUI is running. + + Args: + directory: The directory to start in. + upper_limit: The directory to stop at. None for no limit, default is same as starting directory. + multiple: Whether to allow multiple files to be selected. + show_hidden_files: Whether to show hidden files. + """ + super().__init__() + + self.path = Path(directory).expanduser() + if upper_limit is None: + self.upper_limit = None + elif upper_limit is ...: + self.upper_limit = Path(directory).expanduser() + else: + self.upper_limit = Path(upper_limit).expanduser() + self.show_hidden_files = show_hidden_files + + with self, ui.card(): + self.add_drives_toggle() + self.grid = ( + ui.aggrid( + { + "columnDefs": [{"field": "name", "headerName": "File"}], + "rowSelection": "multiple" if multiple else "single", + }, + html_columns=[0], + ) + .classes("w-96") + .on("cellDoubleClicked", self.handle_double_click) + ) + with ui.row().classes("w-full justify-end"): + ui.button("Cancel", on_click=self.close).props("outline").mark("BUTTON_CANCEL") + ui.button("Ok", on_click=self._handle_ok).mark("BUTTON_OK") + self.update_grid() + + def add_drives_toggle(self) -> None: + if platform.system() == "Windows": + import win32api # noqa: PLC0415 + + drives = win32api.GetLogicalDriveStrings().split("\000")[:-1] + self.drives_toggle = ui.toggle(drives, value=drives[0], on_change=self.update_drive) + + def update_drive(self) -> None: + self.path = Path(self.drives_toggle.value).expanduser() + self.update_grid() + + def update_grid(self) -> None: + paths = list(self.path.glob("*")) + if not self.show_hidden_files: + paths = [p for p in paths if not p.name.startswith(".")] + paths.sort(key=lambda p: p.name.lower()) + paths.sort(key=lambda p: not p.is_dir()) + + self.grid.options["rowData"] = [ { - "columnDefs": [{"field": "name", "headerName": "File"}], - "rowSelection": "multiple" if multiple else "single", - }, - html_columns=[0], - ) - .classes("w-96") - .on("cellDoubleClicked", self.handle_double_click) - ) - with ui.row().classes("w-full justify-end"): - ui.button("Cancel", on_click=self.close).props("outline").mark("BUTTON_CANCEL") - ui.button("Ok", on_click=self._handle_ok).mark("BUTTON_OK") - self.update_grid() - - def add_drives_toggle(self) -> None: - if platform.system() == "Windows": - import win32api # noqa: PLC0415 - - drives = win32api.GetLogicalDriveStrings().split("\000")[:-1] - self.drives_toggle = ui.toggle(drives, value=drives[0], on_change=self.update_drive) - - def update_drive(self) -> None: - self.path = Path(self.drives_toggle.value).expanduser() - self.update_grid() - - def update_grid(self) -> None: - paths = list(self.path.glob("*")) - if not self.show_hidden_files: - paths = [p for p in paths if not p.name.startswith(".")] - paths.sort(key=lambda p: p.name.lower()) - paths.sort(key=lambda p: not p.is_dir()) - - self.grid.options["rowData"] = [ - { - "name": f"📁 {p.name}" if p.is_dir() else p.name, - "path": str(p), - } - for p in paths - ] - if (self.upper_limit is None and self.path != self.path.parent) or ( - self.upper_limit is not None and self.path != self.upper_limit - ): - self.grid.options["rowData"].insert( - 0, - { - "name": "📁 ..", - "path": str(self.path.parent), - }, - ) - self.grid.update() - - def handle_double_click(self, e: events.GenericEventArguments) -> None: - self.path = Path(e.args["data"]["path"]) - if self.path.is_dir(): - self.update_grid() - else: - self.submit([str(self.path)]) - - async def _handle_ok(self) -> None: - rows = await self.grid.get_selected_rows() - self.submit([r["path"] for r in rows]) + "name": f"📁 {p.name}" if p.is_dir() else p.name, + "path": str(p), + } + for p in paths + ] + if (self.upper_limit is None and self.path != self.path.parent) or ( + self.upper_limit is not None and self.path != self.upper_limit + ): + self.grid.options["rowData"].insert( + 0, + { + "name": "📁 ..", + "path": str(self.path.parent), + }, + ) + self.grid.update() + + def handle_double_click(self, e: events.GenericEventArguments) -> None: + self.path = Path(e.args["data"]["path"]) + if self.path.is_dir(): + self.update_grid() + else: + self.submit([str(self.path)]) + + async def _handle_ok(self) -> None: + rows = await self.grid.get_selected_rows() + self.submit([r["path"] for r in rows]) + + # Create and return an instance but tell mypy it's a GUILocalFilePicker + return GUILocalFilePickerImpl( # type: ignore[return-value] + directory=directory, + upper_limit=upper_limit, + multiple=multiple, + show_hidden_files=show_hidden_files, + ) diff --git a/src/aignostics/utils/_log.py b/src/aignostics/utils/_log.py index d10c380b..2f371f47 100644 --- a/src/aignostics/utils/_log.py +++ b/src/aignostics/utils/_log.py @@ -1,18 +1,21 @@ """Logging configuration and utilities.""" +import contextlib import logging as python_logging +import os import typing as t from logging import FileHandler +from pathlib import Path from typing import Annotated, Literal import click import logfire -from pydantic import Field +from pydantic import AfterValidator, Field from pydantic_settings import BaseSettings, SettingsConfigDict from rich.console import Console from rich.logging import RichHandler -from ._constants import __env_file__, __project_name__ +from ._constants import __env_file__, __is_running_in_read_only_environment__, __project_name__ from ._settings import load_settings @@ -31,6 +34,46 @@ def get_logger(name: str | None) -> python_logging.Logger: return python_logging.getLogger(f"{__project_name__}.{name}") +def _validate_file_name(file_name: str | None) -> str | None: + """Validate the file_name is valid and the file writeable. + + - Checks file_name does not yet exist or is a file + - If not yet existing, checks it can be created + - If existing file, checks file is writeable + + Args: + file_name: The file name of the log file + + Returns: + str | None: The validated file name + + Raises: + ValueError: If file name is not valid or the file not writeable + """ + if file_name is None: + return file_name + + file_path = Path(file_name) + if file_path.exists(): + if not file_path.is_file() and not file_path.is_symlink(): + message = f"File name {file_path.absolute()} is not a file or symlink" + raise ValueError(message) + if not os.access(file_path, os.W_OK): + message = f"File {file_path.absolute()} is not writable" + raise ValueError(message) + else: + try: + file_path.touch(exist_ok=True) + except OSError as e: + message = f"File {file_path.absolute()} cannot be created: {e}" + raise ValueError(message) from e + + with contextlib.suppress(OSError): # Parallel execution e.g. in tests can create race + file_path.unlink() + + return file_name + + class LogSettings(BaseSettings): """Settings for configuring logging behavior.""" @@ -51,7 +94,11 @@ class LogSettings(BaseSettings): ] file_name: Annotated[ str, - Field(description="Name of the log file", default=f"{__project_name__}.log"), + AfterValidator(_validate_file_name), + Field( + description="Name of the log file", + default="/dev/stdout" if __is_running_in_read_only_environment__ else f"{__project_name__}.log", + ), ] console_enabled: Annotated[ bool, diff --git a/src/aignostics/utils/_notebook.py b/src/aignostics/utils/_notebook.py index b0e4d4e4..61ac0ed0 100644 --- a/src/aignostics/utils/_notebook.py +++ b/src/aignostics/utils/_notebook.py @@ -1,9 +1,7 @@ -"""System service.""" +"""Notebook server utilities.""" from collections.abc import Callable - -import marimo -from fastapi import APIRouter, FastAPI +from typing import Any from ..constants import NOTEBOOK_APP, NOTEBOOK_FOLDER # noqa: TID252 from ._health import Health @@ -12,7 +10,7 @@ logger = get_logger(__name__) -def register_health_endpoint(router: APIRouter) -> Callable[..., Health]: +def register_health_endpoint(router: Any) -> Callable[..., Health]: # noqa: ANN401 """Register health endpoint to the given router. Args: @@ -21,6 +19,7 @@ def register_health_endpoint(router: APIRouter) -> Callable[..., Health]: Returns: Callable[..., Health]: The health endpoint function. """ + # We accept 'Any' instead of APIRouter to avoid importing fastapi at module level @router.get("/healthz") def health_endpoint() -> Health: @@ -31,10 +30,12 @@ def health_endpoint() -> Health: """ return Health(status=Health.Code.UP) - return health_endpoint + # Explicitly type the return value to satisfy mypy + result: Callable[..., Health] = health_endpoint + return result -def create_marimo_app() -> FastAPI: +def create_marimo_app() -> Any: # noqa: ANN401 """Create a FastAPI app with marimo notebook server. Returns: @@ -43,6 +44,10 @@ def create_marimo_app() -> FastAPI: Raises: ValueError: If the notebook directory does not exist. """ + # Import dependencies only when function is called + import marimo # noqa: PLC0415 + from fastapi import APIRouter, FastAPI # noqa: PLC0415 + server = marimo.create_asgi_app(include_code=True) if not NOTEBOOK_FOLDER.is_dir(): logger.critical( diff --git a/src/aignostics/utils/_sentry.py b/src/aignostics/utils/_sentry.py index 8eaee97d..a80f79fc 100644 --- a/src/aignostics/utils/_sentry.py +++ b/src/aignostics/utils/_sentry.py @@ -1,15 +1,115 @@ """Sentry integration for application monitoring.""" +import re +import urllib.parse from typing import Annotated import sentry_sdk -from pydantic import BeforeValidator, Field, PlainSerializer, SecretStr +from pydantic import AfterValidator, BeforeValidator, Field, PlainSerializer, SecretStr from pydantic_settings import SettingsConfigDict from sentry_sdk.integrations.typer import TyperIntegration from ._constants import __env__, __env_file__, __project_name__, __version__ from ._settings import OpaqueSettings, load_settings, strip_to_none_before_validator +_ERR_MSG_MISSING_SCHEME = "Sentry DSN is missing URL scheme (protocol)" +_ERR_MSG_MISSING_NETLOC = "Sentry DSN is missing network location (domain)" +_ERR_MSG_NON_HTTPS = "Sentry DSN must use HTTPS protocol for security" +_ERR_MSG_INVALID_DOMAIN = "Sentry DSN must use a valid Sentry domain (ingest.us.sentry.io or ingest.de.sentry.io)" +_ERR_MSG_INVALID_FORMAT = "Invalid Sentry DSN format" +_VALID_SENTRY_DOMAIN_PATTERN = r"^[a-f0-9]+@o\d+\.ingest\.(us|de)\.sentry\.io$" + + +def _validate_url_scheme(parsed_url: urllib.parse.ParseResult) -> None: + """Validate that the URL has a scheme. + + Args: + parsed_url: The parsed URL to validate + + Raises: + ValueError: If URL is missing scheme + """ + if not parsed_url.scheme: + raise ValueError(_ERR_MSG_MISSING_SCHEME) + + +def _validate_url_netloc(parsed_url: urllib.parse.ParseResult) -> None: + """Validate that the URL has a network location. + + Args: + parsed_url: The parsed URL to validate + + Raises: + ValueError: If URL is missing network location + """ + if not parsed_url.netloc: + raise ValueError(_ERR_MSG_MISSING_NETLOC) + + +def _validate_https_scheme(parsed_url: urllib.parse.ParseResult) -> None: + """Validate that the URL uses HTTPS scheme. + + Args: + parsed_url: The parsed URL to validate + + Raises: + ValueError: If URL doesn't use HTTPS scheme + """ + if parsed_url.scheme != "https": + raise ValueError(_ERR_MSG_NON_HTTPS) + + +def _validate_sentry_domain(netloc_with_auth: str) -> None: + """Validate that the URL uses a valid Sentry domain. + + Args: + netloc_with_auth: The network location with auth part + + Raises: + ValueError: If URL doesn't use a valid Sentry domain + """ + if "@" not in netloc_with_auth: + raise ValueError(_ERR_MSG_INVALID_DOMAIN) + + user_pass, domain = netloc_with_auth.split("@", 1) + full_auth = f"{user_pass}@{domain}" + if not re.match(_VALID_SENTRY_DOMAIN_PATTERN, full_auth): + raise ValueError(_ERR_MSG_INVALID_DOMAIN) + + +def _validate_https_dsn(value: SecretStr | None) -> SecretStr | None: + """Validate that the Sentry DSN is a valid HTTPS URL. + + Args: + value: The DSN value to validate + + Returns: + SecretStr | None: The validated DSN value + + Raises: + ValueError: If DSN isn't a valid HTTPS URL with specific error details + """ + if value is None: + return value + + dsn = value.get_secret_value() + try: + parsed_url = urllib.parse.urlparse(dsn) + + # Call validation functions outside of the try block + _validate_url_scheme(parsed_url) + _validate_url_netloc(parsed_url) + _validate_https_scheme(parsed_url) + _validate_sentry_domain(parsed_url.netloc) + + except ValueError as exc: + raise exc from None + except Exception as exc: + error_message = _ERR_MSG_INVALID_FORMAT + raise ValueError(error_message) from exc + + return value + class SentrySettings(OpaqueSettings): """Configuration settings for Sentry integration.""" @@ -24,6 +124,7 @@ class SentrySettings(OpaqueSettings): dsn: Annotated[ SecretStr | None, BeforeValidator(strip_to_none_before_validator), + AfterValidator(_validate_https_dsn), PlainSerializer(func=OpaqueSettings.serialize_sensitive_info, return_type=str, when_used="always"), Field(description="Sentry DSN", examples=["https://SECRET@SECRET.ingest.de.sentry.io/SECRET"], default=None), ] diff --git a/tests/aignostics/__init__.py b/tests/aignostics/__init__.py index daf30e80..8a9a5861 100644 --- a/tests/aignostics/__init__.py +++ b/tests/aignostics/__init__.py @@ -1 +1 @@ -"""Test suite for package {{ import_package_name }}.""" +"""Test suite for package aignostics.""" diff --git a/tests/aignostics/cli_test.py b/tests/aignostics/cli_test.py index a7fd66c0..5ae11888 100644 --- a/tests/aignostics/cli_test.py +++ b/tests/aignostics/cli_test.py @@ -174,7 +174,7 @@ def mock_app_mount(path, app_instance): assert mock_ui_run_args["show"] is False, "show parameter should be False" -if find_spec("marimo"): +if find_spec("marimo") and find_spec("fastapi"): from fastapi import FastAPI def test_cli_notebook_help(runner: CliRunner) -> None: diff --git a/tests/aignostics/platform/scheduled_test.py b/tests/aignostics/platform/scheduled_test.py index 122064f4..c9149a0b 100644 --- a/tests/aignostics/platform/scheduled_test.py +++ b/tests/aignostics/platform/scheduled_test.py @@ -107,6 +107,7 @@ def three_spots_payload() -> list[platform.InputItem]: @pytest.mark.scheduled +@pytest.mark.long_running @pytest.mark.parametrize( ("timeout", "application_version_id", "payload"), [ diff --git a/tests/aignostics/system/cli_test.py b/tests/aignostics/system/cli_test.py index 397032ce..e9588c2b 100644 --- a/tests/aignostics/system/cli_test.py +++ b/tests/aignostics/system/cli_test.py @@ -1,7 +1,7 @@ """Tests to verify the CLI functionality of the system module.""" import os -from unittest.mock import patch +from unittest.mock import MagicMock, patch import pytest from typer.testing import CliRunner @@ -55,37 +55,20 @@ def test_cli_info_secrets(runner: CliRunner) -> None: assert THE_VALUE in result.output -@pytest.mark.skip # We don't serve an API -@patch("uvicorn.run") -def test_cli_serve_no_app(mock_uvicorn_run, runner: CliRunner) -> None: - """Check serve command starts the server.""" - result = runner.invoke(cli, ["system", "serve", "--host", "127.0.0.1", "--port", "8000", "--no-watch", "--no-app"]) - assert result.exit_code == 0 - assert "Starting webservice API server at http://127.0.0.1:8000" in result.output - mock_uvicorn_run.assert_called_once_with( - "aignostics.api:api", - host="127.0.0.1", - port=8000, - reload=False, - ) - - -@pytest.mark.skip # We don't serve an API -@patch("aignostics.utils._gui.app.mount") -@patch("aignostics.utils._gui.ui.run") @patch("aignostics.utils._gui.gui_register_pages") -def test_cli_serve_api_and_app(mock_register_pages, mock_ui_run, mock_app_mount, runner: CliRunner) -> None: +@patch("nicegui.ui.run") +def test_cli_serve_api_and_app(mock_ui_run, mock_register_pages, runner: CliRunner) -> None: """Check serve command starts the server with API and GUI app.""" - # Create a MagicMock for native_app.find_open_port - with patch("aignostics.utils._gui.native_app.find_open_port", return_value=8123): - result = runner.invoke(cli, ["system", "serve", "--host", "127.0.0.1", "--port", "8000", "--no-watch"]) + # Create mocks for components needed in gui_run + mock_app = MagicMock() + + # Patch nicegui imports inside gui_run function + with patch("nicegui.native.find_open_port", return_value=8123), patch("nicegui.app", mock_app): + result = runner.invoke(cli, ["system", "serve", "--host", "127.0.0.1", "--port", "8000"]) assert result.exit_code == 0 assert "Starting web application server at http://127.0.0.1:8000" in result.output - # Check that app.mount was called to mount the API - mock_app_mount.assert_called_once_with("/api", mock_app_mount.call_args[0][1]) - # Check that gui_register_pages was called mock_register_pages.assert_called_once() diff --git a/tests/aignostics/utils/cli_test.py b/tests/aignostics/utils/cli_test.py new file mode 100644 index 00000000..b06f4202 --- /dev/null +++ b/tests/aignostics/utils/cli_test.py @@ -0,0 +1,126 @@ +"""Tests for CLI utilities.""" + +from typing import Optional +from unittest.mock import MagicMock, Mock, patch + +import pytest +from typer.models import CommandInfo, TyperInfo + +from aignostics.utils._cli import prepare_cli + +# Constants to avoid duplication +LOCATE_IMPLEMENTATIONS_PATH = "aignostics.utils._cli.locate_implementations" +TEST_EPILOG = "Test Epilog" + + +class MockTyper: + """Mock Typer class for stattesting.""" + + def __init__(self) -> None: + """Initialize the mock Typer with necessary attributes.""" + self.registered_commands: list[CommandInfo] = [] + self.registered_groups: list[TyperInfo] = [] + self.info = Mock() + self.info.epilog = "" + self.info.no_args_is_help = False + self.typer_instance = None + + def add_typer(self, cli: "MockTyper") -> None: + """Mock method to add a typer instance.""" + + +class MockCommand: + """Mock Command class for testing.""" + + def __init__(self) -> None: + """Initialize the mock Command.""" + self.epilog = "" + + +class MockGroup: + """Mock Group class for testing.""" + + def __init__(self, instance: Optional["MockTyper"] = None) -> None: + """Initialize the mock Group.""" + self.typer_instance = instance + self.no_args_is_help = False + + +@pytest.fixture +def mock_typer() -> MockTyper: + """Create a mock typer instance for testing.""" + return MockTyper() + + +@pytest.fixture +def mock_command() -> MockCommand: + """Create a mock command for testing.""" + return MockCommand() + + +@pytest.fixture +def mock_group(mock_typer: MockTyper) -> MockGroup: + """Create a mock group for testing.""" + return MockGroup(mock_typer) + + +def test_prepare_cli_adds_typers(mock_typer: MockTyper) -> None: + """Test that prepare_cli correctly adds discovered typers.""" + with patch(LOCATE_IMPLEMENTATIONS_PATH) as mock_locate: + # Create a different typer instance to be discovered + other_typer = MockTyper() + mock_locate.return_value = [other_typer] + + # Mock the add_typer method + mock_typer.add_typer = MagicMock() + + prepare_cli(mock_typer, TEST_EPILOG) + + # Verify add_typer was called with the discovered typer + mock_typer.add_typer.assert_called_once_with(other_typer) + + +def test_prepare_cli_sets_epilog(mock_typer: MockTyper) -> None: + """Test that prepare_cli correctly sets the epilog.""" + with patch(LOCATE_IMPLEMENTATIONS_PATH, return_value=[]): + prepare_cli(mock_typer, TEST_EPILOG) + assert mock_typer.info.epilog == TEST_EPILOG + + +def test_prepare_cli_sets_no_args_is_help(mock_typer: MockTyper) -> None: + """Test that prepare_cli correctly sets no_args_is_help.""" + with patch(LOCATE_IMPLEMENTATIONS_PATH, return_value=[]): + prepare_cli(mock_typer, TEST_EPILOG) + assert mock_typer.info.no_args_is_help is True + + +@pytest.mark.parametrize( + ("argv_parts", "expected_calls"), + [ + (["script", "with", "typer"], 0), # Contains "typer", don't add epilog recursively + (["script", "without", "keywords"], 1), # Doesn't contain "typer", add epilog recursively + ], +) +def test_prepare_cli_conditional_epilog_recursion( + argv_parts: list[str], + expected_calls: int, + mock_typer: MockTyper, +) -> None: + """Test that prepare_cli conditionally calls _add_epilog_recursively based on sys.argv.""" + with ( + patch(LOCATE_IMPLEMENTATIONS_PATH, return_value=[]), + patch("aignostics.utils._cli.Path") as mock_path, + patch("aignostics.utils._cli._add_epilog_recursively") as mock_add_epilog, + ): + mock_path.return_value.parts = argv_parts + prepare_cli(mock_typer, TEST_EPILOG) + assert mock_add_epilog.call_count == expected_calls + + +def test_add_epilog_recursively_with_cycle(mock_typer: MockTyper) -> None: + """Test that _add_epilog_recursively handles cycles in the typer structure.""" + # Create a cycle by having the typer reference itself + mock_typer.registered_groups = [] + group = Mock(spec=TyperInfo) + group.typer_instance = mock_typer + mock_typer.registered_groups.append(group) diff --git a/tests/aignostics/utils/di_test.py b/tests/aignostics/utils/di_test.py new file mode 100644 index 00000000..c75b7abb --- /dev/null +++ b/tests/aignostics/utils/di_test.py @@ -0,0 +1,171 @@ +"""Tests for the CLI utilities.""" + +import sys +from unittest.mock import MagicMock, Mock, patch + +import typer + +from aignostics.utils._cli import ( + _add_epilog_recursively, + _no_args_is_help_recursively, + prepare_cli, +) + +# Constants to avoid duplication +TEST_EPILOG = "Test epilog" +SCRIPT_FILENAME = "script.py" + + +@patch("aignostics.utils._cli.locate_implementations") +def test_prepare_cli_registers_subcommands(mock_locate_implementations: Mock) -> None: + """Test that prepare_cli registers all located implementations.""" + # Setup + cli = typer.Typer() + mock_subcli = typer.Typer() + mock_locate_implementations.return_value = [cli, mock_subcli] + + # Execute + prepare_cli(cli, TEST_EPILOG) + + # Verify + mock_locate_implementations.assert_called_once_with(typer.Typer) + assert mock_subcli in [group.typer_instance for group in cli.registered_groups] + + +@patch("aignostics.utils._cli.locate_implementations") +def test_prepare_cli_sets_epilog_and_no_args_help(mock_locate_implementations: Mock) -> None: + """Test that prepare_cli sets epilog and no_args_is_help on the cli instance.""" + # Setup + cli = typer.Typer() + mock_locate_implementations.return_value = [cli] + + # Execute + prepare_cli(cli, TEST_EPILOG) + + # Verify + assert cli.info.epilog == TEST_EPILOG + assert cli.info.no_args_is_help is True + + +@patch("aignostics.utils._cli.Path") +@patch("aignostics.utils._cli.locate_implementations") +def test_prepare_cli_adds_epilog_to_commands_when_not_running_from_typer( + mock_locate_implementations: Mock, mock_path: Mock +) -> None: + """Test that prepare_cli adds epilog to commands when not running from typer.""" + # Setup + cli = typer.Typer() + mock_command = MagicMock() + cli.registered_commands = [mock_command] + mock_locate_implementations.return_value = [cli] + mock_path.return_value.parts = ["python", SCRIPT_FILENAME] + + # Execute + with patch.object(sys, "argv", [SCRIPT_FILENAME]): + prepare_cli(cli, TEST_EPILOG) + + # Verify + assert mock_command.epilog == TEST_EPILOG + + +@patch("aignostics.utils._cli._add_epilog_recursively") +@patch("aignostics.utils._cli.Path") +@patch("aignostics.utils._cli.locate_implementations") +def test_prepare_cli_calls_add_epilog_recursively_when_not_running_from_typer( + mock_locate_implementations: Mock, mock_path: Mock, mock_add_epilog_recursively: Mock +) -> None: + """Test that prepare_cli calls _add_epilog_recursively when not running from typer.""" + # Setup + cli = typer.Typer() + mock_locate_implementations.return_value = [cli] + mock_path.return_value.parts = ["python", SCRIPT_FILENAME] + + # Execute + with patch.object(sys, "argv", [SCRIPT_FILENAME]): + prepare_cli(cli, TEST_EPILOG) + + # Verify + mock_add_epilog_recursively.assert_called_once_with(cli, TEST_EPILOG) + + +@patch("aignostics.utils._cli._no_args_is_help_recursively") +@patch("aignostics.utils._cli.locate_implementations") +def test_prepare_cli_calls_no_args_is_help_recursively( + mock_locate_implementations: Mock, mock_no_args_is_help_recursively: Mock +) -> None: + """Test that prepare_cli calls _no_args_is_help_recursively.""" + # Setup + cli = typer.Typer() + mock_locate_implementations.return_value = [cli] + + # Execute + prepare_cli(cli, TEST_EPILOG) + + # Verify + mock_no_args_is_help_recursively.assert_called_once_with(cli) + + +def test_add_epilog_recursively_sets_epilog_on_cli() -> None: + """Test that _add_epilog_recursively sets epilog on the cli instance.""" + # Setup + cli = typer.Typer() + + # Execute + _add_epilog_recursively(cli, TEST_EPILOG) + + # Verify + assert cli.info.epilog == TEST_EPILOG + + +def test_add_epilog_recursively_sets_epilog_on_nested_typers() -> None: + """Test that _add_epilog_recursively sets epilog on nested typer instances.""" + # Setup + cli = typer.Typer() + subcli = typer.Typer() + cli.add_typer(subcli) + + # Execute + _add_epilog_recursively(cli, TEST_EPILOG) + + # Verify + assert subcli.info.epilog == TEST_EPILOG + + +def test_no_args_is_help_recursively_sets_no_args_is_help_on_groups() -> None: + """Test that _no_args_is_help_recursively sets no_args_is_help on groups.""" + # Setup + cli = typer.Typer() + subcli = typer.Typer() + cli.add_typer(subcli) + + # Create a mock for the group to verify it's accessed properly + mock_group = MagicMock() + mock_group.typer_instance = subcli + cli.registered_groups = [mock_group] + + # Execute + with patch.object(cli, "registered_groups", [mock_group]): + _no_args_is_help_recursively(cli) + + # Verify + mock_group.no_args_is_help = True + + +def test_no_args_is_help_recursively_calls_itself_on_nested_typers() -> None: + """Test that _no_args_is_help_recursively calls itself on nested typer instances.""" + # Setup + cli = typer.Typer() + subcli = typer.Typer() + sub_subcli = typer.Typer() + subcli.add_typer(sub_subcli) + cli.add_typer(subcli) + + # Execute + _no_args_is_help_recursively(cli) + + # Verify that all groups have no_args_is_help set to True + for group in cli.registered_groups: + assert group.no_args_is_help is True + if group.typer_instance: + for subgroup in group.typer_instance.registered_groups: + assert subgroup.no_args_is_help is True diff --git a/tests/aignostics/utils/gui_test.py b/tests/aignostics/utils/gui_test.py new file mode 100644 index 00000000..a2775ccb --- /dev/null +++ b/tests/aignostics/utils/gui_test.py @@ -0,0 +1,122 @@ +"""Tests for GUI module.""" + +from unittest import mock + +import pytest + +from aignostics.utils._constants import __project_name__ +from aignostics.utils._gui import ( + BasePageBuilder, + gui_register_pages, + gui_run, +) + + +def test_base_page_builder_is_abstract() -> None: + """Test that BasePageBuilder is an abstract class. + + Args: + None + """ + with pytest.raises(TypeError): + BasePageBuilder() # type: ignore # Cannot instantiate abstract class + + +def test_register_pages_is_abstract() -> None: + """Test that register_pages is an abstract method. + + Args: + None + """ + + class IncompletePageBuilder(BasePageBuilder): + pass + + with pytest.raises(TypeError): + IncompletePageBuilder() # type: ignore # Abstract method not implemented + + +@mock.patch("aignostics.utils._gui.locate_subclasses") +def test_register_pages_calls_all_builders(mock_locate_subclasses: mock.MagicMock) -> None: + """Test that gui_register_pages calls register_pages on all builders. + + Args: + mock_locate_subclasses: Mock for locate_subclasses function + """ + # Create mock page builders + mock_builder1 = mock.MagicMock() + mock_builder2 = mock.MagicMock() + mock_locate_subclasses.return_value = [mock_builder1, mock_builder2] + + # Call the function + gui_register_pages() + + # Assert each builder's register_pages was called + mock_builder1.register_pages.assert_called_once() + mock_builder2.register_pages.assert_called_once() + + +@mock.patch("aignostics.utils._gui.__is_running_in_container__", False) +@mock.patch("aignostics.utils._gui.gui_register_pages") +@mock.patch("nicegui.ui") +def test_gui_run_default_params(mock_ui: mock.MagicMock, mock_register_pages: mock.MagicMock) -> None: + """Test gui_run with default parameters. + + Args: + mock_ui: Mock for nicegui UI + mock_register_pages: Mock for gui_register_pages function + """ + with mock.patch("nicegui.native.find_open_port", return_value=8000): + gui_run() + mock_register_pages.assert_called_once() + mock_ui.run.assert_called_once() + # Verify default parameters + call_kwargs = mock_ui.run.call_args[1] + assert call_kwargs["title"] == __project_name__ + assert call_kwargs["native"] is True + assert call_kwargs["reload"] is False + assert call_kwargs["port"] == 8000 + + +@mock.patch("aignostics.utils._gui.__is_running_in_container__", False) +@mock.patch("aignostics.utils._gui.gui_register_pages") +@mock.patch("nicegui.ui") +def test_gui_run_custom_params(mock_ui: mock.MagicMock, mock_register_pages: mock.MagicMock) -> None: + """Test gui_run with custom parameters. + + Args: + mock_ui: Mock for nicegui UI + mock_register_pages: Mock for gui_register_pages function + """ + gui_run( + native=False, + show=True, + host="0.0.0.0", + port=5000, + title="Test GUI", + watch=True, + ) + mock_register_pages.assert_called_once() + mock_ui.run.assert_called_once() + # Verify custom parameters + call_kwargs = mock_ui.run.call_args[1] + assert call_kwargs["title"] == "Test GUI" + assert call_kwargs["native"] is False + assert call_kwargs["reload"] is True + assert call_kwargs["host"] == "0.0.0.0" + assert call_kwargs["port"] == 5000 + assert call_kwargs["show"] is True + + +@mock.patch("aignostics.utils._gui.__is_running_in_container__", True) +@mock.patch("nicegui.ui") +def test_gui_run_in_container_with_native(mock_ui: mock.MagicMock) -> None: + """Test that gui_run raises ValueError when running native in container. + + Args: + mock_ui: Mock for nicegui UI + """ + with pytest.raises(ValueError) as excinfo: + gui_run(native=True) + assert "Native GUI cannot be run in a container" in str(excinfo.value) + mock_ui.run.assert_not_called() diff --git a/tests/aignostics/utils/log_test.py b/tests/aignostics/utils/log_test.py new file mode 100644 index 00000000..9cb67f68 --- /dev/null +++ b/tests/aignostics/utils/log_test.py @@ -0,0 +1,128 @@ +"""Tests for logging configuration and utilities.""" + +import tempfile +from pathlib import Path +from unittest import mock + +import pytest + +from aignostics.utils import get_logger +from aignostics.utils._log import _validate_file_name, logging_initialize + +log = get_logger(__name__) + + +def test_validate_file_name_none() -> None: + """Test that None file name is returned unchanged.""" + assert _validate_file_name(None) is None + + +def test_validate_file_name_nonexistent() -> None: + """Test validation of a non-existent file that can be created.""" + with tempfile.TemporaryDirectory() as temp_dir: + test_file = Path(temp_dir) / "test_log.log" + assert _validate_file_name(str(test_file)) == str(test_file) + # Verify the file was not actually created + assert not test_file.exists() + + +def test_validate_file_name_existing() -> None: + """Test validation of an existing writable file.""" + with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", delete=False) as temp_file: + temp_file_path = Path(temp_file.name) + + try: + # File exists and is writable + assert _validate_file_name(str(temp_file_path)) == str(temp_file_path) + finally: + # Clean up + temp_file_path.unlink(missing_ok=True) + + +def test_validate_file_name_existing_readonly() -> None: + """Test validation of an existing read-only file.""" + with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", delete=False) as temp_file: + temp_file_path = Path(temp_file.name) + + try: + # Make file read-only + temp_file_path.chmod(0o444) + + # File exists but is not writable + with pytest.raises(ValueError, match=r"is not writable"): + _validate_file_name(str(temp_file_path)) + finally: + # Need to make it writable again to delete it + temp_file_path.chmod(0o644) + temp_file_path.unlink(missing_ok=True) + + +def test_validate_file_name_directory() -> None: + """Test validation of a path that points to a directory.""" + with tempfile.TemporaryDirectory() as temp_dir, pytest.raises(ValueError, match=r"is not a file"): + _validate_file_name(temp_dir) + + +def test_validate_file_name_cannot_create() -> None: + """Test validation of a file that cannot be created due to permissions.""" + with tempfile.TemporaryDirectory() as temp_dir: + temp_dir_path = Path(temp_dir) + # Make temp dir read-only + temp_dir_path.chmod(0o555) + + try: + test_file = temp_dir_path / "test_log.log" + with pytest.raises(ValueError, match=r"cannot be created"): + _validate_file_name(str(test_file)) + finally: + # Need to make it writable again to allow cleanup + temp_dir_path.chmod(0o755) + + +def test_validate_file_name_invalid_path() -> None: + """Test validation of a file with an invalid path.""" + # Testing with a path that should always be invalid + invalid_path = Path("/nonexistent/directory/that/definitely/should/not/exist") / "file.log" + with pytest.raises(ValueError, match=r"cannot be created"): + _validate_file_name(str(invalid_path)) + + +def test_get_logger_with_name() -> None: + """Test get_logger with a specific name.""" + logger = get_logger("test_module") + assert logger.name == "aignostics.test_module" + + +def test_get_logger_none() -> None: + """Test get_logger with None name.""" + logger = get_logger(None) + assert logger.name == "aignostics" + + +def test_get_logger_project_name() -> None: + """Test get_logger with the project name.""" + logger = get_logger("aignostics") + assert logger.name == "aignostics" + + +def test_logging_initialize_with_defaults() -> None: + """Test logging_initialize with default settings.""" + with ( + mock.patch("aignostics.utils._log.load_settings") as mock_load_settings, + mock.patch("logging.basicConfig") as mock_basic_config, + ): + # Mock settings with defaults + mock_settings = mock.MagicMock() + mock_settings.file_enabled = False + mock_settings.console_enabled = False + mock_settings.level = "INFO" + mock_load_settings.return_value = mock_settings + + # Call the function + logging_initialize() + + # Verify basicConfig was called with empty handlers list + mock_basic_config.assert_called_once() + call_kwargs = mock_basic_config.call_args.kwargs + assert call_kwargs["level"] == "INFO" + assert call_kwargs["handlers"] == [] diff --git a/tests/aignostics/utils/sentry_test.py b/tests/aignostics/utils/sentry_test.py new file mode 100644 index 00000000..51a45dfd --- /dev/null +++ b/tests/aignostics/utils/sentry_test.py @@ -0,0 +1,157 @@ +"""Tests for Sentry settings.""" + +import os +import re +from collections.abc import Generator +from unittest import mock + +import pytest +from pydantic import SecretStr + +from aignostics.utils import get_logger +from aignostics.utils._sentry import ( + _ERR_MSG_INVALID_DOMAIN, + _ERR_MSG_MISSING_NETLOC, + _ERR_MSG_MISSING_SCHEME, + _ERR_MSG_NON_HTTPS, + _validate_https_dsn, + _validate_https_scheme, + _validate_sentry_domain, + _validate_url_netloc, + _validate_url_scheme, + sentry_initialize, +) + +log = get_logger(__name__) + +VALID_DSN = "https://abcdef1234567890@o12345.ingest.us.sentry.io/1234567890" + + +@pytest.fixture +def mock_environment() -> Generator[None, None, None]: + """Fixture to set up the environment for testing.""" + with mock.patch.dict(os.environ, {}, clear=True): + yield + + +def test_validate_url_scheme() -> None: + """Test URL scheme validation.""" + import urllib.parse + + # Valid case + parsed_url = urllib.parse.urlparse(VALID_DSN) + _validate_url_scheme(parsed_url) # Should not raise + + # Invalid case - missing scheme + invalid_url = urllib.parse.urlparse("//missing-scheme.com") + with pytest.raises(ValueError, match=re.escape(_ERR_MSG_MISSING_SCHEME)): + _validate_url_scheme(invalid_url) + + +def test_validate_url_netloc() -> None: + """Test network location validation.""" + import urllib.parse + + # Valid case + parsed_url = urllib.parse.urlparse(VALID_DSN) + _validate_url_netloc(parsed_url) # Should not raise + + # Invalid case - missing netloc + invalid_url = urllib.parse.urlparse("https://") + with pytest.raises(ValueError, match=re.escape(_ERR_MSG_MISSING_NETLOC)): + _validate_url_netloc(invalid_url) + + +def test_validate_https_scheme() -> None: + """Test HTTPS scheme validation.""" + import urllib.parse + + # Valid case + parsed_url = urllib.parse.urlparse(VALID_DSN) + _validate_https_scheme(parsed_url) # Should not raise + + # Invalid case - HTTP scheme + invalid_url = urllib.parse.urlparse("http://example.com") + with pytest.raises(ValueError, match=re.escape(_ERR_MSG_NON_HTTPS)): + _validate_https_scheme(invalid_url) + + +def test_validate_sentry_domain() -> None: + """Test Sentry domain validation.""" + import urllib.parse + + # Valid cases + parsed_url = urllib.parse.urlparse(VALID_DSN) + _validate_sentry_domain(parsed_url.netloc) # Should not raise + + parsed_url = urllib.parse.urlparse("https://abcdef1234567890@o12345.ingest.de.sentry.io/1234567890") + _validate_sentry_domain(parsed_url.netloc) # Should not raise + + # Invalid case - missing @ + invalid_netloc = "example.com" + with pytest.raises(ValueError, match=re.escape(_ERR_MSG_INVALID_DOMAIN)): + _validate_sentry_domain(invalid_netloc) + + # Invalid case - wrong domain format + invalid_netloc = "user@example.com" + with pytest.raises(ValueError, match=re.escape(_ERR_MSG_INVALID_DOMAIN)): + _validate_sentry_domain(invalid_netloc) + + +def test_validate_https_dsn_with_valid_dsn() -> None: + """Test DSN validation with valid DSN.""" + valid_dsn = SecretStr(VALID_DSN) + result = _validate_https_dsn(valid_dsn) + assert result is valid_dsn # Should return the same object + + +def test_validate_https_dsn_with_none() -> None: + """Test DSN validation with None value.""" + result = _validate_https_dsn(None) + assert result is None # Should return None unchanged + + +def test_validate_https_dsn_invalid_cases() -> None: + """Test DSN validation with various invalid cases.""" + # Missing scheme + with pytest.raises(ValueError, match=re.escape(_ERR_MSG_MISSING_SCHEME)): + _validate_https_dsn(SecretStr("//invalid.com")) + + # Missing netloc + with pytest.raises(ValueError, match=re.escape(_ERR_MSG_MISSING_NETLOC)): + _validate_https_dsn(SecretStr("https://")) + + # HTTP scheme instead of HTTPS + with pytest.raises(ValueError, match=re.escape(_ERR_MSG_NON_HTTPS)): + _validate_https_dsn(SecretStr("http://abcdef1234567890@o12345.ingest.us.sentry.io/1234567890")) + + # Invalid Sentry domain + with pytest.raises(ValueError, match=re.escape(_ERR_MSG_INVALID_DOMAIN)): + _validate_https_dsn(SecretStr("https://user@example.com")) + + +def test_sentry_initialize_with_no_dsn(mock_environment: None) -> None: + """Test sentry_initialize with no DSN.""" + with mock.patch("aignostics.utils._sentry.load_settings") as mock_load_settings: + mock_settings = mock.MagicMock() + mock_settings.dsn = None + mock_load_settings.return_value = mock_settings + + result = sentry_initialize() + assert result is False # Should return False when no DSN is provided + + +def test_sentry_initialize_with_valid_dsn(mock_environment: None) -> None: + """Test sentry_initialize with a valid DSN.""" + with ( + mock.patch("aignostics.utils._sentry.load_settings") as mock_load_settings, + mock.patch("sentry_sdk.init") as mock_sentry_init, + ): + mock_settings = mock.MagicMock() + mock_settings.dsn = SecretStr(VALID_DSN) + mock_load_settings.return_value = mock_settings + + result = sentry_initialize() + + assert result is True # Should return True when initialization is successful + mock_sentry_init.assert_called_once() # Should call sentry_sdk.init diff --git a/tests/aignostics/utils/settings_test.py b/tests/aignostics/utils/settings_test.py new file mode 100644 index 00000000..33642e55 --- /dev/null +++ b/tests/aignostics/utils/settings_test.py @@ -0,0 +1,118 @@ +"""Tests for the settings.""" + +import os +from typing import Any, ClassVar +from unittest.mock import patch + +from pydantic import SecretStr + +from aignostics.utils._settings import ( + UNHIDE_SENSITIVE_INFO, + OpaqueSettings, + load_settings, + strip_to_none_before_validator, +) + + +def test_strip_to_none_before_validator_with_none() -> None: + """Test that None is returned when None is passed.""" + assert strip_to_none_before_validator(None) is None + + +def test_strip_to_none_before_validator_with_empty_string() -> None: + """Test that None is returned when an empty string is passed.""" + assert strip_to_none_before_validator("") is None + + +def test_strip_to_none_before_validator_with_whitespace_string() -> None: + """Test that None is returned when a whitespace string is passed.""" + assert strip_to_none_before_validator(" \t\n ") is None + + +def test_strip_to_none_before_validator_with_valid_string() -> None: + """Test that a stripped string is returned when a valid string is passed.""" + assert strip_to_none_before_validator(" test ") == "test" + + +class TestSettings(OpaqueSettings): + """Test settings class.""" + + test_value: str = "default" + secret_value: SecretStr | None = None + required_value: str + + +def test_opaque_settings_serialize_sensitive_info_with_unhide() -> None: + """Test that sensitive info is revealed when unhide_sensitive_info is True.""" + secret = SecretStr("sensitive") + context = {UNHIDE_SENSITIVE_INFO: True} + + result = OpaqueSettings.serialize_sensitive_info(secret, type("FieldSerializationInfo", (), {"context": context})) + + assert result == "sensitive" + + +def test_opaque_settings_serialize_sensitive_info_without_unhide() -> None: + """Test that sensitive info is hidden when unhide_sensitive_info is False.""" + secret = SecretStr("sensitive") + context = {UNHIDE_SENSITIVE_INFO: False} + + result = OpaqueSettings.serialize_sensitive_info(secret, type("FieldSerializationInfo", (), {"context": context})) + + assert result == "**********" + + +def test_opaque_settings_serialize_sensitive_info_empty() -> None: + """Test that None is returned when the SecretStr is empty.""" + secret = SecretStr("") + context = {} + + result = OpaqueSettings.serialize_sensitive_info(secret, type("FieldSerializationInfo", (), {"context": context})) + + assert result is None + + +@patch.dict(os.environ, {"REQUIRED_VALUE": "test_value"}) +def test_load_settings_success() -> None: + """Test successful settings loading.""" + settings = load_settings(TestSettings) + assert settings.test_value == "default" + assert settings.required_value == "test_value" + + +@patch("sys.exit") +@patch("rich.console.Console.print") +def test_load_settings_validation_error(mock_console_print, mock_exit) -> None: + """Test that validation error is handled properly.""" + # The settings class requires required_value, but we're not providing it + # This will trigger a validation error + load_settings(TestSettings) + + # Verify that sys.exit was called with the correct code + mock_exit.assert_called_once_with(78) + + # Verify that console.print was called (with a panel showing the error) + mock_console_print.assert_called_once() + + +class TestSettingsWithEnvPrefix(OpaqueSettings): + """Test settings class with an environment prefix.""" + + model_config: ClassVar[dict[str, Any]] = {"env_prefix": "TEST_"} + + value: str + + +@patch.dict(os.environ, {"TEST_VALUE": "prefixed_value"}) +def test_settings_with_env_prefix() -> None: + """Test that settings with environment prefix work correctly.""" + settings = load_settings(TestSettingsWithEnvPrefix) + assert settings.value == "prefixed_value" + + +class TestSettingsWithEnvFile(OpaqueSettings): + """Test settings class with a custom env file.""" + + model_config: ClassVar[dict[str, Any]] = {"env_file": "custom.env"} + + value: str = "default" diff --git a/tests/conftest.py b/tests/conftest.py index a8442eae..56a9fd70 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -23,6 +23,11 @@ def pytest_collection_modifyitems(config, items) -> None: for item in items: if "long_running" in item.keywords: item.add_marker(skip_me) + elif config.getoption("-m") == "not sequential": + skip_me = pytest.mark.skip(reason="skipped as only not sequential marker given on execution using '-m'") + for item in items: + if "long_running" in item.keywords: + item.add_marker(skip_me) @pytest.fixture(scope="session") diff --git a/uv.lock b/uv.lock index 848f2c43..ab7ad75a 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 1 +revision = 2 requires-python = ">=3.11, <4.0" resolution-markers = [ "python_full_version >= '3.13'", @@ -89,6 +89,7 @@ dev = [ { name = "pytest-cov" }, { name = "pytest-docker" }, { name = "pytest-env" }, + { name = "pytest-md-report" }, { name = "pytest-regressions" }, { name = "pytest-selenium" }, { name = "pytest-subprocess" }, @@ -96,6 +97,7 @@ dev = [ { name = "pytest-watcher" }, { name = "pytest-xdist", extra = ["psutil"] }, { name = "ruff" }, + { name = "scalene" }, { name = "sphinx" }, { name = "sphinx-autobuild" }, { name = "sphinx-copybutton" }, @@ -127,7 +129,7 @@ requires-dist = [ { name = "jsf", specifier = ">=0.11.2" }, { name = "jsonschema", specifier = ">=4.23.0" }, { name = "jupyter", marker = "extra == 'examples'", specifier = ">=1.1.1" }, - { name = "logfire", extras = ["system-metrics"], specifier = ">=3.13.1" }, + { name = "logfire", extras = ["system-metrics"], specifier = ">=3.14.1" }, { name = "marimo", marker = "extra == 'examples'", specifier = ">=0.13.0" }, { name = "matplotlib", marker = "extra == 'examples'", specifier = ">=3.10.1" }, { name = "nicegui", extras = ["native"], specifier = ">=2.15.0" }, @@ -146,7 +148,7 @@ requires-dist = [ { name = "pyyaml", specifier = ">=6.0" }, { name = "requests", specifier = ">=2.32.3" }, { name = "requests-oauthlib", specifier = ">=2.0.0" }, - { name = "sentry-sdk", specifier = ">=2.26.1" }, + { name = "sentry-sdk", specifier = ">=2.27.0" }, { name = "shapely", marker = "extra == 'examples'", specifier = ">=2.1.0" }, { name = "streamlit", marker = "extra == 'examples'", specifier = ">=1.44.1" }, { name = "tqdm", specifier = ">=4.67.1" }, @@ -178,6 +180,7 @@ dev = [ { name = "pytest-cov", specifier = ">=6.1.1" }, { name = "pytest-docker", specifier = ">=3.2.1" }, { name = "pytest-env", specifier = ">=1.1.5" }, + { name = "pytest-md-report", specifier = ">=0.6.3" }, { name = "pytest-regressions", specifier = ">=2.7.0" }, { name = "pytest-selenium", specifier = ">=4.1.0" }, { name = "pytest-subprocess", specifier = ">=1.5.3" }, @@ -185,6 +188,7 @@ dev = [ { name = "pytest-watcher", specifier = ">=0.4.3" }, { name = "pytest-xdist", extras = ["psutil"], specifier = ">=3.6.1" }, { name = "ruff", specifier = ">=0.11.6" }, + { name = "scalene", specifier = ">=1.5.51" }, { name = "sphinx", specifier = ">=8.2.3" }, { name = "sphinx-autobuild", specifier = ">=2024.10.3" }, { name = "sphinx-copybutton", specifier = ">=0.5.2" }, @@ -205,23 +209,23 @@ dev = [ name = "aiofiles" version = "24.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247 } +sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247, upload_time = "2024-06-24T11:02:03.584Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896 }, + { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896, upload_time = "2024-06-24T11:02:01.529Z" }, ] [[package]] name = "aiohappyeyeballs" version = "2.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760 } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload_time = "2025-03-12T01:42:48.764Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265 }, + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload_time = "2025-03-12T01:42:47.083Z" }, ] [[package]] name = "aiohttp" -version = "3.11.16" +version = "3.11.18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -232,56 +236,56 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/d9/1c4721d143e14af753f2bf5e3b681883e1f24b592c0482df6fa6e33597fa/aiohttp-3.11.16.tar.gz", hash = "sha256:16f8a2c9538c14a557b4d309ed4d0a7c60f0253e8ed7b6c9a2859a7582f8b1b8", size = 7676826 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/98/be30539cd84260d9f3ea1936d50445e25aa6029a4cb9707f3b64cfd710f7/aiohttp-3.11.16-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8cb0688a8d81c63d716e867d59a9ccc389e97ac7037ebef904c2b89334407180", size = 708664 }, - { url = "https://files.pythonhosted.org/packages/e6/27/d51116ce18bdfdea7a2244b55ad38d7b01a4298af55765eed7e8431f013d/aiohttp-3.11.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ad1fb47da60ae1ddfb316f0ff16d1f3b8e844d1a1e154641928ea0583d486ed", size = 468953 }, - { url = "https://files.pythonhosted.org/packages/34/23/eedf80ec42865ea5355b46265a2433134138eff9a4fea17e1348530fa4ae/aiohttp-3.11.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:df7db76400bf46ec6a0a73192b14c8295bdb9812053f4fe53f4e789f3ea66bbb", size = 456065 }, - { url = "https://files.pythonhosted.org/packages/36/23/4a5b1ef6cff994936bf96d981dd817b487d9db755457a0d1c2939920d620/aiohttp-3.11.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc3a145479a76ad0ed646434d09216d33d08eef0d8c9a11f5ae5cdc37caa3540", size = 1687976 }, - { url = "https://files.pythonhosted.org/packages/d0/5d/c7474b4c3069bb35276d54c82997dff4f7575e4b73f0a7b1b08a39ece1eb/aiohttp-3.11.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d007aa39a52d62373bd23428ba4a2546eed0e7643d7bf2e41ddcefd54519842c", size = 1752711 }, - { url = "https://files.pythonhosted.org/packages/64/4c/ee416987b6729558f2eb1b727c60196580aafdb141e83bd78bb031d1c000/aiohttp-3.11.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6ddd90d9fb4b501c97a4458f1c1720e42432c26cb76d28177c5b5ad4e332601", size = 1791305 }, - { url = "https://files.pythonhosted.org/packages/58/28/3e1e1884070b95f1f69c473a1995852a6f8516670bb1c29d6cb2dbb73e1c/aiohttp-3.11.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a2f451849e6b39e5c226803dcacfa9c7133e9825dcefd2f4e837a2ec5a3bb98", size = 1674499 }, - { url = "https://files.pythonhosted.org/packages/ad/55/a032b32fa80a662d25d9eb170ed1e2c2be239304ca114ec66c89dc40f37f/aiohttp-3.11.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8df6612df74409080575dca38a5237282865408016e65636a76a2eb9348c2567", size = 1622313 }, - { url = "https://files.pythonhosted.org/packages/b1/df/ca775605f72abbda4e4746e793c408c84373ca2c6ce7a106a09f853f1e89/aiohttp-3.11.16-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78e6e23b954644737e385befa0deb20233e2dfddf95dd11e9db752bdd2a294d3", size = 1658274 }, - { url = "https://files.pythonhosted.org/packages/cc/6c/21c45b66124df5b4b0ab638271ecd8c6402b702977120cb4d5be6408e15d/aiohttp-3.11.16-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:696ef00e8a1f0cec5e30640e64eca75d8e777933d1438f4facc9c0cdf288a810", size = 1666704 }, - { url = "https://files.pythonhosted.org/packages/1d/e2/7d92adc03e3458edd18a21da2575ab84e58f16b1672ae98529e4eeee45ab/aiohttp-3.11.16-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3538bc9fe1b902bef51372462e3d7c96fce2b566642512138a480b7adc9d508", size = 1652815 }, - { url = "https://files.pythonhosted.org/packages/3a/52/7549573cd654ad651e3c5786ec3946d8f0ee379023e22deb503ff856b16c/aiohttp-3.11.16-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3ab3367bb7f61ad18793fea2ef71f2d181c528c87948638366bf1de26e239183", size = 1735669 }, - { url = "https://files.pythonhosted.org/packages/d5/54/dcd24a23c7a5a2922123e07a296a5f79ea87ce605f531be068415c326de6/aiohttp-3.11.16-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:56a3443aca82abda0e07be2e1ecb76a050714faf2be84256dae291182ba59049", size = 1760422 }, - { url = "https://files.pythonhosted.org/packages/a7/53/87327fe982fa310944e1450e97bf7b2a28015263771931372a1dfe682c58/aiohttp-3.11.16-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:61c721764e41af907c9d16b6daa05a458f066015abd35923051be8705108ed17", size = 1694457 }, - { url = "https://files.pythonhosted.org/packages/ce/6d/c5ccf41059267bcf89853d3db9d8d217dacf0a04f4086cb6bf278323011f/aiohttp-3.11.16-cp311-cp311-win32.whl", hash = "sha256:3e061b09f6fa42997cf627307f220315e313ece74907d35776ec4373ed718b86", size = 416817 }, - { url = "https://files.pythonhosted.org/packages/e7/dd/01f6fe028e054ef4f909c9d63e3a2399e77021bb2e1bb51d56ca8b543989/aiohttp-3.11.16-cp311-cp311-win_amd64.whl", hash = "sha256:745f1ed5e2c687baefc3c5e7b4304e91bf3e2f32834d07baaee243e349624b24", size = 442986 }, - { url = "https://files.pythonhosted.org/packages/db/38/100d01cbc60553743baf0fba658cb125f8ad674a8a771f765cdc155a890d/aiohttp-3.11.16-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:911a6e91d08bb2c72938bc17f0a2d97864c531536b7832abee6429d5296e5b27", size = 704881 }, - { url = "https://files.pythonhosted.org/packages/21/ed/b4102bb6245e36591209e29f03fe87e7956e54cb604ee12e20f7eb47f994/aiohttp-3.11.16-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac13b71761e49d5f9e4d05d33683bbafef753e876e8e5a7ef26e937dd766713", size = 464564 }, - { url = "https://files.pythonhosted.org/packages/3b/e1/a9ab6c47b62ecee080eeb33acd5352b40ecad08fb2d0779bcc6739271745/aiohttp-3.11.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fd36c119c5d6551bce374fcb5c19269638f8d09862445f85a5a48596fd59f4bb", size = 456548 }, - { url = "https://files.pythonhosted.org/packages/80/ad/216c6f71bdff2becce6c8776f0aa32cb0fa5d83008d13b49c3208d2e4016/aiohttp-3.11.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d489d9778522fbd0f8d6a5c6e48e3514f11be81cb0a5954bdda06f7e1594b321", size = 1691749 }, - { url = "https://files.pythonhosted.org/packages/bd/ea/7df7bcd3f4e734301605f686ffc87993f2d51b7acb6bcc9b980af223f297/aiohttp-3.11.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69a2cbd61788d26f8f1e626e188044834f37f6ae3f937bd9f08b65fc9d7e514e", size = 1736874 }, - { url = "https://files.pythonhosted.org/packages/51/41/c7724b9c87a29b7cfd1202ec6446bae8524a751473d25e2ff438bc9a02bf/aiohttp-3.11.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd464ba806e27ee24a91362ba3621bfc39dbbb8b79f2e1340201615197370f7c", size = 1786885 }, - { url = "https://files.pythonhosted.org/packages/86/b3/f61f8492fa6569fa87927ad35a40c159408862f7e8e70deaaead349e2fba/aiohttp-3.11.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ce63ae04719513dd2651202352a2beb9f67f55cb8490c40f056cea3c5c355ce", size = 1698059 }, - { url = "https://files.pythonhosted.org/packages/ce/be/7097cf860a9ce8bbb0e8960704e12869e111abcd3fbd245153373079ccec/aiohttp-3.11.16-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09b00dd520d88eac9d1768439a59ab3d145065c91a8fab97f900d1b5f802895e", size = 1626527 }, - { url = "https://files.pythonhosted.org/packages/1d/1d/aaa841c340e8c143a8d53a1f644c2a2961c58cfa26e7b398d6bf75cf5d23/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f6428fee52d2bcf96a8aa7b62095b190ee341ab0e6b1bcf50c615d7966fd45b", size = 1644036 }, - { url = "https://files.pythonhosted.org/packages/2c/88/59d870f76e9345e2b149f158074e78db457985c2b4da713038d9da3020a8/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:13ceac2c5cdcc3f64b9015710221ddf81c900c5febc505dbd8f810e770011540", size = 1685270 }, - { url = "https://files.pythonhosted.org/packages/2b/b1/c6686948d4c79c3745595efc469a9f8a43cab3c7efc0b5991be65d9e8cb8/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fadbb8f1d4140825069db3fedbbb843290fd5f5bc0a5dbd7eaf81d91bf1b003b", size = 1650852 }, - { url = "https://files.pythonhosted.org/packages/fe/94/3e42a6916fd3441721941e0f1b8438e1ce2a4c49af0e28e0d3c950c9b3c9/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6a792ce34b999fbe04a7a71a90c74f10c57ae4c51f65461a411faa70e154154e", size = 1704481 }, - { url = "https://files.pythonhosted.org/packages/b1/6d/6ab5854ff59b27075c7a8c610597d2b6c38945f9a1284ee8758bc3720ff6/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f4065145bf69de124accdd17ea5f4dc770da0a6a6e440c53f6e0a8c27b3e635c", size = 1735370 }, - { url = "https://files.pythonhosted.org/packages/73/2a/08a68eec3c99a6659067d271d7553e4d490a0828d588e1daa3970dc2b771/aiohttp-3.11.16-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fa73e8c2656a3653ae6c307b3f4e878a21f87859a9afab228280ddccd7369d71", size = 1697619 }, - { url = "https://files.pythonhosted.org/packages/61/d5/fea8dbbfb0cd68fbb56f0ae913270a79422d9a41da442a624febf72d2aaf/aiohttp-3.11.16-cp312-cp312-win32.whl", hash = "sha256:f244b8e541f414664889e2c87cac11a07b918cb4b540c36f7ada7bfa76571ea2", size = 411710 }, - { url = "https://files.pythonhosted.org/packages/33/fb/41cde15fbe51365024550bf77b95a4fc84ef41365705c946da0421f0e1e0/aiohttp-3.11.16-cp312-cp312-win_amd64.whl", hash = "sha256:23a15727fbfccab973343b6d1b7181bfb0b4aa7ae280f36fd2f90f5476805682", size = 438012 }, - { url = "https://files.pythonhosted.org/packages/52/52/7c712b2d9fb4d5e5fd6d12f9ab76e52baddfee71e3c8203ca7a7559d7f51/aiohttp-3.11.16-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a3814760a1a700f3cfd2f977249f1032301d0a12c92aba74605cfa6ce9f78489", size = 698005 }, - { url = "https://files.pythonhosted.org/packages/51/3e/61057814f7247666d43ac538abcd6335b022869ade2602dab9bf33f607d2/aiohttp-3.11.16-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b751a6306f330801665ae69270a8a3993654a85569b3469662efaad6cf5cc50", size = 461106 }, - { url = "https://files.pythonhosted.org/packages/4f/85/6b79fb0ea6e913d596d5b949edc2402b20803f51b1a59e1bbc5bb7ba7569/aiohttp-3.11.16-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ad497f38a0d6c329cb621774788583ee12321863cd4bd9feee1effd60f2ad133", size = 453394 }, - { url = "https://files.pythonhosted.org/packages/4b/04/e1bb3fcfbd2c26753932c759593a32299aff8625eaa0bf8ff7d9c0c34a36/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca37057625693d097543bd88076ceebeb248291df9d6ca8481349efc0b05dcd0", size = 1666643 }, - { url = "https://files.pythonhosted.org/packages/0e/27/97bc0fdd1f439b8f060beb3ba8fb47b908dc170280090801158381ad7942/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5abcbba9f4b463a45c8ca8b7720891200658f6f46894f79517e6cd11f3405ca", size = 1721948 }, - { url = "https://files.pythonhosted.org/packages/2c/4f/bc4c5119e75c05ef15c5670ef1563bbe25d4ed4893b76c57b0184d815e8b/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f420bfe862fb357a6d76f2065447ef6f484bc489292ac91e29bc65d2d7a2c84d", size = 1774454 }, - { url = "https://files.pythonhosted.org/packages/73/5b/54b42b2150bb26fdf795464aa55ceb1a49c85f84e98e6896d211eabc6670/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58ede86453a6cf2d6ce40ef0ca15481677a66950e73b0a788917916f7e35a0bb", size = 1677785 }, - { url = "https://files.pythonhosted.org/packages/10/ee/a0fe68916d3f82eae199b8535624cf07a9c0a0958c7a76e56dd21140487a/aiohttp-3.11.16-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fdec0213244c39973674ca2a7f5435bf74369e7d4e104d6c7473c81c9bcc8c4", size = 1608456 }, - { url = "https://files.pythonhosted.org/packages/8b/48/83afd779242b7cf7e1ceed2ff624a86d3221e17798061cf9a79e0b246077/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:72b1b03fb4655c1960403c131740755ec19c5898c82abd3961c364c2afd59fe7", size = 1622424 }, - { url = "https://files.pythonhosted.org/packages/6f/27/452f1d5fca1f516f9f731539b7f5faa9e9d3bf8a3a6c3cd7c4b031f20cbd/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:780df0d837276276226a1ff803f8d0fa5f8996c479aeef52eb040179f3156cbd", size = 1660943 }, - { url = "https://files.pythonhosted.org/packages/d6/e1/5c7d63143b8d00c83b958b9e78e7048c4a69903c760c1e329bf02bac57a1/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ecdb8173e6c7aa09eee342ac62e193e6904923bd232e76b4157ac0bfa670609f", size = 1622797 }, - { url = "https://files.pythonhosted.org/packages/46/9e/2ac29cca2746ee8e449e73cd2fcb3d454467393ec03a269d50e49af743f1/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a6db7458ab89c7d80bc1f4e930cc9df6edee2200127cfa6f6e080cf619eddfbd", size = 1687162 }, - { url = "https://files.pythonhosted.org/packages/ad/6b/eaa6768e02edebaf37d77f4ffb74dd55f5cbcbb6a0dbf798ccec7b0ac23b/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2540ddc83cc724b13d1838026f6a5ad178510953302a49e6d647f6e1de82bc34", size = 1718518 }, - { url = "https://files.pythonhosted.org/packages/e5/18/dda87cbad29472a51fa058d6d8257dfce168289adaeb358b86bd93af3b20/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3b4e6db8dc4879015b9955778cfb9881897339c8fab7b3676f8433f849425913", size = 1675254 }, - { url = "https://files.pythonhosted.org/packages/32/d9/d2fb08c614df401d92c12fcbc60e6e879608d5e8909ef75c5ad8d4ad8aa7/aiohttp-3.11.16-cp313-cp313-win32.whl", hash = "sha256:493910ceb2764f792db4dc6e8e4b375dae1b08f72e18e8f10f18b34ca17d0979", size = 410698 }, - { url = "https://files.pythonhosted.org/packages/ce/ed/853e36d5a33c24544cfa46585895547de152dfef0b5c79fa675f6e4b7b87/aiohttp-3.11.16-cp313-cp313-win_amd64.whl", hash = "sha256:42864e70a248f5f6a49fdaf417d9bc62d6e4d8ee9695b24c5916cb4bb666c802", size = 436395 }, +sdist = { url = "https://files.pythonhosted.org/packages/63/e7/fa1a8c00e2c54b05dc8cb5d1439f627f7c267874e3f7bb047146116020f9/aiohttp-3.11.18.tar.gz", hash = "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a", size = 7678653, upload_time = "2025-04-21T09:43:09.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/10/fd9ee4f9e042818c3c2390054c08ccd34556a3cb209d83285616434cf93e/aiohttp-3.11.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9", size = 712088, upload_time = "2025-04-21T09:40:55.776Z" }, + { url = "https://files.pythonhosted.org/packages/22/eb/6a77f055ca56f7aae2cd2a5607a3c9e7b9554f1497a069dcfcb52bfc9540/aiohttp-3.11.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b", size = 471450, upload_time = "2025-04-21T09:40:57.301Z" }, + { url = "https://files.pythonhosted.org/packages/78/dc/5f3c0d27c91abf0bb5d103e9c9b0ff059f60cf6031a5f06f456c90731f42/aiohttp-3.11.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66", size = 457836, upload_time = "2025-04-21T09:40:59.322Z" }, + { url = "https://files.pythonhosted.org/packages/49/7b/55b65af9ef48b9b811c91ff8b5b9de9650c71147f10523e278d297750bc8/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756", size = 1690978, upload_time = "2025-04-21T09:41:00.795Z" }, + { url = "https://files.pythonhosted.org/packages/a2/5a/3f8938c4f68ae400152b42742653477fc625d6bfe02e764f3521321c8442/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717", size = 1745307, upload_time = "2025-04-21T09:41:02.89Z" }, + { url = "https://files.pythonhosted.org/packages/b4/42/89b694a293333ef6f771c62da022163bcf44fb03d4824372d88e3dc12530/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4", size = 1780692, upload_time = "2025-04-21T09:41:04.461Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ce/1a75384e01dd1bf546898b6062b1b5f7a59b6692ef802e4dd6db64fed264/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f", size = 1676934, upload_time = "2025-04-21T09:41:06.728Z" }, + { url = "https://files.pythonhosted.org/packages/a5/31/442483276e6c368ab5169797d9873b5875213cbcf7e74b95ad1c5003098a/aiohttp-3.11.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361", size = 1621190, upload_time = "2025-04-21T09:41:08.293Z" }, + { url = "https://files.pythonhosted.org/packages/7b/83/90274bf12c079457966008a58831a99675265b6a34b505243e004b408934/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1", size = 1658947, upload_time = "2025-04-21T09:41:11.054Z" }, + { url = "https://files.pythonhosted.org/packages/91/c1/da9cee47a0350b78fdc93670ebe7ad74103011d7778ab4c382ca4883098d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421", size = 1654443, upload_time = "2025-04-21T09:41:13.213Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f2/73cbe18dc25d624f79a09448adfc4972f82ed6088759ddcf783cd201956c/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e", size = 1644169, upload_time = "2025-04-21T09:41:14.827Z" }, + { url = "https://files.pythonhosted.org/packages/5b/32/970b0a196c4dccb1b0cfa5b4dc3b20f63d76f1c608f41001a84b2fd23c3d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d", size = 1728532, upload_time = "2025-04-21T09:41:17.168Z" }, + { url = "https://files.pythonhosted.org/packages/0b/50/b1dc810a41918d2ea9574e74125eb053063bc5e14aba2d98966f7d734da0/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f", size = 1750310, upload_time = "2025-04-21T09:41:19.353Z" }, + { url = "https://files.pythonhosted.org/packages/95/24/39271f5990b35ff32179cc95537e92499d3791ae82af7dcf562be785cd15/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd", size = 1691580, upload_time = "2025-04-21T09:41:21.868Z" }, + { url = "https://files.pythonhosted.org/packages/6b/78/75d0353feb77f041460564f12fe58e456436bbc00cbbf5d676dbf0038cc2/aiohttp-3.11.18-cp311-cp311-win32.whl", hash = "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d", size = 417565, upload_time = "2025-04-21T09:41:24.78Z" }, + { url = "https://files.pythonhosted.org/packages/ed/97/b912dcb654634a813f8518de359364dfc45976f822116e725dc80a688eee/aiohttp-3.11.18-cp311-cp311-win_amd64.whl", hash = "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6", size = 443652, upload_time = "2025-04-21T09:41:26.48Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d2/5bc436f42bf4745c55f33e1e6a2d69e77075d3e768e3d1a34f96ee5298aa/aiohttp-3.11.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2", size = 706671, upload_time = "2025-04-21T09:41:28.021Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d0/2dbabecc4e078c0474abb40536bbde717fb2e39962f41c5fc7a216b18ea7/aiohttp-3.11.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508", size = 466169, upload_time = "2025-04-21T09:41:29.783Z" }, + { url = "https://files.pythonhosted.org/packages/70/84/19edcf0b22933932faa6e0be0d933a27bd173da02dc125b7354dff4d8da4/aiohttp-3.11.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e", size = 457554, upload_time = "2025-04-21T09:41:31.327Z" }, + { url = "https://files.pythonhosted.org/packages/32/d0/e8d1f034ae5624a0f21e4fb3feff79342ce631f3a4d26bd3e58b31ef033b/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f", size = 1690154, upload_time = "2025-04-21T09:41:33.541Z" }, + { url = "https://files.pythonhosted.org/packages/16/de/2f9dbe2ac6f38f8495562077131888e0d2897e3798a0ff3adda766b04a34/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f", size = 1733402, upload_time = "2025-04-21T09:41:35.634Z" }, + { url = "https://files.pythonhosted.org/packages/e0/04/bd2870e1e9aef990d14b6df2a695f17807baf5c85a4c187a492bda569571/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec", size = 1783958, upload_time = "2025-04-21T09:41:37.456Z" }, + { url = "https://files.pythonhosted.org/packages/23/06/4203ffa2beb5bedb07f0da0f79b7d9039d1c33f522e0d1a2d5b6218e6f2e/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6", size = 1695288, upload_time = "2025-04-21T09:41:39.756Z" }, + { url = "https://files.pythonhosted.org/packages/30/b2/e2285dda065d9f29ab4b23d8bcc81eb881db512afb38a3f5247b191be36c/aiohttp-3.11.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009", size = 1618871, upload_time = "2025-04-21T09:41:41.972Z" }, + { url = "https://files.pythonhosted.org/packages/57/e0/88f2987885d4b646de2036f7296ebea9268fdbf27476da551c1a7c158bc0/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4", size = 1646262, upload_time = "2025-04-21T09:41:44.192Z" }, + { url = "https://files.pythonhosted.org/packages/e0/19/4d2da508b4c587e7472a032290b2981f7caeca82b4354e19ab3df2f51d56/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9", size = 1677431, upload_time = "2025-04-21T09:41:46.049Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ae/047473ea50150a41440f3265f53db1738870b5a1e5406ece561ca61a3bf4/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb", size = 1637430, upload_time = "2025-04-21T09:41:47.973Z" }, + { url = "https://files.pythonhosted.org/packages/11/32/c6d1e3748077ce7ee13745fae33e5cb1dac3e3b8f8787bf738a93c94a7d2/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda", size = 1703342, upload_time = "2025-04-21T09:41:50.323Z" }, + { url = "https://files.pythonhosted.org/packages/c5/1d/a3b57bfdbe285f0d45572d6d8f534fd58761da3e9cbc3098372565005606/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1", size = 1740600, upload_time = "2025-04-21T09:41:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/a5/71/f9cd2fed33fa2b7ce4d412fb7876547abb821d5b5520787d159d0748321d/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea", size = 1695131, upload_time = "2025-04-21T09:41:53.94Z" }, + { url = "https://files.pythonhosted.org/packages/97/97/d1248cd6d02b9de6aa514793d0dcb20099f0ec47ae71a933290116c070c5/aiohttp-3.11.18-cp312-cp312-win32.whl", hash = "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8", size = 412442, upload_time = "2025-04-21T09:41:55.689Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/e34e65506e06427b111e19218a99abf627638a9703f4b8bcc3e3021277ed/aiohttp-3.11.18-cp312-cp312-win_amd64.whl", hash = "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8", size = 439444, upload_time = "2025-04-21T09:41:57.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/18/be8b5dd6b9cf1b2172301dbed28e8e5e878ee687c21947a6c81d6ceaa15d/aiohttp-3.11.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811", size = 699833, upload_time = "2025-04-21T09:42:00.298Z" }, + { url = "https://files.pythonhosted.org/packages/0d/84/ecdc68e293110e6f6f6d7b57786a77555a85f70edd2b180fb1fafaff361a/aiohttp-3.11.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804", size = 462774, upload_time = "2025-04-21T09:42:02.015Z" }, + { url = "https://files.pythonhosted.org/packages/d7/85/f07718cca55884dad83cc2433746384d267ee970e91f0dcc75c6d5544079/aiohttp-3.11.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd", size = 454429, upload_time = "2025-04-21T09:42:03.728Z" }, + { url = "https://files.pythonhosted.org/packages/82/02/7f669c3d4d39810db8842c4e572ce4fe3b3a9b82945fdd64affea4c6947e/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c", size = 1670283, upload_time = "2025-04-21T09:42:06.053Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/b82a12f67009b377b6c07a26bdd1b81dab7409fc2902d669dbfa79e5ac02/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118", size = 1717231, upload_time = "2025-04-21T09:42:07.953Z" }, + { url = "https://files.pythonhosted.org/packages/a6/38/d5a1f28c3904a840642b9a12c286ff41fc66dfa28b87e204b1f242dbd5e6/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1", size = 1769621, upload_time = "2025-04-21T09:42:09.855Z" }, + { url = "https://files.pythonhosted.org/packages/53/2d/deb3749ba293e716b5714dda06e257f123c5b8679072346b1eb28b766a0b/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000", size = 1678667, upload_time = "2025-04-21T09:42:11.741Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a8/04b6e11683a54e104b984bd19a9790eb1ae5f50968b601bb202d0406f0ff/aiohttp-3.11.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137", size = 1601592, upload_time = "2025-04-21T09:42:14.137Z" }, + { url = "https://files.pythonhosted.org/packages/5e/9d/c33305ae8370b789423623f0e073d09ac775cd9c831ac0f11338b81c16e0/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93", size = 1621679, upload_time = "2025-04-21T09:42:16.056Z" }, + { url = "https://files.pythonhosted.org/packages/56/45/8e9a27fff0538173d47ba60362823358f7a5f1653c6c30c613469f94150e/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3", size = 1656878, upload_time = "2025-04-21T09:42:18.368Z" }, + { url = "https://files.pythonhosted.org/packages/84/5b/8c5378f10d7a5a46b10cb9161a3aac3eeae6dba54ec0f627fc4ddc4f2e72/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8", size = 1620509, upload_time = "2025-04-21T09:42:20.141Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2f/99dee7bd91c62c5ff0aa3c55f4ae7e1bc99c6affef780d7777c60c5b3735/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2", size = 1680263, upload_time = "2025-04-21T09:42:21.993Z" }, + { url = "https://files.pythonhosted.org/packages/03/0a/378745e4ff88acb83e2d5c884a4fe993a6e9f04600a4560ce0e9b19936e3/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261", size = 1715014, upload_time = "2025-04-21T09:42:23.87Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0b/b5524b3bb4b01e91bc4323aad0c2fcaebdf2f1b4d2eb22743948ba364958/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7", size = 1666614, upload_time = "2025-04-21T09:42:25.764Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b7/3d7b036d5a4ed5a4c704e0754afe2eef24a824dfab08e6efbffb0f6dd36a/aiohttp-3.11.18-cp313-cp313-win32.whl", hash = "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78", size = 411358, upload_time = "2025-04-21T09:42:27.558Z" }, + { url = "https://files.pythonhosted.org/packages/1e/3c/143831b32cd23b5263a995b2a1794e10aa42f8a895aae5074c20fda36c07/aiohttp-3.11.18-cp313-cp313-win_amd64.whl", hash = "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01", size = 437658, upload_time = "2025-04-21T09:42:29.209Z" }, ] [[package]] @@ -291,18 +295,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 } +sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424, upload_time = "2024-12-13T17:10:40.86Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, + { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597, upload_time = "2024-12-13T17:10:38.469Z" }, ] [[package]] name = "alabaster" version = "1.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210 } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload_time = "2024-07-26T18:15:03.762Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929 }, + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload_time = "2024-07-26T18:15:02.05Z" }, ] [[package]] @@ -316,18 +320,18 @@ dependencies = [ { name = "packaging" }, { name = "typing-extensions", marker = "python_full_version < '3.14'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/16/b1/f2969c7bdb8ad8bbdda031687defdce2c19afba2aa2c8e1d2a17f78376d8/altair-5.5.0.tar.gz", hash = "sha256:d960ebe6178c56de3855a68c47b516be38640b73fb3b5111c2a9ca90546dd73d", size = 705305 } +sdist = { url = "https://files.pythonhosted.org/packages/16/b1/f2969c7bdb8ad8bbdda031687defdce2c19afba2aa2c8e1d2a17f78376d8/altair-5.5.0.tar.gz", hash = "sha256:d960ebe6178c56de3855a68c47b516be38640b73fb3b5111c2a9ca90546dd73d", size = 705305, upload_time = "2024-11-23T23:39:58.542Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl", hash = "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c", size = 731200 }, + { url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl", hash = "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c", size = 731200, upload_time = "2024-11-23T23:39:56.4Z" }, ] [[package]] name = "annotated-types" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload_time = "2024-05-20T21:33:25.928Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload_time = "2024-05-20T21:33:24.1Z" }, ] [[package]] @@ -339,9 +343,9 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 } +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload_time = "2025-03-17T00:02:54.77Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 }, + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload_time = "2025-03-17T00:02:52.713Z" }, ] [[package]] @@ -354,9 +358,9 @@ dependencies = [ { name = "platformdirs" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4f/6b/cc65e31843d7bfda8313a9dc0c77a21e8580b782adca53c7cb3e511fe023/apeye-1.4.1.tar.gz", hash = "sha256:14ea542fad689e3bfdbda2189a354a4908e90aee4bf84c15ab75d68453d76a36", size = 99219 } +sdist = { url = "https://files.pythonhosted.org/packages/4f/6b/cc65e31843d7bfda8313a9dc0c77a21e8580b782adca53c7cb3e511fe023/apeye-1.4.1.tar.gz", hash = "sha256:14ea542fad689e3bfdbda2189a354a4908e90aee4bf84c15ab75d68453d76a36", size = 99219, upload_time = "2023-08-14T15:32:41.381Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/7b/2d63664777b3e831ac1b1d8df5bbf0b7c8bee48e57115896080890527b1b/apeye-1.4.1-py3-none-any.whl", hash = "sha256:44e58a9104ec189bf42e76b3a7fe91e2b2879d96d48e9a77e5e32ff699c9204e", size = 107989 }, + { url = "https://files.pythonhosted.org/packages/89/7b/2d63664777b3e831ac1b1d8df5bbf0b7c8bee48e57115896080890527b1b/apeye-1.4.1-py3-none-any.whl", hash = "sha256:44e58a9104ec189bf42e76b3a7fe91e2b2879d96d48e9a77e5e32ff699c9204e", size = 107989, upload_time = "2023-08-14T15:32:40.064Z" }, ] [[package]] @@ -367,36 +371,36 @@ dependencies = [ { name = "domdf-python-tools" }, { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e5/4c/4f108cfd06923bd897bf992a6ecb6fb122646ee7af94d7f9a64abd071d4c/apeye_core-1.1.5.tar.gz", hash = "sha256:5de72ed3d00cc9b20fea55e54b7ab8f5ef8500eb33a5368bc162a5585e238a55", size = 96511 } +sdist = { url = "https://files.pythonhosted.org/packages/e5/4c/4f108cfd06923bd897bf992a6ecb6fb122646ee7af94d7f9a64abd071d4c/apeye_core-1.1.5.tar.gz", hash = "sha256:5de72ed3d00cc9b20fea55e54b7ab8f5ef8500eb33a5368bc162a5585e238a55", size = 96511, upload_time = "2024-01-30T17:45:48.727Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/9f/fa9971d2a0c6fef64c87ba362a493a4f230eff4ea8dfb9f4c7cbdf71892e/apeye_core-1.1.5-py3-none-any.whl", hash = "sha256:dc27a93f8c9e246b3b238c5ea51edf6115ab2618ef029b9f2d9a190ec8228fbf", size = 99286 }, + { url = "https://files.pythonhosted.org/packages/77/9f/fa9971d2a0c6fef64c87ba362a493a4f230eff4ea8dfb9f4c7cbdf71892e/apeye_core-1.1.5-py3-none-any.whl", hash = "sha256:dc27a93f8c9e246b3b238c5ea51edf6115ab2618ef029b9f2d9a190ec8228fbf", size = 99286, upload_time = "2024-01-30T17:45:46.764Z" }, ] [[package]] name = "appdirs" version = "1.4.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470 } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470, upload_time = "2020-05-11T07:59:51.037Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566 }, + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566, upload_time = "2020-05-11T07:59:49.499Z" }, ] [[package]] name = "appnope" version = "0.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload_time = "2024-02-06T09:43:11.258Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload_time = "2024-02-06T09:43:09.663Z" }, ] [[package]] name = "argcomplete" version = "3.6.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/0f/861e168fc813c56a78b35f3c30d91c6757d1fd185af1110f1aec784b35d0/argcomplete-3.6.2.tar.gz", hash = "sha256:d0519b1bc867f5f4f4713c41ad0aba73a4a5f007449716b16f385f2166dc6adf", size = 73403 } +sdist = { url = "https://files.pythonhosted.org/packages/16/0f/861e168fc813c56a78b35f3c30d91c6757d1fd185af1110f1aec784b35d0/argcomplete-3.6.2.tar.gz", hash = "sha256:d0519b1bc867f5f4f4713c41ad0aba73a4a5f007449716b16f385f2166dc6adf", size = 73403, upload_time = "2025-04-03T04:57:03.52Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/da/e42d7a9d8dd33fa775f467e4028a47936da2f01e4b0e561f9ba0d74cb0ca/argcomplete-3.6.2-py3-none-any.whl", hash = "sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591", size = 43708 }, + { url = "https://files.pythonhosted.org/packages/31/da/e42d7a9d8dd33fa775f467e4028a47936da2f01e4b0e561f9ba0d74cb0ca/argcomplete-3.6.2-py3-none-any.whl", hash = "sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591", size = 43708, upload_time = "2025-04-03T04:57:01.591Z" }, ] [[package]] @@ -406,9 +410,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "argon2-cffi-bindings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/31/fa/57ec2c6d16ecd2ba0cf15f3c7d1c3c2e7b5fcb83555ff56d7ab10888ec8f/argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", size = 42798 } +sdist = { url = "https://files.pythonhosted.org/packages/31/fa/57ec2c6d16ecd2ba0cf15f3c7d1c3c2e7b5fcb83555ff56d7ab10888ec8f/argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", size = 42798, upload_time = "2023-08-15T14:13:12.711Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea", size = 15124 }, + { url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea", size = 15124, upload_time = "2023-08-15T14:13:10.752Z" }, ] [[package]] @@ -418,18 +422,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/e9/184b8ccce6683b0aa2fbb7ba5683ea4b9c5763f1356347f1312c32e3c66e/argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", size = 1779911 } +sdist = { url = "https://files.pythonhosted.org/packages/b9/e9/184b8ccce6683b0aa2fbb7ba5683ea4b9c5763f1356347f1312c32e3c66e/argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", size = 1779911, upload_time = "2021-12-01T08:52:55.68Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/13/838ce2620025e9666aa8f686431f67a29052241692a3dd1ae9d3692a89d3/argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", size = 29658 }, - { url = "https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", size = 80583 }, - { url = "https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", size = 86168 }, - { url = "https://files.pythonhosted.org/packages/74/f6/4a34a37a98311ed73bb80efe422fed95f2ac25a4cacc5ae1d7ae6a144505/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", size = 82709 }, - { url = "https://files.pythonhosted.org/packages/74/2b/73d767bfdaab25484f7e7901379d5f8793cccbb86c6e0cbc4c1b96f63896/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", size = 83613 }, - { url = "https://files.pythonhosted.org/packages/4f/fd/37f86deef67ff57c76f137a67181949c2d408077e2e3dd70c6c42912c9bf/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", size = 84583 }, - { url = "https://files.pythonhosted.org/packages/6f/52/5a60085a3dae8fded8327a4f564223029f5f54b0cb0455a31131b5363a01/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", size = 88475 }, - { url = "https://files.pythonhosted.org/packages/8b/95/143cd64feb24a15fa4b189a3e1e7efbaeeb00f39a51e99b26fc62fbacabd/argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", size = 27698 }, - { url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", size = 30817 }, - { url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", size = 53104 }, + { url = "https://files.pythonhosted.org/packages/d4/13/838ce2620025e9666aa8f686431f67a29052241692a3dd1ae9d3692a89d3/argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", size = 29658, upload_time = "2021-12-01T09:09:17.016Z" }, + { url = "https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", size = 80583, upload_time = "2021-12-01T09:09:19.546Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", size = 86168, upload_time = "2021-12-01T09:09:21.445Z" }, + { url = "https://files.pythonhosted.org/packages/74/f6/4a34a37a98311ed73bb80efe422fed95f2ac25a4cacc5ae1d7ae6a144505/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", size = 82709, upload_time = "2021-12-01T09:09:18.182Z" }, + { url = "https://files.pythonhosted.org/packages/74/2b/73d767bfdaab25484f7e7901379d5f8793cccbb86c6e0cbc4c1b96f63896/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", size = 83613, upload_time = "2021-12-01T09:09:22.741Z" }, + { url = "https://files.pythonhosted.org/packages/4f/fd/37f86deef67ff57c76f137a67181949c2d408077e2e3dd70c6c42912c9bf/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", size = 84583, upload_time = "2021-12-01T09:09:24.177Z" }, + { url = "https://files.pythonhosted.org/packages/6f/52/5a60085a3dae8fded8327a4f564223029f5f54b0cb0455a31131b5363a01/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", size = 88475, upload_time = "2021-12-01T09:09:26.673Z" }, + { url = "https://files.pythonhosted.org/packages/8b/95/143cd64feb24a15fa4b189a3e1e7efbaeeb00f39a51e99b26fc62fbacabd/argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", size = 27698, upload_time = "2021-12-01T09:09:27.87Z" }, + { url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", size = 30817, upload_time = "2021-12-01T09:09:30.267Z" }, + { url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", size = 53104, upload_time = "2021-12-01T09:09:31.335Z" }, ] [[package]] @@ -440,45 +444,45 @@ dependencies = [ { name = "python-dateutil" }, { name = "types-python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/00/0f6e8fcdb23ea632c866620cc872729ff43ed91d284c866b515c6342b173/arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85", size = 131960 } +sdist = { url = "https://files.pythonhosted.org/packages/2e/00/0f6e8fcdb23ea632c866620cc872729ff43ed91d284c866b515c6342b173/arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85", size = 131960, upload_time = "2023-09-30T22:11:18.25Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", size = 66419 }, + { url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", size = 66419, upload_time = "2023-09-30T22:11:16.072Z" }, ] [[package]] name = "asgiref" version = "3.8.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/29/38/b3395cc9ad1b56d2ddac9970bc8f4141312dbaec28bc7c218b0dfafd0f42/asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590", size = 35186 } +sdist = { url = "https://files.pythonhosted.org/packages/29/38/b3395cc9ad1b56d2ddac9970bc8f4141312dbaec28bc7c218b0dfafd0f42/asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590", size = 35186, upload_time = "2024-03-22T14:39:36.863Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", size = 23828 }, + { url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", size = 23828, upload_time = "2024-03-22T14:39:34.521Z" }, ] [[package]] name = "asttokens" version = "3.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload_time = "2024-11-30T04:30:14.439Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload_time = "2024-11-30T04:30:10.946Z" }, ] [[package]] name = "async-lru" version = "2.0.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/4d/71ec4d3939dc755264f680f6c2b4906423a304c3d18e96853f0a595dfe97/async_lru-2.0.5.tar.gz", hash = "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb", size = 10380 } +sdist = { url = "https://files.pythonhosted.org/packages/b2/4d/71ec4d3939dc755264f680f6c2b4906423a304c3d18e96853f0a595dfe97/async_lru-2.0.5.tar.gz", hash = "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb", size = 10380, upload_time = "2025-03-16T17:25:36.919Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl", hash = "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943", size = 6069 }, + { url = "https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl", hash = "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943", size = 6069, upload_time = "2025-03-16T17:25:35.422Z" }, ] [[package]] name = "attrs" version = "25.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload_time = "2025-03-13T11:10:22.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload_time = "2025-03-13T11:10:21.14Z" }, ] [[package]] @@ -491,7 +495,7 @@ dependencies = [ { name = "sphinx" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl", hash = "sha256:8c6a36fbf6ed2700ea9c6d21ea76ad541b621fbdf16b5a80ee04673548af4d95", size = 34001 }, + { url = "https://files.pythonhosted.org/packages/7b/df/87120e2195f08d760bc5cf8a31cfa2381a6887517aa89453b23f1ae3354f/autodoc_pydantic-2.2.0-py3-none-any.whl", hash = "sha256:8c6a36fbf6ed2700ea9c6d21ea76ad541b621fbdf16b5a80ee04673548af4d95", size = 34001, upload_time = "2024-04-27T10:57:00.542Z" }, ] [[package]] @@ -501,40 +505,40 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/03/96/92afe8a7912b327c01f0a8b6408c9556ee13b1aba5b98d587ac7327ff32d/autodocsumm-0.2.14.tar.gz", hash = "sha256:2839a9d4facc3c4eccd306c08695540911042b46eeafcdc3203e6d0bab40bc77", size = 46357 } +sdist = { url = "https://files.pythonhosted.org/packages/03/96/92afe8a7912b327c01f0a8b6408c9556ee13b1aba5b98d587ac7327ff32d/autodocsumm-0.2.14.tar.gz", hash = "sha256:2839a9d4facc3c4eccd306c08695540911042b46eeafcdc3203e6d0bab40bc77", size = 46357, upload_time = "2024-10-23T18:51:47.369Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/bc/3f66af9beb683728e06ca08797e4e9d3e44f432f339718cae3ba856a9cad/autodocsumm-0.2.14-py3-none-any.whl", hash = "sha256:3bad8717fc5190802c60392a7ab04b9f3c97aa9efa8b3780b3d81d615bfe5dc0", size = 14640 }, + { url = "https://files.pythonhosted.org/packages/87/bc/3f66af9beb683728e06ca08797e4e9d3e44f432f339718cae3ba856a9cad/autodocsumm-0.2.14-py3-none-any.whl", hash = "sha256:3bad8717fc5190802c60392a7ab04b9f3c97aa9efa8b3780b3d81d615bfe5dc0", size = 14640, upload_time = "2024-10-23T18:51:45.115Z" }, ] [[package]] name = "babel" version = "2.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852 } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload_time = "2025-02-01T15:17:41.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload_time = "2025-02-01T15:17:37.39Z" }, ] [[package]] name = "beautifulsoup4" -version = "4.13.3" +version = "4.13.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f0/3c/adaf39ce1fb4afdd21b611e3d530b183bb7759c9b673d60db0e347fd4439/beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b", size = 619516 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload_time = "2025-04-15T17:05:13.836Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload_time = "2025-04-15T17:05:12.221Z" }, ] [[package]] name = "bidict" version = "0.23.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9a/6e/026678aa5a830e07cd9498a05d3e7e650a4f56a42f267a53d22bcda1bdc9/bidict-0.23.1.tar.gz", hash = "sha256:03069d763bc387bbd20e7d49914e75fc4132a41937fa3405417e1a5a2d006d71", size = 29093 } +sdist = { url = "https://files.pythonhosted.org/packages/9a/6e/026678aa5a830e07cd9498a05d3e7e650a4f56a42f267a53d22bcda1bdc9/bidict-0.23.1.tar.gz", hash = "sha256:03069d763bc387bbd20e7d49914e75fc4132a41937fa3405417e1a5a2d006d71", size = 29093, upload_time = "2024-02-18T19:09:05.748Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5", size = 32764 }, + { url = "https://files.pythonhosted.org/packages/99/37/e8730c3587a65eb5645d4aba2d27aae48e8003614d6aaf15dda67f702f1f/bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5", size = 32764, upload_time = "2024-02-18T19:09:04.156Z" }, ] [[package]] @@ -544,9 +548,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083 } +sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload_time = "2024-10-29T18:30:40.477Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406 }, + { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406, upload_time = "2024-10-29T18:30:38.186Z" }, ] [package.optional-dependencies] @@ -558,64 +562,64 @@ css = [ name = "blinker" version = "1.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460 } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload_time = "2024-11-08T17:25:47.436Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458 }, + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload_time = "2024-11-08T17:25:46.184Z" }, ] [[package]] name = "boolean-py" version = "5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047 } +sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047, upload_time = "2025-04-03T10:39:49.734Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577 }, + { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload_time = "2025-04-03T10:39:48.449Z" }, ] [[package]] name = "boto3" -version = "1.37.28" +version = "1.38.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, { name = "jmespath" }, { name = "s3transfer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/f5/dd50ed0a20019fa38c22797718c80d38e8b75b5e97c971a908c638e819aa/boto3-1.37.28.tar.gz", hash = "sha256:09ee85ba70a88286bba0d1bf5f0460a4b3bde52d162216accfe637b8bfac351b", size = 111385 } +sdist = { url = "https://files.pythonhosted.org/packages/61/ce/d6fbf9cdda1b40023ef60507adc1de1d7ba0786dc73ddca59f4bed487e40/boto3-1.38.3.tar.gz", hash = "sha256:655d51abcd68a40a33c52dbaa2ca73fc63c746b894e2ae22ed8ddc1912ddd93f", size = 111816, upload_time = "2025-04-25T19:22:41.656Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/76/2723dede8c69d04e37f0897e9c05b597b6906df3d4c80186e39a0bc1b914/boto3-1.37.28-py3-none-any.whl", hash = "sha256:e584d9d33808633e73af3d962e22cf2cea91a38bc5a17577bb25618f8ded504f", size = 139562 }, + { url = "https://files.pythonhosted.org/packages/c1/cb/9f6cdbb1e6194064d40ce7ef04a276822aacf036dc8d03d7d156c4701290/boto3-1.38.3-py3-none-any.whl", hash = "sha256:9218f86e2164e1bddb75d435bbde4fa651aa58687213d7e3e1b50f7eb8868f66", size = 139897, upload_time = "2025-04-25T19:22:38.747Z" }, ] [[package]] name = "botocore" -version = "1.37.28" +version = "1.38.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/90/557082a8379ece106b37eb00766efc7a32cbfcdaa0d1d78f38f99eefd218/botocore-1.37.28.tar.gz", hash = "sha256:69ea327f70f0607d174c4c2b1dcc87327b9c48e413c9d322179172b614b28e03", size = 13799915 } +sdist = { url = "https://files.pythonhosted.org/packages/92/ee/b47c0286ada750271897f5cc3e40b4405f1218ff392cd15df993893f0099/botocore-1.38.3.tar.gz", hash = "sha256:790f8f966201781f5fcf486d48b4492e9f734446bbf9d19ef8159d08be854243", size = 13846441, upload_time = "2025-04-25T19:22:27.881Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/c3/29ffcb4c90492bcfcff1b7e5ddb5529846acc0e627569432db9842c47675/botocore-1.37.28-py3-none-any.whl", hash = "sha256:c26b645d7b125bf42ffc1671b862b47500ee658e3a1c95d2438cb689fc85df15", size = 13467675 }, + { url = "https://files.pythonhosted.org/packages/b7/d1/2b9e417b0212339f14b853aa4391b0121c11308f968798c874e74f265080/botocore-1.38.3-py3-none-any.whl", hash = "sha256:96f823240fe3704b99c17d1d1b2fd2d1679cf56d2a55b095f00255b76087cbf0", size = 13506578, upload_time = "2025-04-25T19:22:22.472Z" }, ] [[package]] name = "bottle" -version = "0.13.2" +version = "0.13.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/97839b95c2a2ea1ca91877a846988f90f4ca16ee42c0bb79e079171c0c06/bottle-0.13.2.tar.gz", hash = "sha256:e53803b9d298c7d343d00ba7d27b0059415f04b9f6f40b8d58b5bf914ba9d348", size = 98472 } +sdist = { url = "https://files.pythonhosted.org/packages/f5/3b/efa9540213c71be3500e14592c5823bd3f9ddd881d306e01b5dd490ddab5/bottle-0.13.3.tar.gz", hash = "sha256:1c23aeb30aa8a13f39c60c0da494530ddd5de3da235bc431b818a50d999de49f", size = 98555, upload_time = "2025-04-21T11:48:36.107Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/0a/a5260c758ff813acc6967344339aa7ba15f815575f4d49141685c4345d39/bottle-0.13.2-py2.py3-none-any.whl", hash = "sha256:27569ab8d1332fbba3e400b3baab2227ab4efb4882ff147af05a7c00ed73409c", size = 104053 }, + { url = "https://files.pythonhosted.org/packages/7b/b1/a6d4ef30ebfa0f62aedd437d81130075afc32266f7f6baf2cddf4b41ac2a/bottle-0.13.3-py2.py3-none-any.whl", hash = "sha256:551709073d750d2e88ade05915f0d5dbbbcb8e1d82573fbe85a0635eb842ab07", size = 104151, upload_time = "2025-04-21T11:48:34.257Z" }, ] [[package]] name = "bracex" version = "2.5.post1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/6c/57418c4404cd22fe6275b8301ca2b46a8cdaa8157938017a9ae0b3edf363/bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6", size = 26641 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/6c/57418c4404cd22fe6275b8301ca2b46a8cdaa8157938017a9ae0b3edf363/bracex-2.5.post1.tar.gz", hash = "sha256:12c50952415bfa773d2d9ccb8e79651b8cdb1f31a42f6091b804f6ba2b4a66b6", size = 26641, upload_time = "2024-09-28T21:41:22.017Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/02/8db98cdc1a58e0abd6716d5e63244658e6e63513c65f469f34b6f1053fd0/bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6", size = 11558 }, + { url = "https://files.pythonhosted.org/packages/4b/02/8db98cdc1a58e0abd6716d5e63244658e6e63513c65f469f34b6f1053fd0/bracex-2.5.post1-py3-none-any.whl", hash = "sha256:13e5732fec27828d6af308628285ad358047cec36801598368cb28bc631dbaf6", size = 11558, upload_time = "2024-09-28T21:41:21.016Z" }, ] [[package]] @@ -633,9 +637,9 @@ dependencies = [ { name = "tomlkit" }, { name = "wcmatch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/13/0a/544e8eb6d46baa99bf16d180b4ddb4509631fa8476e686c8e6c47681afb4/bump_my_version-1.1.2.tar.gz", hash = "sha256:0122845a78502b5a5a635ca17c1efb3e1ec05e77d72d13b2314186b9806882fb", size = 1120309 } +sdist = { url = "https://files.pythonhosted.org/packages/13/0a/544e8eb6d46baa99bf16d180b4ddb4509631fa8476e686c8e6c47681afb4/bump_my_version-1.1.2.tar.gz", hash = "sha256:0122845a78502b5a5a635ca17c1efb3e1ec05e77d72d13b2314186b9806882fb", size = 1120309, upload_time = "2025-04-12T14:21:02.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/a9/026894e86ce2838d029af1344c71fd57560d1b6e2ce6513c340cbf8e00cb/bump_my_version-1.1.2-py3-none-any.whl", hash = "sha256:71a2a8c3940c87749c4cc404b2ada2fafbeab4e478e0ef54537686905ae58e0d", size = 59495 }, + { url = "https://files.pythonhosted.org/packages/dc/a9/026894e86ce2838d029af1344c71fd57560d1b6e2ce6513c340cbf8e00cb/bump_my_version-1.1.2-py3-none-any.whl", hash = "sha256:71a2a8c3940c87749c4cc404b2ada2fafbeab4e478e0ef54537686905ae58e0d", size = 59495, upload_time = "2025-04-12T14:21:00.872Z" }, ] [[package]] @@ -646,9 +650,9 @@ dependencies = [ { name = "msgpack" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/a4/3390ac4dfa1773f661c8780368018230e8207ec4fd3800d2c0c3adee4456/cachecontrol-0.14.2.tar.gz", hash = "sha256:7d47d19f866409b98ff6025b6a0fca8e4c791fb31abbd95f622093894ce903a2", size = 28832 } +sdist = { url = "https://files.pythonhosted.org/packages/b7/a4/3390ac4dfa1773f661c8780368018230e8207ec4fd3800d2c0c3adee4456/cachecontrol-0.14.2.tar.gz", hash = "sha256:7d47d19f866409b98ff6025b6a0fca8e4c791fb31abbd95f622093894ce903a2", size = 28832, upload_time = "2025-01-07T15:48:23.709Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/63/baffb44ca6876e7b5fc8fe17b24a7c07bf479d604a592182db9af26ea366/cachecontrol-0.14.2-py3-none-any.whl", hash = "sha256:ebad2091bf12d0d200dfc2464330db638c5deb41d546f6d7aca079e87290f3b0", size = 21780 }, + { url = "https://files.pythonhosted.org/packages/c8/63/baffb44ca6876e7b5fc8fe17b24a7c07bf479d604a592182db9af26ea366/cachecontrol-0.14.2-py3-none-any.whl", hash = "sha256:ebad2091bf12d0d200dfc2464330db638c5deb41d546f6d7aca079e87290f3b0", size = 21780, upload_time = "2025-01-07T15:48:21.034Z" }, ] [package.optional-dependencies] @@ -660,18 +664,18 @@ filecache = [ name = "cachetools" version = "5.5.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380 } +sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380, upload_time = "2025-02-20T21:01:19.524Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080 }, + { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload_time = "2025-02-20T21:01:16.647Z" }, ] [[package]] name = "certifi" -version = "2025.1.31" +version = "2025.4.26" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } +sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705, upload_time = "2025-04-26T02:12:29.51Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, + { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618, upload_time = "2025-04-26T02:12:27.662Z" }, ] [[package]] @@ -681,108 +685,108 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload_time = "2024-09-04T20:45:21.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload_time = "2024-09-04T20:43:51.124Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload_time = "2024-09-04T20:43:52.872Z" }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload_time = "2024-09-04T20:43:56.123Z" }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload_time = "2024-09-04T20:43:57.891Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload_time = "2024-09-04T20:44:00.18Z" }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload_time = "2024-09-04T20:44:01.585Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload_time = "2024-09-04T20:44:03.467Z" }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload_time = "2024-09-04T20:44:05.023Z" }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload_time = "2024-09-04T20:44:06.444Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload_time = "2024-09-04T20:44:08.206Z" }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload_time = "2024-09-04T20:44:09.481Z" }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload_time = "2024-09-04T20:44:10.873Z" }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload_time = "2024-09-04T20:44:12.232Z" }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload_time = "2024-09-04T20:44:13.739Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload_time = "2024-09-04T20:44:15.231Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload_time = "2024-09-04T20:44:17.188Z" }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload_time = "2024-09-04T20:44:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload_time = "2024-09-04T20:44:20.248Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload_time = "2024-09-04T20:44:21.673Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload_time = "2024-09-04T20:44:23.245Z" }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload_time = "2024-09-04T20:44:24.757Z" }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload_time = "2024-09-04T20:44:26.208Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload_time = "2024-09-04T20:44:27.578Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload_time = "2024-09-04T20:44:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload_time = "2024-09-04T20:44:30.289Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload_time = "2024-09-04T20:44:32.01Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload_time = "2024-09-04T20:44:33.606Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload_time = "2024-09-04T20:44:35.191Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload_time = "2024-09-04T20:44:36.743Z" }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload_time = "2024-09-04T20:44:38.492Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload_time = "2024-09-04T20:44:40.046Z" }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload_time = "2024-09-04T20:44:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload_time = "2024-09-04T20:44:43.733Z" }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload_time = "2024-09-04T20:44:45.309Z" }, ] [[package]] name = "cfgv" version = "3.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload_time = "2023-08-12T20:38:17.776Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload_time = "2023-08-12T20:38:16.269Z" }, ] [[package]] name = "chardet" version = "5.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618 } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/f7b6ab21ec75897ed80c17d79b15951a719226b9fababf1e40ea74d69079/chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", size = 2069618, upload_time = "2023-08-01T19:23:02.662Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385 }, + { url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970", size = 199385, upload_time = "2023-08-01T19:23:00.661Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, - { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, - { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, - { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, - { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, - { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, - { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, - { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, - { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, - { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, - { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, - { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, - { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, - { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, - { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, - { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, - { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, - { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, - { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, - { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, - { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, - { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, - { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, - { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, - { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, - { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, - { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, - { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, - { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, - { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, - { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, - { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, - { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, - { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, - { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, - { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, - { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, - { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, - { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188, upload_time = "2024-12-24T18:12:35.43Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995, upload_time = "2024-12-24T18:10:12.838Z" }, + { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471, upload_time = "2024-12-24T18:10:14.101Z" }, + { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831, upload_time = "2024-12-24T18:10:15.512Z" }, + { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335, upload_time = "2024-12-24T18:10:18.369Z" }, + { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862, upload_time = "2024-12-24T18:10:19.743Z" }, + { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673, upload_time = "2024-12-24T18:10:21.139Z" }, + { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211, upload_time = "2024-12-24T18:10:22.382Z" }, + { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039, upload_time = "2024-12-24T18:10:24.802Z" }, + { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939, upload_time = "2024-12-24T18:10:26.124Z" }, + { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075, upload_time = "2024-12-24T18:10:30.027Z" }, + { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340, upload_time = "2024-12-24T18:10:32.679Z" }, + { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205, upload_time = "2024-12-24T18:10:34.724Z" }, + { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441, upload_time = "2024-12-24T18:10:37.574Z" }, + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105, upload_time = "2024-12-24T18:10:38.83Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404, upload_time = "2024-12-24T18:10:44.272Z" }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423, upload_time = "2024-12-24T18:10:45.492Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184, upload_time = "2024-12-24T18:10:47.898Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268, upload_time = "2024-12-24T18:10:50.589Z" }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601, upload_time = "2024-12-24T18:10:52.541Z" }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098, upload_time = "2024-12-24T18:10:53.789Z" }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520, upload_time = "2024-12-24T18:10:55.048Z" }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852, upload_time = "2024-12-24T18:10:57.647Z" }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488, upload_time = "2024-12-24T18:10:59.43Z" }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192, upload_time = "2024-12-24T18:11:00.676Z" }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550, upload_time = "2024-12-24T18:11:01.952Z" }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785, upload_time = "2024-12-24T18:11:03.142Z" }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698, upload_time = "2024-12-24T18:11:05.834Z" }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162, upload_time = "2024-12-24T18:11:07.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263, upload_time = "2024-12-24T18:11:08.374Z" }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966, upload_time = "2024-12-24T18:11:09.831Z" }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992, upload_time = "2024-12-24T18:11:12.03Z" }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162, upload_time = "2024-12-24T18:11:13.372Z" }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972, upload_time = "2024-12-24T18:11:14.628Z" }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095, upload_time = "2024-12-24T18:11:17.672Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668, upload_time = "2024-12-24T18:11:18.989Z" }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073, upload_time = "2024-12-24T18:11:21.507Z" }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732, upload_time = "2024-12-24T18:11:22.774Z" }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391, upload_time = "2024-12-24T18:11:24.139Z" }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702, upload_time = "2024-12-24T18:11:26.535Z" }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767, upload_time = "2024-12-24T18:12:32.852Z" }, ] [[package]] @@ -792,18 +796,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload_time = "2024-12-21T18:38:44.339Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload_time = "2024-12-21T18:38:41.666Z" }, ] [[package]] name = "cloudpathlib" version = "0.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5f/54/71e828c2e415024783f92ee942d3223f6f94cf3fe2e48689b0f3bbb5b608/cloudpathlib-0.21.0.tar.gz", hash = "sha256:fb8f6b890a3d37b35f0eabff86721bb8d35dfc6a6be98c1f4d34b19e989c6641", size = 45271 } +sdist = { url = "https://files.pythonhosted.org/packages/5f/54/71e828c2e415024783f92ee942d3223f6f94cf3fe2e48689b0f3bbb5b608/cloudpathlib-0.21.0.tar.gz", hash = "sha256:fb8f6b890a3d37b35f0eabff86721bb8d35dfc6a6be98c1f4d34b19e989c6641", size = 45271, upload_time = "2025-03-04T01:13:38.118Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/0f/b1a9b09a84ef98b9fc38d50c6b2815cb2256b804a78e7d838ddfbdc035c7/cloudpathlib-0.21.0-py3-none-any.whl", hash = "sha256:657e95ecd2663f1123b6daa95d49aca4b4bc8a9fa90c07930bdba2c5e295e5ef", size = 52744, upload_time = "2025-03-04T01:13:36.41Z" }, +] + +[[package]] +name = "cloudpickle" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/39/069100b84d7418bc358d81669d5748efb14b9cceacd2f9c75f550424132f/cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64", size = 22113, upload_time = "2025-01-14T17:02:05.085Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/0f/b1a9b09a84ef98b9fc38d50c6b2815cb2256b804a78e7d838ddfbdc035c7/cloudpathlib-0.21.0-py3-none-any.whl", hash = "sha256:657e95ecd2663f1123b6daa95d49aca4b4bc8a9fa90c07930bdba2c5e295e5ef", size = 52744 }, + { url = "https://files.pythonhosted.org/packages/7e/e8/64c37fadfc2816a7701fa8a6ed8d87327c7d54eacfbfb6edab14a2f2be75/cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e", size = 20992, upload_time = "2025-01-14T17:02:02.417Z" }, ] [[package]] @@ -813,18 +826,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d5/b3/8ae917e458394e2cebdbf17bed0a8204f8d4ffc79a093a7b1141c7731d3c/clr_loader-0.2.7.post0.tar.gz", hash = "sha256:b7a8b3f8fbb1bcbbb6382d887e21d1742d4f10b5ea209e4ad95568fe97e1c7c6", size = 56701 } +sdist = { url = "https://files.pythonhosted.org/packages/d5/b3/8ae917e458394e2cebdbf17bed0a8204f8d4ffc79a093a7b1141c7731d3c/clr_loader-0.2.7.post0.tar.gz", hash = "sha256:b7a8b3f8fbb1bcbbb6382d887e21d1742d4f10b5ea209e4ad95568fe97e1c7c6", size = 56701, upload_time = "2024-12-12T20:15:15.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/c0/06e64a54bced4e8b885c1e7ec03ee1869e52acf69e87da40f92391a214ad/clr_loader-0.2.7.post0-py3-none-any.whl", hash = "sha256:e0b9fcc107d48347a4311a28ffe3ae78c4968edb216ffb6564cb03f7ace0bb47", size = 50649 }, + { url = "https://files.pythonhosted.org/packages/9c/c0/06e64a54bced4e8b885c1e7ec03ee1869e52acf69e87da40f92391a214ad/clr_loader-0.2.7.post0-py3-none-any.whl", hash = "sha256:e0b9fcc107d48347a4311a28ffe3ae78c4968edb216ffb6564cb03f7ace0bb47", size = 50649, upload_time = "2024-12-12T20:15:13.714Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload_time = "2022-10-25T02:36:22.414Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload_time = "2022-10-25T02:36:20.889Z" }, ] [[package]] @@ -834,9 +847,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d3/7a/359f4d5df2353f26172b3cc39ea32daa39af8de522205f512f458923e677/colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2", size = 16624 } +sdist = { url = "https://files.pythonhosted.org/packages/d3/7a/359f4d5df2353f26172b3cc39ea32daa39af8de522205f512f458923e677/colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2", size = 16624, upload_time = "2024-10-29T18:34:51.011Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/51/9b208e85196941db2f0654ad0357ca6388ab3ed67efdbfc799f35d1f83aa/colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff", size = 11424 }, + { url = "https://files.pythonhosted.org/packages/e3/51/9b208e85196941db2f0654ad0357ca6388ab3ed67efdbfc799f35d1f83aa/colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff", size = 11424, upload_time = "2024-10-29T18:34:49.815Z" }, ] [[package]] @@ -846,110 +859,113 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 } +sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210, upload_time = "2024-03-12T16:53:41.133Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180, upload_time = "2024-03-12T16:53:39.226Z" }, ] [[package]] name = "contourpy" -version = "1.3.1" +version = "1.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/c2/fc7193cc5383637ff390a712e88e4ded0452c9fbcf84abe3de5ea3df1866/contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699", size = 13465753 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/bb/11250d2906ee2e8b466b5f93e6b19d525f3e0254ac8b445b56e618527718/contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b", size = 269555 }, - { url = "https://files.pythonhosted.org/packages/67/71/1e6e95aee21a500415f5d2dbf037bf4567529b6a4e986594d7026ec5ae90/contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc", size = 254549 }, - { url = "https://files.pythonhosted.org/packages/31/2c/b88986e8d79ac45efe9d8801ae341525f38e087449b6c2f2e6050468a42c/contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86", size = 313000 }, - { url = "https://files.pythonhosted.org/packages/c4/18/65280989b151fcf33a8352f992eff71e61b968bef7432fbfde3a364f0730/contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6", size = 352925 }, - { url = "https://files.pythonhosted.org/packages/f5/c7/5fd0146c93220dbfe1a2e0f98969293b86ca9bc041d6c90c0e065f4619ad/contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85", size = 323693 }, - { url = "https://files.pythonhosted.org/packages/85/fc/7fa5d17daf77306840a4e84668a48ddff09e6bc09ba4e37e85ffc8e4faa3/contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c", size = 326184 }, - { url = "https://files.pythonhosted.org/packages/ef/e7/104065c8270c7397c9571620d3ab880558957216f2b5ebb7e040f85eeb22/contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291", size = 1268031 }, - { url = "https://files.pythonhosted.org/packages/e2/4a/c788d0bdbf32c8113c2354493ed291f924d4793c4a2e85b69e737a21a658/contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f", size = 1325995 }, - { url = "https://files.pythonhosted.org/packages/a6/e6/a2f351a90d955f8b0564caf1ebe4b1451a3f01f83e5e3a414055a5b8bccb/contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375", size = 174396 }, - { url = "https://files.pythonhosted.org/packages/a8/7e/cd93cab453720a5d6cb75588cc17dcdc08fc3484b9de98b885924ff61900/contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9", size = 219787 }, - { url = "https://files.pythonhosted.org/packages/37/6b/175f60227d3e7f5f1549fcb374592be311293132207e451c3d7c654c25fb/contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509", size = 271494 }, - { url = "https://files.pythonhosted.org/packages/6b/6a/7833cfae2c1e63d1d8875a50fd23371394f540ce809d7383550681a1fa64/contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc", size = 255444 }, - { url = "https://files.pythonhosted.org/packages/7f/b3/7859efce66eaca5c14ba7619791b084ed02d868d76b928ff56890d2d059d/contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454", size = 307628 }, - { url = "https://files.pythonhosted.org/packages/48/b2/011415f5e3f0a50b1e285a0bf78eb5d92a4df000553570f0851b6e309076/contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80", size = 347271 }, - { url = "https://files.pythonhosted.org/packages/84/7d/ef19b1db0f45b151ac78c65127235239a8cf21a59d1ce8507ce03e89a30b/contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec", size = 318906 }, - { url = "https://files.pythonhosted.org/packages/ba/99/6794142b90b853a9155316c8f470d2e4821fe6f086b03e372aca848227dd/contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9", size = 323622 }, - { url = "https://files.pythonhosted.org/packages/3c/0f/37d2c84a900cd8eb54e105f4fa9aebd275e14e266736778bb5dccbf3bbbb/contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b", size = 1266699 }, - { url = "https://files.pythonhosted.org/packages/3a/8a/deb5e11dc7d9cc8f0f9c8b29d4f062203f3af230ba83c30a6b161a6effc9/contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d", size = 1326395 }, - { url = "https://files.pythonhosted.org/packages/1a/35/7e267ae7c13aaf12322ccc493531f1e7f2eb8fba2927b9d7a05ff615df7a/contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e", size = 175354 }, - { url = "https://files.pythonhosted.org/packages/a1/35/c2de8823211d07e8a79ab018ef03960716c5dff6f4d5bff5af87fd682992/contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d", size = 220971 }, - { url = "https://files.pythonhosted.org/packages/9a/e7/de62050dce687c5e96f946a93546910bc67e483fe05324439e329ff36105/contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2", size = 271548 }, - { url = "https://files.pythonhosted.org/packages/78/4d/c2a09ae014ae984c6bdd29c11e74d3121b25eaa117eca0bb76340efd7e1c/contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5", size = 255576 }, - { url = "https://files.pythonhosted.org/packages/ab/8a/915380ee96a5638bda80cd061ccb8e666bfdccea38d5741cb69e6dbd61fc/contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81", size = 306635 }, - { url = "https://files.pythonhosted.org/packages/29/5c/c83ce09375428298acd4e6582aeb68b1e0d1447f877fa993d9bf6cd3b0a0/contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2", size = 345925 }, - { url = "https://files.pythonhosted.org/packages/29/63/5b52f4a15e80c66c8078a641a3bfacd6e07106835682454647aca1afc852/contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7", size = 318000 }, - { url = "https://files.pythonhosted.org/packages/9a/e2/30ca086c692691129849198659bf0556d72a757fe2769eb9620a27169296/contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c", size = 322689 }, - { url = "https://files.pythonhosted.org/packages/6b/77/f37812ef700f1f185d348394debf33f22d531e714cf6a35d13d68a7003c7/contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3", size = 1268413 }, - { url = "https://files.pythonhosted.org/packages/3f/6d/ce84e79cdd128542ebeb268f84abb4b093af78e7f8ec504676673d2675bc/contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1", size = 1326530 }, - { url = "https://files.pythonhosted.org/packages/72/22/8282f4eae20c73c89bee7a82a19c4e27af9b57bb602ecaa00713d5bdb54d/contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82", size = 175315 }, - { url = "https://files.pythonhosted.org/packages/e3/d5/28bca491f65312b438fbf076589dcde7f6f966b196d900777f5811b9c4e2/contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd", size = 220987 }, - { url = "https://files.pythonhosted.org/packages/2f/24/a4b285d6adaaf9746e4700932f579f1a7b6f9681109f694cfa233ae75c4e/contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30", size = 285001 }, - { url = "https://files.pythonhosted.org/packages/48/1d/fb49a401b5ca4f06ccf467cd6c4f1fd65767e63c21322b29b04ec40b40b9/contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751", size = 268553 }, - { url = "https://files.pythonhosted.org/packages/79/1e/4aef9470d13fd029087388fae750dccb49a50c012a6c8d1d634295caa644/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342", size = 310386 }, - { url = "https://files.pythonhosted.org/packages/b0/34/910dc706ed70153b60392b5305c708c9810d425bde12499c9184a1100888/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c", size = 349806 }, - { url = "https://files.pythonhosted.org/packages/31/3c/faee6a40d66d7f2a87f7102236bf4780c57990dd7f98e5ff29881b1b1344/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f", size = 321108 }, - { url = "https://files.pythonhosted.org/packages/17/69/390dc9b20dd4bb20585651d7316cc3054b7d4a7b4f8b710b2b698e08968d/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda", size = 327291 }, - { url = "https://files.pythonhosted.org/packages/ef/74/7030b67c4e941fe1e5424a3d988080e83568030ce0355f7c9fc556455b01/contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242", size = 1263752 }, - { url = "https://files.pythonhosted.org/packages/f0/ed/92d86f183a8615f13f6b9cbfc5d4298a509d6ce433432e21da838b4b63f4/contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1", size = 1318403 }, - { url = "https://files.pythonhosted.org/packages/b3/0e/c8e4950c77dcfc897c71d61e56690a0a9df39543d2164040301b5df8e67b/contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1", size = 185117 }, - { url = "https://files.pythonhosted.org/packages/c1/31/1ae946f11dfbd229222e6d6ad8e7bd1891d3d48bde5fbf7a0beb9491f8e3/contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546", size = 236668 }, +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload_time = "2025-04-15T17:47:53.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636, upload_time = "2025-04-15T17:35:54.473Z" }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636, upload_time = "2025-04-15T17:35:58.283Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053, upload_time = "2025-04-15T17:36:03.235Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985, upload_time = "2025-04-15T17:36:08.275Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750, upload_time = "2025-04-15T17:36:13.29Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246, upload_time = "2025-04-15T17:36:18.329Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728, upload_time = "2025-04-15T17:36:33.878Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload_time = "2025-04-15T17:36:51.295Z" }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload_time = "2025-04-15T17:36:55.002Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload_time = "2025-04-15T17:36:58.576Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload_time = "2025-04-15T17:37:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload_time = "2025-04-15T17:37:07.026Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload_time = "2025-04-15T17:37:11.481Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload_time = "2025-04-15T17:37:18.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload_time = "2025-04-15T17:37:22.76Z" }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload_time = "2025-04-15T17:37:33.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload_time = "2025-04-15T17:37:48.64Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload_time = "2025-04-15T17:38:06.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload_time = "2025-04-15T17:38:10.338Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload_time = "2025-04-15T17:38:14.239Z" }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630, upload_time = "2025-04-15T17:38:19.142Z" }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670, upload_time = "2025-04-15T17:38:23.688Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694, upload_time = "2025-04-15T17:38:28.238Z" }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986, upload_time = "2025-04-15T17:38:33.502Z" }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060, upload_time = "2025-04-15T17:38:38.672Z" }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747, upload_time = "2025-04-15T17:38:43.712Z" }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895, upload_time = "2025-04-15T17:39:00.224Z" }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098, upload_time = "2025-04-15T17:43:29.649Z" }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535, upload_time = "2025-04-15T17:44:44.532Z" }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096, upload_time = "2025-04-15T17:44:48.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090, upload_time = "2025-04-15T17:43:34.084Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643, upload_time = "2025-04-15T17:43:38.626Z" }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443, upload_time = "2025-04-15T17:43:44.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865, upload_time = "2025-04-15T17:43:49.545Z" }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162, upload_time = "2025-04-15T17:43:54.203Z" }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355, upload_time = "2025-04-15T17:44:01.025Z" }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935, upload_time = "2025-04-15T17:44:17.322Z" }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168, upload_time = "2025-04-15T17:44:33.43Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550, upload_time = "2025-04-15T17:44:37.092Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214, upload_time = "2025-04-15T17:44:40.827Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807, upload_time = "2025-04-15T17:45:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729, upload_time = "2025-04-15T17:45:20.166Z" }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload_time = "2025-04-15T17:45:24.794Z" }, ] [[package]] name = "coverage" version = "7.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/4f/2251e65033ed2ce1e68f00f91a0294e0f80c80ae8c3ebbe2f12828c4cd53/coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501", size = 811872 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/77/074d201adb8383addae5784cb8e2dac60bb62bfdf28b2b10f3a3af2fda47/coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27", size = 211493 }, - { url = "https://files.pythonhosted.org/packages/a9/89/7a8efe585750fe59b48d09f871f0e0c028a7b10722b2172dfe021fa2fdd4/coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea", size = 211921 }, - { url = "https://files.pythonhosted.org/packages/e9/ef/96a90c31d08a3f40c49dbe897df4f1fd51fb6583821a1a1c5ee30cc8f680/coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7", size = 244556 }, - { url = "https://files.pythonhosted.org/packages/89/97/dcd5c2ce72cee9d7b0ee8c89162c24972fb987a111b92d1a3d1d19100c61/coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040", size = 242245 }, - { url = "https://files.pythonhosted.org/packages/b2/7b/b63cbb44096141ed435843bbb251558c8e05cc835c8da31ca6ffb26d44c0/coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543", size = 244032 }, - { url = "https://files.pythonhosted.org/packages/97/e3/7fa8c2c00a1ef530c2a42fa5df25a6971391f92739d83d67a4ee6dcf7a02/coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2", size = 243679 }, - { url = "https://files.pythonhosted.org/packages/4f/b3/e0a59d8df9150c8a0c0841d55d6568f0a9195692136c44f3d21f1842c8f6/coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318", size = 241852 }, - { url = "https://files.pythonhosted.org/packages/9b/82/db347ccd57bcef150c173df2ade97976a8367a3be7160e303e43dd0c795f/coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9", size = 242389 }, - { url = "https://files.pythonhosted.org/packages/21/f6/3f7d7879ceb03923195d9ff294456241ed05815281f5254bc16ef71d6a20/coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c", size = 213997 }, - { url = "https://files.pythonhosted.org/packages/28/87/021189643e18ecf045dbe1e2071b2747901f229df302de01c998eeadf146/coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78", size = 214911 }, - { url = "https://files.pythonhosted.org/packages/aa/12/4792669473297f7973518bec373a955e267deb4339286f882439b8535b39/coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc", size = 211684 }, - { url = "https://files.pythonhosted.org/packages/be/e1/2a4ec273894000ebedd789e8f2fc3813fcaf486074f87fd1c5b2cb1c0a2b/coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6", size = 211935 }, - { url = "https://files.pythonhosted.org/packages/f8/3a/7b14f6e4372786709a361729164125f6b7caf4024ce02e596c4a69bccb89/coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d", size = 245994 }, - { url = "https://files.pythonhosted.org/packages/54/80/039cc7f1f81dcbd01ea796d36d3797e60c106077e31fd1f526b85337d6a1/coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05", size = 242885 }, - { url = "https://files.pythonhosted.org/packages/10/e0/dc8355f992b6cc2f9dcd5ef6242b62a3f73264893bc09fbb08bfcab18eb4/coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a", size = 245142 }, - { url = "https://files.pythonhosted.org/packages/43/1b/33e313b22cf50f652becb94c6e7dae25d8f02e52e44db37a82de9ac357e8/coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6", size = 244906 }, - { url = "https://files.pythonhosted.org/packages/05/08/c0a8048e942e7f918764ccc99503e2bccffba1c42568693ce6955860365e/coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47", size = 243124 }, - { url = "https://files.pythonhosted.org/packages/5b/62/ea625b30623083c2aad645c9a6288ad9fc83d570f9adb913a2abdba562dd/coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe", size = 244317 }, - { url = "https://files.pythonhosted.org/packages/62/cb/3871f13ee1130a6c8f020e2f71d9ed269e1e2124aa3374d2180ee451cee9/coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545", size = 214170 }, - { url = "https://files.pythonhosted.org/packages/88/26/69fe1193ab0bfa1eb7a7c0149a066123611baba029ebb448500abd8143f9/coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b", size = 214969 }, - { url = "https://files.pythonhosted.org/packages/f3/21/87e9b97b568e223f3438d93072479c2f36cc9b3f6b9f7094b9d50232acc0/coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd", size = 211708 }, - { url = "https://files.pythonhosted.org/packages/75/be/882d08b28a0d19c9c4c2e8a1c6ebe1f79c9c839eb46d4fca3bd3b34562b9/coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00", size = 211981 }, - { url = "https://files.pythonhosted.org/packages/7a/1d/ce99612ebd58082fbe3f8c66f6d8d5694976c76a0d474503fa70633ec77f/coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64", size = 245495 }, - { url = "https://files.pythonhosted.org/packages/dc/8d/6115abe97df98db6b2bd76aae395fcc941d039a7acd25f741312ced9a78f/coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067", size = 242538 }, - { url = "https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008", size = 244561 }, - { url = "https://files.pythonhosted.org/packages/22/70/c10c77cd77970ac965734fe3419f2c98665f6e982744a9bfb0e749d298f4/coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733", size = 244633 }, - { url = "https://files.pythonhosted.org/packages/38/5a/4f7569d946a07c952688debee18c2bb9ab24f88027e3d71fd25dbc2f9dca/coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323", size = 242712 }, - { url = "https://files.pythonhosted.org/packages/bb/a1/03a43b33f50475a632a91ea8c127f7e35e53786dbe6781c25f19fd5a65f8/coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3", size = 244000 }, - { url = "https://files.pythonhosted.org/packages/6a/89/ab6c43b1788a3128e4d1b7b54214548dcad75a621f9d277b14d16a80d8a1/coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d", size = 214195 }, - { url = "https://files.pythonhosted.org/packages/12/12/6bf5f9a8b063d116bac536a7fb594fc35cb04981654cccb4bbfea5dcdfa0/coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487", size = 214998 }, - { url = "https://files.pythonhosted.org/packages/2a/e6/1e9df74ef7a1c983a9c7443dac8aac37a46f1939ae3499424622e72a6f78/coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25", size = 212541 }, - { url = "https://files.pythonhosted.org/packages/04/51/c32174edb7ee49744e2e81c4b1414ac9df3dacfcb5b5f273b7f285ad43f6/coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42", size = 212767 }, - { url = "https://files.pythonhosted.org/packages/e9/8f/f454cbdb5212f13f29d4a7983db69169f1937e869a5142bce983ded52162/coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502", size = 256997 }, - { url = "https://files.pythonhosted.org/packages/e6/74/2bf9e78b321216d6ee90a81e5c22f912fc428442c830c4077b4a071db66f/coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1", size = 252708 }, - { url = "https://files.pythonhosted.org/packages/92/4d/50d7eb1e9a6062bee6e2f92e78b0998848a972e9afad349b6cdde6fa9e32/coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4", size = 255046 }, - { url = "https://files.pythonhosted.org/packages/40/9e/71fb4e7402a07c4198ab44fc564d09d7d0ffca46a9fb7b0a7b929e7641bd/coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73", size = 256139 }, - { url = "https://files.pythonhosted.org/packages/49/1a/78d37f7a42b5beff027e807c2843185961fdae7fe23aad5a4837c93f9d25/coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a", size = 254307 }, - { url = "https://files.pythonhosted.org/packages/58/e9/8fb8e0ff6bef5e170ee19d59ca694f9001b2ec085dc99b4f65c128bb3f9a/coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883", size = 255116 }, - { url = "https://files.pythonhosted.org/packages/56/b0/d968ecdbe6fe0a863de7169bbe9e8a476868959f3af24981f6a10d2b6924/coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada", size = 214909 }, - { url = "https://files.pythonhosted.org/packages/87/e9/d6b7ef9fecf42dfb418d93544af47c940aa83056c49e6021a564aafbc91f/coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257", size = 216068 }, - { url = "https://files.pythonhosted.org/packages/c4/f1/1da77bb4c920aa30e82fa9b6ea065da3467977c2e5e032e38e66f1c57ffd/coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd", size = 203443 }, - { url = "https://files.pythonhosted.org/packages/59/f1/4da7717f0063a222db253e7121bd6a56f6fb1ba439dcc36659088793347c/coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7", size = 203435 }, +sdist = { url = "https://files.pythonhosted.org/packages/19/4f/2251e65033ed2ce1e68f00f91a0294e0f80c80ae8c3ebbe2f12828c4cd53/coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501", size = 811872, upload_time = "2025-03-30T20:36:45.376Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/77/074d201adb8383addae5784cb8e2dac60bb62bfdf28b2b10f3a3af2fda47/coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27", size = 211493, upload_time = "2025-03-30T20:35:12.286Z" }, + { url = "https://files.pythonhosted.org/packages/a9/89/7a8efe585750fe59b48d09f871f0e0c028a7b10722b2172dfe021fa2fdd4/coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea", size = 211921, upload_time = "2025-03-30T20:35:14.18Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ef/96a90c31d08a3f40c49dbe897df4f1fd51fb6583821a1a1c5ee30cc8f680/coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7", size = 244556, upload_time = "2025-03-30T20:35:15.616Z" }, + { url = "https://files.pythonhosted.org/packages/89/97/dcd5c2ce72cee9d7b0ee8c89162c24972fb987a111b92d1a3d1d19100c61/coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040", size = 242245, upload_time = "2025-03-30T20:35:18.648Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7b/b63cbb44096141ed435843bbb251558c8e05cc835c8da31ca6ffb26d44c0/coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543", size = 244032, upload_time = "2025-03-30T20:35:20.131Z" }, + { url = "https://files.pythonhosted.org/packages/97/e3/7fa8c2c00a1ef530c2a42fa5df25a6971391f92739d83d67a4ee6dcf7a02/coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2", size = 243679, upload_time = "2025-03-30T20:35:21.636Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b3/e0a59d8df9150c8a0c0841d55d6568f0a9195692136c44f3d21f1842c8f6/coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318", size = 241852, upload_time = "2025-03-30T20:35:23.525Z" }, + { url = "https://files.pythonhosted.org/packages/9b/82/db347ccd57bcef150c173df2ade97976a8367a3be7160e303e43dd0c795f/coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9", size = 242389, upload_time = "2025-03-30T20:35:25.09Z" }, + { url = "https://files.pythonhosted.org/packages/21/f6/3f7d7879ceb03923195d9ff294456241ed05815281f5254bc16ef71d6a20/coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c", size = 213997, upload_time = "2025-03-30T20:35:26.914Z" }, + { url = "https://files.pythonhosted.org/packages/28/87/021189643e18ecf045dbe1e2071b2747901f229df302de01c998eeadf146/coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78", size = 214911, upload_time = "2025-03-30T20:35:28.498Z" }, + { url = "https://files.pythonhosted.org/packages/aa/12/4792669473297f7973518bec373a955e267deb4339286f882439b8535b39/coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc", size = 211684, upload_time = "2025-03-30T20:35:29.959Z" }, + { url = "https://files.pythonhosted.org/packages/be/e1/2a4ec273894000ebedd789e8f2fc3813fcaf486074f87fd1c5b2cb1c0a2b/coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6", size = 211935, upload_time = "2025-03-30T20:35:31.912Z" }, + { url = "https://files.pythonhosted.org/packages/f8/3a/7b14f6e4372786709a361729164125f6b7caf4024ce02e596c4a69bccb89/coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d", size = 245994, upload_time = "2025-03-30T20:35:33.455Z" }, + { url = "https://files.pythonhosted.org/packages/54/80/039cc7f1f81dcbd01ea796d36d3797e60c106077e31fd1f526b85337d6a1/coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05", size = 242885, upload_time = "2025-03-30T20:35:35.354Z" }, + { url = "https://files.pythonhosted.org/packages/10/e0/dc8355f992b6cc2f9dcd5ef6242b62a3f73264893bc09fbb08bfcab18eb4/coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a", size = 245142, upload_time = "2025-03-30T20:35:37.121Z" }, + { url = "https://files.pythonhosted.org/packages/43/1b/33e313b22cf50f652becb94c6e7dae25d8f02e52e44db37a82de9ac357e8/coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6", size = 244906, upload_time = "2025-03-30T20:35:39.07Z" }, + { url = "https://files.pythonhosted.org/packages/05/08/c0a8048e942e7f918764ccc99503e2bccffba1c42568693ce6955860365e/coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47", size = 243124, upload_time = "2025-03-30T20:35:40.598Z" }, + { url = "https://files.pythonhosted.org/packages/5b/62/ea625b30623083c2aad645c9a6288ad9fc83d570f9adb913a2abdba562dd/coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe", size = 244317, upload_time = "2025-03-30T20:35:42.204Z" }, + { url = "https://files.pythonhosted.org/packages/62/cb/3871f13ee1130a6c8f020e2f71d9ed269e1e2124aa3374d2180ee451cee9/coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545", size = 214170, upload_time = "2025-03-30T20:35:44.216Z" }, + { url = "https://files.pythonhosted.org/packages/88/26/69fe1193ab0bfa1eb7a7c0149a066123611baba029ebb448500abd8143f9/coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b", size = 214969, upload_time = "2025-03-30T20:35:45.797Z" }, + { url = "https://files.pythonhosted.org/packages/f3/21/87e9b97b568e223f3438d93072479c2f36cc9b3f6b9f7094b9d50232acc0/coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd", size = 211708, upload_time = "2025-03-30T20:35:47.417Z" }, + { url = "https://files.pythonhosted.org/packages/75/be/882d08b28a0d19c9c4c2e8a1c6ebe1f79c9c839eb46d4fca3bd3b34562b9/coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00", size = 211981, upload_time = "2025-03-30T20:35:49.002Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/ce99612ebd58082fbe3f8c66f6d8d5694976c76a0d474503fa70633ec77f/coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64", size = 245495, upload_time = "2025-03-30T20:35:51.073Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8d/6115abe97df98db6b2bd76aae395fcc941d039a7acd25f741312ced9a78f/coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067", size = 242538, upload_time = "2025-03-30T20:35:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008", size = 244561, upload_time = "2025-03-30T20:35:54.658Z" }, + { url = "https://files.pythonhosted.org/packages/22/70/c10c77cd77970ac965734fe3419f2c98665f6e982744a9bfb0e749d298f4/coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733", size = 244633, upload_time = "2025-03-30T20:35:56.221Z" }, + { url = "https://files.pythonhosted.org/packages/38/5a/4f7569d946a07c952688debee18c2bb9ab24f88027e3d71fd25dbc2f9dca/coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323", size = 242712, upload_time = "2025-03-30T20:35:57.801Z" }, + { url = "https://files.pythonhosted.org/packages/bb/a1/03a43b33f50475a632a91ea8c127f7e35e53786dbe6781c25f19fd5a65f8/coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3", size = 244000, upload_time = "2025-03-30T20:35:59.378Z" }, + { url = "https://files.pythonhosted.org/packages/6a/89/ab6c43b1788a3128e4d1b7b54214548dcad75a621f9d277b14d16a80d8a1/coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d", size = 214195, upload_time = "2025-03-30T20:36:01.005Z" }, + { url = "https://files.pythonhosted.org/packages/12/12/6bf5f9a8b063d116bac536a7fb594fc35cb04981654cccb4bbfea5dcdfa0/coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487", size = 214998, upload_time = "2025-03-30T20:36:03.006Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e6/1e9df74ef7a1c983a9c7443dac8aac37a46f1939ae3499424622e72a6f78/coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25", size = 212541, upload_time = "2025-03-30T20:36:04.638Z" }, + { url = "https://files.pythonhosted.org/packages/04/51/c32174edb7ee49744e2e81c4b1414ac9df3dacfcb5b5f273b7f285ad43f6/coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42", size = 212767, upload_time = "2025-03-30T20:36:06.503Z" }, + { url = "https://files.pythonhosted.org/packages/e9/8f/f454cbdb5212f13f29d4a7983db69169f1937e869a5142bce983ded52162/coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502", size = 256997, upload_time = "2025-03-30T20:36:08.137Z" }, + { url = "https://files.pythonhosted.org/packages/e6/74/2bf9e78b321216d6ee90a81e5c22f912fc428442c830c4077b4a071db66f/coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1", size = 252708, upload_time = "2025-03-30T20:36:09.781Z" }, + { url = "https://files.pythonhosted.org/packages/92/4d/50d7eb1e9a6062bee6e2f92e78b0998848a972e9afad349b6cdde6fa9e32/coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4", size = 255046, upload_time = "2025-03-30T20:36:11.409Z" }, + { url = "https://files.pythonhosted.org/packages/40/9e/71fb4e7402a07c4198ab44fc564d09d7d0ffca46a9fb7b0a7b929e7641bd/coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73", size = 256139, upload_time = "2025-03-30T20:36:13.86Z" }, + { url = "https://files.pythonhosted.org/packages/49/1a/78d37f7a42b5beff027e807c2843185961fdae7fe23aad5a4837c93f9d25/coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a", size = 254307, upload_time = "2025-03-30T20:36:16.074Z" }, + { url = "https://files.pythonhosted.org/packages/58/e9/8fb8e0ff6bef5e170ee19d59ca694f9001b2ec085dc99b4f65c128bb3f9a/coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883", size = 255116, upload_time = "2025-03-30T20:36:18.033Z" }, + { url = "https://files.pythonhosted.org/packages/56/b0/d968ecdbe6fe0a863de7169bbe9e8a476868959f3af24981f6a10d2b6924/coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada", size = 214909, upload_time = "2025-03-30T20:36:19.644Z" }, + { url = "https://files.pythonhosted.org/packages/87/e9/d6b7ef9fecf42dfb418d93544af47c940aa83056c49e6021a564aafbc91f/coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257", size = 216068, upload_time = "2025-03-30T20:36:21.282Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f1/1da77bb4c920aa30e82fa9b6ea065da3467977c2e5e032e38e66f1c57ffd/coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd", size = 203443, upload_time = "2025-03-30T20:36:41.959Z" }, + { url = "https://files.pythonhosted.org/packages/59/f1/4da7717f0063a222db253e7121bd6a56f6fb1ba439dcc36659088793347c/coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7", size = 203435, upload_time = "2025-03-30T20:36:43.61Z" }, ] [package.optional-dependencies] @@ -964,36 +980,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/25/4ce80c78963834b8a9fd1cc1266be5ed8d1840785c0f2e1b73b8d128d505/cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", size = 710807 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/ef/83e632cfa801b221570c5f58c0369db6fa6cef7d9ff859feab1aae1a8a0f/cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", size = 6676361 }, - { url = "https://files.pythonhosted.org/packages/30/ec/7ea7c1e4c8fc8329506b46c6c4a52e2f20318425d48e0fe597977c71dbce/cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", size = 3952350 }, - { url = "https://files.pythonhosted.org/packages/27/61/72e3afdb3c5ac510330feba4fc1faa0fe62e070592d6ad00c40bb69165e5/cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", size = 4166572 }, - { url = "https://files.pythonhosted.org/packages/26/e4/ba680f0b35ed4a07d87f9e98f3ebccb05091f3bf6b5a478b943253b3bbd5/cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", size = 3958124 }, - { url = "https://files.pythonhosted.org/packages/9c/e8/44ae3e68c8b6d1cbc59040288056df2ad7f7f03bbcaca6b503c737ab8e73/cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", size = 3678122 }, - { url = "https://files.pythonhosted.org/packages/27/7b/664ea5e0d1eab511a10e480baf1c5d3e681c7d91718f60e149cec09edf01/cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", size = 4191831 }, - { url = "https://files.pythonhosted.org/packages/2a/07/79554a9c40eb11345e1861f46f845fa71c9e25bf66d132e123d9feb8e7f9/cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", size = 3960583 }, - { url = "https://files.pythonhosted.org/packages/bb/6d/858e356a49a4f0b591bd6789d821427de18432212e137290b6d8a817e9bf/cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308", size = 4191753 }, - { url = "https://files.pythonhosted.org/packages/b2/80/62df41ba4916067fa6b125aa8c14d7e9181773f0d5d0bd4dcef580d8b7c6/cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", size = 4079550 }, - { url = "https://files.pythonhosted.org/packages/f3/cd/2558cc08f7b1bb40683f99ff4327f8dcfc7de3affc669e9065e14824511b/cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", size = 4298367 }, - { url = "https://files.pythonhosted.org/packages/71/59/94ccc74788945bc3bd4cf355d19867e8057ff5fdbcac781b1ff95b700fb1/cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", size = 2772843 }, - { url = "https://files.pythonhosted.org/packages/ca/2c/0d0bbaf61ba05acb32f0841853cfa33ebb7a9ab3d9ed8bb004bd39f2da6a/cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", size = 3209057 }, - { url = "https://files.pythonhosted.org/packages/9e/be/7a26142e6d0f7683d8a382dd963745e65db895a79a280a30525ec92be890/cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", size = 6677789 }, - { url = "https://files.pythonhosted.org/packages/06/88/638865be7198a84a7713950b1db7343391c6066a20e614f8fa286eb178ed/cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", size = 3951919 }, - { url = "https://files.pythonhosted.org/packages/d7/fc/99fe639bcdf58561dfad1faa8a7369d1dc13f20acd78371bb97a01613585/cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", size = 4167812 }, - { url = "https://files.pythonhosted.org/packages/53/7b/aafe60210ec93d5d7f552592a28192e51d3c6b6be449e7fd0a91399b5d07/cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", size = 3958571 }, - { url = "https://files.pythonhosted.org/packages/16/32/051f7ce79ad5a6ef5e26a92b37f172ee2d6e1cce09931646eef8de1e9827/cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", size = 3679832 }, - { url = "https://files.pythonhosted.org/packages/78/2b/999b2a1e1ba2206f2d3bca267d68f350beb2b048a41ea827e08ce7260098/cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", size = 4193719 }, - { url = "https://files.pythonhosted.org/packages/72/97/430e56e39a1356e8e8f10f723211a0e256e11895ef1a135f30d7d40f2540/cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", size = 3960852 }, - { url = "https://files.pythonhosted.org/packages/89/33/c1cf182c152e1d262cac56850939530c05ca6c8d149aa0dcee490b417e99/cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", size = 4193906 }, - { url = "https://files.pythonhosted.org/packages/e1/99/87cf26d4f125380dc674233971069bc28d19b07f7755b29861570e513650/cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", size = 4081572 }, - { url = "https://files.pythonhosted.org/packages/b3/9f/6a3e0391957cc0c5f84aef9fbdd763035f2b52e998a53f99345e3ac69312/cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", size = 4298631 }, - { url = "https://files.pythonhosted.org/packages/e2/a5/5bc097adb4b6d22a24dea53c51f37e480aaec3465285c253098642696423/cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", size = 2773792 }, - { url = "https://files.pythonhosted.org/packages/33/cf/1f7649b8b9a3543e042d3f348e398a061923ac05b507f3f4d95f11938aa9/cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", size = 3210957 }, - { url = "https://files.pythonhosted.org/packages/d6/d7/f30e75a6aa7d0f65031886fa4a1485c2fbfe25a1896953920f6a9cfe2d3b/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", size = 3887513 }, - { url = "https://files.pythonhosted.org/packages/9c/b4/7a494ce1032323ca9db9a3661894c66e0d7142ad2079a4249303402d8c71/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", size = 4107432 }, - { url = "https://files.pythonhosted.org/packages/45/f8/6b3ec0bc56123b344a8d2b3264a325646d2dcdbdd9848b5e6f3d37db90b3/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", size = 3891421 }, - { url = "https://files.pythonhosted.org/packages/57/ff/f3b4b2d007c2a646b0f69440ab06224f9cf37a977a72cdb7b50632174e8a/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", size = 4107081 }, +sdist = { url = "https://files.pythonhosted.org/packages/cd/25/4ce80c78963834b8a9fd1cc1266be5ed8d1840785c0f2e1b73b8d128d505/cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", size = 710807, upload_time = "2025-03-02T00:01:37.692Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/ef/83e632cfa801b221570c5f58c0369db6fa6cef7d9ff859feab1aae1a8a0f/cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", size = 6676361, upload_time = "2025-03-02T00:00:06.528Z" }, + { url = "https://files.pythonhosted.org/packages/30/ec/7ea7c1e4c8fc8329506b46c6c4a52e2f20318425d48e0fe597977c71dbce/cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", size = 3952350, upload_time = "2025-03-02T00:00:09.537Z" }, + { url = "https://files.pythonhosted.org/packages/27/61/72e3afdb3c5ac510330feba4fc1faa0fe62e070592d6ad00c40bb69165e5/cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", size = 4166572, upload_time = "2025-03-02T00:00:12.03Z" }, + { url = "https://files.pythonhosted.org/packages/26/e4/ba680f0b35ed4a07d87f9e98f3ebccb05091f3bf6b5a478b943253b3bbd5/cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", size = 3958124, upload_time = "2025-03-02T00:00:14.518Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e8/44ae3e68c8b6d1cbc59040288056df2ad7f7f03bbcaca6b503c737ab8e73/cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", size = 3678122, upload_time = "2025-03-02T00:00:17.212Z" }, + { url = "https://files.pythonhosted.org/packages/27/7b/664ea5e0d1eab511a10e480baf1c5d3e681c7d91718f60e149cec09edf01/cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", size = 4191831, upload_time = "2025-03-02T00:00:19.696Z" }, + { url = "https://files.pythonhosted.org/packages/2a/07/79554a9c40eb11345e1861f46f845fa71c9e25bf66d132e123d9feb8e7f9/cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", size = 3960583, upload_time = "2025-03-02T00:00:22.488Z" }, + { url = "https://files.pythonhosted.org/packages/bb/6d/858e356a49a4f0b591bd6789d821427de18432212e137290b6d8a817e9bf/cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308", size = 4191753, upload_time = "2025-03-02T00:00:25.038Z" }, + { url = "https://files.pythonhosted.org/packages/b2/80/62df41ba4916067fa6b125aa8c14d7e9181773f0d5d0bd4dcef580d8b7c6/cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", size = 4079550, upload_time = "2025-03-02T00:00:26.929Z" }, + { url = "https://files.pythonhosted.org/packages/f3/cd/2558cc08f7b1bb40683f99ff4327f8dcfc7de3affc669e9065e14824511b/cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", size = 4298367, upload_time = "2025-03-02T00:00:28.735Z" }, + { url = "https://files.pythonhosted.org/packages/71/59/94ccc74788945bc3bd4cf355d19867e8057ff5fdbcac781b1ff95b700fb1/cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", size = 2772843, upload_time = "2025-03-02T00:00:30.592Z" }, + { url = "https://files.pythonhosted.org/packages/ca/2c/0d0bbaf61ba05acb32f0841853cfa33ebb7a9ab3d9ed8bb004bd39f2da6a/cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", size = 3209057, upload_time = "2025-03-02T00:00:33.393Z" }, + { url = "https://files.pythonhosted.org/packages/9e/be/7a26142e6d0f7683d8a382dd963745e65db895a79a280a30525ec92be890/cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", size = 6677789, upload_time = "2025-03-02T00:00:36.009Z" }, + { url = "https://files.pythonhosted.org/packages/06/88/638865be7198a84a7713950b1db7343391c6066a20e614f8fa286eb178ed/cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", size = 3951919, upload_time = "2025-03-02T00:00:38.581Z" }, + { url = "https://files.pythonhosted.org/packages/d7/fc/99fe639bcdf58561dfad1faa8a7369d1dc13f20acd78371bb97a01613585/cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", size = 4167812, upload_time = "2025-03-02T00:00:42.934Z" }, + { url = "https://files.pythonhosted.org/packages/53/7b/aafe60210ec93d5d7f552592a28192e51d3c6b6be449e7fd0a91399b5d07/cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", size = 3958571, upload_time = "2025-03-02T00:00:46.026Z" }, + { url = "https://files.pythonhosted.org/packages/16/32/051f7ce79ad5a6ef5e26a92b37f172ee2d6e1cce09931646eef8de1e9827/cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", size = 3679832, upload_time = "2025-03-02T00:00:48.647Z" }, + { url = "https://files.pythonhosted.org/packages/78/2b/999b2a1e1ba2206f2d3bca267d68f350beb2b048a41ea827e08ce7260098/cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", size = 4193719, upload_time = "2025-03-02T00:00:51.397Z" }, + { url = "https://files.pythonhosted.org/packages/72/97/430e56e39a1356e8e8f10f723211a0e256e11895ef1a135f30d7d40f2540/cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", size = 3960852, upload_time = "2025-03-02T00:00:53.317Z" }, + { url = "https://files.pythonhosted.org/packages/89/33/c1cf182c152e1d262cac56850939530c05ca6c8d149aa0dcee490b417e99/cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", size = 4193906, upload_time = "2025-03-02T00:00:56.49Z" }, + { url = "https://files.pythonhosted.org/packages/e1/99/87cf26d4f125380dc674233971069bc28d19b07f7755b29861570e513650/cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", size = 4081572, upload_time = "2025-03-02T00:00:59.995Z" }, + { url = "https://files.pythonhosted.org/packages/b3/9f/6a3e0391957cc0c5f84aef9fbdd763035f2b52e998a53f99345e3ac69312/cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", size = 4298631, upload_time = "2025-03-02T00:01:01.623Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a5/5bc097adb4b6d22a24dea53c51f37e480aaec3465285c253098642696423/cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", size = 2773792, upload_time = "2025-03-02T00:01:04.133Z" }, + { url = "https://files.pythonhosted.org/packages/33/cf/1f7649b8b9a3543e042d3f348e398a061923ac05b507f3f4d95f11938aa9/cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", size = 3210957, upload_time = "2025-03-02T00:01:06.987Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d7/f30e75a6aa7d0f65031886fa4a1485c2fbfe25a1896953920f6a9cfe2d3b/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", size = 3887513, upload_time = "2025-03-02T00:01:22.911Z" }, + { url = "https://files.pythonhosted.org/packages/9c/b4/7a494ce1032323ca9db9a3661894c66e0d7142ad2079a4249303402d8c71/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", size = 4107432, upload_time = "2025-03-02T00:01:24.701Z" }, + { url = "https://files.pythonhosted.org/packages/45/f8/6b3ec0bc56123b344a8d2b3264a325646d2dcdbdd9848b5e6f3d37db90b3/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", size = 3891421, upload_time = "2025-03-02T00:01:26.335Z" }, + { url = "https://files.pythonhosted.org/packages/57/ff/f3b4b2d007c2a646b0f69440ab06224f9cf37a977a72cdb7b50632174e8a/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", size = 4107081, upload_time = "2025-03-02T00:01:28.938Z" }, ] [[package]] @@ -1003,23 +1019,23 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "more-itertools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/9f/329d26121fe165be44b1dfff21aa0dc348f04633931f1d20ed6cf448a236/cssutils-2.11.1.tar.gz", hash = "sha256:0563a76513b6af6eebbe788c3bf3d01c920e46b3f90c8416738c5cfc773ff8e2", size = 711657 } +sdist = { url = "https://files.pythonhosted.org/packages/33/9f/329d26121fe165be44b1dfff21aa0dc348f04633931f1d20ed6cf448a236/cssutils-2.11.1.tar.gz", hash = "sha256:0563a76513b6af6eebbe788c3bf3d01c920e46b3f90c8416738c5cfc773ff8e2", size = 711657, upload_time = "2024-06-04T15:51:39.373Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/ec/bb273b7208c606890dc36540fe667d06ce840a6f62f9fae7e658fcdc90fb/cssutils-2.11.1-py3-none-any.whl", hash = "sha256:a67bfdfdff4f3867fab43698ec4897c1a828eca5973f4073321b3bccaf1199b1", size = 385747 }, + { url = "https://files.pythonhosted.org/packages/a7/ec/bb273b7208c606890dc36540fe667d06ce840a6f62f9fae7e658fcdc90fb/cssutils-2.11.1-py3-none-any.whl", hash = "sha256:a67bfdfdff4f3867fab43698ec4897c1a828eca5973f4073321b3bccaf1199b1", size = 385747, upload_time = "2024-06-04T15:51:37.499Z" }, ] [[package]] name = "cycler" version = "0.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615 } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload_time = "2023-10-07T05:32:18.335Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload_time = "2023-10-07T05:32:16.783Z" }, ] [[package]] name = "cyclonedx-bom" -version = "5.3.0" +version = "6.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "chardet" }, @@ -1028,9 +1044,9 @@ dependencies = [ { name = "packaging" }, { name = "pip-requirements-parser" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/bf/0d59cb517e032eed773365f7b6493499d7e9c1335e272d1a6dc0e318ec9a/cyclonedx_bom-5.3.0.tar.gz", hash = "sha256:1468aaf8dc4c8f178fc8403141281bdd9ba609053aaddea68348b2dfb5da6bc7", size = 3501545 } +sdist = { url = "https://files.pythonhosted.org/packages/8a/17/2d3cd57305e4b193f91b58843db09118dc2146ad32a63b868f4b546fb97c/cyclonedx_bom-6.0.0.tar.gz", hash = "sha256:78f05ad294552aa6f11867d243649a8869f7fd463f87cd61334da813fa7ef06e", size = 3495507, upload_time = "2025-04-24T15:36:11.683Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/c7/3432a39f784ee530de060993bdf24e596e93111dbcaba99b8034ef8ea4cb/cyclonedx_bom-5.3.0-py3-none-any.whl", hash = "sha256:31328db8adbb580538df996df61615c614711c75a5c81b0f9665270194a308c1", size = 55775 }, + { url = "https://files.pythonhosted.org/packages/cb/e3/36578c5fbfcc1f875a0c00e63729e692735f1da26ec6c750bc9590a3ed0a/cyclonedx_bom-6.0.0-py3-none-any.whl", hash = "sha256:70b921eaa43110d81928495a8da1a93de8bc90c31d3edb67ef6e46fd6d2328c5", size = 56662, upload_time = "2025-04-24T15:36:10.072Z" }, ] [[package]] @@ -1040,14 +1056,14 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cyclonedx-bom" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b8/57/ecb5eb11d4ed98d366fc072165ab1183b4c8fb6152cb692d842c1ba366fa/cyclonedx-py-1.0.1.tar.gz", hash = "sha256:bee26f9988177659bb03f7864b52ab4145bfea78245fe9fd4483425d20102fcc", size = 1218 } +sdist = { url = "https://files.pythonhosted.org/packages/b8/57/ecb5eb11d4ed98d366fc072165ab1183b4c8fb6152cb692d842c1ba366fa/cyclonedx-py-1.0.1.tar.gz", hash = "sha256:bee26f9988177659bb03f7864b52ab4145bfea78245fe9fd4483425d20102fcc", size = 1218, upload_time = "2024-01-31T15:36:35.632Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/6b/f10fe61f3f6e17ea1db203719dfba40ba499b5cc3ccf504d61e4b4a3505f/cyclonedx_py-1.0.1-py3-none-any.whl", hash = "sha256:eb62856a99822ed4c5bca47f88689243f353caf1f4f203a3288ceab3403c343c", size = 1335 }, + { url = "https://files.pythonhosted.org/packages/03/6b/f10fe61f3f6e17ea1db203719dfba40ba499b5cc3ccf504d61e4b4a3505f/cyclonedx_py-1.0.1-py3-none-any.whl", hash = "sha256:eb62856a99822ed4c5bca47f88689243f353caf1f4f203a3288ceab3403c343c", size = 1335, upload_time = "2024-01-31T15:36:34.63Z" }, ] [[package]] name = "cyclonedx-python-lib" -version = "8.9.0" +version = "9.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "license-expression" }, @@ -1055,9 +1071,9 @@ dependencies = [ { name = "py-serializable" }, { name = "sortedcontainers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/0c/af4b06d555c5e9b8b5bd48db7593c4f29ce21f91b139d30e29d76c02b55d/cyclonedx_python_lib-8.9.0.tar.gz", hash = "sha256:112c6e6e5290420e32026c49b8391645bf3e646c7602f7bdb5d02c6febbaa073", size = 1046896 } +sdist = { url = "https://files.pythonhosted.org/packages/66/fc/abaad5482f7b59c9a0a9d8f354ce4ce23346d582a0d85730b559562bbeb4/cyclonedx_python_lib-9.1.0.tar.gz", hash = "sha256:86935f2c88a7b47a529b93c724dbd3e903bc573f6f8bd977628a7ca1b5dadea1", size = 1048735, upload_time = "2025-02-27T17:23:40.367Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/42/e6680a2c452d171b43b23a39eeffe7cc95738a1ec22db4e36dd3fc2ea533/cyclonedx_python_lib-8.9.0-py3-none-any.whl", hash = "sha256:017b95b334aa83b2d0db8af9764e13a46f0e903bd30a57d93d08dcd302c84032", size = 375022 }, + { url = "https://files.pythonhosted.org/packages/53/f1/f3be2e9820a2c26fa77622223e91f9c504e1581830930d477e06146073f4/cyclonedx_python_lib-9.1.0-py3-none-any.whl", hash = "sha256:55693fca8edaecc3363b24af14e82cc6e659eb1e8353e58b587c42652ce0fb52", size = 374968, upload_time = "2025-02-27T17:23:37.766Z" }, ] [package.optional-dependencies] @@ -1066,43 +1082,56 @@ validation = [ { name = "lxml" }, ] +[[package]] +name = "dataproperty" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mbstrdecoder" }, + { name = "typepy", extra = ["datetime"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0b/81/8c8b64ae873cb9014815214c07b63b12e3b18835780fb342223cfe3fe7d8/dataproperty-1.1.0.tar.gz", hash = "sha256:b038437a4097d1a1c497695c3586ea34bea67fdd35372b9a50f30bf044d77d04", size = 42574, upload_time = "2024-12-31T14:37:26.033Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/c2/e12e95e289e6081a40454199ab213139ef16a528c7c86432de545b05a23a/DataProperty-1.1.0-py3-none-any.whl", hash = "sha256:c61fcb2e2deca35e6d1eb1f251a7f22f0dcde63e80e61f0cc18c19f42abfd25b", size = 27581, upload_time = "2024-12-31T14:37:22.657Z" }, +] + [[package]] name = "debugpy" -version = "1.8.13" +version = "1.8.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/d4/f35f539e11c9344652f362c22413ec5078f677ac71229dc9b4f6f85ccaa3/debugpy-1.8.13.tar.gz", hash = "sha256:837e7bef95bdefba426ae38b9a94821ebdc5bea55627879cd48165c90b9e50ce", size = 1641193 } +sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444, upload_time = "2025-04-10T19:46:10.981Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/90/dd2fcad8364f0964f476537481985198ce6e879760281ad1cec289f1aa71/debugpy-1.8.13-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:eee02b2ed52a563126c97bf04194af48f2fe1f68bb522a312b05935798e922ff", size = 2174802 }, - { url = "https://files.pythonhosted.org/packages/5c/c9/06ff65f15eb30dbdafd45d1575770b842ce3869ad5580a77f4e5590f1be7/debugpy-1.8.13-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4caca674206e97c85c034c1efab4483f33971d4e02e73081265ecb612af65377", size = 3133620 }, - { url = "https://files.pythonhosted.org/packages/3b/49/798a4092bde16a4650f17ac5f2301d4d37e1972d65462fb25c80a83b4790/debugpy-1.8.13-cp311-cp311-win32.whl", hash = "sha256:7d9a05efc6973b5aaf076d779cf3a6bbb1199e059a17738a2aa9d27a53bcc888", size = 5104764 }, - { url = "https://files.pythonhosted.org/packages/cd/d5/3684d7561c8ba2797305cf8259619acccb8d6ebe2117bb33a6897c235eee/debugpy-1.8.13-cp311-cp311-win_amd64.whl", hash = "sha256:62f9b4a861c256f37e163ada8cf5a81f4c8d5148fc17ee31fb46813bd658cdcc", size = 5129670 }, - { url = "https://files.pythonhosted.org/packages/79/ad/dff929b6b5403feaab0af0e5bb460fd723f9c62538b718a9af819b8fff20/debugpy-1.8.13-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:2b8de94c5c78aa0d0ed79023eb27c7c56a64c68217d881bee2ffbcb13951d0c1", size = 2501004 }, - { url = "https://files.pythonhosted.org/packages/d6/4f/b7d42e6679f0bb525888c278b0c0d2b6dff26ed42795230bb46eaae4f9b3/debugpy-1.8.13-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887d54276cefbe7290a754424b077e41efa405a3e07122d8897de54709dbe522", size = 4222346 }, - { url = "https://files.pythonhosted.org/packages/ec/18/d9b3e88e85d41f68f77235112adc31012a784e45a3fcdbb039777d570a0f/debugpy-1.8.13-cp312-cp312-win32.whl", hash = "sha256:3872ce5453b17837ef47fb9f3edc25085ff998ce63543f45ba7af41e7f7d370f", size = 5226639 }, - { url = "https://files.pythonhosted.org/packages/c9/f7/0df18a4f530ed3cc06f0060f548efe9e3316102101e311739d906f5650be/debugpy-1.8.13-cp312-cp312-win_amd64.whl", hash = "sha256:63ca7670563c320503fea26ac688988d9d6b9c6a12abc8a8cf2e7dd8e5f6b6ea", size = 5268735 }, - { url = "https://files.pythonhosted.org/packages/b1/db/ae7cd645c1826aae557cebccbc448f0cc9a818d364efb88f8d80e7a03f41/debugpy-1.8.13-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:31abc9618be4edad0b3e3a85277bc9ab51a2d9f708ead0d99ffb5bb750e18503", size = 2485416 }, - { url = "https://files.pythonhosted.org/packages/ec/ed/db4b10ff3b5bb30fe41d9e86444a08bb6448e4d8265e7768450b8408dd36/debugpy-1.8.13-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0bd87557f97bced5513a74088af0b84982b6ccb2e254b9312e29e8a5c4270eb", size = 4218784 }, - { url = "https://files.pythonhosted.org/packages/82/82/ed81852a8d94086f51664d032d83c7f87cd2b087c6ea70dabec7c1ba813d/debugpy-1.8.13-cp313-cp313-win32.whl", hash = "sha256:5268ae7fdca75f526d04465931cb0bd24577477ff50e8bb03dab90983f4ebd02", size = 5226270 }, - { url = "https://files.pythonhosted.org/packages/15/63/aa92fb341a78ec40f1c414ec7a7885c2ee17032eee00d12cee0cdc502af4/debugpy-1.8.13-cp313-cp313-win_amd64.whl", hash = "sha256:79ce4ed40966c4c1631d0131606b055a5a2f8e430e3f7bf8fd3744b09943e8e8", size = 5268621 }, - { url = "https://files.pythonhosted.org/packages/37/4f/0b65410a08b6452bfd3f7ed6f3610f1a31fb127f46836e82d31797065dcb/debugpy-1.8.13-py2.py3-none-any.whl", hash = "sha256:d4ba115cdd0e3a70942bd562adba9ec8c651fe69ddde2298a1be296fc331906f", size = 5229306 }, + { url = "https://files.pythonhosted.org/packages/67/e8/57fe0c86915671fd6a3d2d8746e40485fd55e8d9e682388fbb3a3d42b86f/debugpy-1.8.14-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:1b2ac8c13b2645e0b1eaf30e816404990fbdb168e193322be8f545e8c01644a9", size = 2175064, upload_time = "2025-04-10T19:46:19.486Z" }, + { url = "https://files.pythonhosted.org/packages/3b/97/2b2fd1b1c9569c6764ccdb650a6f752e4ac31be465049563c9eb127a8487/debugpy-1.8.14-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf431c343a99384ac7eab2f763980724834f933a271e90496944195318c619e2", size = 3132359, upload_time = "2025-04-10T19:46:21.192Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ee/b825c87ed06256ee2a7ed8bab8fb3bb5851293bf9465409fdffc6261c426/debugpy-1.8.14-cp311-cp311-win32.whl", hash = "sha256:c99295c76161ad8d507b413cd33422d7c542889fbb73035889420ac1fad354f2", size = 5133269, upload_time = "2025-04-10T19:46:23.047Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a6/6c70cd15afa43d37839d60f324213843174c1d1e6bb616bd89f7c1341bac/debugpy-1.8.14-cp311-cp311-win_amd64.whl", hash = "sha256:7816acea4a46d7e4e50ad8d09d963a680ecc814ae31cdef3622eb05ccacf7b01", size = 5158156, upload_time = "2025-04-10T19:46:24.521Z" }, + { url = "https://files.pythonhosted.org/packages/d9/2a/ac2df0eda4898f29c46eb6713a5148e6f8b2b389c8ec9e425a4a1d67bf07/debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", size = 2501268, upload_time = "2025-04-10T19:46:26.044Z" }, + { url = "https://files.pythonhosted.org/packages/10/53/0a0cb5d79dd9f7039169f8bf94a144ad3efa52cc519940b3b7dde23bcb89/debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826", size = 4221077, upload_time = "2025-04-10T19:46:27.464Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d5/84e01821f362327bf4828728aa31e907a2eca7c78cd7c6ec062780d249f8/debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", size = 5255127, upload_time = "2025-04-10T19:46:29.467Z" }, + { url = "https://files.pythonhosted.org/packages/33/16/1ed929d812c758295cac7f9cf3dab5c73439c83d9091f2d91871e648093e/debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", size = 5297249, upload_time = "2025-04-10T19:46:31.538Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676, upload_time = "2025-04-10T19:46:32.96Z" }, + { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514, upload_time = "2025-04-10T19:46:34.336Z" }, + { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756, upload_time = "2025-04-10T19:46:36.199Z" }, + { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119, upload_time = "2025-04-10T19:46:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230, upload_time = "2025-04-10T19:46:54.077Z" }, ] [[package]] name = "decorator" version = "5.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload_time = "2025-02-24T04:41:34.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload_time = "2025-02-24T04:41:32.565Z" }, ] [[package]] name = "defusedxml" version = "0.7.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload_time = "2021-03-08T10:59:26.269Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload_time = "2021-03-08T10:59:24.45Z" }, ] [[package]] @@ -1112,9 +1141,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/57/cd53c3e335eafbb0894449af078e2b71db47e9939ce2b45013e5a9fe89b7/dependency_groups-1.3.0.tar.gz", hash = "sha256:5b9751d5d98fbd6dfd038a560a69c8382e41afcbf7ffdbcc28a2a3f85498830f", size = 9832 } +sdist = { url = "https://files.pythonhosted.org/packages/b4/57/cd53c3e335eafbb0894449af078e2b71db47e9939ce2b45013e5a9fe89b7/dependency_groups-1.3.0.tar.gz", hash = "sha256:5b9751d5d98fbd6dfd038a560a69c8382e41afcbf7ffdbcc28a2a3f85498830f", size = 9832, upload_time = "2024-11-01T00:31:56.828Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/2c/3e3afb1df3dc8a8deeb143f6ac41acbfdfae4f03a54c760871c56832a554/dependency_groups-1.3.0-py3-none-any.whl", hash = "sha256:1abf34d712deda5581e80d507512664d52b35d1c2d7caf16c85e58ca508547e0", size = 8597 }, + { url = "https://files.pythonhosted.org/packages/99/2c/3e3afb1df3dc8a8deeb143f6ac41acbfdfae4f03a54c760871c56832a554/dependency_groups-1.3.0-py3-none-any.whl", hash = "sha256:1abf34d712deda5581e80d507512664d52b35d1c2d7caf16c85e58ca508547e0", size = 8597, upload_time = "2024-11-01T00:31:55.488Z" }, ] [[package]] @@ -1124,9 +1153,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744 } +sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744, upload_time = "2025-01-27T10:46:25.7Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 }, + { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998, upload_time = "2025-01-27T10:46:09.186Z" }, ] [[package]] @@ -1137,9 +1166,9 @@ dependencies = [ { name = "pyyaml" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/67/382a863fff94eae5a0cf05542179169a1c49a4c8784a9480621e2066ca7d/detect_secrets-1.5.0.tar.gz", hash = "sha256:6bb46dcc553c10df51475641bb30fd69d25645cc12339e46c824c1e0c388898a", size = 97351 } +sdist = { url = "https://files.pythonhosted.org/packages/69/67/382a863fff94eae5a0cf05542179169a1c49a4c8784a9480621e2066ca7d/detect_secrets-1.5.0.tar.gz", hash = "sha256:6bb46dcc553c10df51475641bb30fd69d25645cc12339e46c824c1e0c388898a", size = 97351, upload_time = "2024-05-06T17:46:19.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/5e/4f5fe4b89fde1dc3ed0eb51bd4ce4c0bca406246673d370ea2ad0c58d747/detect_secrets-1.5.0-py3-none-any.whl", hash = "sha256:e24e7b9b5a35048c313e983f76c4bd09dad89f045ff059e354f9943bf45aa060", size = 120341 }, + { url = "https://files.pythonhosted.org/packages/4e/5e/4f5fe4b89fde1dc3ed0eb51bd4ce4c0bca406246673d370ea2ad0c58d747/detect_secrets-1.5.0-py3-none-any.whl", hash = "sha256:e24e7b9b5a35048c313e983f76c4bd09dad89f045ff059e354f9943bf45aa060", size = 120341, upload_time = "2024-05-06T17:46:16.628Z" }, ] [[package]] @@ -1153,9 +1182,9 @@ dependencies = [ { name = "requests" }, { name = "retrying" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/dd/160c7670dcba8081c737404a3186ae219a8804d8cc087b29aa8d08c2c8fa/dicomweb_client-0.59.3.tar.gz", hash = "sha256:dd11604c99711d3fc9d223de960a1b64db3b2dcbc30592473d935e27b9243d46", size = 70995 } +sdist = { url = "https://files.pythonhosted.org/packages/ba/dd/160c7670dcba8081c737404a3186ae219a8804d8cc087b29aa8d08c2c8fa/dicomweb_client-0.59.3.tar.gz", hash = "sha256:dd11604c99711d3fc9d223de960a1b64db3b2dcbc30592473d935e27b9243d46", size = 70995, upload_time = "2024-10-22T01:26:25.053Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/77/e7ac701ad5ce4507d52ed5ace9f3c0c0129e6fbb29d108a0fd00362547c1/dicomweb_client-0.59.3-py3-none-any.whl", hash = "sha256:58ba2c9d4924ab3bc66d7a078b070b73562d321846f70f0050fb51d078897726", size = 61563 }, + { url = "https://files.pythonhosted.org/packages/fd/77/e7ac701ad5ce4507d52ed5ace9f3c0c0129e6fbb29d108a0fd00362547c1/dicomweb_client-0.59.3-py3-none-any.whl", hash = "sha256:58ba2c9d4924ab3bc66d7a078b070b73562d321846f70f0050fb51d078897726", size = 61563, upload_time = "2024-10-22T01:26:23.109Z" }, ] [[package]] @@ -1166,36 +1195,36 @@ dependencies = [ { name = "cssutils" }, { name = "domdf-python-tools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/24/eb/776eef1f1aa0188c0fc165c3a60b71027539f71f2eedc43ad21b060e9c39/dict2css-0.3.0.post1.tar.gz", hash = "sha256:89c544c21c4ca7472c3fffb9d37d3d926f606329afdb751dc1de67a411b70719", size = 7845 } +sdist = { url = "https://files.pythonhosted.org/packages/24/eb/776eef1f1aa0188c0fc165c3a60b71027539f71f2eedc43ad21b060e9c39/dict2css-0.3.0.post1.tar.gz", hash = "sha256:89c544c21c4ca7472c3fffb9d37d3d926f606329afdb751dc1de67a411b70719", size = 7845, upload_time = "2023-11-22T11:09:20.958Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/47/290daabcf91628f4fc0e17c75a1690b354ba067066cd14407712600e609f/dict2css-0.3.0.post1-py3-none-any.whl", hash = "sha256:f006a6b774c3e31869015122ae82c491fd25e7de4a75607a62aa3e798f837e0d", size = 25647 }, + { url = "https://files.pythonhosted.org/packages/fe/47/290daabcf91628f4fc0e17c75a1690b354ba067066cd14407712600e609f/dict2css-0.3.0.post1-py3-none-any.whl", hash = "sha256:f006a6b774c3e31869015122ae82c491fd25e7de4a75607a62aa3e798f837e0d", size = 25647, upload_time = "2023-11-22T11:09:19.221Z" }, ] [[package]] name = "distlib" version = "0.3.9" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923, upload_time = "2024-10-09T18:35:47.551Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload_time = "2024-10-09T18:35:44.272Z" }, ] [[package]] name = "dnspython" version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197 } +sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197, upload_time = "2024-10-05T20:14:59.362Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632 }, + { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632, upload_time = "2024-10-05T20:14:57.687Z" }, ] [[package]] name = "docutils" version = "0.21.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444 } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload_time = "2024-04-23T18:57:18.24Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 }, + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload_time = "2024-04-23T18:57:14.835Z" }, ] [[package]] @@ -1206,41 +1235,41 @@ dependencies = [ { name = "natsort" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/8b/ab2d8a292bba8fe3135cacc8bfd3576710a14b8f2d0a8cde19130d5c9d21/domdf_python_tools-3.10.0.tar.gz", hash = "sha256:2ae308d2f4f1e9145f5f4ba57f840fbfd1c2983ee26e4824347789649d3ae298", size = 100458 } +sdist = { url = "https://files.pythonhosted.org/packages/36/8b/ab2d8a292bba8fe3135cacc8bfd3576710a14b8f2d0a8cde19130d5c9d21/domdf_python_tools-3.10.0.tar.gz", hash = "sha256:2ae308d2f4f1e9145f5f4ba57f840fbfd1c2983ee26e4824347789649d3ae298", size = 100458, upload_time = "2025-02-12T17:34:05.747Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/11/208f72084084d3f6a2ed5ebfdfc846692c3f7ad6dce65e400194924f7eed/domdf_python_tools-3.10.0-py3-none-any.whl", hash = "sha256:5e71c1be71bbcc1f881d690c8984b60e64298ec256903b3147f068bc33090c36", size = 126860 }, + { url = "https://files.pythonhosted.org/packages/5b/11/208f72084084d3f6a2ed5ebfdfc846692c3f7ad6dce65e400194924f7eed/domdf_python_tools-3.10.0-py3-none-any.whl", hash = "sha256:5e71c1be71bbcc1f881d690c8984b60e64298ec256903b3147f068bc33090c36", size = 126860, upload_time = "2025-02-12T17:34:04.093Z" }, ] [[package]] name = "duckdb" version = "1.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/b4/34b98425d643e412f52703829b5ed2da7d7cb6dd40c80a3aa210002cafa8/duckdb-1.2.1.tar.gz", hash = "sha256:15d49030d04572540cc1c8ad8a491ce018a590ec995d5d38c8f5f75b6422413e", size = 11591514 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/58/82/b119808dde71e42cc1fc77ac4a912e38c84eb47fa6ca4bc90652f99b7252/duckdb-1.2.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:99c47ea82df549c284e4e4d8c89a940af4f19c03427f6f42cafeb3c152536bc5", size = 15252717 }, - { url = "https://files.pythonhosted.org/packages/8a/ff/015fd0cdec48791c36d6251916b456e96ed9fb71a791a7385b26cec14810/duckdb-1.2.1-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:203ebdf401d049135492cc3d49146cfd704d866ee9cc52b18e80a586aceabb69", size = 31915709 }, - { url = "https://files.pythonhosted.org/packages/d7/d2/72ef2cf81562fdb6068b1e2cd19a878943067ce812060a4bc91e61d0e92d/duckdb-1.2.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ac5f7c15176b6fb90f1f3bed08a99b9d32f55b58cd3d9d2ed6a1037a8fda2024", size = 16772294 }, - { url = "https://files.pythonhosted.org/packages/b5/06/b454b94ceec3a813c5122a99b0259ced53874b15fb2dfdb669164dbcb153/duckdb-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b2c13f4f9290db60c783b93b79ce521a3890ff8d817a6670afb760e030043b", size = 18728528 }, - { url = "https://files.pythonhosted.org/packages/50/52/6e6f5b5b07841cec334ca6b98f2e02b7bb54ab3b99c49aa3a161cc0b4b37/duckdb-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d493e051f594175a2a5bdcae5c008d3cc424805e3282292c1204f597880de8ea", size = 20197440 }, - { url = "https://files.pythonhosted.org/packages/f5/dc/01c3f5a47d7433d1e261042f61e6b3d77634f28706975b3027697fa19de8/duckdb-1.2.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c252be2ed07817916342823b271253459932c60d7f7ee4e28f33650552cda24", size = 18736032 }, - { url = "https://files.pythonhosted.org/packages/1e/e4/7ef6b8e08c410fc13ba9f62ecf2802e8e2adcae38a5ea7a4f6829b99f32d/duckdb-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:832627f11b370d708543a86d18d5eda4eacb7ca51fdc83c74629adfff2ec1bf2", size = 22251245 }, - { url = "https://files.pythonhosted.org/packages/a5/b7/e3f5d60117fe31623122a44b6d3e8f1cee9d87a23810c9c35bb1d743d4d2/duckdb-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:d05e5914857b4d93b136de385d81a65165a6c24a6ecf6eee3dcd0017233bff6c", size = 11363523 }, - { url = "https://files.pythonhosted.org/packages/5d/70/2c1240415afc176ac7019f0fd5add3310ba93c80885a55d7fecc194108e6/duckdb-1.2.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:7e587410e05343ffaf9a21bacb6811aad253bd443ab4ff869fdaa645908f47a4", size = 15263653 }, - { url = "https://files.pythonhosted.org/packages/2c/6e/83caef4d3b6e68da768ec564d5c9b982a84d9167ead0ad674b69810d7bb8/duckdb-1.2.1-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:8cb84295cafbf2510326f4ae18d401fc2d45b6d4811c43f1b7451a69a0a74f5f", size = 31955476 }, - { url = "https://files.pythonhosted.org/packages/35/fb/ee33f3417d4778ab183d47fe8569dc7906a1b95f69cfb10f15d5f88e8dcf/duckdb-1.2.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:1b6dfefadc455347a2c649d41ebd561b32574b4191508043c9ee81fa0da95485", size = 16798219 }, - { url = "https://files.pythonhosted.org/packages/21/11/9cf670a88f39dd18854883c38b9374c745e47d69896bb8dbc9cc239a43d6/duckdb-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d75d9fdf5865399f634d824c8d427c7666d1f2c640115178115459fa69b20b0", size = 18730807 }, - { url = "https://files.pythonhosted.org/packages/d4/5f/7b511dcaa772f9ae20c7f3fe05dd88174729fbcb67e15b349b72a3855712/duckdb-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4a05d182d1dec1ff4acb53a266b3b8024afcc1ed0d399f5784ff1607a4271e9", size = 20199069 }, - { url = "https://files.pythonhosted.org/packages/9c/58/7942a1d7c84a045e1513acc7e753ac67f2f272601a2c21d71b4cb85967e7/duckdb-1.2.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:317af7385b4f1d0c90ca029a71ce3d4f9571549c162798d58a0b20ba0a11762e", size = 18753393 }, - { url = "https://files.pythonhosted.org/packages/6b/00/57417ae7d9bd47c71284bff7f69736bdde0f213ce312292e4f553449a667/duckdb-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41fca1666d0905e929ede0899a4275d67835a285b98e28fce446e8c3e53cfe8c", size = 22290931 }, - { url = "https://files.pythonhosted.org/packages/71/bc/acb4d48f41dada36e723e9786d1ebe89f8e1db6685b86a2a1f0551bd5e16/duckdb-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:f8f19f145442dbdfae029b68208fc237816f70b3d25bb77ed31ace79b6059fa5", size = 11365235 }, - { url = "https://files.pythonhosted.org/packages/e3/3b/d154fcde6205aafd2002ddec7eef37e5c7907c3aa63b51f6d9f7d2ec1442/duckdb-1.2.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:bc9ed3adea35e7e688750e80330b5b93cd430483d68a5f880dac76bedca14c0e", size = 15264713 }, - { url = "https://files.pythonhosted.org/packages/20/3f/e54f898c62a3d6873c090f06bab62544ac33826ec65e7598af7c09264a14/duckdb-1.2.1-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:b26ff415d89860b7013d711fce916f919ad058dbf0a3fc4bcdff5323ec4bbfa0", size = 31955551 }, - { url = "https://files.pythonhosted.org/packages/11/b9/19ecfcc13b402686cf6f121cb08451f7655bd653990fdabfda1f2db87081/duckdb-1.2.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:0e26037b138a22f72fe44697b605ccac06e223c108b3f4a3e91e7ffad45ee673", size = 16797823 }, - { url = "https://files.pythonhosted.org/packages/35/69/20fe0c748371866bdd150d60b065498b7414537c4ad0f7235b5ae604ac99/duckdb-1.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e2f530e8290e4b2d2c341bc709a6a0c9ec7a0e1c7a4679afa7bd4db972fcf12", size = 18731358 }, - { url = "https://files.pythonhosted.org/packages/cc/f7/ba9b39791a0415c48d4696f10217e44ac526e450b811bc68f9acf0ef3b5c/duckdb-1.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7985129c4bc810cb08938043822bb1fc4b67c11f4c1b025527f9c888e0638b6a", size = 20198769 }, - { url = "https://files.pythonhosted.org/packages/9c/6c/07717799b64e34dd383c4fe9a3a53f5506c97ada096b103154c8856dc68b/duckdb-1.2.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be76e55e9a36febcb0c7c7c28b8fae0b33bbcf6a84b3b23eb23e7ee3e65e3394", size = 18754621 }, - { url = "https://files.pythonhosted.org/packages/53/8b/f971b0cd6cfc3ac094d31998b789a8fb372bd0813fbb47c932342fc926f0/duckdb-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d8f5066ae9acc6cee22c7a455696511d993bdbfc55bb9466360b073b5c8cba67", size = 22291214 }, - { url = "https://files.pythonhosted.org/packages/1e/1c/4e29e52a35b5af451b24232b6f89714180da71c904017e62f7cc5477f135/duckdb-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:6112711457b6014ac041492bedf8b6a97403666aefa20a4a4f3479db10136501", size = 11365219 }, +sdist = { url = "https://files.pythonhosted.org/packages/41/b4/34b98425d643e412f52703829b5ed2da7d7cb6dd40c80a3aa210002cafa8/duckdb-1.2.1.tar.gz", hash = "sha256:15d49030d04572540cc1c8ad8a491ce018a590ec995d5d38c8f5f75b6422413e", size = 11591514, upload_time = "2025-03-05T18:26:32.88Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/82/b119808dde71e42cc1fc77ac4a912e38c84eb47fa6ca4bc90652f99b7252/duckdb-1.2.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:99c47ea82df549c284e4e4d8c89a940af4f19c03427f6f42cafeb3c152536bc5", size = 15252717, upload_time = "2025-03-05T18:23:44.822Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ff/015fd0cdec48791c36d6251916b456e96ed9fb71a791a7385b26cec14810/duckdb-1.2.1-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:203ebdf401d049135492cc3d49146cfd704d866ee9cc52b18e80a586aceabb69", size = 31915709, upload_time = "2025-03-05T18:23:48.938Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d2/72ef2cf81562fdb6068b1e2cd19a878943067ce812060a4bc91e61d0e92d/duckdb-1.2.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ac5f7c15176b6fb90f1f3bed08a99b9d32f55b58cd3d9d2ed6a1037a8fda2024", size = 16772294, upload_time = "2025-03-05T18:23:53.316Z" }, + { url = "https://files.pythonhosted.org/packages/b5/06/b454b94ceec3a813c5122a99b0259ced53874b15fb2dfdb669164dbcb153/duckdb-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97b2c13f4f9290db60c783b93b79ce521a3890ff8d817a6670afb760e030043b", size = 18728528, upload_time = "2025-03-05T18:23:57.19Z" }, + { url = "https://files.pythonhosted.org/packages/50/52/6e6f5b5b07841cec334ca6b98f2e02b7bb54ab3b99c49aa3a161cc0b4b37/duckdb-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d493e051f594175a2a5bdcae5c008d3cc424805e3282292c1204f597880de8ea", size = 20197440, upload_time = "2025-03-05T18:24:02.179Z" }, + { url = "https://files.pythonhosted.org/packages/f5/dc/01c3f5a47d7433d1e261042f61e6b3d77634f28706975b3027697fa19de8/duckdb-1.2.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c252be2ed07817916342823b271253459932c60d7f7ee4e28f33650552cda24", size = 18736032, upload_time = "2025-03-05T18:24:06.145Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e4/7ef6b8e08c410fc13ba9f62ecf2802e8e2adcae38a5ea7a4f6829b99f32d/duckdb-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:832627f11b370d708543a86d18d5eda4eacb7ca51fdc83c74629adfff2ec1bf2", size = 22251245, upload_time = "2025-03-05T18:24:09.753Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b7/e3f5d60117fe31623122a44b6d3e8f1cee9d87a23810c9c35bb1d743d4d2/duckdb-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:d05e5914857b4d93b136de385d81a65165a6c24a6ecf6eee3dcd0017233bff6c", size = 11363523, upload_time = "2025-03-05T18:24:14.279Z" }, + { url = "https://files.pythonhosted.org/packages/5d/70/2c1240415afc176ac7019f0fd5add3310ba93c80885a55d7fecc194108e6/duckdb-1.2.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:7e587410e05343ffaf9a21bacb6811aad253bd443ab4ff869fdaa645908f47a4", size = 15263653, upload_time = "2025-03-05T18:24:17.807Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6e/83caef4d3b6e68da768ec564d5c9b982a84d9167ead0ad674b69810d7bb8/duckdb-1.2.1-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:8cb84295cafbf2510326f4ae18d401fc2d45b6d4811c43f1b7451a69a0a74f5f", size = 31955476, upload_time = "2025-03-05T18:24:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/35/fb/ee33f3417d4778ab183d47fe8569dc7906a1b95f69cfb10f15d5f88e8dcf/duckdb-1.2.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:1b6dfefadc455347a2c649d41ebd561b32574b4191508043c9ee81fa0da95485", size = 16798219, upload_time = "2025-03-05T18:24:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/21/11/9cf670a88f39dd18854883c38b9374c745e47d69896bb8dbc9cc239a43d6/duckdb-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d75d9fdf5865399f634d824c8d427c7666d1f2c640115178115459fa69b20b0", size = 18730807, upload_time = "2025-03-05T18:24:30.717Z" }, + { url = "https://files.pythonhosted.org/packages/d4/5f/7b511dcaa772f9ae20c7f3fe05dd88174729fbcb67e15b349b72a3855712/duckdb-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4a05d182d1dec1ff4acb53a266b3b8024afcc1ed0d399f5784ff1607a4271e9", size = 20199069, upload_time = "2025-03-05T18:24:36.973Z" }, + { url = "https://files.pythonhosted.org/packages/9c/58/7942a1d7c84a045e1513acc7e753ac67f2f272601a2c21d71b4cb85967e7/duckdb-1.2.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:317af7385b4f1d0c90ca029a71ce3d4f9571549c162798d58a0b20ba0a11762e", size = 18753393, upload_time = "2025-03-05T18:24:40.617Z" }, + { url = "https://files.pythonhosted.org/packages/6b/00/57417ae7d9bd47c71284bff7f69736bdde0f213ce312292e4f553449a667/duckdb-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41fca1666d0905e929ede0899a4275d67835a285b98e28fce446e8c3e53cfe8c", size = 22290931, upload_time = "2025-03-05T18:24:44.959Z" }, + { url = "https://files.pythonhosted.org/packages/71/bc/acb4d48f41dada36e723e9786d1ebe89f8e1db6685b86a2a1f0551bd5e16/duckdb-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:f8f19f145442dbdfae029b68208fc237816f70b3d25bb77ed31ace79b6059fa5", size = 11365235, upload_time = "2025-03-05T18:24:49.773Z" }, + { url = "https://files.pythonhosted.org/packages/e3/3b/d154fcde6205aafd2002ddec7eef37e5c7907c3aa63b51f6d9f7d2ec1442/duckdb-1.2.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:bc9ed3adea35e7e688750e80330b5b93cd430483d68a5f880dac76bedca14c0e", size = 15264713, upload_time = "2025-03-05T18:24:52.597Z" }, + { url = "https://files.pythonhosted.org/packages/20/3f/e54f898c62a3d6873c090f06bab62544ac33826ec65e7598af7c09264a14/duckdb-1.2.1-cp313-cp313-macosx_12_0_universal2.whl", hash = "sha256:b26ff415d89860b7013d711fce916f919ad058dbf0a3fc4bcdff5323ec4bbfa0", size = 31955551, upload_time = "2025-03-05T18:24:57.01Z" }, + { url = "https://files.pythonhosted.org/packages/11/b9/19ecfcc13b402686cf6f121cb08451f7655bd653990fdabfda1f2db87081/duckdb-1.2.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:0e26037b138a22f72fe44697b605ccac06e223c108b3f4a3e91e7ffad45ee673", size = 16797823, upload_time = "2025-03-05T18:25:01.786Z" }, + { url = "https://files.pythonhosted.org/packages/35/69/20fe0c748371866bdd150d60b065498b7414537c4ad0f7235b5ae604ac99/duckdb-1.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e2f530e8290e4b2d2c341bc709a6a0c9ec7a0e1c7a4679afa7bd4db972fcf12", size = 18731358, upload_time = "2025-03-05T18:25:05.913Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f7/ba9b39791a0415c48d4696f10217e44ac526e450b811bc68f9acf0ef3b5c/duckdb-1.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7985129c4bc810cb08938043822bb1fc4b67c11f4c1b025527f9c888e0638b6a", size = 20198769, upload_time = "2025-03-05T18:25:10.746Z" }, + { url = "https://files.pythonhosted.org/packages/9c/6c/07717799b64e34dd383c4fe9a3a53f5506c97ada096b103154c8856dc68b/duckdb-1.2.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be76e55e9a36febcb0c7c7c28b8fae0b33bbcf6a84b3b23eb23e7ee3e65e3394", size = 18754621, upload_time = "2025-03-05T18:25:14.716Z" }, + { url = "https://files.pythonhosted.org/packages/53/8b/f971b0cd6cfc3ac094d31998b789a8fb372bd0813fbb47c932342fc926f0/duckdb-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d8f5066ae9acc6cee22c7a455696511d993bdbfc55bb9466360b073b5c8cba67", size = 22291214, upload_time = "2025-03-05T18:25:18.487Z" }, + { url = "https://files.pythonhosted.org/packages/1e/1c/4e29e52a35b5af451b24232b6f89714180da71c904017e62f7cc5477f135/duckdb-1.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:6112711457b6014ac041492bedf8b6a97403666aefa20a4a4f3479db10136501", size = 11365219, upload_time = "2025-03-05T18:25:21.512Z" }, ] [[package]] @@ -1251,9 +1280,9 @@ dependencies = [ { name = "dnspython" }, { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967 } +sdist = { url = "https://files.pythonhosted.org/packages/48/ce/13508a1ec3f8bb981ae4ca79ea40384becc868bfae97fd1c942bb3a001b1/email_validator-2.2.0.tar.gz", hash = "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7", size = 48967, upload_time = "2024-06-20T11:30:30.034Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521 }, + { url = "https://files.pythonhosted.org/packages/d7/ee/bf0adb559ad3c786f12bcbc9296b3f5675f529199bef03e2df281fa1fadb/email_validator-2.2.0-py3-none-any.whl", hash = "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631", size = 33521, upload_time = "2024-06-20T11:30:28.248Z" }, ] [[package]] @@ -1264,27 +1293,27 @@ dependencies = [ { name = "pygments" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/87/50091e20c2765aa495b24521844a7d8f7041d48e4f9b47dd928cd38c8606/enum_tools-0.13.0.tar.gz", hash = "sha256:0d13335e361d300dc0f8fd82c8cf9951417246f9676144f5ee1761eb690228eb", size = 18904 } +sdist = { url = "https://files.pythonhosted.org/packages/6d/87/50091e20c2765aa495b24521844a7d8f7041d48e4f9b47dd928cd38c8606/enum_tools-0.13.0.tar.gz", hash = "sha256:0d13335e361d300dc0f8fd82c8cf9951417246f9676144f5ee1761eb690228eb", size = 18904, upload_time = "2025-04-17T15:26:59.412Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/45/cf8a8df3ebe78db691ab54525d552085b67658877f0334f4b0c08c43b518/enum_tools-0.13.0-py3-none-any.whl", hash = "sha256:e0112b16767dd08cb94105844b52770eae67ece6f026916a06db4a3d330d2a95", size = 22366 }, + { url = "https://files.pythonhosted.org/packages/84/45/cf8a8df3ebe78db691ab54525d552085b67658877f0334f4b0c08c43b518/enum_tools-0.13.0-py3-none-any.whl", hash = "sha256:e0112b16767dd08cb94105844b52770eae67ece6f026916a06db4a3d330d2a95", size = 22366, upload_time = "2025-04-17T15:26:58.34Z" }, ] [[package]] name = "execnet" version = "2.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/ff/b4c0dc78fbe20c3e59c0c7334de0c27eb4001a2b2017999af398bf730817/execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3", size = 166524, upload_time = "2024-04-08T09:04:19.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612 }, + { url = "https://files.pythonhosted.org/packages/43/09/2aea36ff60d16dd8879bdb2f5b3ee0ba8d08cbbdcdfe870e695ce3784385/execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", size = 40612, upload_time = "2024-04-08T09:04:17.414Z" }, ] [[package]] name = "executing" version = "2.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 } +sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693, upload_time = "2025-01-22T15:41:29.403Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 }, + { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload_time = "2025-01-22T15:41:25.929Z" }, ] [[package]] @@ -1294,9 +1323,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/a6/b77f42021308ec8b134502343da882c0905d725a4d661c7adeaf7acaf515/faker-37.1.0.tar.gz", hash = "sha256:ad9dc66a3b84888b837ca729e85299a96b58fdaef0323ed0baace93c9614af06", size = 1875707 } +sdist = { url = "https://files.pythonhosted.org/packages/ba/a6/b77f42021308ec8b134502343da882c0905d725a4d661c7adeaf7acaf515/faker-37.1.0.tar.gz", hash = "sha256:ad9dc66a3b84888b837ca729e85299a96b58fdaef0323ed0baace93c9614af06", size = 1875707, upload_time = "2025-03-24T16:14:02.958Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/a1/8936bc8e79af80ca38288dd93ed44ed1f9d63beb25447a4c59e746e01f8d/faker-37.1.0-py3-none-any.whl", hash = "sha256:dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c", size = 1918783 }, + { url = "https://files.pythonhosted.org/packages/d7/a1/8936bc8e79af80ca38288dd93ed44ed1f9d63beb25447a4c59e746e01f8d/faker-37.1.0-py3-none-any.whl", hash = "sha256:dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c", size = 1918783, upload_time = "2025-03-24T16:14:00.051Z" }, ] [[package]] @@ -1308,9 +1337,9 @@ dependencies = [ { name = "starlette" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236 } +sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236, upload_time = "2025-03-23T22:55:43.822Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164 }, + { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload_time = "2025-03-23T22:55:42.101Z" }, ] [package.optional-dependencies] @@ -1346,9 +1375,9 @@ dependencies = [ { name = "typer" }, { name = "uvicorn", extra = ["standard"] }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753 } +sdist = { url = "https://files.pythonhosted.org/packages/fe/73/82a5831fbbf8ed75905bacf5b2d9d3dfd6f04d6968b29fe6f72a5ae9ceb1/fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e", size = 16753, upload_time = "2024-12-15T14:28:10.028Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705 }, + { url = "https://files.pythonhosted.org/packages/a1/e6/5daefc851b514ce2287d8f5d358ae4341089185f78f3217a69d0ce3a390c/fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4", size = 10705, upload_time = "2024-12-15T14:28:06.18Z" }, ] [package.optional-dependencies] @@ -1360,146 +1389,146 @@ standard = [ name = "fastjsonschema" version = "2.21.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939 } +sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939, upload_time = "2024-12-02T10:55:15.133Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924 }, + { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924, upload_time = "2024-12-02T10:55:07.599Z" }, ] [[package]] name = "filelock" version = "3.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload_time = "2025-03-14T07:11:40.47Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215 }, + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload_time = "2025-03-14T07:11:39.145Z" }, ] [[package]] name = "fonttools" version = "4.57.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/03/2d/a9a0b6e3a0cf6bd502e64fc16d894269011930cabfc89aee20d1635b1441/fonttools-4.57.0.tar.gz", hash = "sha256:727ece10e065be2f9dd239d15dd5d60a66e17eac11aea47d447f9f03fdbc42de", size = 3492448 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/1f/e67c99aa3c6d3d2f93d956627e62a57ae0d35dc42f26611ea2a91053f6d6/fonttools-4.57.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3871349303bdec958360eedb619169a779956503ffb4543bb3e6211e09b647c4", size = 2757392 }, - { url = "https://files.pythonhosted.org/packages/aa/f1/f75770d0ddc67db504850898d96d75adde238c35313409bfcd8db4e4a5fe/fonttools-4.57.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c59375e85126b15a90fcba3443eaac58f3073ba091f02410eaa286da9ad80ed8", size = 2285609 }, - { url = "https://files.pythonhosted.org/packages/f5/d3/bc34e4953cb204bae0c50b527307dce559b810e624a733351a654cfc318e/fonttools-4.57.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967b65232e104f4b0f6370a62eb33089e00024f2ce143aecbf9755649421c683", size = 4873292 }, - { url = "https://files.pythonhosted.org/packages/41/b8/d5933559303a4ab18c799105f4c91ee0318cc95db4a2a09e300116625e7a/fonttools-4.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39acf68abdfc74e19de7485f8f7396fa4d2418efea239b7061d6ed6a2510c746", size = 4902503 }, - { url = "https://files.pythonhosted.org/packages/32/13/acb36bfaa316f481153ce78de1fa3926a8bad42162caa3b049e1afe2408b/fonttools-4.57.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d077f909f2343daf4495ba22bb0e23b62886e8ec7c109ee8234bdbd678cf344", size = 5077351 }, - { url = "https://files.pythonhosted.org/packages/b5/23/6d383a2ca83b7516d73975d8cca9d81a01acdcaa5e4db8579e4f3de78518/fonttools-4.57.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:46370ac47a1e91895d40e9ad48effbe8e9d9db1a4b80888095bc00e7beaa042f", size = 5275067 }, - { url = "https://files.pythonhosted.org/packages/bc/ca/31b8919c6da0198d5d522f1d26c980201378c087bdd733a359a1e7485769/fonttools-4.57.0-cp311-cp311-win32.whl", hash = "sha256:ca2aed95855506b7ae94e8f1f6217b7673c929e4f4f1217bcaa236253055cb36", size = 2158263 }, - { url = "https://files.pythonhosted.org/packages/13/4c/de2612ea2216eb45cfc8eb91a8501615dd87716feaf5f8fb65cbca576289/fonttools-4.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:17168a4670bbe3775f3f3f72d23ee786bd965395381dfbb70111e25e81505b9d", size = 2204968 }, - { url = "https://files.pythonhosted.org/packages/cb/98/d4bc42d43392982eecaaca117d79845734d675219680cd43070bb001bc1f/fonttools-4.57.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:889e45e976c74abc7256d3064aa7c1295aa283c6bb19810b9f8b604dfe5c7f31", size = 2751824 }, - { url = "https://files.pythonhosted.org/packages/1a/62/7168030eeca3742fecf45f31e63b5ef48969fa230a672216b805f1d61548/fonttools-4.57.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0425c2e052a5f1516c94e5855dbda706ae5a768631e9fcc34e57d074d1b65b92", size = 2283072 }, - { url = "https://files.pythonhosted.org/packages/5d/82/121a26d9646f0986ddb35fbbaf58ef791c25b59ecb63ffea2aab0099044f/fonttools-4.57.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44c26a311be2ac130f40a96769264809d3b0cb297518669db437d1cc82974888", size = 4788020 }, - { url = "https://files.pythonhosted.org/packages/5b/26/e0f2fb662e022d565bbe280a3cfe6dafdaabf58889ff86fdef2d31ff1dde/fonttools-4.57.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c41ba992df5b8d680b89fd84c6a1f2aca2b9f1ae8a67400c8930cd4ea115f6", size = 4859096 }, - { url = "https://files.pythonhosted.org/packages/9e/44/9075e323347b1891cdece4b3f10a3b84a8f4c42a7684077429d9ce842056/fonttools-4.57.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea1e9e43ca56b0c12440a7c689b1350066595bebcaa83baad05b8b2675129d98", size = 4964356 }, - { url = "https://files.pythonhosted.org/packages/48/28/caa8df32743462fb966be6de6a79d7f30393859636d7732e82efa09fbbb4/fonttools-4.57.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84fd56c78d431606332a0627c16e2a63d243d0d8b05521257d77c6529abe14d8", size = 5226546 }, - { url = "https://files.pythonhosted.org/packages/f6/46/95ab0f0d2e33c5b1a4fc1c0efe5e286ba9359602c0a9907adb1faca44175/fonttools-4.57.0-cp312-cp312-win32.whl", hash = "sha256:f4376819c1c778d59e0a31db5dc6ede854e9edf28bbfa5b756604727f7f800ac", size = 2146776 }, - { url = "https://files.pythonhosted.org/packages/06/5d/1be5424bb305880e1113631f49a55ea7c7da3a5fe02608ca7c16a03a21da/fonttools-4.57.0-cp312-cp312-win_amd64.whl", hash = "sha256:57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9", size = 2193956 }, - { url = "https://files.pythonhosted.org/packages/e9/2f/11439f3af51e4bb75ac9598c29f8601aa501902dcedf034bdc41f47dd799/fonttools-4.57.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:408ce299696012d503b714778d89aa476f032414ae57e57b42e4b92363e0b8ef", size = 2739175 }, - { url = "https://files.pythonhosted.org/packages/25/52/677b55a4c0972dc3820c8dba20a29c358197a78229daa2ea219fdb19e5d5/fonttools-4.57.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bbceffc80aa02d9e8b99f2a7491ed8c4a783b2fc4020119dc405ca14fb5c758c", size = 2276583 }, - { url = "https://files.pythonhosted.org/packages/64/79/184555f8fa77b827b9460a4acdbbc0b5952bb6915332b84c615c3a236826/fonttools-4.57.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f022601f3ee9e1f6658ed6d184ce27fa5216cee5b82d279e0f0bde5deebece72", size = 4766437 }, - { url = "https://files.pythonhosted.org/packages/f8/ad/c25116352f456c0d1287545a7aa24e98987b6d99c5b0456c4bd14321f20f/fonttools-4.57.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dea5893b58d4637ffa925536462ba626f8a1b9ffbe2f5c272cdf2c6ebadb817", size = 4838431 }, - { url = "https://files.pythonhosted.org/packages/53/ae/398b2a833897297797a44f519c9af911c2136eb7aa27d3f1352c6d1129fa/fonttools-4.57.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dff02c5c8423a657c550b48231d0a48d7e2b2e131088e55983cfe74ccc2c7cc9", size = 4951011 }, - { url = "https://files.pythonhosted.org/packages/b7/5d/7cb31c4bc9ffb9a2bbe8b08f8f53bad94aeb158efad75da645b40b62cb73/fonttools-4.57.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:767604f244dc17c68d3e2dbf98e038d11a18abc078f2d0f84b6c24571d9c0b13", size = 5205679 }, - { url = "https://files.pythonhosted.org/packages/4c/e4/6934513ec2c4d3d69ca1bc3bd34d5c69dafcbf68c15388dd3bb062daf345/fonttools-4.57.0-cp313-cp313-win32.whl", hash = "sha256:8e2e12d0d862f43d51e5afb8b9751c77e6bec7d2dc00aad80641364e9df5b199", size = 2144833 }, - { url = "https://files.pythonhosted.org/packages/c4/0d/2177b7fdd23d017bcfb702fd41e47d4573766b9114da2fddbac20dcc4957/fonttools-4.57.0-cp313-cp313-win_amd64.whl", hash = "sha256:f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3", size = 2190799 }, - { url = "https://files.pythonhosted.org/packages/90/27/45f8957c3132917f91aaa56b700bcfc2396be1253f685bd5c68529b6f610/fonttools-4.57.0-py3-none-any.whl", hash = "sha256:3122c604a675513c68bd24c6a8f9091f1c2376d18e8f5fe5a101746c81b3e98f", size = 1093605 }, +sdist = { url = "https://files.pythonhosted.org/packages/03/2d/a9a0b6e3a0cf6bd502e64fc16d894269011930cabfc89aee20d1635b1441/fonttools-4.57.0.tar.gz", hash = "sha256:727ece10e065be2f9dd239d15dd5d60a66e17eac11aea47d447f9f03fdbc42de", size = 3492448, upload_time = "2025-04-03T11:07:13.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/1f/e67c99aa3c6d3d2f93d956627e62a57ae0d35dc42f26611ea2a91053f6d6/fonttools-4.57.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3871349303bdec958360eedb619169a779956503ffb4543bb3e6211e09b647c4", size = 2757392, upload_time = "2025-04-03T11:05:45.715Z" }, + { url = "https://files.pythonhosted.org/packages/aa/f1/f75770d0ddc67db504850898d96d75adde238c35313409bfcd8db4e4a5fe/fonttools-4.57.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c59375e85126b15a90fcba3443eaac58f3073ba091f02410eaa286da9ad80ed8", size = 2285609, upload_time = "2025-04-03T11:05:47.977Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d3/bc34e4953cb204bae0c50b527307dce559b810e624a733351a654cfc318e/fonttools-4.57.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967b65232e104f4b0f6370a62eb33089e00024f2ce143aecbf9755649421c683", size = 4873292, upload_time = "2025-04-03T11:05:49.921Z" }, + { url = "https://files.pythonhosted.org/packages/41/b8/d5933559303a4ab18c799105f4c91ee0318cc95db4a2a09e300116625e7a/fonttools-4.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39acf68abdfc74e19de7485f8f7396fa4d2418efea239b7061d6ed6a2510c746", size = 4902503, upload_time = "2025-04-03T11:05:52.17Z" }, + { url = "https://files.pythonhosted.org/packages/32/13/acb36bfaa316f481153ce78de1fa3926a8bad42162caa3b049e1afe2408b/fonttools-4.57.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d077f909f2343daf4495ba22bb0e23b62886e8ec7c109ee8234bdbd678cf344", size = 5077351, upload_time = "2025-04-03T11:05:54.162Z" }, + { url = "https://files.pythonhosted.org/packages/b5/23/6d383a2ca83b7516d73975d8cca9d81a01acdcaa5e4db8579e4f3de78518/fonttools-4.57.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:46370ac47a1e91895d40e9ad48effbe8e9d9db1a4b80888095bc00e7beaa042f", size = 5275067, upload_time = "2025-04-03T11:05:57.375Z" }, + { url = "https://files.pythonhosted.org/packages/bc/ca/31b8919c6da0198d5d522f1d26c980201378c087bdd733a359a1e7485769/fonttools-4.57.0-cp311-cp311-win32.whl", hash = "sha256:ca2aed95855506b7ae94e8f1f6217b7673c929e4f4f1217bcaa236253055cb36", size = 2158263, upload_time = "2025-04-03T11:05:59.567Z" }, + { url = "https://files.pythonhosted.org/packages/13/4c/de2612ea2216eb45cfc8eb91a8501615dd87716feaf5f8fb65cbca576289/fonttools-4.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:17168a4670bbe3775f3f3f72d23ee786bd965395381dfbb70111e25e81505b9d", size = 2204968, upload_time = "2025-04-03T11:06:02.16Z" }, + { url = "https://files.pythonhosted.org/packages/cb/98/d4bc42d43392982eecaaca117d79845734d675219680cd43070bb001bc1f/fonttools-4.57.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:889e45e976c74abc7256d3064aa7c1295aa283c6bb19810b9f8b604dfe5c7f31", size = 2751824, upload_time = "2025-04-03T11:06:03.782Z" }, + { url = "https://files.pythonhosted.org/packages/1a/62/7168030eeca3742fecf45f31e63b5ef48969fa230a672216b805f1d61548/fonttools-4.57.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0425c2e052a5f1516c94e5855dbda706ae5a768631e9fcc34e57d074d1b65b92", size = 2283072, upload_time = "2025-04-03T11:06:05.533Z" }, + { url = "https://files.pythonhosted.org/packages/5d/82/121a26d9646f0986ddb35fbbaf58ef791c25b59ecb63ffea2aab0099044f/fonttools-4.57.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44c26a311be2ac130f40a96769264809d3b0cb297518669db437d1cc82974888", size = 4788020, upload_time = "2025-04-03T11:06:07.249Z" }, + { url = "https://files.pythonhosted.org/packages/5b/26/e0f2fb662e022d565bbe280a3cfe6dafdaabf58889ff86fdef2d31ff1dde/fonttools-4.57.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c41ba992df5b8d680b89fd84c6a1f2aca2b9f1ae8a67400c8930cd4ea115f6", size = 4859096, upload_time = "2025-04-03T11:06:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/9e/44/9075e323347b1891cdece4b3f10a3b84a8f4c42a7684077429d9ce842056/fonttools-4.57.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea1e9e43ca56b0c12440a7c689b1350066595bebcaa83baad05b8b2675129d98", size = 4964356, upload_time = "2025-04-03T11:06:11.294Z" }, + { url = "https://files.pythonhosted.org/packages/48/28/caa8df32743462fb966be6de6a79d7f30393859636d7732e82efa09fbbb4/fonttools-4.57.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84fd56c78d431606332a0627c16e2a63d243d0d8b05521257d77c6529abe14d8", size = 5226546, upload_time = "2025-04-03T11:06:13.6Z" }, + { url = "https://files.pythonhosted.org/packages/f6/46/95ab0f0d2e33c5b1a4fc1c0efe5e286ba9359602c0a9907adb1faca44175/fonttools-4.57.0-cp312-cp312-win32.whl", hash = "sha256:f4376819c1c778d59e0a31db5dc6ede854e9edf28bbfa5b756604727f7f800ac", size = 2146776, upload_time = "2025-04-03T11:06:15.643Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/1be5424bb305880e1113631f49a55ea7c7da3a5fe02608ca7c16a03a21da/fonttools-4.57.0-cp312-cp312-win_amd64.whl", hash = "sha256:57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9", size = 2193956, upload_time = "2025-04-03T11:06:17.534Z" }, + { url = "https://files.pythonhosted.org/packages/e9/2f/11439f3af51e4bb75ac9598c29f8601aa501902dcedf034bdc41f47dd799/fonttools-4.57.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:408ce299696012d503b714778d89aa476f032414ae57e57b42e4b92363e0b8ef", size = 2739175, upload_time = "2025-04-03T11:06:19.583Z" }, + { url = "https://files.pythonhosted.org/packages/25/52/677b55a4c0972dc3820c8dba20a29c358197a78229daa2ea219fdb19e5d5/fonttools-4.57.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bbceffc80aa02d9e8b99f2a7491ed8c4a783b2fc4020119dc405ca14fb5c758c", size = 2276583, upload_time = "2025-04-03T11:06:21.753Z" }, + { url = "https://files.pythonhosted.org/packages/64/79/184555f8fa77b827b9460a4acdbbc0b5952bb6915332b84c615c3a236826/fonttools-4.57.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f022601f3ee9e1f6658ed6d184ce27fa5216cee5b82d279e0f0bde5deebece72", size = 4766437, upload_time = "2025-04-03T11:06:23.521Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ad/c25116352f456c0d1287545a7aa24e98987b6d99c5b0456c4bd14321f20f/fonttools-4.57.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dea5893b58d4637ffa925536462ba626f8a1b9ffbe2f5c272cdf2c6ebadb817", size = 4838431, upload_time = "2025-04-03T11:06:25.423Z" }, + { url = "https://files.pythonhosted.org/packages/53/ae/398b2a833897297797a44f519c9af911c2136eb7aa27d3f1352c6d1129fa/fonttools-4.57.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dff02c5c8423a657c550b48231d0a48d7e2b2e131088e55983cfe74ccc2c7cc9", size = 4951011, upload_time = "2025-04-03T11:06:27.41Z" }, + { url = "https://files.pythonhosted.org/packages/b7/5d/7cb31c4bc9ffb9a2bbe8b08f8f53bad94aeb158efad75da645b40b62cb73/fonttools-4.57.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:767604f244dc17c68d3e2dbf98e038d11a18abc078f2d0f84b6c24571d9c0b13", size = 5205679, upload_time = "2025-04-03T11:06:29.804Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e4/6934513ec2c4d3d69ca1bc3bd34d5c69dafcbf68c15388dd3bb062daf345/fonttools-4.57.0-cp313-cp313-win32.whl", hash = "sha256:8e2e12d0d862f43d51e5afb8b9751c77e6bec7d2dc00aad80641364e9df5b199", size = 2144833, upload_time = "2025-04-03T11:06:31.737Z" }, + { url = "https://files.pythonhosted.org/packages/c4/0d/2177b7fdd23d017bcfb702fd41e47d4573766b9114da2fddbac20dcc4957/fonttools-4.57.0-cp313-cp313-win_amd64.whl", hash = "sha256:f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3", size = 2190799, upload_time = "2025-04-03T11:06:34.784Z" }, + { url = "https://files.pythonhosted.org/packages/90/27/45f8957c3132917f91aaa56b700bcfc2396be1253f685bd5c68529b6f610/fonttools-4.57.0-py3-none-any.whl", hash = "sha256:3122c604a675513c68bd24c6a8f9091f1c2376d18e8f5fe5a101746c81b3e98f", size = 1093605, upload_time = "2025-04-03T11:07:11.341Z" }, ] [[package]] name = "fqdn" version = "1.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015 } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015, upload_time = "2021-03-11T07:16:29.08Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121 }, + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload_time = "2021-03-11T07:16:28.351Z" }, ] [[package]] name = "frozenlist" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/b5/bc883b5296ec902115c00be161da93bf661199c465ec4c483feec6ea4c32/frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d", size = 160912 }, - { url = "https://files.pythonhosted.org/packages/6f/93/51b058b563d0704b39c56baa222828043aafcac17fd3734bec5dbeb619b1/frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0", size = 124315 }, - { url = "https://files.pythonhosted.org/packages/c9/e0/46cd35219428d350558b874d595e132d1c17a9471a1bd0d01d518a261e7c/frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe", size = 122230 }, - { url = "https://files.pythonhosted.org/packages/d1/0f/7ad2ce928ad06d6dd26a61812b959ded573d3e9d0ee6109d96c2be7172e9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba", size = 314842 }, - { url = "https://files.pythonhosted.org/packages/34/76/98cbbd8a20a5c3359a2004ae5e5b216af84a150ccbad67c8f8f30fb2ea91/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595", size = 304919 }, - { url = "https://files.pythonhosted.org/packages/9a/fa/258e771ce3a44348c05e6b01dffc2bc67603fba95761458c238cd09a2c77/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a", size = 324074 }, - { url = "https://files.pythonhosted.org/packages/d5/a4/047d861fd8c538210e12b208c0479912273f991356b6bdee7ea8356b07c9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626", size = 321292 }, - { url = "https://files.pythonhosted.org/packages/c0/25/cfec8af758b4525676cabd36efcaf7102c1348a776c0d1ad046b8a7cdc65/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff", size = 301569 }, - { url = "https://files.pythonhosted.org/packages/87/2f/0c819372fa9f0c07b153124bf58683b8d0ca7bb73ea5ccde9b9ef1745beb/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a", size = 313625 }, - { url = "https://files.pythonhosted.org/packages/50/5f/f0cf8b0fdedffdb76b3745aa13d5dbe404d63493cc211ce8250f2025307f/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0", size = 312523 }, - { url = "https://files.pythonhosted.org/packages/e1/6c/38c49108491272d3e84125bbabf2c2d0b304899b52f49f0539deb26ad18d/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606", size = 322657 }, - { url = "https://files.pythonhosted.org/packages/bd/4b/3bd3bad5be06a9d1b04b1c22be80b5fe65b502992d62fab4bdb25d9366ee/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584", size = 303414 }, - { url = "https://files.pythonhosted.org/packages/5b/89/7e225a30bef6e85dbfe22622c24afe932e9444de3b40d58b1ea589a14ef8/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a", size = 320321 }, - { url = "https://files.pythonhosted.org/packages/22/72/7e3acef4dd9e86366cb8f4d8f28e852c2b7e116927e9722b31a6f71ea4b0/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1", size = 323975 }, - { url = "https://files.pythonhosted.org/packages/d8/85/e5da03d20507e13c66ce612c9792b76811b7a43e3320cce42d95b85ac755/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e", size = 316553 }, - { url = "https://files.pythonhosted.org/packages/ac/8e/6c609cbd0580ae8a0661c408149f196aade7d325b1ae7adc930501b81acb/frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860", size = 115511 }, - { url = "https://files.pythonhosted.org/packages/f2/13/a84804cfde6de12d44ed48ecbf777ba62b12ff09e761f76cdd1ff9e14bb1/frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603", size = 120863 }, - { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193 }, - { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831 }, - { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862 }, - { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361 }, - { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115 }, - { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505 }, - { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666 }, - { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119 }, - { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226 }, - { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788 }, - { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914 }, - { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283 }, - { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264 }, - { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482 }, - { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248 }, - { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161 }, - { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548 }, - { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182 }, - { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838 }, - { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980 }, - { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463 }, - { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985 }, - { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188 }, - { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874 }, - { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897 }, - { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799 }, - { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804 }, - { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404 }, - { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572 }, - { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601 }, - { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232 }, - { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187 }, - { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772 }, - { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847 }, - { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937 }, - { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029 }, - { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831 }, - { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981 }, - { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999 }, - { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200 }, - { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134 }, - { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208 }, - { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548 }, - { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123 }, - { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199 }, - { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854 }, - { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412 }, - { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936 }, - { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459 }, - { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797 }, - { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709 }, - { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404 }, +sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831, upload_time = "2025-04-17T22:38:53.099Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/b5/bc883b5296ec902115c00be161da93bf661199c465ec4c483feec6ea4c32/frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d", size = 160912, upload_time = "2025-04-17T22:36:17.235Z" }, + { url = "https://files.pythonhosted.org/packages/6f/93/51b058b563d0704b39c56baa222828043aafcac17fd3734bec5dbeb619b1/frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0", size = 124315, upload_time = "2025-04-17T22:36:18.735Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e0/46cd35219428d350558b874d595e132d1c17a9471a1bd0d01d518a261e7c/frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe", size = 122230, upload_time = "2025-04-17T22:36:20.6Z" }, + { url = "https://files.pythonhosted.org/packages/d1/0f/7ad2ce928ad06d6dd26a61812b959ded573d3e9d0ee6109d96c2be7172e9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba", size = 314842, upload_time = "2025-04-17T22:36:22.088Z" }, + { url = "https://files.pythonhosted.org/packages/34/76/98cbbd8a20a5c3359a2004ae5e5b216af84a150ccbad67c8f8f30fb2ea91/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595", size = 304919, upload_time = "2025-04-17T22:36:24.247Z" }, + { url = "https://files.pythonhosted.org/packages/9a/fa/258e771ce3a44348c05e6b01dffc2bc67603fba95761458c238cd09a2c77/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a", size = 324074, upload_time = "2025-04-17T22:36:26.291Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a4/047d861fd8c538210e12b208c0479912273f991356b6bdee7ea8356b07c9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626", size = 321292, upload_time = "2025-04-17T22:36:27.909Z" }, + { url = "https://files.pythonhosted.org/packages/c0/25/cfec8af758b4525676cabd36efcaf7102c1348a776c0d1ad046b8a7cdc65/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff", size = 301569, upload_time = "2025-04-17T22:36:29.448Z" }, + { url = "https://files.pythonhosted.org/packages/87/2f/0c819372fa9f0c07b153124bf58683b8d0ca7bb73ea5ccde9b9ef1745beb/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a", size = 313625, upload_time = "2025-04-17T22:36:31.55Z" }, + { url = "https://files.pythonhosted.org/packages/50/5f/f0cf8b0fdedffdb76b3745aa13d5dbe404d63493cc211ce8250f2025307f/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0", size = 312523, upload_time = "2025-04-17T22:36:33.078Z" }, + { url = "https://files.pythonhosted.org/packages/e1/6c/38c49108491272d3e84125bbabf2c2d0b304899b52f49f0539deb26ad18d/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606", size = 322657, upload_time = "2025-04-17T22:36:34.688Z" }, + { url = "https://files.pythonhosted.org/packages/bd/4b/3bd3bad5be06a9d1b04b1c22be80b5fe65b502992d62fab4bdb25d9366ee/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584", size = 303414, upload_time = "2025-04-17T22:36:36.363Z" }, + { url = "https://files.pythonhosted.org/packages/5b/89/7e225a30bef6e85dbfe22622c24afe932e9444de3b40d58b1ea589a14ef8/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a", size = 320321, upload_time = "2025-04-17T22:36:38.16Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/7e3acef4dd9e86366cb8f4d8f28e852c2b7e116927e9722b31a6f71ea4b0/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1", size = 323975, upload_time = "2025-04-17T22:36:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/d8/85/e5da03d20507e13c66ce612c9792b76811b7a43e3320cce42d95b85ac755/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e", size = 316553, upload_time = "2025-04-17T22:36:42.045Z" }, + { url = "https://files.pythonhosted.org/packages/ac/8e/6c609cbd0580ae8a0661c408149f196aade7d325b1ae7adc930501b81acb/frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860", size = 115511, upload_time = "2025-04-17T22:36:44.067Z" }, + { url = "https://files.pythonhosted.org/packages/f2/13/a84804cfde6de12d44ed48ecbf777ba62b12ff09e761f76cdd1ff9e14bb1/frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603", size = 120863, upload_time = "2025-04-17T22:36:45.465Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193, upload_time = "2025-04-17T22:36:47.382Z" }, + { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831, upload_time = "2025-04-17T22:36:49.401Z" }, + { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862, upload_time = "2025-04-17T22:36:51.899Z" }, + { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361, upload_time = "2025-04-17T22:36:53.402Z" }, + { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115, upload_time = "2025-04-17T22:36:55.016Z" }, + { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505, upload_time = "2025-04-17T22:36:57.12Z" }, + { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666, upload_time = "2025-04-17T22:36:58.735Z" }, + { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119, upload_time = "2025-04-17T22:37:00.512Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226, upload_time = "2025-04-17T22:37:02.102Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788, upload_time = "2025-04-17T22:37:03.578Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914, upload_time = "2025-04-17T22:37:05.213Z" }, + { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283, upload_time = "2025-04-17T22:37:06.985Z" }, + { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264, upload_time = "2025-04-17T22:37:08.618Z" }, + { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482, upload_time = "2025-04-17T22:37:10.196Z" }, + { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248, upload_time = "2025-04-17T22:37:12.284Z" }, + { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161, upload_time = "2025-04-17T22:37:13.902Z" }, + { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548, upload_time = "2025-04-17T22:37:15.326Z" }, + { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182, upload_time = "2025-04-17T22:37:16.837Z" }, + { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838, upload_time = "2025-04-17T22:37:18.352Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980, upload_time = "2025-04-17T22:37:19.857Z" }, + { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463, upload_time = "2025-04-17T22:37:21.328Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985, upload_time = "2025-04-17T22:37:23.55Z" }, + { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188, upload_time = "2025-04-17T22:37:25.221Z" }, + { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874, upload_time = "2025-04-17T22:37:26.791Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897, upload_time = "2025-04-17T22:37:28.958Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799, upload_time = "2025-04-17T22:37:30.889Z" }, + { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804, upload_time = "2025-04-17T22:37:32.489Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404, upload_time = "2025-04-17T22:37:34.59Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572, upload_time = "2025-04-17T22:37:36.337Z" }, + { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601, upload_time = "2025-04-17T22:37:37.923Z" }, + { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232, upload_time = "2025-04-17T22:37:39.669Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187, upload_time = "2025-04-17T22:37:41.662Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772, upload_time = "2025-04-17T22:37:43.132Z" }, + { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847, upload_time = "2025-04-17T22:37:45.118Z" }, + { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937, upload_time = "2025-04-17T22:37:46.635Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029, upload_time = "2025-04-17T22:37:48.192Z" }, + { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831, upload_time = "2025-04-17T22:37:50.485Z" }, + { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981, upload_time = "2025-04-17T22:37:52.558Z" }, + { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999, upload_time = "2025-04-17T22:37:54.092Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200, upload_time = "2025-04-17T22:37:55.951Z" }, + { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134, upload_time = "2025-04-17T22:37:57.633Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208, upload_time = "2025-04-17T22:37:59.742Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548, upload_time = "2025-04-17T22:38:01.416Z" }, + { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123, upload_time = "2025-04-17T22:38:03.049Z" }, + { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199, upload_time = "2025-04-17T22:38:04.776Z" }, + { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854, upload_time = "2025-04-17T22:38:06.576Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412, upload_time = "2025-04-17T22:38:08.197Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936, upload_time = "2025-04-17T22:38:10.056Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459, upload_time = "2025-04-17T22:38:11.826Z" }, + { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797, upload_time = "2025-04-17T22:38:14.013Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709, upload_time = "2025-04-17T22:38:15.551Z" }, + { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404, upload_time = "2025-04-17T22:38:51.668Z" }, ] [[package]] name = "fsspec" version = "2024.12.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/11/de70dee31455c546fbc88301971ec03c328f3d1138cfba14263f651e9551/fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f", size = 291600 } +sdist = { url = "https://files.pythonhosted.org/packages/ee/11/de70dee31455c546fbc88301971ec03c328f3d1138cfba14263f651e9551/fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f", size = 291600, upload_time = "2024-12-19T19:57:30.333Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/86/5486b0188d08aa643e127774a99bac51ffa6cf343e3deb0583956dca5b22/fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2", size = 183862 }, + { url = "https://files.pythonhosted.org/packages/de/86/5486b0188d08aa643e127774a99bac51ffa6cf343e3deb0583956dca5b22/fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2", size = 183862, upload_time = "2024-12-19T19:57:28.258Z" }, ] [[package]] @@ -1512,26 +1541,26 @@ dependencies = [ { name = "sphinx" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506 } +sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506, upload_time = "2024-08-06T08:07:57.567Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/48/e791a7ed487dbb9729ef32bb5d1af16693d8925f4366befef54119b2e576/furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c", size = 341333 }, + { url = "https://files.pythonhosted.org/packages/27/48/e791a7ed487dbb9729ef32bb5d1af16693d8925f4366befef54119b2e576/furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c", size = 341333, upload_time = "2024-08-06T08:07:54.44Z" }, ] [[package]] name = "git-cliff" version = "2.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/2c/4be68bbdea827ad2b3fd5e7ae880da65e5e4dae8a37af368cc6a1a6ec1ab/git_cliff-2.8.0.tar.gz", hash = "sha256:ab252f0d31c6febb57b6d4f24f9584b779327af43bc94e2bdb00867248cb5d0d", size = 87078 } +sdist = { url = "https://files.pythonhosted.org/packages/57/2c/4be68bbdea827ad2b3fd5e7ae880da65e5e4dae8a37af368cc6a1a6ec1ab/git_cliff-2.8.0.tar.gz", hash = "sha256:ab252f0d31c6febb57b6d4f24f9584b779327af43bc94e2bdb00867248cb5d0d", size = 87078, upload_time = "2025-01-24T15:08:11.93Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/48/06035b44dee6e1bdaea093d48d8b32f4570c665366accf6143e60faa92f4/git_cliff-2.8.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:bfd552f1bda845e85e0a570336b4dacaf76e481f9ebe00301fe5c869377e2289", size = 6325036 }, - { url = "https://files.pythonhosted.org/packages/e3/90/eaa5f850a5d14132026d121896751424e0249e14368e339272f05edec4b9/git_cliff-2.8.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:281504bb22da43b671f9131c3cd7f0d56fa4aa7c9a1922948f9a537a76b38ea7", size = 5870796 }, - { url = "https://files.pythonhosted.org/packages/8b/50/79d7202ce0ca3839b5a03e334201ef58c285e2be5034f9a6eb84a15644d3/git_cliff-2.8.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:485b825fec2600bd2ab847cd5f1724c874ddc0aed7e57d7fb43e484fcc114f8a", size = 6226344 }, - { url = "https://files.pythonhosted.org/packages/4d/d8/cf470a17daeef8e562b3a08310e6d35a00e79ae83391f690006455f10da8/git_cliff-2.8.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dad66722d0df40bd3722cf274cae5f6f55d61f5faa5974c48a68c62179592f7", size = 6669351 }, - { url = "https://files.pythonhosted.org/packages/f2/9d/74357c40bf6f10b91f4422f2ffb5b97384cb33bd01130b43608378740afc/git_cliff-2.8.0-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:96cc47b9716fdeddfa0d68f6c93d6f7deb056da3dcefc0b4e337edb463b5790d", size = 6276116 }, - { url = "https://files.pythonhosted.org/packages/10/7e/12d5c62dd79a8650a75a5d3f28535ae4b4fe5c4b2ae849850608e7cda981/git_cliff-2.8.0-py3-none-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aef4513c51ccd05f21cb539d4125902dbe555abd56695c9793f01636775075ee", size = 6473118 }, - { url = "https://files.pythonhosted.org/packages/20/a7/05285fddc01398b486f51ec799891c238889e680a4711322e55d4eee7723/git_cliff-2.8.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:db21d6f3bf2641bd45340d076e108692606b723ddf8fc7be6bef3ffc9faedaff", size = 6929288 }, - { url = "https://files.pythonhosted.org/packages/48/9c/19e98f35fc27657fe08e22a1cbae8cf40138cb66959f213b112771f25a8d/git_cliff-2.8.0-py3-none-win32.whl", hash = "sha256:09611b9e909f2635378bf185616a82ec7e9bbccb6e79ae6ce204c2ea4005f215", size = 5963978 }, - { url = "https://files.pythonhosted.org/packages/75/e0/c4413fd66f0fb58109627afe64ac8574f46fd7358a4aabca8ed5e85d6a9c/git_cliff-2.8.0-py3-none-win_amd64.whl", hash = "sha256:e284e6b1e7f701b9f2836f31fec38c408da54f361f1a281d0e4709f33f00d905", size = 6716805 }, + { url = "https://files.pythonhosted.org/packages/a5/48/06035b44dee6e1bdaea093d48d8b32f4570c665366accf6143e60faa92f4/git_cliff-2.8.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:bfd552f1bda845e85e0a570336b4dacaf76e481f9ebe00301fe5c869377e2289", size = 6325036, upload_time = "2025-01-24T15:07:49.174Z" }, + { url = "https://files.pythonhosted.org/packages/e3/90/eaa5f850a5d14132026d121896751424e0249e14368e339272f05edec4b9/git_cliff-2.8.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:281504bb22da43b671f9131c3cd7f0d56fa4aa7c9a1922948f9a537a76b38ea7", size = 5870796, upload_time = "2025-01-24T15:07:51.543Z" }, + { url = "https://files.pythonhosted.org/packages/8b/50/79d7202ce0ca3839b5a03e334201ef58c285e2be5034f9a6eb84a15644d3/git_cliff-2.8.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:485b825fec2600bd2ab847cd5f1724c874ddc0aed7e57d7fb43e484fcc114f8a", size = 6226344, upload_time = "2025-01-24T15:07:54.135Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d8/cf470a17daeef8e562b3a08310e6d35a00e79ae83391f690006455f10da8/git_cliff-2.8.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dad66722d0df40bd3722cf274cae5f6f55d61f5faa5974c48a68c62179592f7", size = 6669351, upload_time = "2025-01-24T15:07:56.806Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9d/74357c40bf6f10b91f4422f2ffb5b97384cb33bd01130b43608378740afc/git_cliff-2.8.0-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:96cc47b9716fdeddfa0d68f6c93d6f7deb056da3dcefc0b4e337edb463b5790d", size = 6276116, upload_time = "2025-01-24T15:07:58.768Z" }, + { url = "https://files.pythonhosted.org/packages/10/7e/12d5c62dd79a8650a75a5d3f28535ae4b4fe5c4b2ae849850608e7cda981/git_cliff-2.8.0-py3-none-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aef4513c51ccd05f21cb539d4125902dbe555abd56695c9793f01636775075ee", size = 6473118, upload_time = "2025-01-24T15:08:01.836Z" }, + { url = "https://files.pythonhosted.org/packages/20/a7/05285fddc01398b486f51ec799891c238889e680a4711322e55d4eee7723/git_cliff-2.8.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:db21d6f3bf2641bd45340d076e108692606b723ddf8fc7be6bef3ffc9faedaff", size = 6929288, upload_time = "2025-01-24T15:08:04.306Z" }, + { url = "https://files.pythonhosted.org/packages/48/9c/19e98f35fc27657fe08e22a1cbae8cf40138cb66959f213b112771f25a8d/git_cliff-2.8.0-py3-none-win32.whl", hash = "sha256:09611b9e909f2635378bf185616a82ec7e9bbccb6e79ae6ce204c2ea4005f215", size = 5963978, upload_time = "2025-01-24T15:08:07.138Z" }, + { url = "https://files.pythonhosted.org/packages/75/e0/c4413fd66f0fb58109627afe64ac8574f46fd7358a4aabca8ed5e85d6a9c/git_cliff-2.8.0-py3-none-win_amd64.whl", hash = "sha256:e284e6b1e7f701b9f2836f31fec38c408da54f361f1a281d0e4709f33f00d905", size = 6716805, upload_time = "2025-01-24T15:08:09.345Z" }, ] [[package]] @@ -1541,9 +1570,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "smmap" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload_time = "2025-01-02T07:20:46.413Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload_time = "2025-01-02T07:20:43.624Z" }, ] [[package]] @@ -1553,9 +1582,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196 } +sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196, upload_time = "2025-01-02T07:32:43.59Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599 }, + { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599, upload_time = "2025-01-02T07:32:40.731Z" }, ] [[package]] @@ -1569,23 +1598,23 @@ dependencies = [ { name = "protobuf" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/09/5c/085bcb872556934bb119e5e09de54daa07873f6866b8f0303c49e72287f7/google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696", size = 163516 } +sdist = { url = "https://files.pythonhosted.org/packages/09/5c/085bcb872556934bb119e5e09de54daa07873f6866b8f0303c49e72287f7/google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696", size = 163516, upload_time = "2025-03-10T15:55:26.201Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/95/f472d85adab6e538da2025dfca9e976a0d125cc0af2301f190e77b76e51c/google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9", size = 160061 }, + { url = "https://files.pythonhosted.org/packages/46/95/f472d85adab6e538da2025dfca9e976a0d125cc0af2301f190e77b76e51c/google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9", size = 160061, upload_time = "2025-03-10T15:55:24.386Z" }, ] [[package]] name = "google-auth" -version = "2.38.0" +version = "2.39.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cachetools" }, { name = "pyasn1-modules" }, { name = "rsa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/eb/d504ba1daf190af6b204a9d4714d457462b486043744901a6eeea711f913/google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4", size = 270866 } +sdist = { url = "https://files.pythonhosted.org/packages/cb/8e/8f45c9a32f73e786e954b8f9761c61422955d23c45d1e8c347f9b4b59e8e/google_auth-2.39.0.tar.gz", hash = "sha256:73222d43cdc35a3aeacbfdcaf73142a97839f10de930550d89ebfe1d0a00cde7", size = 274834, upload_time = "2025-04-14T17:44:49.402Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/47/603554949a37bca5b7f894d51896a9c534b9eab808e2520a748e081669d0/google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a", size = 210770 }, + { url = "https://files.pythonhosted.org/packages/ce/12/ad37a1ef86006d0a0117fc06a4a00bd461c775356b534b425f00dde208ea/google_auth-2.39.0-py2.py3-none-any.whl", hash = "sha256:0150b6711e97fb9f52fe599f55648950cc4540015565d8fbb31be2ad6e1548a2", size = 212319, upload_time = "2025-04-14T17:44:47.699Z" }, ] [[package]] @@ -1596,9 +1625,9 @@ dependencies = [ { name = "google-api-core" }, { name = "google-auth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d6/b8/2b53838d2acd6ec6168fd284a990c76695e84c65deee79c9f3a4276f6b4f/google_cloud_core-2.4.3.tar.gz", hash = "sha256:1fab62d7102844b278fe6dead3af32408b1df3eb06f5c7e8634cbd40edc4da53", size = 35861 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/b8/2b53838d2acd6ec6168fd284a990c76695e84c65deee79c9f3a4276f6b4f/google_cloud_core-2.4.3.tar.gz", hash = "sha256:1fab62d7102844b278fe6dead3af32408b1df3eb06f5c7e8634cbd40edc4da53", size = 35861, upload_time = "2025-03-10T21:05:38.948Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/86/bda7241a8da2d28a754aad2ba0f6776e35b67e37c36ae0c45d49370f1014/google_cloud_core-2.4.3-py2.py3-none-any.whl", hash = "sha256:5130f9f4c14b4fafdff75c79448f9495cfade0d8775facf1b09c3bf67e027f6e", size = 29348 }, + { url = "https://files.pythonhosted.org/packages/40/86/bda7241a8da2d28a754aad2ba0f6776e35b67e37c36ae0c45d49370f1014/google_cloud_core-2.4.3-py2.py3-none-any.whl", hash = "sha256:5130f9f4c14b4fafdff75c79448f9495cfade0d8775facf1b09c3bf67e027f6e", size = 29348, upload_time = "2025-03-10T21:05:37.785Z" }, ] [[package]] @@ -1613,36 +1642,36 @@ dependencies = [ { name = "google-resumable-media" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/08/52143124415a889bbab60a8ecede1e31ea0e8d992ca078317886f26dc3be/google_cloud_storage-3.1.0.tar.gz", hash = "sha256:944273179897c7c8a07ee15f2e6466a02da0c7c4b9ecceac2a26017cb2972049", size = 7666527 } +sdist = { url = "https://files.pythonhosted.org/packages/f3/08/52143124415a889bbab60a8ecede1e31ea0e8d992ca078317886f26dc3be/google_cloud_storage-3.1.0.tar.gz", hash = "sha256:944273179897c7c8a07ee15f2e6466a02da0c7c4b9ecceac2a26017cb2972049", size = 7666527, upload_time = "2025-02-28T00:20:02.383Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/b8/c99c965659f45efa73080477c49ffddf7b9aecb00806be8422560bb5b824/google_cloud_storage-3.1.0-py2.py3-none-any.whl", hash = "sha256:eaf36966b68660a9633f03b067e4a10ce09f1377cae3ff9f2c699f69a81c66c6", size = 174861 }, + { url = "https://files.pythonhosted.org/packages/13/b8/c99c965659f45efa73080477c49ffddf7b9aecb00806be8422560bb5b824/google_cloud_storage-3.1.0-py2.py3-none-any.whl", hash = "sha256:eaf36966b68660a9633f03b067e4a10ce09f1377cae3ff9f2c699f69a81c66c6", size = 174861, upload_time = "2025-02-28T00:19:59.459Z" }, ] [[package]] name = "google-crc32c" version = "1.7.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/ae/87802e6d9f9d69adfaedfcfd599266bf386a54d0be058b532d04c794f76d/google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472", size = 14495 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/94/220139ea87822b6fdfdab4fb9ba81b3fff7ea2c82e2af34adc726085bffc/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06", size = 30468 }, - { url = "https://files.pythonhosted.org/packages/94/97/789b23bdeeb9d15dc2904660463ad539d0318286d7633fe2760c10ed0c1c/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9", size = 30313 }, - { url = "https://files.pythonhosted.org/packages/81/b8/976a2b843610c211e7ccb3e248996a61e87dbb2c09b1499847e295080aec/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77", size = 33048 }, - { url = "https://files.pythonhosted.org/packages/c9/16/a3842c2cf591093b111d4a5e2bfb478ac6692d02f1b386d2a33283a19dc9/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53", size = 32669 }, - { url = "https://files.pythonhosted.org/packages/04/17/ed9aba495916fcf5fe4ecb2267ceb851fc5f273c4e4625ae453350cfd564/google_crc32c-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d", size = 33476 }, - { url = "https://files.pythonhosted.org/packages/dd/b7/787e2453cf8639c94b3d06c9d61f512234a82e1d12d13d18584bd3049904/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194", size = 30470 }, - { url = "https://files.pythonhosted.org/packages/ed/b4/6042c2b0cbac3ec3a69bb4c49b28d2f517b7a0f4a0232603c42c58e22b44/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e", size = 30315 }, - { url = "https://files.pythonhosted.org/packages/29/ad/01e7a61a5d059bc57b702d9ff6a18b2585ad97f720bd0a0dbe215df1ab0e/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337", size = 33180 }, - { url = "https://files.pythonhosted.org/packages/3b/a5/7279055cf004561894ed3a7bfdf5bf90a53f28fadd01af7cd166e88ddf16/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65", size = 32794 }, - { url = "https://files.pythonhosted.org/packages/0f/d6/77060dbd140c624e42ae3ece3df53b9d811000729a5c821b9fd671ceaac6/google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6", size = 33477 }, - { url = "https://files.pythonhosted.org/packages/8b/72/b8d785e9184ba6297a8620c8a37cf6e39b81a8ca01bb0796d7cbb28b3386/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35", size = 30467 }, - { url = "https://files.pythonhosted.org/packages/34/25/5f18076968212067c4e8ea95bf3b69669f9fc698476e5f5eb97d5b37999f/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638", size = 30309 }, - { url = "https://files.pythonhosted.org/packages/92/83/9228fe65bf70e93e419f38bdf6c5ca5083fc6d32886ee79b450ceefd1dbd/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb", size = 33133 }, - { url = "https://files.pythonhosted.org/packages/c3/ca/1ea2fd13ff9f8955b85e7956872fdb7050c4ace8a2306a6d177edb9cf7fe/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6", size = 32773 }, - { url = "https://files.pythonhosted.org/packages/89/32/a22a281806e3ef21b72db16f948cad22ec68e4bdd384139291e00ff82fe2/google_crc32c-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db", size = 33475 }, - { url = "https://files.pythonhosted.org/packages/b8/c5/002975aff514e57fc084ba155697a049b3f9b52225ec3bc0f542871dd524/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3", size = 33243 }, - { url = "https://files.pythonhosted.org/packages/61/cb/c585282a03a0cea70fcaa1bf55d5d702d0f2351094d663ec3be1c6c67c52/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9", size = 32870 }, - { url = "https://files.pythonhosted.org/packages/16/1b/1693372bf423ada422f80fd88260dbfd140754adb15cbc4d7e9a68b1cb8e/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48", size = 28241 }, - { url = "https://files.pythonhosted.org/packages/fd/3c/2a19a60a473de48717b4efb19398c3f914795b64a96cf3fbe82588044f78/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82", size = 28048 }, +sdist = { url = "https://files.pythonhosted.org/packages/19/ae/87802e6d9f9d69adfaedfcfd599266bf386a54d0be058b532d04c794f76d/google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472", size = 14495, upload_time = "2025-03-26T14:29:13.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/94/220139ea87822b6fdfdab4fb9ba81b3fff7ea2c82e2af34adc726085bffc/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06", size = 30468, upload_time = "2025-03-26T14:32:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/94/97/789b23bdeeb9d15dc2904660463ad539d0318286d7633fe2760c10ed0c1c/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9", size = 30313, upload_time = "2025-03-26T14:57:38.758Z" }, + { url = "https://files.pythonhosted.org/packages/81/b8/976a2b843610c211e7ccb3e248996a61e87dbb2c09b1499847e295080aec/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77", size = 33048, upload_time = "2025-03-26T14:41:30.679Z" }, + { url = "https://files.pythonhosted.org/packages/c9/16/a3842c2cf591093b111d4a5e2bfb478ac6692d02f1b386d2a33283a19dc9/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53", size = 32669, upload_time = "2025-03-26T14:41:31.432Z" }, + { url = "https://files.pythonhosted.org/packages/04/17/ed9aba495916fcf5fe4ecb2267ceb851fc5f273c4e4625ae453350cfd564/google_crc32c-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d", size = 33476, upload_time = "2025-03-26T14:29:10.211Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b7/787e2453cf8639c94b3d06c9d61f512234a82e1d12d13d18584bd3049904/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194", size = 30470, upload_time = "2025-03-26T14:34:31.655Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b4/6042c2b0cbac3ec3a69bb4c49b28d2f517b7a0f4a0232603c42c58e22b44/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e", size = 30315, upload_time = "2025-03-26T15:01:54.634Z" }, + { url = "https://files.pythonhosted.org/packages/29/ad/01e7a61a5d059bc57b702d9ff6a18b2585ad97f720bd0a0dbe215df1ab0e/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337", size = 33180, upload_time = "2025-03-26T14:41:32.168Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a5/7279055cf004561894ed3a7bfdf5bf90a53f28fadd01af7cd166e88ddf16/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65", size = 32794, upload_time = "2025-03-26T14:41:33.264Z" }, + { url = "https://files.pythonhosted.org/packages/0f/d6/77060dbd140c624e42ae3ece3df53b9d811000729a5c821b9fd671ceaac6/google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6", size = 33477, upload_time = "2025-03-26T14:29:10.94Z" }, + { url = "https://files.pythonhosted.org/packages/8b/72/b8d785e9184ba6297a8620c8a37cf6e39b81a8ca01bb0796d7cbb28b3386/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35", size = 30467, upload_time = "2025-03-26T14:36:06.909Z" }, + { url = "https://files.pythonhosted.org/packages/34/25/5f18076968212067c4e8ea95bf3b69669f9fc698476e5f5eb97d5b37999f/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638", size = 30309, upload_time = "2025-03-26T15:06:15.318Z" }, + { url = "https://files.pythonhosted.org/packages/92/83/9228fe65bf70e93e419f38bdf6c5ca5083fc6d32886ee79b450ceefd1dbd/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb", size = 33133, upload_time = "2025-03-26T14:41:34.388Z" }, + { url = "https://files.pythonhosted.org/packages/c3/ca/1ea2fd13ff9f8955b85e7956872fdb7050c4ace8a2306a6d177edb9cf7fe/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6", size = 32773, upload_time = "2025-03-26T14:41:35.19Z" }, + { url = "https://files.pythonhosted.org/packages/89/32/a22a281806e3ef21b72db16f948cad22ec68e4bdd384139291e00ff82fe2/google_crc32c-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db", size = 33475, upload_time = "2025-03-26T14:29:11.771Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c5/002975aff514e57fc084ba155697a049b3f9b52225ec3bc0f542871dd524/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3", size = 33243, upload_time = "2025-03-26T14:41:35.975Z" }, + { url = "https://files.pythonhosted.org/packages/61/cb/c585282a03a0cea70fcaa1bf55d5d702d0f2351094d663ec3be1c6c67c52/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9", size = 32870, upload_time = "2025-03-26T14:41:37.08Z" }, + { url = "https://files.pythonhosted.org/packages/16/1b/1693372bf423ada422f80fd88260dbfd140754adb15cbc4d7e9a68b1cb8e/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48", size = 28241, upload_time = "2025-03-26T14:41:45.898Z" }, + { url = "https://files.pythonhosted.org/packages/fd/3c/2a19a60a473de48717b4efb19398c3f914795b64a96cf3fbe82588044f78/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82", size = 28048, upload_time = "2025-03-26T14:41:46.696Z" }, ] [[package]] @@ -1652,30 +1681,30 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-crc32c" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/5a/0efdc02665dca14e0837b62c8a1a93132c264bd02054a15abb2218afe0ae/google_resumable_media-2.7.2.tar.gz", hash = "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0", size = 2163099 } +sdist = { url = "https://files.pythonhosted.org/packages/58/5a/0efdc02665dca14e0837b62c8a1a93132c264bd02054a15abb2218afe0ae/google_resumable_media-2.7.2.tar.gz", hash = "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0", size = 2163099, upload_time = "2024-08-07T22:20:38.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/35/b8d3baf8c46695858cb9d8835a53baa1eeb9906ddaf2f728a5f5b640fd1e/google_resumable_media-2.7.2-py2.py3-none-any.whl", hash = "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa", size = 81251 }, + { url = "https://files.pythonhosted.org/packages/82/35/b8d3baf8c46695858cb9d8835a53baa1eeb9906ddaf2f728a5f5b640fd1e/google_resumable_media-2.7.2-py2.py3-none-any.whl", hash = "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa", size = 81251, upload_time = "2024-08-07T22:20:36.409Z" }, ] [[package]] name = "googleapis-common-protos" -version = "1.69.2" +version = "1.70.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1b/d7/ee9d56af4e6dbe958562b5020f46263c8a4628e7952070241fc0e9b182ae/googleapis_common_protos-1.69.2.tar.gz", hash = "sha256:3e1b904a27a33c821b4b749fd31d334c0c9c30e6113023d495e48979a3dc9c5f", size = 144496 } +sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903, upload_time = "2025-04-14T10:17:02.924Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/53/d35476d547a286506f0a6a634ccf1e5d288fffd53d48f0bd5fef61d68684/googleapis_common_protos-1.69.2-py3-none-any.whl", hash = "sha256:0b30452ff9c7a27d80bfc5718954063e8ab53dd3697093d3bc99581f5fd24212", size = 293215 }, + { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530, upload_time = "2025-04-14T10:17:01.271Z" }, ] [[package]] name = "h11" version = "0.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload_time = "2025-04-24T03:35:25.427Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload_time = "2025-04-24T03:35:24.344Z" }, ] [[package]] @@ -1689,9 +1718,9 @@ dependencies = [ { name = "pyjpegls" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/4d/c57fe8ec3d9df870ceb484f66d37341ddf28e3f11e30556e746a21eb158d/highdicom-0.25.1.tar.gz", hash = "sha256:db77eec2c533d79ea698cc10c0be7c203dc5ce5bf0f2b6ca822b816c4c0531f1", size = 1104557 } +sdist = { url = "https://files.pythonhosted.org/packages/61/4d/c57fe8ec3d9df870ceb484f66d37341ddf28e3f11e30556e746a21eb158d/highdicom-0.25.1.tar.gz", hash = "sha256:db77eec2c533d79ea698cc10c0be7c203dc5ce5bf0f2b6ca822b816c4c0531f1", size = 1104557, upload_time = "2025-03-04T16:35:05.395Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/fa/0f057191fb08e82f1525d37688beddc6fb53d638db6d27db142a681f9a38/highdicom-0.25.1-py3-none-any.whl", hash = "sha256:ad5a49715e9a67af24622a08c27e0d31792be9a0d53c24da70c9f3dfaf9af79f", size = 1090252 }, + { url = "https://files.pythonhosted.org/packages/6f/fa/0f057191fb08e82f1525d37688beddc6fb53d638db6d27db142a681f9a38/highdicom-0.25.1-py3-none-any.whl", hash = "sha256:ad5a49715e9a67af24622a08c27e0d31792be9a0d53c24da70c9f3dfaf9af79f", size = 1090252, upload_time = "2025-03-04T16:35:03.847Z" }, ] [[package]] @@ -1702,51 +1731,51 @@ dependencies = [ { name = "six" }, { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/b6/b55c3f49042f1df3dcd422b7f224f939892ee94f22abcf503a9b7339eaf2/html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f", size = 272215 } +sdist = { url = "https://files.pythonhosted.org/packages/ac/b6/b55c3f49042f1df3dcd422b7f224f939892ee94f22abcf503a9b7339eaf2/html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f", size = 272215, upload_time = "2020-06-22T23:32:38.834Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", size = 112173 }, + { url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", size = 112173, upload_time = "2020-06-22T23:32:36.781Z" }, ] [[package]] name = "httpcore" -version = "1.0.7" +version = "1.0.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload_time = "2025-04-24T22:06:22.219Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload_time = "2025-04-24T22:06:20.566Z" }, ] [[package]] name = "httptools" version = "0.6.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029 }, - { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492 }, - { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891 }, - { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788 }, - { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214 }, - { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120 }, - { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565 }, - { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683 }, - { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337 }, - { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796 }, - { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837 }, - { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289 }, - { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779 }, - { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634 }, - { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214 }, - { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431 }, - { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121 }, - { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805 }, - { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858 }, - { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042 }, - { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682 }, +sdist = { url = "https://files.pythonhosted.org/packages/a7/9a/ce5e1f7e131522e6d3426e8e7a490b3a01f39a6696602e1c4f33f9e94277/httptools-0.6.4.tar.gz", hash = "sha256:4e93eee4add6493b59a5c514da98c939b244fce4a0d8879cd3f466562f4b7d5c", size = 240639, upload_time = "2024-10-16T19:45:08.902Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/26/bb526d4d14c2774fe07113ca1db7255737ffbb119315839af2065abfdac3/httptools-0.6.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f47f8ed67cc0ff862b84a1189831d1d33c963fb3ce1ee0c65d3b0cbe7b711069", size = 199029, upload_time = "2024-10-16T19:44:18.427Z" }, + { url = "https://files.pythonhosted.org/packages/a6/17/3e0d3e9b901c732987a45f4f94d4e2c62b89a041d93db89eafb262afd8d5/httptools-0.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0614154d5454c21b6410fdf5262b4a3ddb0f53f1e1721cfd59d55f32138c578a", size = 103492, upload_time = "2024-10-16T19:44:19.515Z" }, + { url = "https://files.pythonhosted.org/packages/b7/24/0fe235d7b69c42423c7698d086d4db96475f9b50b6ad26a718ef27a0bce6/httptools-0.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8787367fbdfccae38e35abf7641dafc5310310a5987b689f4c32cc8cc3ee975", size = 462891, upload_time = "2024-10-16T19:44:21.067Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2f/205d1f2a190b72da6ffb5f41a3736c26d6fa7871101212b15e9b5cd8f61d/httptools-0.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40b0f7fe4fd38e6a507bdb751db0379df1e99120c65fbdc8ee6c1d044897a636", size = 459788, upload_time = "2024-10-16T19:44:22.958Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4c/d09ce0eff09057a206a74575ae8f1e1e2f0364d20e2442224f9e6612c8b9/httptools-0.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40a5ec98d3f49904b9fe36827dcf1aadfef3b89e2bd05b0e35e94f97c2b14721", size = 433214, upload_time = "2024-10-16T19:44:24.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/84c9e23edbccc4a4c6f96a1b8d99dfd2350289e94f00e9ccc7aadde26fb5/httptools-0.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dacdd3d10ea1b4ca9df97a0a303cbacafc04b5cd375fa98732678151643d4988", size = 434120, upload_time = "2024-10-16T19:44:26.295Z" }, + { url = "https://files.pythonhosted.org/packages/d0/46/4d8e7ba9581416de1c425b8264e2cadd201eb709ec1584c381f3e98f51c1/httptools-0.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:288cd628406cc53f9a541cfaf06041b4c71d751856bab45e3702191f931ccd17", size = 88565, upload_time = "2024-10-16T19:44:29.188Z" }, + { url = "https://files.pythonhosted.org/packages/bb/0e/d0b71465c66b9185f90a091ab36389a7352985fe857e352801c39d6127c8/httptools-0.6.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:df017d6c780287d5c80601dafa31f17bddb170232d85c066604d8558683711a2", size = 200683, upload_time = "2024-10-16T19:44:30.175Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b8/412a9bb28d0a8988de3296e01efa0bd62068b33856cdda47fe1b5e890954/httptools-0.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85071a1e8c2d051b507161f6c3e26155b5c790e4e28d7f236422dbacc2a9cc44", size = 104337, upload_time = "2024-10-16T19:44:31.786Z" }, + { url = "https://files.pythonhosted.org/packages/9b/01/6fb20be3196ffdc8eeec4e653bc2a275eca7f36634c86302242c4fbb2760/httptools-0.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69422b7f458c5af875922cdb5bd586cc1f1033295aa9ff63ee196a87519ac8e1", size = 508796, upload_time = "2024-10-16T19:44:32.825Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d8/b644c44acc1368938317d76ac991c9bba1166311880bcc0ac297cb9d6bd7/httptools-0.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16e603a3bff50db08cd578d54f07032ca1631450ceb972c2f834c2b860c28ea2", size = 510837, upload_time = "2024-10-16T19:44:33.974Z" }, + { url = "https://files.pythonhosted.org/packages/52/d8/254d16a31d543073a0e57f1c329ca7378d8924e7e292eda72d0064987486/httptools-0.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec4f178901fa1834d4a060320d2f3abc5c9e39766953d038f1458cb885f47e81", size = 485289, upload_time = "2024-10-16T19:44:35.111Z" }, + { url = "https://files.pythonhosted.org/packages/5f/3c/4aee161b4b7a971660b8be71a92c24d6c64372c1ab3ae7f366b3680df20f/httptools-0.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f9eb89ecf8b290f2e293325c646a211ff1c2493222798bb80a530c5e7502494f", size = 489779, upload_time = "2024-10-16T19:44:36.253Z" }, + { url = "https://files.pythonhosted.org/packages/12/b7/5cae71a8868e555f3f67a50ee7f673ce36eac970f029c0c5e9d584352961/httptools-0.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:db78cb9ca56b59b016e64b6031eda5653be0589dba2b1b43453f6e8b405a0970", size = 88634, upload_time = "2024-10-16T19:44:37.357Z" }, + { url = "https://files.pythonhosted.org/packages/94/a3/9fe9ad23fd35f7de6b91eeb60848986058bd8b5a5c1e256f5860a160cc3e/httptools-0.6.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ade273d7e767d5fae13fa637f4d53b6e961fb7fd93c7797562663f0171c26660", size = 197214, upload_time = "2024-10-16T19:44:38.738Z" }, + { url = "https://files.pythonhosted.org/packages/ea/d9/82d5e68bab783b632023f2fa31db20bebb4e89dfc4d2293945fd68484ee4/httptools-0.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:856f4bc0478ae143bad54a4242fccb1f3f86a6e1be5548fecfd4102061b3a083", size = 102431, upload_time = "2024-10-16T19:44:39.818Z" }, + { url = "https://files.pythonhosted.org/packages/96/c1/cb499655cbdbfb57b577734fde02f6fa0bbc3fe9fb4d87b742b512908dff/httptools-0.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322d20ea9cdd1fa98bd6a74b77e2ec5b818abdc3d36695ab402a0de8ef2865a3", size = 473121, upload_time = "2024-10-16T19:44:41.189Z" }, + { url = "https://files.pythonhosted.org/packages/af/71/ee32fd358f8a3bb199b03261f10921716990808a675d8160b5383487a317/httptools-0.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d87b29bd4486c0093fc64dea80231f7c7f7eb4dc70ae394d70a495ab8436071", size = 473805, upload_time = "2024-10-16T19:44:42.384Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0a/0d4df132bfca1507114198b766f1737d57580c9ad1cf93c1ff673e3387be/httptools-0.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:342dd6946aa6bda4b8f18c734576106b8a31f2fe31492881a9a160ec84ff4bd5", size = 448858, upload_time = "2024-10-16T19:44:43.959Z" }, + { url = "https://files.pythonhosted.org/packages/1e/6a/787004fdef2cabea27bad1073bf6a33f2437b4dbd3b6fb4a9d71172b1c7c/httptools-0.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b36913ba52008249223042dca46e69967985fb4051951f94357ea681e1f5dc0", size = 452042, upload_time = "2024-10-16T19:44:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dc/7decab5c404d1d2cdc1bb330b1bf70e83d6af0396fd4fc76fc60c0d522bf/httptools-0.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:28908df1b9bb8187393d5b5db91435ccc9c8e891657f9cbb42a2541b44c82fc8", size = 87682, upload_time = "2024-10-16T19:44:46.46Z" }, ] [[package]] @@ -1759,9 +1788,9 @@ dependencies = [ { name = "httpcore" }, { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload_time = "2024-12-06T15:37:23.222Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload_time = "2024-12-06T15:37:21.509Z" }, ] [[package]] @@ -1782,54 +1811,54 @@ dependencies = [ { name = "sphinx-click" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/67/583272695d5e7014f67a1c9401f00f1c17dc8d9338accfe5306767af8f93/idc_index-0.8.6.tar.gz", hash = "sha256:340b83f77a640ae626f3f99efcfccbc2dba3b46030f870daf76089cfcfa2d01f", size = 41194 } +sdist = { url = "https://files.pythonhosted.org/packages/28/67/583272695d5e7014f67a1c9401f00f1c17dc8d9338accfe5306767af8f93/idc_index-0.8.6.tar.gz", hash = "sha256:340b83f77a640ae626f3f99efcfccbc2dba3b46030f870daf76089cfcfa2d01f", size = 41194, upload_time = "2025-03-27T20:10:31.352Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/ee/1ad5329215a4d79033b8e2c1fe21484cc1b44465f67abb42c3b4e337b253/idc_index-0.8.6-py3-none-any.whl", hash = "sha256:3b2fd243c382a346cc0175855ce92dc922d8871ee9449fde8b96c2888668af79", size = 26724 }, + { url = "https://files.pythonhosted.org/packages/2b/ee/1ad5329215a4d79033b8e2c1fe21484cc1b44465f67abb42c3b4e337b253/idc_index-0.8.6-py3-none-any.whl", hash = "sha256:3b2fd243c382a346cc0175855ce92dc922d8871ee9449fde8b96c2888668af79", size = 26724, upload_time = "2025-03-27T20:10:29.725Z" }, ] [[package]] name = "idc-index-data" version = "20.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ab/b7/9aef00071919744833e3cca60c86f09769752ea4cfe5e3e31a3fd7d0632d/idc_index_data-20.0.3.tar.gz", hash = "sha256:b8b16cfbf10725f2dbfb90135d9d746659ffeb97735965af94ad743011e77937", size = 20059 } +sdist = { url = "https://files.pythonhosted.org/packages/ab/b7/9aef00071919744833e3cca60c86f09769752ea4cfe5e3e31a3fd7d0632d/idc_index_data-20.0.3.tar.gz", hash = "sha256:b8b16cfbf10725f2dbfb90135d9d746659ffeb97735965af94ad743011e77937", size = 20059, upload_time = "2025-03-03T23:02:18.864Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/0a/a4d2d5e8bc23b93587865885896638075f6455a797ea798d13a44a286aed/idc_index_data-20.0.3-py3-none-any.whl", hash = "sha256:83f3b5db815e34a7e5bc720a37d9f39e35825ab31357bdc0fba3969a77a6c4ba", size = 80260908 }, + { url = "https://files.pythonhosted.org/packages/8f/0a/a4d2d5e8bc23b93587865885896638075f6455a797ea798d13a44a286aed/idc_index_data-20.0.3-py3-none-any.whl", hash = "sha256:83f3b5db815e34a7e5bc720a37d9f39e35825ab31357bdc0fba3969a77a6c4ba", size = 80260908, upload_time = "2025-03-03T23:02:12.908Z" }, ] [[package]] name = "identify" -version = "2.6.9" +version = "2.6.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/98/a71ab060daec766acc30fb47dfca219d03de34a70d616a79a38c6066c5bf/identify-2.6.9.tar.gz", hash = "sha256:d40dfe3142a1421d8518e3d3985ef5ac42890683e32306ad614a29490abeb6bf", size = 99249 } +sdist = { url = "https://files.pythonhosted.org/packages/0c/83/b6ea0334e2e7327084a46aaaf71f2146fc061a192d6518c0d020120cd0aa/identify-2.6.10.tar.gz", hash = "sha256:45e92fd704f3da71cc3880036633f48b4b7265fd4de2b57627cb157216eb7eb8", size = 99201, upload_time = "2025-04-19T15:10:38.32Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/ce/0845144ed1f0e25db5e7a79c2354c1da4b5ce392b8966449d5db8dca18f1/identify-2.6.9-py2.py3-none-any.whl", hash = "sha256:c98b4322da415a8e5a70ff6e51fbc2d2932c015532d77e9f8537b4ba7813b150", size = 99101 }, + { url = "https://files.pythonhosted.org/packages/2b/d3/85feeba1d097b81a44bcffa6a0beab7b4dfffe78e82fc54978d3ac380736/identify-2.6.10-py2.py3-none-any.whl", hash = "sha256:5f34248f54136beed1a7ba6a6b5c4b6cf21ff495aac7c359e1ef831ae3b8ab25", size = 99101, upload_time = "2025-04-19T15:10:36.701Z" }, ] [[package]] name = "idna" version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload_time = "2024-09-15T18:07:39.745Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload_time = "2024-09-15T18:07:37.964Z" }, ] [[package]] name = "ifaddr" version = "0.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/ac/fb4c578f4a3256561548cd825646680edcadb9440f3f68add95ade1eb791/ifaddr-0.2.0.tar.gz", hash = "sha256:cc0cbfcaabf765d44595825fb96a99bb12c79716b73b44330ea38ee2b0c4aed4", size = 10485 } +sdist = { url = "https://files.pythonhosted.org/packages/e8/ac/fb4c578f4a3256561548cd825646680edcadb9440f3f68add95ade1eb791/ifaddr-0.2.0.tar.gz", hash = "sha256:cc0cbfcaabf765d44595825fb96a99bb12c79716b73b44330ea38ee2b0c4aed4", size = 10485, upload_time = "2022-06-15T21:40:27.561Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/1f/19ebc343cc71a7ffa78f17018535adc5cbdd87afb31d7c34874680148b32/ifaddr-0.2.0-py3-none-any.whl", hash = "sha256:085e0305cfe6f16ab12d72e2024030f5d52674afad6911bb1eee207177b8a748", size = 12314 }, + { url = "https://files.pythonhosted.org/packages/9c/1f/19ebc343cc71a7ffa78f17018535adc5cbdd87afb31d7c34874680148b32/ifaddr-0.2.0-py3-none-any.whl", hash = "sha256:085e0305cfe6f16ab12d72e2024030f5d52674afad6911bb1eee207177b8a748", size = 12314, upload_time = "2022-06-15T21:40:25.756Z" }, ] [[package]] name = "imagesize" version = "1.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload_time = "2022-07-01T12:21:05.687Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload_time = "2022-07-01T12:21:02.467Z" }, ] [[package]] @@ -1839,18 +1868,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/08/c1395a292bb23fd03bdf572a1357c5a733d3eecbab877641ceacab23db6e/importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580", size = 55767 } +sdist = { url = "https://files.pythonhosted.org/packages/33/08/c1395a292bb23fd03bdf572a1357c5a733d3eecbab877641ceacab23db6e/importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580", size = 55767, upload_time = "2025-01-20T22:21:30.429Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e", size = 26971 }, + { url = "https://files.pythonhosted.org/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e", size = 26971, upload_time = "2025-01-20T22:21:29.177Z" }, ] [[package]] name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload_time = "2025-03-19T20:09:59.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload_time = "2025-03-19T20:10:01.071Z" }, ] [[package]] @@ -1872,14 +1901,14 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 } +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367, upload_time = "2024-07-01T14:07:22.543Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 }, + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173, upload_time = "2024-07-01T14:07:19.603Z" }, ] [[package]] name = "ipython" -version = "9.0.2" +version = "9.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -1894,9 +1923,9 @@ dependencies = [ { name = "traitlets" }, { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/ce/012a0f40ca58a966f87a6e894d6828e2817657cbdf522b02a5d3a87d92ce/ipython-9.0.2.tar.gz", hash = "sha256:ec7b479e3e5656bf4f58c652c120494df1820f4f28f522fb7ca09e213c2aab52", size = 4366102 } +sdist = { url = "https://files.pythonhosted.org/packages/9d/02/63a84444a7409b3c0acd1de9ffe524660e0e5d82ee473e78b45e5bfb64a4/ipython-9.2.0.tar.gz", hash = "sha256:62a9373dbc12f28f9feaf4700d052195bf89806279fc8ca11f3f54017d04751b", size = 4424394, upload_time = "2025-04-25T17:55:40.498Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/3a/917cb9e72f4e1a4ea13c862533205ae1319bd664119189ee5cc9e4e95ebf/ipython-9.0.2-py3-none-any.whl", hash = "sha256:143ef3ea6fb1e1bffb4c74b114051de653ffb7737a3f7ab1670e657ca6ae8c44", size = 600524 }, + { url = "https://files.pythonhosted.org/packages/78/ce/5e897ee51b7d26ab4e47e5105e7368d40ce6cfae2367acdf3165396d50be/ipython-9.2.0-py3-none-any.whl", hash = "sha256:fef5e33c4a1ae0759e0bba5917c9db4eb8c53fee917b6a526bd973e1ca5159f6", size = 604277, upload_time = "2025-04-25T17:55:37.625Z" }, ] [[package]] @@ -1906,14 +1935,14 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 } +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload_time = "2025-01-17T11:24:34.505Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 }, + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload_time = "2025-01-17T11:24:33.271Z" }, ] [[package]] name = "ipywidgets" -version = "8.1.5" +version = "8.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "comm" }, @@ -1922,9 +1951,9 @@ dependencies = [ { name = "traitlets" }, { name = "widgetsnbextension" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/4c/dab2a281b07596a5fc220d49827fe6c794c66f1493d7a74f1df0640f2cc5/ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17", size = 116723 } +sdist = { url = "https://files.pythonhosted.org/packages/aa/98/4074d9cb7e89f7ee387b41e9a4b74c8e0d6196e90b910af1cc674e1cdd3d/ipywidgets-8.1.6.tar.gz", hash = "sha256:d8ace49c66f14419fc66071371b99d01bed230bbc15d8a60233b18bfbd782851", size = 116764, upload_time = "2025-04-10T13:02:35.733Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245", size = 139767 }, + { url = "https://files.pythonhosted.org/packages/53/b8/62952729573d983d9433faacf62a52ee2e8cf46504418061ad1739967abe/ipywidgets-8.1.6-py3-none-any.whl", hash = "sha256:446e7630a1d025bdc7635e1169fcc06f2ce33b5bd41c2003edeb4a47c8d4bbb1", size = 139808, upload_time = "2025-04-10T13:02:33.904Z" }, ] [[package]] @@ -1934,18 +1963,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "arrow" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649 } +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649, upload_time = "2020-11-01T11:00:00.312Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321 }, + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload_time = "2020-11-01T10:59:58.02Z" }, ] [[package]] name = "itsdangerous" version = "2.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410 } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload_time = "2024-04-16T21:28:15.614Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234 }, + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload_time = "2024-04-16T21:28:14.499Z" }, ] [[package]] @@ -1955,9 +1984,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "parso" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload_time = "2024-11-11T01:41:42.873Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload_time = "2024-11-11T01:41:40.175Z" }, ] [[package]] @@ -1967,18 +1996,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload_time = "2025-03-05T20:05:02.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload_time = "2025-03-05T20:05:00.369Z" }, ] [[package]] name = "jmespath" version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843 } +sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843, upload_time = "2022-06-17T18:00:12.224Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256 }, + { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256, upload_time = "2022-06-17T18:00:10.251Z" }, ] [[package]] @@ -1993,27 +2022,27 @@ dependencies = [ { name = "smart-open", extra = ["http"] }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8d/34/cf272dfe4277ce03b275bb9f5e99001b31db01b21c290fd262333c96e34a/jsf-0.11.2.tar.gz", hash = "sha256:07055b363281d38ce871a9256a00587d8472802c5108721a7fe5884465104b5d", size = 29837 } +sdist = { url = "https://files.pythonhosted.org/packages/8d/34/cf272dfe4277ce03b275bb9f5e99001b31db01b21c290fd262333c96e34a/jsf-0.11.2.tar.gz", hash = "sha256:07055b363281d38ce871a9256a00587d8472802c5108721a7fe5884465104b5d", size = 29837, upload_time = "2024-03-26T02:04:38.893Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/ae/7435288ab8b3059823afa48508ddf658c27d96deb8a978498103ccd71ca8/jsf-0.11.2-py3-none-any.whl", hash = "sha256:b4472c8c2d776eb3e0bb08368caa6ae0ead7ea78b20653facc07b6d93768612c", size = 49322 }, + { url = "https://files.pythonhosted.org/packages/0a/ae/7435288ab8b3059823afa48508ddf658c27d96deb8a978498103ccd71ca8/jsf-0.11.2-py3-none-any.whl", hash = "sha256:b4472c8c2d776eb3e0bb08368caa6ae0ead7ea78b20653facc07b6d93768612c", size = 49322, upload_time = "2024-03-26T02:04:37.013Z" }, ] [[package]] name = "json5" version = "0.12.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/12/be/c6c745ec4c4539b25a278b70e29793f10382947df0d9efba2fa09120895d/json5-0.12.0.tar.gz", hash = "sha256:0b4b6ff56801a1c7dc817b0241bca4ce474a0e6a163bfef3fc594d3fd263ff3a", size = 51907 } +sdist = { url = "https://files.pythonhosted.org/packages/12/be/c6c745ec4c4539b25a278b70e29793f10382947df0d9efba2fa09120895d/json5-0.12.0.tar.gz", hash = "sha256:0b4b6ff56801a1c7dc817b0241bca4ce474a0e6a163bfef3fc594d3fd263ff3a", size = 51907, upload_time = "2025-04-03T16:33:13.201Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/9f/3500910d5a98549e3098807493851eeef2b89cdd3032227558a104dfe926/json5-0.12.0-py3-none-any.whl", hash = "sha256:6d37aa6c08b0609f16e1ec5ff94697e2cbbfbad5ac112afa05794da9ab7810db", size = 36079 }, + { url = "https://files.pythonhosted.org/packages/41/9f/3500910d5a98549e3098807493851eeef2b89cdd3032227558a104dfe926/json5-0.12.0-py3-none-any.whl", hash = "sha256:6d37aa6c08b0609f16e1ec5ff94697e2cbbfbad5ac112afa05794da9ab7810db", size = 36079, upload_time = "2025-04-03T16:33:11.927Z" }, ] [[package]] name = "jsonpointer" version = "3.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114, upload_time = "2024-06-10T19:24:42.462Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload_time = "2024-06-10T19:24:40.698Z" }, ] [[package]] @@ -2026,9 +2055,9 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 } +sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778, upload_time = "2024-07-08T18:40:05.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 }, + { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462, upload_time = "2024-07-08T18:40:00.165Z" }, ] [package.optional-dependencies] @@ -2055,14 +2084,14 @@ format-nongpl = [ [[package]] name = "jsonschema-specifications" -version = "2024.10.1" +version = "2025.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", size = 15561 } +sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload_time = "2025-04-23T12:34:07.418Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 }, + { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload_time = "2025-04-23T12:34:05.422Z" }, ] [[package]] @@ -2077,9 +2106,9 @@ dependencies = [ { name = "nbconvert" }, { name = "notebook" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959 } +sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959, upload_time = "2024-08-30T07:15:48.299Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657 }, + { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657, upload_time = "2024-08-30T07:15:47.045Z" }, ] [[package]] @@ -2093,9 +2122,9 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 } +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload_time = "2024-09-17T10:44:17.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload_time = "2024-09-17T10:44:15.218Z" }, ] [[package]] @@ -2112,9 +2141,9 @@ dependencies = [ { name = "pyzmq" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363 } +sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363, upload_time = "2023-03-06T14:13:31.02Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510 }, + { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510, upload_time = "2023-03-06T14:13:28.229Z" }, ] [[package]] @@ -2126,9 +2155,9 @@ dependencies = [ { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 } +sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629, upload_time = "2024-03-12T12:37:35.652Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 }, + { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965, upload_time = "2024-03-12T12:37:32.36Z" }, ] [[package]] @@ -2145,9 +2174,9 @@ dependencies = [ { name = "rfc3986-validator" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b", size = 62196 } +sdist = { url = "https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b", size = 62196, upload_time = "2025-02-03T17:23:41.485Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", size = 19430 }, + { url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", size = 19430, upload_time = "2025-02-03T17:23:38.643Z" }, ] [[package]] @@ -2157,9 +2186,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jupyter-server" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/b4/3200b0b09c12bc3b72d943d923323c398eff382d1dcc7c0dbc8b74630e40/jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001", size = 48741 } +sdist = { url = "https://files.pythonhosted.org/packages/85/b4/3200b0b09c12bc3b72d943d923323c398eff382d1dcc7c0dbc8b74630e40/jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001", size = 48741, upload_time = "2024-04-09T17:59:44.918Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/e0/7bd7cff65594fd9936e2f9385701e44574fc7d721331ff676ce440b14100/jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da", size = 69146 }, + { url = "https://files.pythonhosted.org/packages/07/e0/7bd7cff65594fd9936e2f9385701e44574fc7d721331ff676ce440b14100/jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da", size = 69146, upload_time = "2024-04-09T17:59:43.388Z" }, ] [[package]] @@ -2187,9 +2216,9 @@ dependencies = [ { name = "traitlets" }, { name = "websocket-client" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/8c/df09d4ab646141f130f9977b32b206ba8615d1969b2eba6a2e84b7f89137/jupyter_server-2.15.0.tar.gz", hash = "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084", size = 725227 } +sdist = { url = "https://files.pythonhosted.org/packages/61/8c/df09d4ab646141f130f9977b32b206ba8615d1969b2eba6a2e84b7f89137/jupyter_server-2.15.0.tar.gz", hash = "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084", size = 725227, upload_time = "2024-12-20T13:02:42.654Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl", hash = "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3", size = 385826 }, + { url = "https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl", hash = "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3", size = 385826, upload_time = "2024-12-20T13:02:37.785Z" }, ] [[package]] @@ -2200,14 +2229,14 @@ dependencies = [ { name = "pywinpty", marker = "os_name == 'nt'" }, { name = "terminado" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430 } +sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430, upload_time = "2024-03-12T14:37:03.049Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", size = 13656 }, + { url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", size = 13656, upload_time = "2024-03-12T14:37:00.708Z" }, ] [[package]] name = "jupyterlab" -version = "4.3.6" +version = "4.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "async-lru" }, @@ -2224,18 +2253,18 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/a5/f0cfd8d8fd521eba1a0beddc201bd0131df8d1355eb4917e92a0ffbac5d6/jupyterlab-4.3.6.tar.gz", hash = "sha256:2900ffdbfca9ed37c4ad7fdda3eb76582fd945d46962af3ac64741ae2d6b2ff4", size = 21827019 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/55/3ef7e6bfe988d7df3d453cc27912846d50590c90790848594f7228c89569/jupyterlab-4.4.1.tar.gz", hash = "sha256:c75c4f33056fbd84f0b31eb44622a00c7a5f981b85adfeb198a83721f0465808", size = 23028447, upload_time = "2025-04-22T18:22:33.423Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/be/422f69447dbd77ddd58251b0945382099fd740e99918a147142f1e852a9d/jupyterlab-4.3.6-py3-none-any.whl", hash = "sha256:fc9eb0455562a56a9bd6d2977cf090842f321fa1a298fcee9bf8c19de353d5fd", size = 11681705 }, + { url = "https://files.pythonhosted.org/packages/29/82/c8784597c5a03426c1ef20c48aff37e8cfe050ab5ca87f0d51069f02b362/jupyterlab-4.4.1-py3-none-any.whl", hash = "sha256:989bca3f9cf2d04b2022e7e657e2df6d4aca808b364810d31c4865edd968a5f7", size = 12292928, upload_time = "2025-04-22T18:22:25.831Z" }, ] [[package]] name = "jupyterlab-pygments" version = "0.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900 } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload_time = "2023-11-23T09:26:37.44Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884 }, + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload_time = "2023-11-23T09:26:34.325Z" }, ] [[package]] @@ -2251,84 +2280,84 @@ dependencies = [ { name = "packaging" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/c9/a883ce65eb27905ce77ace410d83587c82ea64dc85a48d1f7ed52bcfa68d/jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4", size = 76173 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/c9/a883ce65eb27905ce77ace410d83587c82ea64dc85a48d1f7ed52bcfa68d/jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4", size = 76173, upload_time = "2024-07-16T17:02:04.149Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4", size = 59700 }, + { url = "https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4", size = 59700, upload_time = "2024-07-16T17:02:01.115Z" }, ] [[package]] name = "jupyterlab-widgets" -version = "3.0.13" +version = "3.0.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/59/73/fa26bbb747a9ea4fca6b01453aa22990d52ab62dd61384f1ac0dc9d4e7ba/jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed", size = 203556 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/94/766b8199e8a902a4c5ee12a9407a348bbabe9fa22400758576b153d17d8e/jupyterlab_widgets-3.0.14.tar.gz", hash = "sha256:bad03e59546869f026e537e0d170e454259e6dc7048e14041707ca31e523c8a1", size = 203815, upload_time = "2025-04-10T13:00:40.522Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54", size = 214392 }, + { url = "https://files.pythonhosted.org/packages/64/7a/f2479ba401e02f7fcbd3fc6af201eac888eaa188574b8e9df19452ab4972/jupyterlab_widgets-3.0.14-py3-none-any.whl", hash = "sha256:54c33e3306b7fca139d165d6190dc6c0627aafa5d14adfc974a4e9a3d26cb703", size = 213999, upload_time = "2025-04-10T13:00:38.626Z" }, ] [[package]] name = "kiwisolver" version = "1.4.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635 }, - { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717 }, - { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413 }, - { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994 }, - { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804 }, - { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690 }, - { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839 }, - { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109 }, - { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269 }, - { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468 }, - { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394 }, - { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901 }, - { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306 }, - { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966 }, - { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311 }, - { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152 }, - { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555 }, - { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067 }, - { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443 }, - { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728 }, - { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388 }, - { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849 }, - { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533 }, - { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898 }, - { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605 }, - { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801 }, - { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077 }, - { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410 }, - { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853 }, - { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424 }, - { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156 }, - { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555 }, - { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071 }, - { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053 }, - { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278 }, - { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139 }, - { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517 }, - { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952 }, - { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132 }, - { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997 }, - { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060 }, - { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471 }, - { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793 }, - { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855 }, - { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430 }, - { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294 }, - { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736 }, - { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194 }, - { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942 }, - { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341 }, - { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455 }, - { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138 }, - { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857 }, - { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129 }, - { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538 }, - { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661 }, - { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710 }, - { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 }, +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538, upload_time = "2024-12-24T18:30:51.519Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635, upload_time = "2024-12-24T18:28:51.826Z" }, + { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717, upload_time = "2024-12-24T18:28:54.256Z" }, + { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413, upload_time = "2024-12-24T18:28:55.184Z" }, + { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994, upload_time = "2024-12-24T18:28:57.493Z" }, + { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804, upload_time = "2024-12-24T18:29:00.077Z" }, + { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690, upload_time = "2024-12-24T18:29:01.401Z" }, + { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839, upload_time = "2024-12-24T18:29:02.685Z" }, + { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109, upload_time = "2024-12-24T18:29:04.113Z" }, + { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269, upload_time = "2024-12-24T18:29:05.488Z" }, + { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468, upload_time = "2024-12-24T18:29:06.79Z" }, + { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394, upload_time = "2024-12-24T18:29:08.24Z" }, + { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901, upload_time = "2024-12-24T18:29:09.653Z" }, + { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306, upload_time = "2024-12-24T18:29:12.644Z" }, + { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966, upload_time = "2024-12-24T18:29:14.089Z" }, + { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311, upload_time = "2024-12-24T18:29:15.892Z" }, + { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152, upload_time = "2024-12-24T18:29:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555, upload_time = "2024-12-24T18:29:19.146Z" }, + { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067, upload_time = "2024-12-24T18:29:20.096Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443, upload_time = "2024-12-24T18:29:22.843Z" }, + { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728, upload_time = "2024-12-24T18:29:24.463Z" }, + { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388, upload_time = "2024-12-24T18:29:25.776Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849, upload_time = "2024-12-24T18:29:27.202Z" }, + { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533, upload_time = "2024-12-24T18:29:28.638Z" }, + { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898, upload_time = "2024-12-24T18:29:30.368Z" }, + { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605, upload_time = "2024-12-24T18:29:33.151Z" }, + { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801, upload_time = "2024-12-24T18:29:34.584Z" }, + { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077, upload_time = "2024-12-24T18:29:36.138Z" }, + { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410, upload_time = "2024-12-24T18:29:39.991Z" }, + { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853, upload_time = "2024-12-24T18:29:42.006Z" }, + { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424, upload_time = "2024-12-24T18:29:44.38Z" }, + { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156, upload_time = "2024-12-24T18:29:45.368Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555, upload_time = "2024-12-24T18:29:46.37Z" }, + { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071, upload_time = "2024-12-24T18:29:47.333Z" }, + { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053, upload_time = "2024-12-24T18:29:49.636Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278, upload_time = "2024-12-24T18:29:51.164Z" }, + { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139, upload_time = "2024-12-24T18:29:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517, upload_time = "2024-12-24T18:29:53.941Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952, upload_time = "2024-12-24T18:29:56.523Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132, upload_time = "2024-12-24T18:29:57.989Z" }, + { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997, upload_time = "2024-12-24T18:29:59.393Z" }, + { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060, upload_time = "2024-12-24T18:30:01.338Z" }, + { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471, upload_time = "2024-12-24T18:30:04.574Z" }, + { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793, upload_time = "2024-12-24T18:30:06.25Z" }, + { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855, upload_time = "2024-12-24T18:30:07.535Z" }, + { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430, upload_time = "2024-12-24T18:30:08.504Z" }, + { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294, upload_time = "2024-12-24T18:30:09.508Z" }, + { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736, upload_time = "2024-12-24T18:30:11.039Z" }, + { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194, upload_time = "2024-12-24T18:30:14.886Z" }, + { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942, upload_time = "2024-12-24T18:30:18.927Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341, upload_time = "2024-12-24T18:30:22.102Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455, upload_time = "2024-12-24T18:30:24.947Z" }, + { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138, upload_time = "2024-12-24T18:30:26.286Z" }, + { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857, upload_time = "2024-12-24T18:30:28.86Z" }, + { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129, upload_time = "2024-12-24T18:30:30.34Z" }, + { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538, upload_time = "2024-12-24T18:30:33.334Z" }, + { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661, upload_time = "2024-12-24T18:30:34.939Z" }, + { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710, upload_time = "2024-12-24T18:30:37.281Z" }, + { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213, upload_time = "2024-12-24T18:30:40.019Z" }, ] [[package]] @@ -2338,14 +2367,14 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "boolean-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/6f/8709031ea6e0573e6075d24ea34507b0eb32f83f10e1420f2e34606bf0da/license_expression-30.4.1.tar.gz", hash = "sha256:9f02105f9e0fcecba6a85dfbbed7d94ea1c3a70cf23ddbfb5adf3438a6f6fce0", size = 177184 } +sdist = { url = "https://files.pythonhosted.org/packages/74/6f/8709031ea6e0573e6075d24ea34507b0eb32f83f10e1420f2e34606bf0da/license_expression-30.4.1.tar.gz", hash = "sha256:9f02105f9e0fcecba6a85dfbbed7d94ea1c3a70cf23ddbfb5adf3438a6f6fce0", size = 177184, upload_time = "2025-01-14T05:11:39.967Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/84/8a89614b2e7eeeaf0a68a4046d6cfaea4544c8619ea02595ebeec9b2bae3/license_expression-30.4.1-py3-none-any.whl", hash = "sha256:679646bc3261a17690494a3e1cada446e5ee342dbd87dcfa4a0c24cc5dce13ee", size = 111457 }, + { url = "https://files.pythonhosted.org/packages/53/84/8a89614b2e7eeeaf0a68a4046d6cfaea4544c8619ea02595ebeec9b2bae3/license_expression-30.4.1-py3-none-any.whl", hash = "sha256:679646bc3261a17690494a3e1cada446e5ee342dbd87dcfa4a0c24cc5dce13ee", size = 111457, upload_time = "2025-01-14T05:11:38.658Z" }, ] [[package]] name = "logfire" -version = "3.13.1" +version = "3.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "executing" }, @@ -2356,9 +2385,9 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/60/8bffe248b2261cd22808e49a882de70e93b2fc7548582daa1009a0ecf9a5/logfire-3.13.1.tar.gz", hash = "sha256:56cd1133bf93d25d2cd44c004df131183997d479a163290e9aab81d58118889a", size = 471902 } +sdist = { url = "https://files.pythonhosted.org/packages/51/38/74e40b472957d565a355bbc19c07a008108ceebaea292cb12458d7b7e73a/logfire-3.14.1.tar.gz", hash = "sha256:c3d53807cfcb6490c18c5a5471033e27c780197162dc0d6564feb62f28ac4454", size = 473536, upload_time = "2025-04-24T11:21:28.591Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/5f/8a05978d8a4ddb13cf04acf7f510b461b76db8d5547cfefe50e42e8a16e8/logfire-3.13.1-py3-none-any.whl", hash = "sha256:b1c662dcb88fbdcfa1b6561f20ed0e758778e5542b21618cca71fee3c45c27eb", size = 191891 }, + { url = "https://files.pythonhosted.org/packages/de/34/a3e214ea81c8e2c5a1defdd863b6564d39c5f2f29336c37a9b4e2377c4ec/logfire-3.14.1-py3-none-any.whl", hash = "sha256:a1290f6dbcfbf593d84d2b9d824c706c7f7bbdacfaceee417e7bf9fe9db6be02", size = 193122, upload_time = "2025-04-24T11:21:25.03Z" }, ] [package.optional-dependencies] @@ -2368,66 +2397,66 @@ system-metrics = [ [[package]] name = "lxml" -version = "5.3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/80/61/d3dc048cd6c7be6fe45b80cedcbdd4326ba4d550375f266d9f4246d0f4bc/lxml-5.3.2.tar.gz", hash = "sha256:773947d0ed809ddad824b7b14467e1a481b8976e87278ac4a730c2f7c7fcddc1", size = 3679948 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/b8/2b727f5a90902f7cc5548349f563b60911ca05f3b92e35dfa751349f265f/lxml-5.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9d61a7d0d208ace43986a92b111e035881c4ed45b1f5b7a270070acae8b0bfb4", size = 8163457 }, - { url = "https://files.pythonhosted.org/packages/91/84/23135b2dc72b3440d68c8f39ace2bb00fe78e3a2255f7c74f7e76f22498e/lxml-5.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856dfd7eda0b75c29ac80a31a6411ca12209183e866c33faf46e77ace3ce8a79", size = 4433445 }, - { url = "https://files.pythonhosted.org/packages/c9/1c/6900ade2294488f80598af7b3229669562166384bb10bf4c915342a2f288/lxml-5.3.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a01679e4aad0727bedd4c9407d4d65978e920f0200107ceeffd4b019bd48529", size = 5029603 }, - { url = "https://files.pythonhosted.org/packages/2f/e9/31dbe5deaccf0d33ec279cf400306ad4b32dfd1a0fee1fca40c5e90678fe/lxml-5.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6b37b4c3acb8472d191816d4582379f64d81cecbdce1a668601745c963ca5cc", size = 4771236 }, - { url = "https://files.pythonhosted.org/packages/68/41/c3412392884130af3415af2e89a2007e00b2a782be6fb848a95b598a114c/lxml-5.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3df5a54e7b7c31755383f126d3a84e12a4e0333db4679462ef1165d702517477", size = 5369815 }, - { url = "https://files.pythonhosted.org/packages/34/0a/ba0309fd5f990ea0cc05aba2bea225ef1bcb07ecbf6c323c6b119fc46e7f/lxml-5.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c09a40f28dcded933dc16217d6a092be0cc49ae25811d3b8e937c8060647c353", size = 4843663 }, - { url = "https://files.pythonhosted.org/packages/b6/c6/663b5d87d51d00d4386a2d52742a62daa486c5dc6872a443409d9aeafece/lxml-5.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1ef20f1851ccfbe6c5a04c67ec1ce49da16ba993fdbabdce87a92926e505412", size = 4918028 }, - { url = "https://files.pythonhosted.org/packages/75/5f/f6a72ccbe05cf83341d4b6ad162ed9e1f1ffbd12f1c4b8bc8ae413392282/lxml-5.3.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:f79a63289dbaba964eb29ed3c103b7911f2dce28c36fe87c36a114e6bd21d7ad", size = 4792005 }, - { url = "https://files.pythonhosted.org/packages/37/7b/8abd5b332252239ffd28df5842ee4e5bf56e1c613c323586c21ccf5af634/lxml-5.3.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:75a72697d95f27ae00e75086aed629f117e816387b74a2f2da6ef382b460b710", size = 5405363 }, - { url = "https://files.pythonhosted.org/packages/5a/79/549b7ec92b8d9feb13869c1b385a0749d7ccfe5590d1e60f11add9cdd580/lxml-5.3.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:b9b00c9ee1cc3a76f1f16e94a23c344e0b6e5c10bec7f94cf2d820ce303b8c01", size = 4932915 }, - { url = "https://files.pythonhosted.org/packages/57/eb/4fa626d0bac8b4f2aa1d0e6a86232db030fd0f462386daf339e4a0ee352b/lxml-5.3.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:77cbcab50cbe8c857c6ba5f37f9a3976499c60eada1bf6d38f88311373d7b4bc", size = 4983473 }, - { url = "https://files.pythonhosted.org/packages/1b/c8/79d61d13cbb361c2c45fbe7c8bd00ea6a23b3e64bc506264d2856c60d702/lxml-5.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:29424058f072a24622a0a15357bca63d796954758248a72da6d512f9bd9a4493", size = 4855284 }, - { url = "https://files.pythonhosted.org/packages/80/16/9f84e1ef03a13136ab4f9482c9adaaad425c68b47556b9d3192a782e5d37/lxml-5.3.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7d82737a8afe69a7c80ef31d7626075cc7d6e2267f16bf68af2c764b45ed68ab", size = 5458355 }, - { url = "https://files.pythonhosted.org/packages/aa/6d/f62860451bb4683e87636e49effb76d499773337928e53356c1712ccec24/lxml-5.3.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:95473d1d50a5d9fcdb9321fdc0ca6e1edc164dce4c7da13616247d27f3d21e31", size = 5300051 }, - { url = "https://files.pythonhosted.org/packages/3f/5f/3b6c4acec17f9a57ea8bb89a658a70621db3fb86ea588e7703b6819d9b03/lxml-5.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2162068f6da83613f8b2a32ca105e37a564afd0d7009b0b25834d47693ce3538", size = 5033481 }, - { url = "https://files.pythonhosted.org/packages/79/bd/3c4dd7d903bb9981f4876c61ef2ff5d5473e409ef61dc7337ac207b91920/lxml-5.3.2-cp311-cp311-win32.whl", hash = "sha256:f8695752cf5d639b4e981afe6c99e060621362c416058effd5c704bede9cb5d1", size = 3474266 }, - { url = "https://files.pythonhosted.org/packages/1f/ea/9311fa1ef75b7d601c89600fc612838ee77ad3d426184941cba9cf62641f/lxml-5.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:d1a94cbb4ee64af3ab386c2d63d6d9e9cf2e256ac0fd30f33ef0a3c88f575174", size = 3815230 }, - { url = "https://files.pythonhosted.org/packages/0d/7e/c749257a7fabc712c4df57927b0f703507f316e9f2c7e3219f8f76d36145/lxml-5.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:16b3897691ec0316a1aa3c6585f61c8b7978475587c5b16fc1d2c28d283dc1b0", size = 8193212 }, - { url = "https://files.pythonhosted.org/packages/a8/50/17e985ba162c9f1ca119f4445004b58f9e5ef559ded599b16755e9bfa260/lxml-5.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8d4b34a0eeaf6e73169dcfd653c8d47f25f09d806c010daf074fba2db5e2d3f", size = 4451439 }, - { url = "https://files.pythonhosted.org/packages/c2/b5/4960ba0fcca6ce394ed4a2f89ee13083e7fcbe9641a91166e8e9792fedb1/lxml-5.3.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cd7a959396da425022e1e4214895b5cfe7de7035a043bcc2d11303792b67554", size = 5052146 }, - { url = "https://files.pythonhosted.org/packages/5f/d1/184b04481a5d1f5758916de087430752a7b229bddbd6c1d23405078c72bd/lxml-5.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cac5eaeec3549c5df7f8f97a5a6db6963b91639389cdd735d5a806370847732b", size = 4789082 }, - { url = "https://files.pythonhosted.org/packages/7d/75/1a19749d373e9a3d08861addccdf50c92b628c67074b22b8f3c61997cf5a/lxml-5.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29b5f7d77334877c2146e7bb8b94e4df980325fab0a8af4d524e5d43cd6f789d", size = 5312300 }, - { url = "https://files.pythonhosted.org/packages/fb/00/9d165d4060d3f347e63b219fcea5c6a3f9193e9e2868c6801e18e5379725/lxml-5.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13f3495cfec24e3d63fffd342cc8141355d1d26ee766ad388775f5c8c5ec3932", size = 4836655 }, - { url = "https://files.pythonhosted.org/packages/b8/e9/06720a33cc155966448a19677f079100517b6629a872382d22ebd25e48aa/lxml-5.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e70ad4c9658beeff99856926fd3ee5fde8b519b92c693f856007177c36eb2e30", size = 4961795 }, - { url = "https://files.pythonhosted.org/packages/2d/57/4540efab2673de2904746b37ef7f74385329afd4643ed92abcc9ec6e00ca/lxml-5.3.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:507085365783abd7879fa0a6fa55eddf4bdd06591b17a2418403bb3aff8a267d", size = 4779791 }, - { url = "https://files.pythonhosted.org/packages/99/ad/6056edf6c9f4fa1d41e6fbdae52c733a4a257fd0d7feccfa26ae051bb46f/lxml-5.3.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:5bb304f67cbf5dfa07edad904732782cbf693286b9cd85af27059c5779131050", size = 5346807 }, - { url = "https://files.pythonhosted.org/packages/a1/fa/5be91fc91a18f3f705ea5533bc2210b25d738c6b615bf1c91e71a9b2f26b/lxml-5.3.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:3d84f5c093645c21c29a4e972b84cb7cf682f707f8706484a5a0c7ff13d7a988", size = 4909213 }, - { url = "https://files.pythonhosted.org/packages/f3/74/71bb96a3b5ae36b74e0402f4fa319df5559a8538577f8c57c50f1b57dc15/lxml-5.3.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:bdc13911db524bd63f37b0103af014b7161427ada41f1b0b3c9b5b5a9c1ca927", size = 4987694 }, - { url = "https://files.pythonhosted.org/packages/08/c2/3953a68b0861b2f97234b1838769269478ccf872d8ea7a26e911238220ad/lxml-5.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ec944539543f66ebc060ae180d47e86aca0188bda9cbfadff47d86b0dc057dc", size = 4862865 }, - { url = "https://files.pythonhosted.org/packages/e0/9a/52e48f7cfd5a5e61f44a77e679880580dfb4f077af52d6ed5dd97e3356fe/lxml-5.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:59d437cc8a7f838282df5a199cf26f97ef08f1c0fbec6e84bd6f5cc2b7913f6e", size = 5423383 }, - { url = "https://files.pythonhosted.org/packages/17/67/42fe1d489e4dcc0b264bef361aef0b929fbb2b5378702471a3043bc6982c/lxml-5.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e275961adbd32e15672e14e0cc976a982075208224ce06d149c92cb43db5b93", size = 5286864 }, - { url = "https://files.pythonhosted.org/packages/29/e4/03b1d040ee3aaf2bd4e1c2061de2eae1178fe9a460d3efc1ea7ef66f6011/lxml-5.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:038aeb6937aa404480c2966b7f26f1440a14005cb0702078c173c028eca72c31", size = 5056819 }, - { url = "https://files.pythonhosted.org/packages/83/b3/e2ec8a6378e4d87da3af9de7c862bcea7ca624fc1a74b794180c82e30123/lxml-5.3.2-cp312-cp312-win32.whl", hash = "sha256:3c2c8d0fa3277147bff180e3590be67597e17d365ce94beb2efa3138a2131f71", size = 3486177 }, - { url = "https://files.pythonhosted.org/packages/d5/8a/6a08254b0bab2da9573735725caab8302a2a1c9b3818533b41568ca489be/lxml-5.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:77809fcd97dfda3f399102db1794f7280737b69830cd5c961ac87b3c5c05662d", size = 3817134 }, - { url = "https://files.pythonhosted.org/packages/19/fe/904fd1b0ba4f42ed5a144fcfff7b8913181892a6aa7aeb361ee783d441f8/lxml-5.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:77626571fb5270ceb36134765f25b665b896243529eefe840974269b083e090d", size = 8173598 }, - { url = "https://files.pythonhosted.org/packages/97/e8/5e332877b3ce4e2840507b35d6dbe1cc33b17678ece945ba48d2962f8c06/lxml-5.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78a533375dc7aa16d0da44af3cf6e96035e484c8c6b2b2445541a5d4d3d289ee", size = 4441586 }, - { url = "https://files.pythonhosted.org/packages/de/f4/8fe2e6d8721803182fbce2325712e98f22dbc478126070e62731ec6d54a0/lxml-5.3.2-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6f62b2404b3f3f0744bbcabb0381c5fe186fa2a9a67ecca3603480f4846c585", size = 5038447 }, - { url = "https://files.pythonhosted.org/packages/a6/ac/fa63f86a1a4b1ba8b03599ad9e2f5212fa813223ac60bfe1155390d1cc0c/lxml-5.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea918da00091194526d40c30c4996971f09dacab032607581f8d8872db34fbf", size = 4783583 }, - { url = "https://files.pythonhosted.org/packages/1a/7a/08898541296a02c868d4acc11f31a5839d80f5b21d4a96f11d4c0fbed15e/lxml-5.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c35326f94702a7264aa0eea826a79547d3396a41ae87a70511b9f6e9667ad31c", size = 5305684 }, - { url = "https://files.pythonhosted.org/packages/0b/be/9a6d80b467771b90be762b968985d3de09e0d5886092238da65dac9c1f75/lxml-5.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3bef90af21d31c4544bc917f51e04f94ae11b43156356aff243cdd84802cbf2", size = 4830797 }, - { url = "https://files.pythonhosted.org/packages/8d/1c/493632959f83519802637f7db3be0113b6e8a4e501b31411fbf410735a75/lxml-5.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52fa7ba11a495b7cbce51573c73f638f1dcff7b3ee23697467dc063f75352a69", size = 4950302 }, - { url = "https://files.pythonhosted.org/packages/c7/13/01aa3b92a6b93253b90c061c7527261b792f5ae7724b420cded733bfd5d6/lxml-5.3.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ad131e2c4d2c3803e736bb69063382334e03648de2a6b8f56a878d700d4b557d", size = 4775247 }, - { url = "https://files.pythonhosted.org/packages/60/4a/baeb09fbf5c84809e119c9cf8e2e94acec326a9b45563bf5ae45a234973b/lxml-5.3.2-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:00a4463ca409ceacd20490a893a7e08deec7870840eff33dc3093067b559ce3e", size = 5338824 }, - { url = "https://files.pythonhosted.org/packages/69/c7/a05850f169ad783ed09740ac895e158b06d25fce4b13887a8ac92a84d61c/lxml-5.3.2-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:87e8d78205331cace2b73ac8249294c24ae3cba98220687b5b8ec5971a2267f1", size = 4899079 }, - { url = "https://files.pythonhosted.org/packages/de/48/18ca583aba5235582db0e933ed1af6540226ee9ca16c2ee2d6f504fcc34a/lxml-5.3.2-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bf6389133bb255e530a4f2f553f41c4dd795b1fbb6f797aea1eff308f1e11606", size = 4978041 }, - { url = "https://files.pythonhosted.org/packages/b6/55/6968ddc88554209d1dba0dca196360c629b3dfe083bc32a3370f9523a0c4/lxml-5.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b3709fc752b42fb6b6ffa2ba0a5b9871646d97d011d8f08f4d5b3ee61c7f3b2b", size = 4859761 }, - { url = "https://files.pythonhosted.org/packages/2e/52/d2d3baa1e0b7d04a729613160f1562f466fb1a0e45085a33acb0d6981a2b/lxml-5.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:abc795703d0de5d83943a4badd770fbe3d1ca16ee4ff3783d7caffc252f309ae", size = 5418209 }, - { url = "https://files.pythonhosted.org/packages/d3/50/6005b297ba5f858a113d6e81ccdb3a558b95a615772e7412d1f1cbdf22d7/lxml-5.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:98050830bb6510159f65d9ad1b8aca27f07c01bb3884ba95f17319ccedc4bcf9", size = 5274231 }, - { url = "https://files.pythonhosted.org/packages/fb/33/6f40c09a5f7d7e7fcb85ef75072e53eba3fbadbf23e4991ca069ab2b1abb/lxml-5.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6ba465a91acc419c5682f8b06bcc84a424a7aa5c91c220241c6fd31de2a72bc6", size = 5051899 }, - { url = "https://files.pythonhosted.org/packages/8b/3a/673bc5c0d5fb6596ee2963dd016fdaefaed2c57ede82c7634c08cbda86c1/lxml-5.3.2-cp313-cp313-win32.whl", hash = "sha256:56a1d56d60ea1ec940f949d7a309e0bff05243f9bd337f585721605670abb1c1", size = 3485315 }, - { url = "https://files.pythonhosted.org/packages/8c/be/cab8dd33b0dbe3af5b5d4d24137218f79ea75d540f74eb7d8581195639e0/lxml-5.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:1a580dc232c33d2ad87d02c8a3069d47abbcdce974b9c9cc82a79ff603065dbe", size = 3814639 }, +version = "5.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/3d/14e82fc7c8fb1b7761f7e748fd47e2ec8276d137b6acfe5a4bb73853e08f/lxml-5.4.0.tar.gz", hash = "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd", size = 3679479, upload_time = "2025-04-23T01:50:29.322Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/2d/67693cc8a605a12e5975380d7ff83020dcc759351b5a066e1cced04f797b/lxml-5.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:98a3912194c079ef37e716ed228ae0dcb960992100461b704aea4e93af6b0bb9", size = 8083240, upload_time = "2025-04-23T01:45:18.566Z" }, + { url = "https://files.pythonhosted.org/packages/73/53/b5a05ab300a808b72e848efd152fe9c022c0181b0a70b8bca1199f1bed26/lxml-5.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ea0252b51d296a75f6118ed0d8696888e7403408ad42345d7dfd0d1e93309a7", size = 4387685, upload_time = "2025-04-23T01:45:21.387Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/1a3879c5f512bdcd32995c301886fe082b2edd83c87d41b6d42d89b4ea4d/lxml-5.4.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b92b69441d1bd39f4940f9eadfa417a25862242ca2c396b406f9272ef09cdcaa", size = 4991164, upload_time = "2025-04-23T01:45:23.849Z" }, + { url = "https://files.pythonhosted.org/packages/f9/94/bbc66e42559f9d04857071e3b3d0c9abd88579367fd2588a4042f641f57e/lxml-5.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20e16c08254b9b6466526bc1828d9370ee6c0d60a4b64836bc3ac2917d1e16df", size = 4746206, upload_time = "2025-04-23T01:45:26.361Z" }, + { url = "https://files.pythonhosted.org/packages/66/95/34b0679bee435da2d7cae895731700e519a8dfcab499c21662ebe671603e/lxml-5.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7605c1c32c3d6e8c990dd28a0970a3cbbf1429d5b92279e37fda05fb0c92190e", size = 5342144, upload_time = "2025-04-23T01:45:28.939Z" }, + { url = "https://files.pythonhosted.org/packages/e0/5d/abfcc6ab2fa0be72b2ba938abdae1f7cad4c632f8d552683ea295d55adfb/lxml-5.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecf4c4b83f1ab3d5a7ace10bafcb6f11df6156857a3c418244cef41ca9fa3e44", size = 4825124, upload_time = "2025-04-23T01:45:31.361Z" }, + { url = "https://files.pythonhosted.org/packages/5a/78/6bd33186c8863b36e084f294fc0a5e5eefe77af95f0663ef33809cc1c8aa/lxml-5.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cef4feae82709eed352cd7e97ae062ef6ae9c7b5dbe3663f104cd2c0e8d94ba", size = 4876520, upload_time = "2025-04-23T01:45:34.191Z" }, + { url = "https://files.pythonhosted.org/packages/3b/74/4d7ad4839bd0fc64e3d12da74fc9a193febb0fae0ba6ebd5149d4c23176a/lxml-5.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:df53330a3bff250f10472ce96a9af28628ff1f4efc51ccba351a8820bca2a8ba", size = 4765016, upload_time = "2025-04-23T01:45:36.7Z" }, + { url = "https://files.pythonhosted.org/packages/24/0d/0a98ed1f2471911dadfc541003ac6dd6879fc87b15e1143743ca20f3e973/lxml-5.4.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:aefe1a7cb852fa61150fcb21a8c8fcea7b58c4cb11fbe59c97a0a4b31cae3c8c", size = 5362884, upload_time = "2025-04-23T01:45:39.291Z" }, + { url = "https://files.pythonhosted.org/packages/48/de/d4f7e4c39740a6610f0f6959052b547478107967362e8424e1163ec37ae8/lxml-5.4.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ef5a7178fcc73b7d8c07229e89f8eb45b2908a9238eb90dcfc46571ccf0383b8", size = 4902690, upload_time = "2025-04-23T01:45:42.386Z" }, + { url = "https://files.pythonhosted.org/packages/07/8c/61763abd242af84f355ca4ef1ee096d3c1b7514819564cce70fd18c22e9a/lxml-5.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d2ed1b3cb9ff1c10e6e8b00941bb2e5bb568b307bfc6b17dffbbe8be5eecba86", size = 4944418, upload_time = "2025-04-23T01:45:46.051Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c5/6d7e3b63e7e282619193961a570c0a4c8a57fe820f07ca3fe2f6bd86608a/lxml-5.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:72ac9762a9f8ce74c9eed4a4e74306f2f18613a6b71fa065495a67ac227b3056", size = 4827092, upload_time = "2025-04-23T01:45:48.943Z" }, + { url = "https://files.pythonhosted.org/packages/71/4a/e60a306df54680b103348545706a98a7514a42c8b4fbfdcaa608567bb065/lxml-5.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f5cb182f6396706dc6cc1896dd02b1c889d644c081b0cdec38747573db88a7d7", size = 5418231, upload_time = "2025-04-23T01:45:51.481Z" }, + { url = "https://files.pythonhosted.org/packages/27/f2/9754aacd6016c930875854f08ac4b192a47fe19565f776a64004aa167521/lxml-5.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3a3178b4873df8ef9457a4875703488eb1622632a9cee6d76464b60e90adbfcd", size = 5261798, upload_time = "2025-04-23T01:45:54.146Z" }, + { url = "https://files.pythonhosted.org/packages/38/a2/0c49ec6941428b1bd4f280650d7b11a0f91ace9db7de32eb7aa23bcb39ff/lxml-5.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e094ec83694b59d263802ed03a8384594fcce477ce484b0cbcd0008a211ca751", size = 4988195, upload_time = "2025-04-23T01:45:56.685Z" }, + { url = "https://files.pythonhosted.org/packages/7a/75/87a3963a08eafc46a86c1131c6e28a4de103ba30b5ae903114177352a3d7/lxml-5.4.0-cp311-cp311-win32.whl", hash = "sha256:4329422de653cdb2b72afa39b0aa04252fca9071550044904b2e7036d9d97fe4", size = 3474243, upload_time = "2025-04-23T01:45:58.863Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f9/1f0964c4f6c2be861c50db380c554fb8befbea98c6404744ce243a3c87ef/lxml-5.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd3be6481ef54b8cfd0e1e953323b7aa9d9789b94842d0e5b142ef4bb7999539", size = 3815197, upload_time = "2025-04-23T01:46:01.096Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4c/d101ace719ca6a4ec043eb516fcfcb1b396a9fccc4fcd9ef593df34ba0d5/lxml-5.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b5aff6f3e818e6bdbbb38e5967520f174b18f539c2b9de867b1e7fde6f8d95a4", size = 8127392, upload_time = "2025-04-23T01:46:04.09Z" }, + { url = "https://files.pythonhosted.org/packages/11/84/beddae0cec4dd9ddf46abf156f0af451c13019a0fa25d7445b655ba5ccb7/lxml-5.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942a5d73f739ad7c452bf739a62a0f83e2578afd6b8e5406308731f4ce78b16d", size = 4415103, upload_time = "2025-04-23T01:46:07.227Z" }, + { url = "https://files.pythonhosted.org/packages/d0/25/d0d93a4e763f0462cccd2b8a665bf1e4343dd788c76dcfefa289d46a38a9/lxml-5.4.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:460508a4b07364d6abf53acaa0a90b6d370fafde5693ef37602566613a9b0779", size = 5024224, upload_time = "2025-04-23T01:46:10.237Z" }, + { url = "https://files.pythonhosted.org/packages/31/ce/1df18fb8f7946e7f3388af378b1f34fcf253b94b9feedb2cec5969da8012/lxml-5.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529024ab3a505fed78fe3cc5ddc079464e709f6c892733e3f5842007cec8ac6e", size = 4769913, upload_time = "2025-04-23T01:46:12.757Z" }, + { url = "https://files.pythonhosted.org/packages/4e/62/f4a6c60ae7c40d43657f552f3045df05118636be1165b906d3423790447f/lxml-5.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ca56ebc2c474e8f3d5761debfd9283b8b18c76c4fc0967b74aeafba1f5647f9", size = 5290441, upload_time = "2025-04-23T01:46:16.037Z" }, + { url = "https://files.pythonhosted.org/packages/9e/aa/04f00009e1e3a77838c7fc948f161b5d2d5de1136b2b81c712a263829ea4/lxml-5.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a81e1196f0a5b4167a8dafe3a66aa67c4addac1b22dc47947abd5d5c7a3f24b5", size = 4820165, upload_time = "2025-04-23T01:46:19.137Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/e0b2f61fa2404bf0f1fdf1898377e5bd1b74cc9b2cf2c6ba8509b8f27990/lxml-5.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00b8686694423ddae324cf614e1b9659c2edb754de617703c3d29ff568448df5", size = 4932580, upload_time = "2025-04-23T01:46:21.963Z" }, + { url = "https://files.pythonhosted.org/packages/24/a2/8263f351b4ffe0ed3e32ea7b7830f845c795349034f912f490180d88a877/lxml-5.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c5681160758d3f6ac5b4fea370495c48aac0989d6a0f01bb9a72ad8ef5ab75c4", size = 4759493, upload_time = "2025-04-23T01:46:24.316Z" }, + { url = "https://files.pythonhosted.org/packages/05/00/41db052f279995c0e35c79d0f0fc9f8122d5b5e9630139c592a0b58c71b4/lxml-5.4.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:2dc191e60425ad70e75a68c9fd90ab284df64d9cd410ba8d2b641c0c45bc006e", size = 5324679, upload_time = "2025-04-23T01:46:27.097Z" }, + { url = "https://files.pythonhosted.org/packages/1d/be/ee99e6314cdef4587617d3b3b745f9356d9b7dd12a9663c5f3b5734b64ba/lxml-5.4.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:67f779374c6b9753ae0a0195a892a1c234ce8416e4448fe1e9f34746482070a7", size = 4890691, upload_time = "2025-04-23T01:46:30.009Z" }, + { url = "https://files.pythonhosted.org/packages/ad/36/239820114bf1d71f38f12208b9c58dec033cbcf80101cde006b9bde5cffd/lxml-5.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:79d5bfa9c1b455336f52343130b2067164040604e41f6dc4d8313867ed540079", size = 4955075, upload_time = "2025-04-23T01:46:32.33Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e1/1b795cc0b174efc9e13dbd078a9ff79a58728a033142bc6d70a1ee8fc34d/lxml-5.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3d3c30ba1c9b48c68489dc1829a6eede9873f52edca1dda900066542528d6b20", size = 4838680, upload_time = "2025-04-23T01:46:34.852Z" }, + { url = "https://files.pythonhosted.org/packages/72/48/3c198455ca108cec5ae3662ae8acd7fd99476812fd712bb17f1b39a0b589/lxml-5.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1af80c6316ae68aded77e91cd9d80648f7dd40406cef73df841aa3c36f6907c8", size = 5391253, upload_time = "2025-04-23T01:46:37.608Z" }, + { url = "https://files.pythonhosted.org/packages/d6/10/5bf51858971c51ec96cfc13e800a9951f3fd501686f4c18d7d84fe2d6352/lxml-5.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4d885698f5019abe0de3d352caf9466d5de2baded00a06ef3f1216c1a58ae78f", size = 5261651, upload_time = "2025-04-23T01:46:40.183Z" }, + { url = "https://files.pythonhosted.org/packages/2b/11/06710dd809205377da380546f91d2ac94bad9ff735a72b64ec029f706c85/lxml-5.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea53d51859b6c64e7c51d522c03cc2c48b9b5d6172126854cc7f01aa11f52bc", size = 5024315, upload_time = "2025-04-23T01:46:43.333Z" }, + { url = "https://files.pythonhosted.org/packages/f5/b0/15b6217834b5e3a59ebf7f53125e08e318030e8cc0d7310355e6edac98ef/lxml-5.4.0-cp312-cp312-win32.whl", hash = "sha256:d90b729fd2732df28130c064aac9bb8aff14ba20baa4aee7bd0795ff1187545f", size = 3486149, upload_time = "2025-04-23T01:46:45.684Z" }, + { url = "https://files.pythonhosted.org/packages/91/1e/05ddcb57ad2f3069101611bd5f5084157d90861a2ef460bf42f45cced944/lxml-5.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1dc4ca99e89c335a7ed47d38964abcb36c5910790f9bd106f2a8fa2ee0b909d2", size = 3817095, upload_time = "2025-04-23T01:46:48.521Z" }, + { url = "https://files.pythonhosted.org/packages/87/cb/2ba1e9dd953415f58548506fa5549a7f373ae55e80c61c9041b7fd09a38a/lxml-5.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:773e27b62920199c6197130632c18fb7ead3257fce1ffb7d286912e56ddb79e0", size = 8110086, upload_time = "2025-04-23T01:46:52.218Z" }, + { url = "https://files.pythonhosted.org/packages/b5/3e/6602a4dca3ae344e8609914d6ab22e52ce42e3e1638c10967568c5c1450d/lxml-5.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ce9c671845de9699904b1e9df95acfe8dfc183f2310f163cdaa91a3535af95de", size = 4404613, upload_time = "2025-04-23T01:46:55.281Z" }, + { url = "https://files.pythonhosted.org/packages/4c/72/bf00988477d3bb452bef9436e45aeea82bb40cdfb4684b83c967c53909c7/lxml-5.4.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9454b8d8200ec99a224df8854786262b1bd6461f4280064c807303c642c05e76", size = 5012008, upload_time = "2025-04-23T01:46:57.817Z" }, + { url = "https://files.pythonhosted.org/packages/92/1f/93e42d93e9e7a44b2d3354c462cd784dbaaf350f7976b5d7c3f85d68d1b1/lxml-5.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cccd007d5c95279e529c146d095f1d39ac05139de26c098166c4beb9374b0f4d", size = 4760915, upload_time = "2025-04-23T01:47:00.745Z" }, + { url = "https://files.pythonhosted.org/packages/45/0b/363009390d0b461cf9976a499e83b68f792e4c32ecef092f3f9ef9c4ba54/lxml-5.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fce1294a0497edb034cb416ad3e77ecc89b313cff7adbee5334e4dc0d11f422", size = 5283890, upload_time = "2025-04-23T01:47:04.702Z" }, + { url = "https://files.pythonhosted.org/packages/19/dc/6056c332f9378ab476c88e301e6549a0454dbee8f0ae16847414f0eccb74/lxml-5.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24974f774f3a78ac12b95e3a20ef0931795ff04dbb16db81a90c37f589819551", size = 4812644, upload_time = "2025-04-23T01:47:07.833Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8a/f8c66bbb23ecb9048a46a5ef9b495fd23f7543df642dabeebcb2eeb66592/lxml-5.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:497cab4d8254c2a90bf988f162ace2ddbfdd806fce3bda3f581b9d24c852e03c", size = 4921817, upload_time = "2025-04-23T01:47:10.317Z" }, + { url = "https://files.pythonhosted.org/packages/04/57/2e537083c3f381f83d05d9b176f0d838a9e8961f7ed8ddce3f0217179ce3/lxml-5.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:e794f698ae4c5084414efea0f5cc9f4ac562ec02d66e1484ff822ef97c2cadff", size = 4753916, upload_time = "2025-04-23T01:47:12.823Z" }, + { url = "https://files.pythonhosted.org/packages/d8/80/ea8c4072109a350848f1157ce83ccd9439601274035cd045ac31f47f3417/lxml-5.4.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:2c62891b1ea3094bb12097822b3d44b93fc6c325f2043c4d2736a8ff09e65f60", size = 5289274, upload_time = "2025-04-23T01:47:15.916Z" }, + { url = "https://files.pythonhosted.org/packages/b3/47/c4be287c48cdc304483457878a3f22999098b9a95f455e3c4bda7ec7fc72/lxml-5.4.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:142accb3e4d1edae4b392bd165a9abdee8a3c432a2cca193df995bc3886249c8", size = 4874757, upload_time = "2025-04-23T01:47:19.793Z" }, + { url = "https://files.pythonhosted.org/packages/2f/04/6ef935dc74e729932e39478e44d8cfe6a83550552eaa072b7c05f6f22488/lxml-5.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1a42b3a19346e5601d1b8296ff6ef3d76038058f311902edd574461e9c036982", size = 4947028, upload_time = "2025-04-23T01:47:22.401Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f9/c33fc8daa373ef8a7daddb53175289024512b6619bc9de36d77dca3df44b/lxml-5.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4291d3c409a17febf817259cb37bc62cb7eb398bcc95c1356947e2871911ae61", size = 4834487, upload_time = "2025-04-23T01:47:25.513Z" }, + { url = "https://files.pythonhosted.org/packages/8d/30/fc92bb595bcb878311e01b418b57d13900f84c2b94f6eca9e5073ea756e6/lxml-5.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4f5322cf38fe0e21c2d73901abf68e6329dc02a4994e483adbcf92b568a09a54", size = 5381688, upload_time = "2025-04-23T01:47:28.454Z" }, + { url = "https://files.pythonhosted.org/packages/43/d1/3ba7bd978ce28bba8e3da2c2e9d5ae3f8f521ad3f0ca6ea4788d086ba00d/lxml-5.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0be91891bdb06ebe65122aa6bf3fc94489960cf7e03033c6f83a90863b23c58b", size = 5242043, upload_time = "2025-04-23T01:47:31.208Z" }, + { url = "https://files.pythonhosted.org/packages/ee/cd/95fa2201041a610c4d08ddaf31d43b98ecc4b1d74b1e7245b1abdab443cb/lxml-5.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:15a665ad90054a3d4f397bc40f73948d48e36e4c09f9bcffc7d90c87410e478a", size = 5021569, upload_time = "2025-04-23T01:47:33.805Z" }, + { url = "https://files.pythonhosted.org/packages/2d/a6/31da006fead660b9512d08d23d31e93ad3477dd47cc42e3285f143443176/lxml-5.4.0-cp313-cp313-win32.whl", hash = "sha256:d5663bc1b471c79f5c833cffbc9b87d7bf13f87e055a5c86c363ccd2348d7e82", size = 3485270, upload_time = "2025-04-23T01:47:36.133Z" }, + { url = "https://files.pythonhosted.org/packages/fc/14/c115516c62a7d2499781d2d3d7215218c0731b2c940753bf9f9b7b73924d/lxml-5.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:bcb7a1096b4b6b24ce1ac24d4942ad98f983cd3810f9711bcd0293f43a9d8b9f", size = 3814606, upload_time = "2025-04-23T01:47:39.028Z" }, ] [[package]] name = "marimo" -version = "0.13.0" +version = "0.13.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -2448,18 +2477,18 @@ dependencies = [ { name = "uvicorn" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/0f/6d6bf8dbedd528b7beefa4385014f7722e7cfd8fc658b0644eeab3ed4a78/marimo-0.13.0.tar.gz", hash = "sha256:46629fbbd0731c7b819fcd0431dd8ed7982259d6936bd90494376ee17de36e2b", size = 10746792 } +sdist = { url = "https://files.pythonhosted.org/packages/29/01/f26fda933290eaeab4a1a3f856221882c311b1ca3f755f6b4df5a4a1bd11/marimo-0.13.2.tar.gz", hash = "sha256:eaee97908b8f90ae53c1f0ddb34f75c9a29c97f683600402372287ba072e44e5", size = 10774675, upload_time = "2025-04-24T16:18:30.205Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/d5/2b023ba1d0f2fb269cb7f02464bf43865f802c24bd80bdad1379f76c7d05/marimo-0.13.0-py3-none-any.whl", hash = "sha256:f03e479b6eb1ad05404737a1f1ed6d526475adde0faea75c6b23fdb393e6b98a", size = 11110407 }, + { url = "https://files.pythonhosted.org/packages/9a/dd/d0127ed66be00796727a929158d8d15cec276364b414f49710dfef4ddbfb/marimo-0.13.2-py3-none-any.whl", hash = "sha256:173a0f4af6661407a43c3af40811c0e16ff41fd9ccae1b15cbfe52b5f3583c50", size = 11139962, upload_time = "2025-04-24T16:18:33.22Z" }, ] [[package]] name = "markdown" -version = "3.7" +version = "3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/28/3af612670f82f4c056911fbbbb42760255801b3068c48de792d354ff4472/markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", size = 357086 } +sdist = { url = "https://files.pythonhosted.org/packages/2f/15/222b423b0b88689c266d9eac4e61396fe2cc53464459d6a37618ac863b24/markdown-3.8.tar.gz", hash = "sha256:7df81e63f0df5c4b24b7d156eb81e4690595239b7d70937d0409f1b0de319c6f", size = 360906, upload_time = "2025-04-11T14:42:50.928Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803", size = 106349 }, + { url = "https://files.pythonhosted.org/packages/51/3f/afe76f8e2246ffbc867440cbcf90525264df0e658f8a5ca1f872b3f6192a/markdown-3.8-py3-none-any.whl", hash = "sha256:794a929b79c5af141ef5ab0f2f642d0f7b1872981250230e72682346f7cc90dc", size = 106210, upload_time = "2025-04-11T14:42:49.178Z" }, ] [[package]] @@ -2469,66 +2498,66 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload_time = "2023-06-03T06:41:14.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload_time = "2023-06-03T06:41:11.019Z" }, ] [[package]] name = "markdown2" version = "2.5.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/52/d7dcc6284d59edb8301b8400435fbb4926a9b0f13a12b5cbaf3a4a54bb7b/markdown2-2.5.3.tar.gz", hash = "sha256:4d502953a4633408b0ab3ec503c5d6984d1b14307e32b325ec7d16ea57524895", size = 141676 } +sdist = { url = "https://files.pythonhosted.org/packages/44/52/d7dcc6284d59edb8301b8400435fbb4926a9b0f13a12b5cbaf3a4a54bb7b/markdown2-2.5.3.tar.gz", hash = "sha256:4d502953a4633408b0ab3ec503c5d6984d1b14307e32b325ec7d16ea57524895", size = 141676, upload_time = "2025-01-24T21:13:55.044Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/37/0a13c83ccf5365b8e08ea572dfbc04b8cb87cadd359b2451a567f5248878/markdown2-2.5.3-py3-none-any.whl", hash = "sha256:a8ebb7e84b8519c37bf7382b3db600f1798a22c245bfd754a1f87ca8d7ea63b3", size = 48550 }, + { url = "https://files.pythonhosted.org/packages/84/37/0a13c83ccf5365b8e08ea572dfbc04b8cb87cadd359b2451a567f5248878/markdown2-2.5.3-py3-none-any.whl", hash = "sha256:a8ebb7e84b8519c37bf7382b3db600f1798a22c245bfd754a1f87ca8d7ea63b3", size = 48550, upload_time = "2025-01-24T21:13:49.937Z" }, ] [[package]] name = "markupsafe" version = "3.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload_time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload_time = "2024-10-18T15:21:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload_time = "2024-10-18T15:21:02.941Z" }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload_time = "2024-10-18T15:21:03.953Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload_time = "2024-10-18T15:21:06.495Z" }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload_time = "2024-10-18T15:21:07.295Z" }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload_time = "2024-10-18T15:21:08.073Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload_time = "2024-10-18T15:21:09.318Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload_time = "2024-10-18T15:21:10.185Z" }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload_time = "2024-10-18T15:21:11.005Z" }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload_time = "2024-10-18T15:21:12.911Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload_time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload_time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload_time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload_time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload_time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload_time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload_time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload_time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload_time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload_time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload_time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload_time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload_time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload_time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload_time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload_time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload_time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload_time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload_time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload_time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload_time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload_time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload_time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload_time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload_time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload_time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload_time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload_time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload_time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload_time = "2024-10-18T15:21:42.784Z" }, ] [[package]] @@ -2538,9 +2567,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/5e/5e53d26b42ab75491cda89b871dab9e97c840bf12c63ec58a1919710cd06/marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6", size = 221825 } +sdist = { url = "https://files.pythonhosted.org/packages/ab/5e/5e53d26b42ab75491cda89b871dab9e97c840bf12c63ec58a1919710cd06/marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6", size = 221825, upload_time = "2025-02-03T15:32:25.093Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/75/51952c7b2d3873b44a0028b1bd26a25078c18f92f256608e8d1dc61b39fd/marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c", size = 50878 }, + { url = "https://files.pythonhosted.org/packages/34/75/51952c7b2d3873b44a0028b1bd26a25078c18f92f256608e8d1dc61b39fd/marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c", size = 50878, upload_time = "2025-02-03T15:32:22.295Z" }, ] [[package]] @@ -2558,32 +2587,32 @@ dependencies = [ { name = "pyparsing" }, { name = "python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/08/b89867ecea2e305f408fbb417139a8dd941ecf7b23a2e02157c36da546f0/matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba", size = 36743335 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/14/a1b840075be247bb1834b22c1e1d558740b0f618fe3a823740181ca557a1/matplotlib-3.10.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:057206ff2d6ab82ff3e94ebd94463d084760ca682ed5f150817b859372ec4401", size = 8174669 }, - { url = "https://files.pythonhosted.org/packages/0a/e4/300b08e3e08f9c98b0d5635f42edabf2f7a1d634e64cb0318a71a44ff720/matplotlib-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a144867dd6bf8ba8cb5fc81a158b645037e11b3e5cf8a50bd5f9917cb863adfe", size = 8047996 }, - { url = "https://files.pythonhosted.org/packages/75/f9/8d99ff5a2498a5f1ccf919fb46fb945109623c6108216f10f96428f388bc/matplotlib-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56c5d9fcd9879aa8040f196a235e2dcbdf7dd03ab5b07c0696f80bc6cf04bedd", size = 8461612 }, - { url = "https://files.pythonhosted.org/packages/40/b8/53fa08a5eaf78d3a7213fd6da1feec4bae14a81d9805e567013811ff0e85/matplotlib-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f69dc9713e4ad2fb21a1c30e37bd445d496524257dfda40ff4a8efb3604ab5c", size = 8602258 }, - { url = "https://files.pythonhosted.org/packages/40/87/4397d2ce808467af86684a622dd112664553e81752ea8bf61bdd89d24a41/matplotlib-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c59af3e8aca75d7744b68e8e78a669e91ccbcf1ac35d0102a7b1b46883f1dd7", size = 9408896 }, - { url = "https://files.pythonhosted.org/packages/d7/68/0d03098b3feb786cbd494df0aac15b571effda7f7cbdec267e8a8d398c16/matplotlib-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:11b65088c6f3dae784bc72e8d039a2580186285f87448babb9ddb2ad0082993a", size = 8061281 }, - { url = "https://files.pythonhosted.org/packages/7c/1d/5e0dc3b59c034e43de16f94deb68f4ad8a96b3ea00f4b37c160b7474928e/matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107", size = 8175488 }, - { url = "https://files.pythonhosted.org/packages/7a/81/dae7e14042e74da658c3336ab9799128e09a1ee03964f2d89630b5d12106/matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be", size = 8046264 }, - { url = "https://files.pythonhosted.org/packages/21/c4/22516775dcde10fc9c9571d155f90710761b028fc44f660508106c363c97/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6", size = 8452048 }, - { url = "https://files.pythonhosted.org/packages/63/23/c0615001f67ce7c96b3051d856baedc0c818a2ed84570b9bf9bde200f85d/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d", size = 8597111 }, - { url = "https://files.pythonhosted.org/packages/ca/c0/a07939a82aed77770514348f4568177d7dadab9787ebc618a616fe3d665e/matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea", size = 9402771 }, - { url = "https://files.pythonhosted.org/packages/a6/b6/a9405484fb40746fdc6ae4502b16a9d6e53282ba5baaf9ebe2da579f68c4/matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c", size = 8063742 }, - { url = "https://files.pythonhosted.org/packages/60/73/6770ff5e5523d00f3bc584acb6031e29ee5c8adc2336b16cd1d003675fe0/matplotlib-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b", size = 8176112 }, - { url = "https://files.pythonhosted.org/packages/08/97/b0ca5da0ed54a3f6599c3ab568bdda65269bc27c21a2c97868c1625e4554/matplotlib-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1", size = 8046931 }, - { url = "https://files.pythonhosted.org/packages/df/9a/1acbdc3b165d4ce2dcd2b1a6d4ffb46a7220ceee960c922c3d50d8514067/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3", size = 8453422 }, - { url = "https://files.pythonhosted.org/packages/51/d0/2bc4368abf766203e548dc7ab57cf7e9c621f1a3c72b516cc7715347b179/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6", size = 8596819 }, - { url = "https://files.pythonhosted.org/packages/ab/1b/8b350f8a1746c37ab69dda7d7528d1fc696efb06db6ade9727b7887be16d/matplotlib-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b", size = 9402782 }, - { url = "https://files.pythonhosted.org/packages/89/06/f570373d24d93503988ba8d04f213a372fa1ce48381c5eb15da985728498/matplotlib-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473", size = 8063812 }, - { url = "https://files.pythonhosted.org/packages/fc/e0/8c811a925b5a7ad75135f0e5af46408b78af88bbb02a1df775100ef9bfef/matplotlib-3.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01", size = 8214021 }, - { url = "https://files.pythonhosted.org/packages/4a/34/319ec2139f68ba26da9d00fce2ff9f27679fb799a6c8e7358539801fd629/matplotlib-3.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb", size = 8090782 }, - { url = "https://files.pythonhosted.org/packages/77/ea/9812124ab9a99df5b2eec1110e9b2edc0b8f77039abf4c56e0a376e84a29/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972", size = 8478901 }, - { url = "https://files.pythonhosted.org/packages/c9/db/b05bf463689134789b06dea85828f8ebe506fa1e37593f723b65b86c9582/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3", size = 8613864 }, - { url = "https://files.pythonhosted.org/packages/c2/04/41ccec4409f3023a7576df3b5c025f1a8c8b81fbfe922ecfd837ac36e081/matplotlib-3.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f", size = 9409487 }, - { url = "https://files.pythonhosted.org/packages/ac/c2/0d5aae823bdcc42cc99327ecdd4d28585e15ccd5218c453b7bcd827f3421/matplotlib-3.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9", size = 8134832 }, +sdist = { url = "https://files.pythonhosted.org/packages/2f/08/b89867ecea2e305f408fbb417139a8dd941ecf7b23a2e02157c36da546f0/matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba", size = 36743335, upload_time = "2025-02-27T19:19:51.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/14/a1b840075be247bb1834b22c1e1d558740b0f618fe3a823740181ca557a1/matplotlib-3.10.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:057206ff2d6ab82ff3e94ebd94463d084760ca682ed5f150817b859372ec4401", size = 8174669, upload_time = "2025-02-27T19:18:34.346Z" }, + { url = "https://files.pythonhosted.org/packages/0a/e4/300b08e3e08f9c98b0d5635f42edabf2f7a1d634e64cb0318a71a44ff720/matplotlib-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a144867dd6bf8ba8cb5fc81a158b645037e11b3e5cf8a50bd5f9917cb863adfe", size = 8047996, upload_time = "2025-02-27T19:18:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/75/f9/8d99ff5a2498a5f1ccf919fb46fb945109623c6108216f10f96428f388bc/matplotlib-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56c5d9fcd9879aa8040f196a235e2dcbdf7dd03ab5b07c0696f80bc6cf04bedd", size = 8461612, upload_time = "2025-02-27T19:18:39.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/b8/53fa08a5eaf78d3a7213fd6da1feec4bae14a81d9805e567013811ff0e85/matplotlib-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f69dc9713e4ad2fb21a1c30e37bd445d496524257dfda40ff4a8efb3604ab5c", size = 8602258, upload_time = "2025-02-27T19:18:43.217Z" }, + { url = "https://files.pythonhosted.org/packages/40/87/4397d2ce808467af86684a622dd112664553e81752ea8bf61bdd89d24a41/matplotlib-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c59af3e8aca75d7744b68e8e78a669e91ccbcf1ac35d0102a7b1b46883f1dd7", size = 9408896, upload_time = "2025-02-27T19:18:45.852Z" }, + { url = "https://files.pythonhosted.org/packages/d7/68/0d03098b3feb786cbd494df0aac15b571effda7f7cbdec267e8a8d398c16/matplotlib-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:11b65088c6f3dae784bc72e8d039a2580186285f87448babb9ddb2ad0082993a", size = 8061281, upload_time = "2025-02-27T19:18:48.919Z" }, + { url = "https://files.pythonhosted.org/packages/7c/1d/5e0dc3b59c034e43de16f94deb68f4ad8a96b3ea00f4b37c160b7474928e/matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107", size = 8175488, upload_time = "2025-02-27T19:18:51.436Z" }, + { url = "https://files.pythonhosted.org/packages/7a/81/dae7e14042e74da658c3336ab9799128e09a1ee03964f2d89630b5d12106/matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be", size = 8046264, upload_time = "2025-02-27T19:18:54.344Z" }, + { url = "https://files.pythonhosted.org/packages/21/c4/22516775dcde10fc9c9571d155f90710761b028fc44f660508106c363c97/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6", size = 8452048, upload_time = "2025-02-27T19:18:56.536Z" }, + { url = "https://files.pythonhosted.org/packages/63/23/c0615001f67ce7c96b3051d856baedc0c818a2ed84570b9bf9bde200f85d/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d", size = 8597111, upload_time = "2025-02-27T19:18:59.439Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c0/a07939a82aed77770514348f4568177d7dadab9787ebc618a616fe3d665e/matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea", size = 9402771, upload_time = "2025-02-27T19:19:01.944Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b6/a9405484fb40746fdc6ae4502b16a9d6e53282ba5baaf9ebe2da579f68c4/matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c", size = 8063742, upload_time = "2025-02-27T19:19:04.632Z" }, + { url = "https://files.pythonhosted.org/packages/60/73/6770ff5e5523d00f3bc584acb6031e29ee5c8adc2336b16cd1d003675fe0/matplotlib-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b", size = 8176112, upload_time = "2025-02-27T19:19:07.59Z" }, + { url = "https://files.pythonhosted.org/packages/08/97/b0ca5da0ed54a3f6599c3ab568bdda65269bc27c21a2c97868c1625e4554/matplotlib-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1", size = 8046931, upload_time = "2025-02-27T19:19:10.515Z" }, + { url = "https://files.pythonhosted.org/packages/df/9a/1acbdc3b165d4ce2dcd2b1a6d4ffb46a7220ceee960c922c3d50d8514067/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3", size = 8453422, upload_time = "2025-02-27T19:19:12.738Z" }, + { url = "https://files.pythonhosted.org/packages/51/d0/2bc4368abf766203e548dc7ab57cf7e9c621f1a3c72b516cc7715347b179/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6", size = 8596819, upload_time = "2025-02-27T19:19:15.306Z" }, + { url = "https://files.pythonhosted.org/packages/ab/1b/8b350f8a1746c37ab69dda7d7528d1fc696efb06db6ade9727b7887be16d/matplotlib-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b", size = 9402782, upload_time = "2025-02-27T19:19:17.841Z" }, + { url = "https://files.pythonhosted.org/packages/89/06/f570373d24d93503988ba8d04f213a372fa1ce48381c5eb15da985728498/matplotlib-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473", size = 8063812, upload_time = "2025-02-27T19:19:20.888Z" }, + { url = "https://files.pythonhosted.org/packages/fc/e0/8c811a925b5a7ad75135f0e5af46408b78af88bbb02a1df775100ef9bfef/matplotlib-3.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01", size = 8214021, upload_time = "2025-02-27T19:19:23.412Z" }, + { url = "https://files.pythonhosted.org/packages/4a/34/319ec2139f68ba26da9d00fce2ff9f27679fb799a6c8e7358539801fd629/matplotlib-3.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb", size = 8090782, upload_time = "2025-02-27T19:19:28.33Z" }, + { url = "https://files.pythonhosted.org/packages/77/ea/9812124ab9a99df5b2eec1110e9b2edc0b8f77039abf4c56e0a376e84a29/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972", size = 8478901, upload_time = "2025-02-27T19:19:31.536Z" }, + { url = "https://files.pythonhosted.org/packages/c9/db/b05bf463689134789b06dea85828f8ebe506fa1e37593f723b65b86c9582/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3", size = 8613864, upload_time = "2025-02-27T19:19:34.233Z" }, + { url = "https://files.pythonhosted.org/packages/c2/04/41ccec4409f3023a7576df3b5c025f1a8c8b81fbfe922ecfd837ac36e081/matplotlib-3.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f", size = 9409487, upload_time = "2025-02-27T19:19:36.924Z" }, + { url = "https://files.pythonhosted.org/packages/ac/c2/0d5aae823bdcc42cc99327ecdd4d28585e15ccd5218c453b7bcd827f3421/matplotlib-3.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9", size = 8134832, upload_time = "2025-02-27T19:19:39.431Z" }, ] [[package]] @@ -2593,154 +2622,166 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload_time = "2024-04-15T13:44:44.803Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload_time = "2024-04-15T13:44:43.265Z" }, +] + +[[package]] +name = "mbstrdecoder" +version = "1.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "chardet" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/ab/05ae008357c8bdb6245ebf8a101d99f26c096e0ea20800b318153da23796/mbstrdecoder-1.1.4.tar.gz", hash = "sha256:8105ef9cf6b7d7d69fe7fd6b68a2d8f281ca9b365d7a9b670be376b2e6c81b21", size = 14527, upload_time = "2025-01-18T10:07:31.089Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/ac/5ce64a1d4cce00390beab88622a290420401f1cabf05caf2fc0995157c21/mbstrdecoder-1.1.4-py3-none-any.whl", hash = "sha256:03dae4ec50ec0d2ff4743e63fdbd5e0022815857494d35224b60775d3d934a8c", size = 7933, upload_time = "2025-01-18T10:07:29.562Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload_time = "2022-08-14T12:40:10.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload_time = "2022-08-14T12:40:09.779Z" }, ] [[package]] name = "mistune" version = "3.1.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/79/bda47f7dd7c3c55770478d6d02c9960c430b0cf1773b72366ff89126ea31/mistune-3.1.3.tar.gz", hash = "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0", size = 94347 } +sdist = { url = "https://files.pythonhosted.org/packages/c4/79/bda47f7dd7c3c55770478d6d02c9960c430b0cf1773b72366ff89126ea31/mistune-3.1.3.tar.gz", hash = "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0", size = 94347, upload_time = "2025-03-19T14:27:24.955Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl", hash = "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9", size = 53410 }, + { url = "https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl", hash = "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9", size = 53410, upload_time = "2025-03-19T14:27:23.451Z" }, ] [[package]] name = "more-itertools" -version = "10.6.0" +version = "10.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/3b/7fa1fe835e2e93fd6d7b52b2f95ae810cf5ba133e1845f726f5a992d62c2/more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b", size = 125009 } +sdist = { url = "https://files.pythonhosted.org/packages/ce/a0/834b0cebabbfc7e311f30b46c8188790a37f89fc8d756660346fe5abfd09/more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3", size = 127671, upload_time = "2025-04-22T14:17:41.838Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/62/0fe302c6d1be1c777cab0616e6302478251dfbf9055ad426f5d0def75c89/more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89", size = 63038 }, + { url = "https://files.pythonhosted.org/packages/2b/9f/7ba6f94fc1e9ac3d2b853fdff3035fb2fa5afbed898c4a72b8a020610594/more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e", size = 65278, upload_time = "2025-04-22T14:17:40.49Z" }, ] [[package]] name = "msgpack" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/5e/a4c7154ba65d93be91f2f1e55f90e76c5f91ccadc7efc4341e6f04c8647f/msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7", size = 150803 }, - { url = "https://files.pythonhosted.org/packages/60/c2/687684164698f1d51c41778c838d854965dd284a4b9d3a44beba9265c931/msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa", size = 84343 }, - { url = "https://files.pythonhosted.org/packages/42/ae/d3adea9bb4a1342763556078b5765e666f8fdf242e00f3f6657380920972/msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701", size = 81408 }, - { url = "https://files.pythonhosted.org/packages/dc/17/6313325a6ff40ce9c3207293aee3ba50104aed6c2c1559d20d09e5c1ff54/msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6", size = 396096 }, - { url = "https://files.pythonhosted.org/packages/a8/a1/ad7b84b91ab5a324e707f4c9761633e357820b011a01e34ce658c1dda7cc/msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59", size = 403671 }, - { url = "https://files.pythonhosted.org/packages/bb/0b/fd5b7c0b308bbf1831df0ca04ec76fe2f5bf6319833646b0a4bd5e9dc76d/msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0", size = 387414 }, - { url = "https://files.pythonhosted.org/packages/f0/03/ff8233b7c6e9929a1f5da3c7860eccd847e2523ca2de0d8ef4878d354cfa/msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e", size = 383759 }, - { url = "https://files.pythonhosted.org/packages/1f/1b/eb82e1fed5a16dddd9bc75f0854b6e2fe86c0259c4353666d7fab37d39f4/msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6", size = 394405 }, - { url = "https://files.pythonhosted.org/packages/90/2e/962c6004e373d54ecf33d695fb1402f99b51832631e37c49273cc564ffc5/msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5", size = 396041 }, - { url = "https://files.pythonhosted.org/packages/f8/20/6e03342f629474414860c48aeffcc2f7f50ddaf351d95f20c3f1c67399a8/msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88", size = 68538 }, - { url = "https://files.pythonhosted.org/packages/aa/c4/5a582fc9a87991a3e6f6800e9bb2f3c82972912235eb9539954f3e9997c7/msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788", size = 74871 }, - { url = "https://files.pythonhosted.org/packages/e1/d6/716b7ca1dbde63290d2973d22bbef1b5032ca634c3ff4384a958ec3f093a/msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", size = 152421 }, - { url = "https://files.pythonhosted.org/packages/70/da/5312b067f6773429cec2f8f08b021c06af416bba340c912c2ec778539ed6/msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", size = 85277 }, - { url = "https://files.pythonhosted.org/packages/28/51/da7f3ae4462e8bb98af0d5bdf2707f1b8c65a0d4f496e46b6afb06cbc286/msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", size = 82222 }, - { url = "https://files.pythonhosted.org/packages/33/af/dc95c4b2a49cff17ce47611ca9ba218198806cad7796c0b01d1e332c86bb/msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", size = 392971 }, - { url = "https://files.pythonhosted.org/packages/f1/54/65af8de681fa8255402c80eda2a501ba467921d5a7a028c9c22a2c2eedb5/msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", size = 401403 }, - { url = "https://files.pythonhosted.org/packages/97/8c/e333690777bd33919ab7024269dc3c41c76ef5137b211d776fbb404bfead/msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", size = 385356 }, - { url = "https://files.pythonhosted.org/packages/57/52/406795ba478dc1c890559dd4e89280fa86506608a28ccf3a72fbf45df9f5/msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", size = 383028 }, - { url = "https://files.pythonhosted.org/packages/e7/69/053b6549bf90a3acadcd8232eae03e2fefc87f066a5b9fbb37e2e608859f/msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", size = 391100 }, - { url = "https://files.pythonhosted.org/packages/23/f0/d4101d4da054f04274995ddc4086c2715d9b93111eb9ed49686c0f7ccc8a/msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", size = 394254 }, - { url = "https://files.pythonhosted.org/packages/1c/12/cf07458f35d0d775ff3a2dc5559fa2e1fcd06c46f1ef510e594ebefdca01/msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", size = 69085 }, - { url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", size = 75347 }, - { url = "https://files.pythonhosted.org/packages/c8/b0/380f5f639543a4ac413e969109978feb1f3c66e931068f91ab6ab0f8be00/msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf", size = 151142 }, - { url = "https://files.pythonhosted.org/packages/c8/ee/be57e9702400a6cb2606883d55b05784fada898dfc7fd12608ab1fdb054e/msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330", size = 84523 }, - { url = "https://files.pythonhosted.org/packages/7e/3a/2919f63acca3c119565449681ad08a2f84b2171ddfcff1dba6959db2cceb/msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734", size = 81556 }, - { url = "https://files.pythonhosted.org/packages/7c/43/a11113d9e5c1498c145a8925768ea2d5fce7cbab15c99cda655aa09947ed/msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e", size = 392105 }, - { url = "https://files.pythonhosted.org/packages/2d/7b/2c1d74ca6c94f70a1add74a8393a0138172207dc5de6fc6269483519d048/msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca", size = 399979 }, - { url = "https://files.pythonhosted.org/packages/82/8c/cf64ae518c7b8efc763ca1f1348a96f0e37150061e777a8ea5430b413a74/msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915", size = 383816 }, - { url = "https://files.pythonhosted.org/packages/69/86/a847ef7a0f5ef3fa94ae20f52a4cacf596a4e4a010197fbcc27744eb9a83/msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d", size = 380973 }, - { url = "https://files.pythonhosted.org/packages/aa/90/c74cf6e1126faa93185d3b830ee97246ecc4fe12cf9d2d31318ee4246994/msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434", size = 387435 }, - { url = "https://files.pythonhosted.org/packages/7a/40/631c238f1f338eb09f4acb0f34ab5862c4e9d7eda11c1b685471a4c5ea37/msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c", size = 399082 }, - { url = "https://files.pythonhosted.org/packages/e9/1b/fa8a952be252a1555ed39f97c06778e3aeb9123aa4cccc0fd2acd0b4e315/msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc", size = 69037 }, - { url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f", size = 75140 }, +sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260, upload_time = "2024-09-10T04:25:52.197Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/5e/a4c7154ba65d93be91f2f1e55f90e76c5f91ccadc7efc4341e6f04c8647f/msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7", size = 150803, upload_time = "2024-09-10T04:24:40.911Z" }, + { url = "https://files.pythonhosted.org/packages/60/c2/687684164698f1d51c41778c838d854965dd284a4b9d3a44beba9265c931/msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa", size = 84343, upload_time = "2024-09-10T04:24:50.283Z" }, + { url = "https://files.pythonhosted.org/packages/42/ae/d3adea9bb4a1342763556078b5765e666f8fdf242e00f3f6657380920972/msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701", size = 81408, upload_time = "2024-09-10T04:25:12.774Z" }, + { url = "https://files.pythonhosted.org/packages/dc/17/6313325a6ff40ce9c3207293aee3ba50104aed6c2c1559d20d09e5c1ff54/msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6", size = 396096, upload_time = "2024-09-10T04:24:37.245Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a1/ad7b84b91ab5a324e707f4c9761633e357820b011a01e34ce658c1dda7cc/msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59", size = 403671, upload_time = "2024-09-10T04:25:10.201Z" }, + { url = "https://files.pythonhosted.org/packages/bb/0b/fd5b7c0b308bbf1831df0ca04ec76fe2f5bf6319833646b0a4bd5e9dc76d/msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0", size = 387414, upload_time = "2024-09-10T04:25:27.552Z" }, + { url = "https://files.pythonhosted.org/packages/f0/03/ff8233b7c6e9929a1f5da3c7860eccd847e2523ca2de0d8ef4878d354cfa/msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e", size = 383759, upload_time = "2024-09-10T04:25:03.366Z" }, + { url = "https://files.pythonhosted.org/packages/1f/1b/eb82e1fed5a16dddd9bc75f0854b6e2fe86c0259c4353666d7fab37d39f4/msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6", size = 394405, upload_time = "2024-09-10T04:25:07.348Z" }, + { url = "https://files.pythonhosted.org/packages/90/2e/962c6004e373d54ecf33d695fb1402f99b51832631e37c49273cc564ffc5/msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5", size = 396041, upload_time = "2024-09-10T04:25:48.311Z" }, + { url = "https://files.pythonhosted.org/packages/f8/20/6e03342f629474414860c48aeffcc2f7f50ddaf351d95f20c3f1c67399a8/msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88", size = 68538, upload_time = "2024-09-10T04:24:29.953Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c4/5a582fc9a87991a3e6f6800e9bb2f3c82972912235eb9539954f3e9997c7/msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788", size = 74871, upload_time = "2024-09-10T04:25:44.823Z" }, + { url = "https://files.pythonhosted.org/packages/e1/d6/716b7ca1dbde63290d2973d22bbef1b5032ca634c3ff4384a958ec3f093a/msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", size = 152421, upload_time = "2024-09-10T04:25:49.63Z" }, + { url = "https://files.pythonhosted.org/packages/70/da/5312b067f6773429cec2f8f08b021c06af416bba340c912c2ec778539ed6/msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", size = 85277, upload_time = "2024-09-10T04:24:48.562Z" }, + { url = "https://files.pythonhosted.org/packages/28/51/da7f3ae4462e8bb98af0d5bdf2707f1b8c65a0d4f496e46b6afb06cbc286/msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", size = 82222, upload_time = "2024-09-10T04:25:36.49Z" }, + { url = "https://files.pythonhosted.org/packages/33/af/dc95c4b2a49cff17ce47611ca9ba218198806cad7796c0b01d1e332c86bb/msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", size = 392971, upload_time = "2024-09-10T04:24:58.129Z" }, + { url = "https://files.pythonhosted.org/packages/f1/54/65af8de681fa8255402c80eda2a501ba467921d5a7a028c9c22a2c2eedb5/msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", size = 401403, upload_time = "2024-09-10T04:25:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/97/8c/e333690777bd33919ab7024269dc3c41c76ef5137b211d776fbb404bfead/msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", size = 385356, upload_time = "2024-09-10T04:25:31.406Z" }, + { url = "https://files.pythonhosted.org/packages/57/52/406795ba478dc1c890559dd4e89280fa86506608a28ccf3a72fbf45df9f5/msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", size = 383028, upload_time = "2024-09-10T04:25:17.08Z" }, + { url = "https://files.pythonhosted.org/packages/e7/69/053b6549bf90a3acadcd8232eae03e2fefc87f066a5b9fbb37e2e608859f/msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", size = 391100, upload_time = "2024-09-10T04:25:08.993Z" }, + { url = "https://files.pythonhosted.org/packages/23/f0/d4101d4da054f04274995ddc4086c2715d9b93111eb9ed49686c0f7ccc8a/msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", size = 394254, upload_time = "2024-09-10T04:25:06.048Z" }, + { url = "https://files.pythonhosted.org/packages/1c/12/cf07458f35d0d775ff3a2dc5559fa2e1fcd06c46f1ef510e594ebefdca01/msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", size = 69085, upload_time = "2024-09-10T04:25:01.494Z" }, + { url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", size = 75347, upload_time = "2024-09-10T04:25:33.106Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b0/380f5f639543a4ac413e969109978feb1f3c66e931068f91ab6ab0f8be00/msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf", size = 151142, upload_time = "2024-09-10T04:24:59.656Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ee/be57e9702400a6cb2606883d55b05784fada898dfc7fd12608ab1fdb054e/msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330", size = 84523, upload_time = "2024-09-10T04:25:37.924Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3a/2919f63acca3c119565449681ad08a2f84b2171ddfcff1dba6959db2cceb/msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734", size = 81556, upload_time = "2024-09-10T04:24:28.296Z" }, + { url = "https://files.pythonhosted.org/packages/7c/43/a11113d9e5c1498c145a8925768ea2d5fce7cbab15c99cda655aa09947ed/msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e", size = 392105, upload_time = "2024-09-10T04:25:20.153Z" }, + { url = "https://files.pythonhosted.org/packages/2d/7b/2c1d74ca6c94f70a1add74a8393a0138172207dc5de6fc6269483519d048/msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca", size = 399979, upload_time = "2024-09-10T04:25:41.75Z" }, + { url = "https://files.pythonhosted.org/packages/82/8c/cf64ae518c7b8efc763ca1f1348a96f0e37150061e777a8ea5430b413a74/msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915", size = 383816, upload_time = "2024-09-10T04:24:45.826Z" }, + { url = "https://files.pythonhosted.org/packages/69/86/a847ef7a0f5ef3fa94ae20f52a4cacf596a4e4a010197fbcc27744eb9a83/msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d", size = 380973, upload_time = "2024-09-10T04:25:04.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/90/c74cf6e1126faa93185d3b830ee97246ecc4fe12cf9d2d31318ee4246994/msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434", size = 387435, upload_time = "2024-09-10T04:24:17.879Z" }, + { url = "https://files.pythonhosted.org/packages/7a/40/631c238f1f338eb09f4acb0f34ab5862c4e9d7eda11c1b685471a4c5ea37/msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c", size = 399082, upload_time = "2024-09-10T04:25:18.398Z" }, + { url = "https://files.pythonhosted.org/packages/e9/1b/fa8a952be252a1555ed39f97c06778e3aeb9123aa4cccc0fd2acd0b4e315/msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc", size = 69037, upload_time = "2024-09-10T04:24:52.798Z" }, + { url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f", size = 75140, upload_time = "2024-09-10T04:24:31.288Z" }, ] [[package]] name = "multidict" version = "6.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/e0/53cf7f27eda48fffa53cfd4502329ed29e00efb9e4ce41362cbf8aa54310/multidict-6.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", size = 65259 }, - { url = "https://files.pythonhosted.org/packages/44/79/1dcd93ce7070cf01c2ee29f781c42b33c64fce20033808f1cc9ec8413d6e/multidict-6.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", size = 38451 }, - { url = "https://files.pythonhosted.org/packages/f4/35/2292cf29ab5f0d0b3613fad1b75692148959d3834d806be1885ceb49a8ff/multidict-6.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad", size = 37706 }, - { url = "https://files.pythonhosted.org/packages/f6/d1/6b157110b2b187b5a608b37714acb15ee89ec773e3800315b0107ea648cd/multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", size = 226669 }, - { url = "https://files.pythonhosted.org/packages/40/7f/61a476450651f177c5570e04bd55947f693077ba7804fe9717ee9ae8de04/multidict-6.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", size = 223182 }, - { url = "https://files.pythonhosted.org/packages/51/7b/eaf7502ac4824cdd8edcf5723e2e99f390c879866aec7b0c420267b53749/multidict-6.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", size = 235025 }, - { url = "https://files.pythonhosted.org/packages/3b/f6/facdbbd73c96b67a93652774edd5778ab1167854fa08ea35ad004b1b70ad/multidict-6.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", size = 231481 }, - { url = "https://files.pythonhosted.org/packages/70/57/c008e861b3052405eebf921fd56a748322d8c44dcfcab164fffbccbdcdc4/multidict-6.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", size = 223492 }, - { url = "https://files.pythonhosted.org/packages/30/4d/7d8440d3a12a6ae5d6b202d6e7f2ac6ab026e04e99aaf1b73f18e6bc34bc/multidict-6.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", size = 217279 }, - { url = "https://files.pythonhosted.org/packages/7f/e7/bca0df4dd057597b94138d2d8af04eb3c27396a425b1b0a52e082f9be621/multidict-6.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", size = 228733 }, - { url = "https://files.pythonhosted.org/packages/88/f5/383827c3f1c38d7c92dbad00a8a041760228573b1c542fbf245c37bbca8a/multidict-6.4.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", size = 218089 }, - { url = "https://files.pythonhosted.org/packages/36/8a/a5174e8a7d8b94b4c8f9c1e2cf5d07451f41368ffe94d05fc957215b8e72/multidict-6.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", size = 225257 }, - { url = "https://files.pythonhosted.org/packages/8c/76/1d4b7218f0fd00b8e5c90b88df2e45f8af127f652f4e41add947fa54c1c4/multidict-6.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", size = 234728 }, - { url = "https://files.pythonhosted.org/packages/64/44/18372a4f6273fc7ca25630d7bf9ae288cde64f29593a078bff450c7170b6/multidict-6.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", size = 230087 }, - { url = "https://files.pythonhosted.org/packages/0f/ae/28728c314a698d8a6d9491fcacc897077348ec28dd85884d09e64df8a855/multidict-6.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", size = 223137 }, - { url = "https://files.pythonhosted.org/packages/22/50/785bb2b3fe16051bc91c70a06a919f26312da45c34db97fc87441d61e343/multidict-6.4.3-cp311-cp311-win32.whl", hash = "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", size = 34959 }, - { url = "https://files.pythonhosted.org/packages/2f/63/2a22e099ae2f4d92897618c00c73a09a08a2a9aa14b12736965bf8d59fd3/multidict-6.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", size = 38541 }, - { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019 }, - { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925 }, - { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008 }, - { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374 }, - { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869 }, - { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949 }, - { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032 }, - { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517 }, - { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291 }, - { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982 }, - { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823 }, - { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714 }, - { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739 }, - { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809 }, - { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934 }, - { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242 }, - { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635 }, - { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831 }, - { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888 }, - { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852 }, - { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644 }, - { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446 }, - { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070 }, - { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956 }, - { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599 }, - { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136 }, - { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139 }, - { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251 }, - { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868 }, - { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106 }, - { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163 }, - { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906 }, - { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238 }, - { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799 }, - { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642 }, - { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028 }, - { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424 }, - { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178 }, - { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617 }, - { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919 }, - { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097 }, - { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706 }, - { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728 }, - { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276 }, - { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069 }, - { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858 }, - { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988 }, - { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435 }, - { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494 }, - { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775 }, - { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946 }, - { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400 }, +sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372, upload_time = "2025-04-10T22:20:17.956Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e0/53cf7f27eda48fffa53cfd4502329ed29e00efb9e4ce41362cbf8aa54310/multidict-6.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", size = 65259, upload_time = "2025-04-10T22:17:59.632Z" }, + { url = "https://files.pythonhosted.org/packages/44/79/1dcd93ce7070cf01c2ee29f781c42b33c64fce20033808f1cc9ec8413d6e/multidict-6.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", size = 38451, upload_time = "2025-04-10T22:18:01.202Z" }, + { url = "https://files.pythonhosted.org/packages/f4/35/2292cf29ab5f0d0b3613fad1b75692148959d3834d806be1885ceb49a8ff/multidict-6.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad", size = 37706, upload_time = "2025-04-10T22:18:02.276Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d1/6b157110b2b187b5a608b37714acb15ee89ec773e3800315b0107ea648cd/multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", size = 226669, upload_time = "2025-04-10T22:18:03.436Z" }, + { url = "https://files.pythonhosted.org/packages/40/7f/61a476450651f177c5570e04bd55947f693077ba7804fe9717ee9ae8de04/multidict-6.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", size = 223182, upload_time = "2025-04-10T22:18:04.922Z" }, + { url = "https://files.pythonhosted.org/packages/51/7b/eaf7502ac4824cdd8edcf5723e2e99f390c879866aec7b0c420267b53749/multidict-6.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", size = 235025, upload_time = "2025-04-10T22:18:06.274Z" }, + { url = "https://files.pythonhosted.org/packages/3b/f6/facdbbd73c96b67a93652774edd5778ab1167854fa08ea35ad004b1b70ad/multidict-6.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", size = 231481, upload_time = "2025-04-10T22:18:07.742Z" }, + { url = "https://files.pythonhosted.org/packages/70/57/c008e861b3052405eebf921fd56a748322d8c44dcfcab164fffbccbdcdc4/multidict-6.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", size = 223492, upload_time = "2025-04-10T22:18:09.095Z" }, + { url = "https://files.pythonhosted.org/packages/30/4d/7d8440d3a12a6ae5d6b202d6e7f2ac6ab026e04e99aaf1b73f18e6bc34bc/multidict-6.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", size = 217279, upload_time = "2025-04-10T22:18:10.474Z" }, + { url = "https://files.pythonhosted.org/packages/7f/e7/bca0df4dd057597b94138d2d8af04eb3c27396a425b1b0a52e082f9be621/multidict-6.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", size = 228733, upload_time = "2025-04-10T22:18:11.793Z" }, + { url = "https://files.pythonhosted.org/packages/88/f5/383827c3f1c38d7c92dbad00a8a041760228573b1c542fbf245c37bbca8a/multidict-6.4.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", size = 218089, upload_time = "2025-04-10T22:18:13.153Z" }, + { url = "https://files.pythonhosted.org/packages/36/8a/a5174e8a7d8b94b4c8f9c1e2cf5d07451f41368ffe94d05fc957215b8e72/multidict-6.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", size = 225257, upload_time = "2025-04-10T22:18:14.654Z" }, + { url = "https://files.pythonhosted.org/packages/8c/76/1d4b7218f0fd00b8e5c90b88df2e45f8af127f652f4e41add947fa54c1c4/multidict-6.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", size = 234728, upload_time = "2025-04-10T22:18:16.236Z" }, + { url = "https://files.pythonhosted.org/packages/64/44/18372a4f6273fc7ca25630d7bf9ae288cde64f29593a078bff450c7170b6/multidict-6.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", size = 230087, upload_time = "2025-04-10T22:18:17.979Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/28728c314a698d8a6d9491fcacc897077348ec28dd85884d09e64df8a855/multidict-6.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", size = 223137, upload_time = "2025-04-10T22:18:19.362Z" }, + { url = "https://files.pythonhosted.org/packages/22/50/785bb2b3fe16051bc91c70a06a919f26312da45c34db97fc87441d61e343/multidict-6.4.3-cp311-cp311-win32.whl", hash = "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", size = 34959, upload_time = "2025-04-10T22:18:20.728Z" }, + { url = "https://files.pythonhosted.org/packages/2f/63/2a22e099ae2f4d92897618c00c73a09a08a2a9aa14b12736965bf8d59fd3/multidict-6.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", size = 38541, upload_time = "2025-04-10T22:18:22.001Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019, upload_time = "2025-04-10T22:18:23.174Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925, upload_time = "2025-04-10T22:18:24.834Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008, upload_time = "2025-04-10T22:18:26.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374, upload_time = "2025-04-10T22:18:27.714Z" }, + { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869, upload_time = "2025-04-10T22:18:29.162Z" }, + { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949, upload_time = "2025-04-10T22:18:30.679Z" }, + { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032, upload_time = "2025-04-10T22:18:32.146Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517, upload_time = "2025-04-10T22:18:33.538Z" }, + { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291, upload_time = "2025-04-10T22:18:34.962Z" }, + { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982, upload_time = "2025-04-10T22:18:36.443Z" }, + { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823, upload_time = "2025-04-10T22:18:37.924Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714, upload_time = "2025-04-10T22:18:39.807Z" }, + { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739, upload_time = "2025-04-10T22:18:41.341Z" }, + { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809, upload_time = "2025-04-10T22:18:42.817Z" }, + { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934, upload_time = "2025-04-10T22:18:44.311Z" }, + { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242, upload_time = "2025-04-10T22:18:46.193Z" }, + { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635, upload_time = "2025-04-10T22:18:47.498Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831, upload_time = "2025-04-10T22:18:48.748Z" }, + { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888, upload_time = "2025-04-10T22:18:50.021Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852, upload_time = "2025-04-10T22:18:51.246Z" }, + { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644, upload_time = "2025-04-10T22:18:52.965Z" }, + { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446, upload_time = "2025-04-10T22:18:54.509Z" }, + { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070, upload_time = "2025-04-10T22:18:56.019Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956, upload_time = "2025-04-10T22:18:59.146Z" }, + { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599, upload_time = "2025-04-10T22:19:00.657Z" }, + { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136, upload_time = "2025-04-10T22:19:02.244Z" }, + { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139, upload_time = "2025-04-10T22:19:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251, upload_time = "2025-04-10T22:19:06.117Z" }, + { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868, upload_time = "2025-04-10T22:19:07.981Z" }, + { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106, upload_time = "2025-04-10T22:19:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163, upload_time = "2025-04-10T22:19:11Z" }, + { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906, upload_time = "2025-04-10T22:19:12.875Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238, upload_time = "2025-04-10T22:19:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799, upload_time = "2025-04-10T22:19:15.869Z" }, + { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642, upload_time = "2025-04-10T22:19:17.527Z" }, + { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028, upload_time = "2025-04-10T22:19:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424, upload_time = "2025-04-10T22:19:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178, upload_time = "2025-04-10T22:19:22.17Z" }, + { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617, upload_time = "2025-04-10T22:19:23.773Z" }, + { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919, upload_time = "2025-04-10T22:19:25.35Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097, upload_time = "2025-04-10T22:19:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706, upload_time = "2025-04-10T22:19:28.882Z" }, + { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728, upload_time = "2025-04-10T22:19:30.481Z" }, + { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276, upload_time = "2025-04-10T22:19:32.454Z" }, + { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069, upload_time = "2025-04-10T22:19:34.17Z" }, + { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858, upload_time = "2025-04-10T22:19:35.879Z" }, + { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988, upload_time = "2025-04-10T22:19:37.434Z" }, + { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435, upload_time = "2025-04-10T22:19:39.005Z" }, + { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494, upload_time = "2025-04-10T22:19:41.447Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775, upload_time = "2025-04-10T22:19:43.707Z" }, + { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946, upload_time = "2025-04-10T22:19:45.071Z" }, + { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400, upload_time = "2025-04-10T22:20:16.445Z" }, ] [[package]] @@ -2751,54 +2792,54 @@ dependencies = [ { name = "mypy-extensions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/bc/f6339726c627bd7ca1ce0fa56c9ae2d0144604a319e0e339bdadafbbb599/mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", size = 10662338 }, - { url = "https://files.pythonhosted.org/packages/e2/90/8dcf506ca1a09b0d17555cc00cd69aee402c203911410136cd716559efe7/mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", size = 9787540 }, - { url = "https://files.pythonhosted.org/packages/05/05/a10f9479681e5da09ef2f9426f650d7b550d4bafbef683b69aad1ba87457/mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", size = 11538051 }, - { url = "https://files.pythonhosted.org/packages/e9/9a/1f7d18b30edd57441a6411fcbc0c6869448d1a4bacbaee60656ac0fc29c8/mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", size = 12286751 }, - { url = "https://files.pythonhosted.org/packages/72/af/19ff499b6f1dafcaf56f9881f7a965ac2f474f69f6f618b5175b044299f5/mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", size = 12421783 }, - { url = "https://files.pythonhosted.org/packages/96/39/11b57431a1f686c1aed54bf794870efe0f6aeca11aca281a0bd87a5ad42c/mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", size = 9265618 }, - { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981 }, - { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175 }, - { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675 }, - { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020 }, - { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582 }, - { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614 }, - { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592 }, - { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611 }, - { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443 }, - { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541 }, - { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348 }, - { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648 }, - { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 }, +sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717, upload_time = "2025-02-05T03:50:34.655Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/bc/f6339726c627bd7ca1ce0fa56c9ae2d0144604a319e0e339bdadafbbb599/mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", size = 10662338, upload_time = "2025-02-05T03:50:17.287Z" }, + { url = "https://files.pythonhosted.org/packages/e2/90/8dcf506ca1a09b0d17555cc00cd69aee402c203911410136cd716559efe7/mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", size = 9787540, upload_time = "2025-02-05T03:49:51.21Z" }, + { url = "https://files.pythonhosted.org/packages/05/05/a10f9479681e5da09ef2f9426f650d7b550d4bafbef683b69aad1ba87457/mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", size = 11538051, upload_time = "2025-02-05T03:50:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9a/1f7d18b30edd57441a6411fcbc0c6869448d1a4bacbaee60656ac0fc29c8/mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", size = 12286751, upload_time = "2025-02-05T03:49:42.408Z" }, + { url = "https://files.pythonhosted.org/packages/72/af/19ff499b6f1dafcaf56f9881f7a965ac2f474f69f6f618b5175b044299f5/mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", size = 12421783, upload_time = "2025-02-05T03:49:07.707Z" }, + { url = "https://files.pythonhosted.org/packages/96/39/11b57431a1f686c1aed54bf794870efe0f6aeca11aca281a0bd87a5ad42c/mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", size = 9265618, upload_time = "2025-02-05T03:49:54.581Z" }, + { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981, upload_time = "2025-02-05T03:50:28.25Z" }, + { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175, upload_time = "2025-02-05T03:50:13.411Z" }, + { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675, upload_time = "2025-02-05T03:50:31.421Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020, upload_time = "2025-02-05T03:48:48.705Z" }, + { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582, upload_time = "2025-02-05T03:49:03.628Z" }, + { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614, upload_time = "2025-02-05T03:50:00.313Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592, upload_time = "2025-02-05T03:48:55.789Z" }, + { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611, upload_time = "2025-02-05T03:48:44.581Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443, upload_time = "2025-02-05T03:49:25.514Z" }, + { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541, upload_time = "2025-02-05T03:49:57.623Z" }, + { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348, upload_time = "2025-02-05T03:48:52.361Z" }, + { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648, upload_time = "2025-02-05T03:49:11.395Z" }, + { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777, upload_time = "2025-02-05T03:50:08.348Z" }, ] [[package]] name = "mypy-extensions" -version = "1.0.0" +version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload_time = "2025-04-22T14:54:24.164Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload_time = "2025-04-22T14:54:22.983Z" }, ] [[package]] name = "narwhals" -version = "1.33.0" +version = "1.36.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/fd/484aa8bb557f97a1781f38c78b79f795a2fa320e4165c4230f679937d1e8/narwhals-1.33.0.tar.gz", hash = "sha256:6233d2457debf4b5fe4a1da54530c6fe2d84326f4a8e3bca35bbbff580a347cb", size = 262554 } +sdist = { url = "https://files.pythonhosted.org/packages/65/92/503f99e2244a271aacd6c2588e0af1b59232292b217708748cdb30214dc3/narwhals-1.36.0.tar.gz", hash = "sha256:7cd860e7e066609bd8a042bb5b8e4193275532114448210a91cbd5c622b6e5eb", size = 270385, upload_time = "2025-04-23T07:15:32.895Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/c1/e9bc6b67c774e7c1f939c91ea535f18f7644fedc61b20d6baa861ad52b34/narwhals-1.33.0-py3-none-any.whl", hash = "sha256:f653319112fd121a1f1c18a40cf70dada773cdacfd53e62c2aa0afae43c17129", size = 322750 }, + { url = "https://files.pythonhosted.org/packages/42/bf/fbcbd9f8676e06ed43d644a4ddbf31478a44056487578ce67f191da430cb/narwhals-1.36.0-py3-none-any.whl", hash = "sha256:e3c50dd1d769bc145f57ae17c1f0f0da6c3d397d62cdd0bb167e9b618e95c9d6", size = 331018, upload_time = "2025-04-23T07:15:30.866Z" }, ] [[package]] name = "natsort" version = "8.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e2/a9/a0c57aee75f77794adaf35322f8b6404cbd0f89ad45c87197a937764b7d0/natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581", size = 76575 } +sdist = { url = "https://files.pythonhosted.org/packages/e2/a9/a0c57aee75f77794adaf35322f8b6404cbd0f89ad45c87197a937764b7d0/natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581", size = 76575, upload_time = "2023-06-20T04:17:19.925Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/82/7a9d0550484a62c6da82858ee9419f3dd1ccc9aa1c26a1e43da3ecd20b0d/natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c", size = 38268 }, + { url = "https://files.pythonhosted.org/packages/ef/82/7a9d0550484a62c6da82858ee9419f3dd1ccc9aa1c26a1e43da3ecd20b0d/natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c", size = 38268, upload_time = "2023-06-20T04:17:17.522Z" }, ] [[package]] @@ -2811,9 +2852,9 @@ dependencies = [ { name = "nbformat" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424 } +sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424, upload_time = "2024-12-19T10:32:27.164Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434 }, + { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434, upload_time = "2024-12-19T10:32:24.139Z" }, ] [[package]] @@ -2836,9 +2877,9 @@ dependencies = [ { name = "pygments" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715 } +sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715, upload_time = "2025-01-28T09:29:14.724Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525 }, + { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525, upload_time = "2025-01-28T09:29:12.551Z" }, ] [[package]] @@ -2851,18 +2892,18 @@ dependencies = [ { name = "jupyter-core" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749 } +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload_time = "2024-04-04T11:20:37.371Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454 }, + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload_time = "2024-04-04T11:20:34.895Z" }, ] [[package]] name = "nest-asyncio" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload_time = "2024-01-21T14:25:19.227Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload_time = "2024-01-21T14:25:17.223Z" }, ] [[package]] @@ -2893,9 +2934,9 @@ dependencies = [ { name = "vbuild" }, { name = "watchfiles" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/65/4e/6e6ab26320c5b5c992c5879de58d08d59decadf59a274bf88cbc89de88d3/nicegui-2.15.0.tar.gz", hash = "sha256:0b63bcf9634744d285aa618f74c4d57ea7264fd8f8a9e331cf10d528ba37355c", size = 16036134 } +sdist = { url = "https://files.pythonhosted.org/packages/65/4e/6e6ab26320c5b5c992c5879de58d08d59decadf59a274bf88cbc89de88d3/nicegui-2.15.0.tar.gz", hash = "sha256:0b63bcf9634744d285aa618f74c4d57ea7264fd8f8a9e331cf10d528ba37355c", size = 16036134, upload_time = "2025-04-16T10:17:44.546Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/48/a302bfeddd0948cccb028716204baa1dc1cfd38d6d6016e42168ddd66295/nicegui-2.15.0-py3-none-any.whl", hash = "sha256:0e401108447ae0e6b0a77c1de2611b67c4508f095a6f34d98a4640a2e17e2a08", size = 16485380 }, + { url = "https://files.pythonhosted.org/packages/5e/48/a302bfeddd0948cccb028716204baa1dc1cfd38d6d6016e42168ddd66295/nicegui-2.15.0-py3-none-any.whl", hash = "sha256:0e401108447ae0e6b0a77c1de2611b67c4508f095a6f34d98a4640a2e17e2a08", size = 16485380, upload_time = "2025-04-16T10:17:41.63Z" }, ] [package.optional-dependencies] @@ -2907,14 +2948,14 @@ native = [ name = "nodeenv" version = "1.9.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload_time = "2024-06-04T18:44:11.171Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload_time = "2024-06-04T18:44:08.352Z" }, ] [[package]] name = "notebook" -version = "7.3.3" +version = "7.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jupyter-server" }, @@ -2923,9 +2964,9 @@ dependencies = [ { name = "notebook-shim" }, { name = "tornado" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/0f/7781fed05f79d1047c039dfd17fbd6e6670bcf5ad330baa997bcc62525b5/notebook-7.3.3.tar.gz", hash = "sha256:707a313fb882d35f921989eb3d204de942ed5132a44e4aa1fe0e8f24bb9dc25d", size = 12758099 } +sdist = { url = "https://files.pythonhosted.org/packages/91/89/1b4636280f01ec948c007e700e24921135b9b76221148a405fd5287c3c17/notebook-7.4.1.tar.gz", hash = "sha256:96894962b230013ea0c0a466e4e642c5aace25ba8c86686175b69990ef628ff9", size = 13881349, upload_time = "2025-04-23T06:40:29.147Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/bf/5e5fcf79c559600b738d7577c8360bfd4cfa705400af06f23b3a049e44b6/notebook-7.3.3-py3-none-any.whl", hash = "sha256:b193df0878956562d5171c8e25c9252b8e86c9fcc16163b8ee3fe6c5e3f422f7", size = 13142886 }, + { url = "https://files.pythonhosted.org/packages/41/c5/47248ed90d263e4c16f9f6b06f094105ce33f384cf135eab5a6452230d46/notebook-7.4.1-py3-none-any.whl", hash = "sha256:498f12cf567d95b20e780d62d52564ee4310248b3175e996b667b5808028e5d3", size = 14282763, upload_time = "2025-04-23T06:40:25.41Z" }, ] [[package]] @@ -2935,9 +2976,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jupyter-server" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167 } +sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167, upload_time = "2024-02-14T23:35:18.353Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307 }, + { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload_time = "2024-02-14T23:35:16.286Z" }, ] [[package]] @@ -2952,9 +2993,9 @@ dependencies = [ { name = "packaging" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0d/22/84a2d3442cb33e6fb1af18172a15deb1eea3f970417f1f4c5fa1600143e8/nox-2025.2.9.tar.gz", hash = "sha256:d50cd4ca568bd7621c2e6cbbc4845b3b7f7697f25d5fb0190ce8f4600be79768", size = 4021103 } +sdist = { url = "https://files.pythonhosted.org/packages/0d/22/84a2d3442cb33e6fb1af18172a15deb1eea3f970417f1f4c5fa1600143e8/nox-2025.2.9.tar.gz", hash = "sha256:d50cd4ca568bd7621c2e6cbbc4845b3b7f7697f25d5fb0190ce8f4600be79768", size = 4021103, upload_time = "2025-02-09T19:02:06.556Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/57/ca/64e634c056cba463cac743735660a772ab78eb26ec9759e88de735f2cd27/nox-2025.2.9-py3-none-any.whl", hash = "sha256:7d1e92d1918c6980d70aee9cf1c1d19d16faa71c4afe338fffd39e8a460e2067", size = 71315 }, + { url = "https://files.pythonhosted.org/packages/57/ca/64e634c056cba463cac743735660a772ab78eb26ec9759e88de735f2cd27/nox-2025.2.9-py3-none-any.whl", hash = "sha256:7d1e92d1918c6980d70aee9cf1c1d19d16faa71c4afe338fffd39e8a460e2067", size = 71315, upload_time = "2025-02-09T19:02:04.624Z" }, ] [package.optional-dependencies] @@ -2964,89 +3005,98 @@ uv = [ [[package]] name = "numpy" -version = "2.2.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e1/78/31103410a57bc2c2b93a3597340a8119588571f6a4539067546cb9a0bfac/numpy-2.2.4.tar.gz", hash = "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", size = 20270701 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/fb/09e778ee3a8ea0d4dc8329cca0a9c9e65fed847d08e37eba74cb7ed4b252/numpy-2.2.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", size = 21254989 }, - { url = "https://files.pythonhosted.org/packages/a2/0a/1212befdbecab5d80eca3cde47d304cad986ad4eec7d85a42e0b6d2cc2ef/numpy-2.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", size = 14425910 }, - { url = "https://files.pythonhosted.org/packages/2b/3e/e7247c1d4f15086bb106c8d43c925b0b2ea20270224f5186fa48d4fb5cbd/numpy-2.2.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", size = 5426490 }, - { url = "https://files.pythonhosted.org/packages/5d/fa/aa7cd6be51419b894c5787a8a93c3302a1ed4f82d35beb0613ec15bdd0e2/numpy-2.2.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", size = 6967754 }, - { url = "https://files.pythonhosted.org/packages/d5/ee/96457c943265de9fadeb3d2ffdbab003f7fba13d971084a9876affcda095/numpy-2.2.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", size = 14373079 }, - { url = "https://files.pythonhosted.org/packages/c5/5c/ceefca458559f0ccc7a982319f37ed07b0d7b526964ae6cc61f8ad1b6119/numpy-2.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", size = 16428819 }, - { url = "https://files.pythonhosted.org/packages/22/31/9b2ac8eee99e001eb6add9fa27514ef5e9faf176169057a12860af52704c/numpy-2.2.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", size = 15881470 }, - { url = "https://files.pythonhosted.org/packages/f0/dc/8569b5f25ff30484b555ad8a3f537e0225d091abec386c9420cf5f7a2976/numpy-2.2.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", size = 18218144 }, - { url = "https://files.pythonhosted.org/packages/5e/05/463c023a39bdeb9bb43a99e7dee2c664cb68d5bb87d14f92482b9f6011cc/numpy-2.2.4-cp311-cp311-win32.whl", hash = "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", size = 6606368 }, - { url = "https://files.pythonhosted.org/packages/8b/72/10c1d2d82101c468a28adc35de6c77b308f288cfd0b88e1070f15b98e00c/numpy-2.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91", size = 12947526 }, - { url = "https://files.pythonhosted.org/packages/a2/30/182db21d4f2a95904cec1a6f779479ea1ac07c0647f064dea454ec650c42/numpy-2.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", size = 20947156 }, - { url = "https://files.pythonhosted.org/packages/24/6d/9483566acfbda6c62c6bc74b6e981c777229d2af93c8eb2469b26ac1b7bc/numpy-2.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", size = 14133092 }, - { url = "https://files.pythonhosted.org/packages/27/f6/dba8a258acbf9d2bed2525cdcbb9493ef9bae5199d7a9cb92ee7e9b2aea6/numpy-2.2.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", size = 5163515 }, - { url = "https://files.pythonhosted.org/packages/62/30/82116199d1c249446723c68f2c9da40d7f062551036f50b8c4caa42ae252/numpy-2.2.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", size = 6696558 }, - { url = "https://files.pythonhosted.org/packages/0e/b2/54122b3c6df5df3e87582b2e9430f1bdb63af4023c739ba300164c9ae503/numpy-2.2.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", size = 14084742 }, - { url = "https://files.pythonhosted.org/packages/02/e2/e2cbb8d634151aab9528ef7b8bab52ee4ab10e076509285602c2a3a686e0/numpy-2.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", size = 16134051 }, - { url = "https://files.pythonhosted.org/packages/8e/21/efd47800e4affc993e8be50c1b768de038363dd88865920439ef7b422c60/numpy-2.2.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", size = 15578972 }, - { url = "https://files.pythonhosted.org/packages/04/1e/f8bb88f6157045dd5d9b27ccf433d016981032690969aa5c19e332b138c0/numpy-2.2.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", size = 17898106 }, - { url = "https://files.pythonhosted.org/packages/2b/93/df59a5a3897c1f036ae8ff845e45f4081bb06943039ae28a3c1c7c780f22/numpy-2.2.4-cp312-cp312-win32.whl", hash = "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", size = 6311190 }, - { url = "https://files.pythonhosted.org/packages/46/69/8c4f928741c2a8efa255fdc7e9097527c6dc4e4df147e3cadc5d9357ce85/numpy-2.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", size = 12644305 }, - { url = "https://files.pythonhosted.org/packages/2a/d0/bd5ad792e78017f5decfb2ecc947422a3669a34f775679a76317af671ffc/numpy-2.2.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", size = 20933623 }, - { url = "https://files.pythonhosted.org/packages/c3/bc/2b3545766337b95409868f8e62053135bdc7fa2ce630aba983a2aa60b559/numpy-2.2.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", size = 14148681 }, - { url = "https://files.pythonhosted.org/packages/6a/70/67b24d68a56551d43a6ec9fe8c5f91b526d4c1a46a6387b956bf2d64744e/numpy-2.2.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", size = 5148759 }, - { url = "https://files.pythonhosted.org/packages/1c/8b/e2fc8a75fcb7be12d90b31477c9356c0cbb44abce7ffb36be39a0017afad/numpy-2.2.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", size = 6683092 }, - { url = "https://files.pythonhosted.org/packages/13/73/41b7b27f169ecf368b52533edb72e56a133f9e86256e809e169362553b49/numpy-2.2.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", size = 14081422 }, - { url = "https://files.pythonhosted.org/packages/4b/04/e208ff3ae3ddfbafc05910f89546382f15a3f10186b1f56bd99f159689c2/numpy-2.2.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", size = 16132202 }, - { url = "https://files.pythonhosted.org/packages/fe/bc/2218160574d862d5e55f803d88ddcad88beff94791f9c5f86d67bd8fbf1c/numpy-2.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", size = 15573131 }, - { url = "https://files.pythonhosted.org/packages/a5/78/97c775bc4f05abc8a8426436b7cb1be806a02a2994b195945600855e3a25/numpy-2.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", size = 17894270 }, - { url = "https://files.pythonhosted.org/packages/b9/eb/38c06217a5f6de27dcb41524ca95a44e395e6a1decdc0c99fec0832ce6ae/numpy-2.2.4-cp313-cp313-win32.whl", hash = "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", size = 6308141 }, - { url = "https://files.pythonhosted.org/packages/52/17/d0dd10ab6d125c6d11ffb6dfa3423c3571befab8358d4f85cd4471964fcd/numpy-2.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", size = 12636885 }, - { url = "https://files.pythonhosted.org/packages/fa/e2/793288ede17a0fdc921172916efb40f3cbc2aa97e76c5c84aba6dc7e8747/numpy-2.2.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", size = 20961829 }, - { url = "https://files.pythonhosted.org/packages/3a/75/bb4573f6c462afd1ea5cbedcc362fe3e9bdbcc57aefd37c681be1155fbaa/numpy-2.2.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", size = 14161419 }, - { url = "https://files.pythonhosted.org/packages/03/68/07b4cd01090ca46c7a336958b413cdbe75002286295f2addea767b7f16c9/numpy-2.2.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", size = 5196414 }, - { url = "https://files.pythonhosted.org/packages/a5/fd/d4a29478d622fedff5c4b4b4cedfc37a00691079623c0575978d2446db9e/numpy-2.2.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", size = 6709379 }, - { url = "https://files.pythonhosted.org/packages/41/78/96dddb75bb9be730b87c72f30ffdd62611aba234e4e460576a068c98eff6/numpy-2.2.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", size = 14051725 }, - { url = "https://files.pythonhosted.org/packages/00/06/5306b8199bffac2a29d9119c11f457f6c7d41115a335b78d3f86fad4dbe8/numpy-2.2.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", size = 16101638 }, - { url = "https://files.pythonhosted.org/packages/fa/03/74c5b631ee1ded596945c12027649e6344614144369fd3ec1aaced782882/numpy-2.2.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", size = 15571717 }, - { url = "https://files.pythonhosted.org/packages/cb/dc/4fc7c0283abe0981e3b89f9b332a134e237dd476b0c018e1e21083310c31/numpy-2.2.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", size = 17879998 }, - { url = "https://files.pythonhosted.org/packages/e5/2b/878576190c5cfa29ed896b518cc516aecc7c98a919e20706c12480465f43/numpy-2.2.4-cp313-cp313t-win32.whl", hash = "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", size = 6366896 }, - { url = "https://files.pythonhosted.org/packages/3e/05/eb7eec66b95cf697f08c754ef26c3549d03ebd682819f794cb039574a0a6/numpy-2.2.4-cp313-cp313t-win_amd64.whl", hash = "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", size = 12739119 }, +version = "2.2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/b2/ce4b867d8cd9c0ee84938ae1e6a6f7926ebf928c9090d036fc3c6a04f946/numpy-2.2.5.tar.gz", hash = "sha256:a9c0d994680cd991b1cb772e8b297340085466a6fe964bc9d4e80f5e2f43c291", size = 20273920, upload_time = "2025-04-19T23:27:42.561Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/fb/e4e4c254ba40e8f0c78218f9e86304628c75b6900509b601c8433bdb5da7/numpy-2.2.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c42365005c7a6c42436a54d28c43fe0e01ca11eb2ac3cefe796c25a5f98e5e9b", size = 21256475, upload_time = "2025-04-19T22:34:24.174Z" }, + { url = "https://files.pythonhosted.org/packages/81/32/dd1f7084f5c10b2caad778258fdaeedd7fbd8afcd2510672811e6138dfac/numpy-2.2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:498815b96f67dc347e03b719ef49c772589fb74b8ee9ea2c37feae915ad6ebda", size = 14461474, upload_time = "2025-04-19T22:34:46.578Z" }, + { url = "https://files.pythonhosted.org/packages/0e/65/937cdf238ef6ac54ff749c0f66d9ee2b03646034c205cea9b6c51f2f3ad1/numpy-2.2.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6411f744f7f20081b1b4e7112e0f4c9c5b08f94b9f086e6f0adf3645f85d3a4d", size = 5426875, upload_time = "2025-04-19T22:34:56.281Z" }, + { url = "https://files.pythonhosted.org/packages/25/17/814515fdd545b07306eaee552b65c765035ea302d17de1b9cb50852d2452/numpy-2.2.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9de6832228f617c9ef45d948ec1cd8949c482238d68b2477e6f642c33a7b0a54", size = 6969176, upload_time = "2025-04-19T22:35:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/e5/32/a66db7a5c8b5301ec329ab36d0ecca23f5e18907f43dbd593c8ec326d57c/numpy-2.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:369e0d4647c17c9363244f3468f2227d557a74b6781cb62ce57cf3ef5cc7c610", size = 14374850, upload_time = "2025-04-19T22:35:31.347Z" }, + { url = "https://files.pythonhosted.org/packages/ad/c9/1bf6ada582eebcbe8978f5feb26584cd2b39f94ededeea034ca8f84af8c8/numpy-2.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:262d23f383170f99cd9191a7c85b9a50970fe9069b2f8ab5d786eca8a675d60b", size = 16430306, upload_time = "2025-04-19T22:35:57.573Z" }, + { url = "https://files.pythonhosted.org/packages/6a/f0/3f741863f29e128f4fcfdb99253cc971406b402b4584663710ee07f5f7eb/numpy-2.2.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa70fdbdc3b169d69e8c59e65c07a1c9351ceb438e627f0fdcd471015cd956be", size = 15884767, upload_time = "2025-04-19T22:36:22.245Z" }, + { url = "https://files.pythonhosted.org/packages/98/d9/4ccd8fd6410f7bf2d312cbc98892e0e43c2fcdd1deae293aeb0a93b18071/numpy-2.2.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37e32e985f03c06206582a7323ef926b4e78bdaa6915095ef08070471865b906", size = 18219515, upload_time = "2025-04-19T22:36:49.822Z" }, + { url = "https://files.pythonhosted.org/packages/b1/56/783237243d4395c6dd741cf16eeb1a9035ee3d4310900e6b17e875d1b201/numpy-2.2.5-cp311-cp311-win32.whl", hash = "sha256:f5045039100ed58fa817a6227a356240ea1b9a1bc141018864c306c1a16d4175", size = 6607842, upload_time = "2025-04-19T22:37:01.624Z" }, + { url = "https://files.pythonhosted.org/packages/98/89/0c93baaf0094bdaaaa0536fe61a27b1dce8a505fa262a865ec142208cfe9/numpy-2.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:b13f04968b46ad705f7c8a80122a42ae8f620536ea38cf4bdd374302926424dd", size = 12949071, upload_time = "2025-04-19T22:37:21.098Z" }, + { url = "https://files.pythonhosted.org/packages/e2/f7/1fd4ff108cd9d7ef929b8882692e23665dc9c23feecafbb9c6b80f4ec583/numpy-2.2.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ee461a4eaab4f165b68780a6a1af95fb23a29932be7569b9fab666c407969051", size = 20948633, upload_time = "2025-04-19T22:37:52.4Z" }, + { url = "https://files.pythonhosted.org/packages/12/03/d443c278348371b20d830af155ff2079acad6a9e60279fac2b41dbbb73d8/numpy-2.2.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ec31367fd6a255dc8de4772bd1658c3e926d8e860a0b6e922b615e532d320ddc", size = 14176123, upload_time = "2025-04-19T22:38:15.058Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0b/5ca264641d0e7b14393313304da48b225d15d471250376f3fbdb1a2be603/numpy-2.2.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:47834cde750d3c9f4e52c6ca28a7361859fcaf52695c7dc3cc1a720b8922683e", size = 5163817, upload_time = "2025-04-19T22:38:24.885Z" }, + { url = "https://files.pythonhosted.org/packages/04/b3/d522672b9e3d28e26e1613de7675b441bbd1eaca75db95680635dd158c67/numpy-2.2.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2c1a1c6ccce4022383583a6ded7bbcda22fc635eb4eb1e0a053336425ed36dfa", size = 6698066, upload_time = "2025-04-19T22:38:35.782Z" }, + { url = "https://files.pythonhosted.org/packages/a0/93/0f7a75c1ff02d4b76df35079676b3b2719fcdfb39abdf44c8b33f43ef37d/numpy-2.2.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d75f338f5f79ee23548b03d801d28a505198297534f62416391857ea0479571", size = 14087277, upload_time = "2025-04-19T22:38:57.697Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d9/7c338b923c53d431bc837b5b787052fef9ae68a56fe91e325aac0d48226e/numpy-2.2.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a801fef99668f309b88640e28d261991bfad9617c27beda4a3aec4f217ea073", size = 16135742, upload_time = "2025-04-19T22:39:22.689Z" }, + { url = "https://files.pythonhosted.org/packages/2d/10/4dec9184a5d74ba9867c6f7d1e9f2e0fb5fe96ff2bf50bb6f342d64f2003/numpy-2.2.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:abe38cd8381245a7f49967a6010e77dbf3680bd3627c0fe4362dd693b404c7f8", size = 15581825, upload_time = "2025-04-19T22:39:45.794Z" }, + { url = "https://files.pythonhosted.org/packages/80/1f/2b6fcd636e848053f5b57712a7d1880b1565eec35a637fdfd0a30d5e738d/numpy-2.2.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5a0ac90e46fdb5649ab6369d1ab6104bfe5854ab19b645bf5cda0127a13034ae", size = 17899600, upload_time = "2025-04-19T22:40:13.427Z" }, + { url = "https://files.pythonhosted.org/packages/ec/87/36801f4dc2623d76a0a3835975524a84bd2b18fe0f8835d45c8eae2f9ff2/numpy-2.2.5-cp312-cp312-win32.whl", hash = "sha256:0cd48122a6b7eab8f06404805b1bd5856200e3ed6f8a1b9a194f9d9054631beb", size = 6312626, upload_time = "2025-04-19T22:40:25.223Z" }, + { url = "https://files.pythonhosted.org/packages/8b/09/4ffb4d6cfe7ca6707336187951992bd8a8b9142cf345d87ab858d2d7636a/numpy-2.2.5-cp312-cp312-win_amd64.whl", hash = "sha256:ced69262a8278547e63409b2653b372bf4baff0870c57efa76c5703fd6543282", size = 12645715, upload_time = "2025-04-19T22:40:44.528Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a0/0aa7f0f4509a2e07bd7a509042967c2fab635690d4f48c6c7b3afd4f448c/numpy-2.2.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:059b51b658f4414fff78c6d7b1b4e18283ab5fa56d270ff212d5ba0c561846f4", size = 20935102, upload_time = "2025-04-19T22:41:16.234Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e4/a6a9f4537542912ec513185396fce52cdd45bdcf3e9d921ab02a93ca5aa9/numpy-2.2.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:47f9ed103af0bc63182609044b0490747e03bd20a67e391192dde119bf43d52f", size = 14191709, upload_time = "2025-04-19T22:41:38.472Z" }, + { url = "https://files.pythonhosted.org/packages/be/65/72f3186b6050bbfe9c43cb81f9df59ae63603491d36179cf7a7c8d216758/numpy-2.2.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:261a1ef047751bb02f29dfe337230b5882b54521ca121fc7f62668133cb119c9", size = 5149173, upload_time = "2025-04-19T22:41:47.823Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e9/83e7a9432378dde5802651307ae5e9ea07bb72b416728202218cd4da2801/numpy-2.2.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4520caa3807c1ceb005d125a75e715567806fed67e315cea619d5ec6e75a4191", size = 6684502, upload_time = "2025-04-19T22:41:58.689Z" }, + { url = "https://files.pythonhosted.org/packages/ea/27/b80da6c762394c8ee516b74c1f686fcd16c8f23b14de57ba0cad7349d1d2/numpy-2.2.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d14b17b9be5f9c9301f43d2e2a4886a33b53f4e6fdf9ca2f4cc60aeeee76372", size = 14084417, upload_time = "2025-04-19T22:42:19.897Z" }, + { url = "https://files.pythonhosted.org/packages/aa/fc/ebfd32c3e124e6a1043e19c0ab0769818aa69050ce5589b63d05ff185526/numpy-2.2.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba321813a00e508d5421104464510cc962a6f791aa2fca1c97b1e65027da80d", size = 16133807, upload_time = "2025-04-19T22:42:44.433Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9b/4cc171a0acbe4666f7775cfd21d4eb6bb1d36d3a0431f48a73e9212d2278/numpy-2.2.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4cbdef3ddf777423060c6f81b5694bad2dc9675f110c4b2a60dc0181543fac7", size = 15575611, upload_time = "2025-04-19T22:43:09.928Z" }, + { url = "https://files.pythonhosted.org/packages/a3/45/40f4135341850df48f8edcf949cf47b523c404b712774f8855a64c96ef29/numpy-2.2.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54088a5a147ab71a8e7fdfd8c3601972751ded0739c6b696ad9cb0343e21ab73", size = 17895747, upload_time = "2025-04-19T22:43:36.983Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4c/b32a17a46f0ffbde8cc82df6d3daeaf4f552e346df143e1b188a701a8f09/numpy-2.2.5-cp313-cp313-win32.whl", hash = "sha256:c8b82a55ef86a2d8e81b63da85e55f5537d2157165be1cb2ce7cfa57b6aef38b", size = 6309594, upload_time = "2025-04-19T22:47:10.523Z" }, + { url = "https://files.pythonhosted.org/packages/13/ae/72e6276feb9ef06787365b05915bfdb057d01fceb4a43cb80978e518d79b/numpy-2.2.5-cp313-cp313-win_amd64.whl", hash = "sha256:d8882a829fd779f0f43998e931c466802a77ca1ee0fe25a3abe50278616b1471", size = 12638356, upload_time = "2025-04-19T22:47:30.253Z" }, + { url = "https://files.pythonhosted.org/packages/79/56/be8b85a9f2adb688e7ded6324e20149a03541d2b3297c3ffc1a73f46dedb/numpy-2.2.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e8b025c351b9f0e8b5436cf28a07fa4ac0204d67b38f01433ac7f9b870fa38c6", size = 20963778, upload_time = "2025-04-19T22:44:09.251Z" }, + { url = "https://files.pythonhosted.org/packages/ff/77/19c5e62d55bff507a18c3cdff82e94fe174957bad25860a991cac719d3ab/numpy-2.2.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dfa94b6a4374e7851bbb6f35e6ded2120b752b063e6acdd3157e4d2bb922eba", size = 14207279, upload_time = "2025-04-19T22:44:31.383Z" }, + { url = "https://files.pythonhosted.org/packages/75/22/aa11f22dc11ff4ffe4e849d9b63bbe8d4ac6d5fae85ddaa67dfe43be3e76/numpy-2.2.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:97c8425d4e26437e65e1d189d22dff4a079b747ff9c2788057bfb8114ce1e133", size = 5199247, upload_time = "2025-04-19T22:44:40.361Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6c/12d5e760fc62c08eded0394f62039f5a9857f758312bf01632a81d841459/numpy-2.2.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:352d330048c055ea6db701130abc48a21bec690a8d38f8284e00fab256dc1376", size = 6711087, upload_time = "2025-04-19T22:44:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/ef/94/ece8280cf4218b2bee5cec9567629e61e51b4be501e5c6840ceb593db945/numpy-2.2.5-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b4c0773b6ada798f51f0f8e30c054d32304ccc6e9c5d93d46cb26f3d385ab19", size = 14059964, upload_time = "2025-04-19T22:45:12.451Z" }, + { url = "https://files.pythonhosted.org/packages/39/41/c5377dac0514aaeec69115830a39d905b1882819c8e65d97fc60e177e19e/numpy-2.2.5-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55f09e00d4dccd76b179c0f18a44f041e5332fd0e022886ba1c0bbf3ea4a18d0", size = 16121214, upload_time = "2025-04-19T22:45:37.734Z" }, + { url = "https://files.pythonhosted.org/packages/db/54/3b9f89a943257bc8e187145c6bc0eb8e3d615655f7b14e9b490b053e8149/numpy-2.2.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02f226baeefa68f7d579e213d0f3493496397d8f1cff5e2b222af274c86a552a", size = 15575788, upload_time = "2025-04-19T22:46:01.908Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c4/2e407e85df35b29f79945751b8f8e671057a13a376497d7fb2151ba0d290/numpy-2.2.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c26843fd58f65da9491165072da2cccc372530681de481ef670dcc8e27cfb066", size = 17893672, upload_time = "2025-04-19T22:46:28.585Z" }, + { url = "https://files.pythonhosted.org/packages/29/7e/d0b44e129d038dba453f00d0e29ebd6eaf2f06055d72b95b9947998aca14/numpy-2.2.5-cp313-cp313t-win32.whl", hash = "sha256:1a161c2c79ab30fe4501d5a2bbfe8b162490757cf90b7f05be8b80bc02f7bb8e", size = 6377102, upload_time = "2025-04-19T22:46:39.949Z" }, + { url = "https://files.pythonhosted.org/packages/63/be/b85e4aa4bf42c6502851b971f1c326d583fcc68227385f92089cf50a7b45/numpy-2.2.5-cp313-cp313t-win_amd64.whl", hash = "sha256:d403c84991b5ad291d3809bace5e85f4bbf44a04bdc9a88ed2bb1807b3360bb8", size = 12750096, upload_time = "2025-04-19T22:47:00.147Z" }, +] + +[[package]] +name = "nvidia-ml-py" +version = "12.570.86" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/6e/7b0c9b88c7d520fb8639024a1a3b6dd1db03bf2c17ae85040c8758d2eb6f/nvidia_ml_py-12.570.86.tar.gz", hash = "sha256:0508d4a0c7b6d015cf574530b95a62ed4fc89da3b8b47e1aefe6777db170ec8b", size = 43147, upload_time = "2025-01-24T21:50:38.869Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/a8/ec37169be4e2b7063b9076ed3fe0661e87335fbca665eed3f48c415cb234/nvidia_ml_py-12.570.86-py3-none-any.whl", hash = "sha256:58907de35a845abd13dcb227f18298f3b5dd94a72d04c9e594e77711e95c0b51", size = 44442, upload_time = "2025-01-24T21:50:37.701Z" }, ] [[package]] name = "oauthlib" version = "3.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918", size = 177352 } +sdist = { url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918", size = 177352, upload_time = "2022-10-17T20:04:27.471Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688 }, + { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688, upload_time = "2022-10-17T20:04:24.037Z" }, ] [[package]] name = "opentelemetry-api" -version = "1.32.0" +version = "1.32.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecated" }, { name = "importlib-metadata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7b/34/e701d77900123af17a11dbaf0c9f527fa7ef94b8f02b2c55bed94477890a/opentelemetry_api-1.32.0.tar.gz", hash = "sha256:2623280c916f9b19cad0aa4280cb171265f19fd2909b0d47e4f06f7c83b02cb5", size = 64134 } +sdist = { url = "https://files.pythonhosted.org/packages/42/40/2359245cd33641c2736a0136a50813352d72f3fc209de28fb226950db4a1/opentelemetry_api-1.32.1.tar.gz", hash = "sha256:a5be71591694a4d9195caf6776b055aa702e964d961051a0715d05f8632c32fb", size = 64138, upload_time = "2025-04-15T16:02:13.97Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/e8/d05fd19c1c7e7e230ab44c366791179fd64c843bc587c257a56e853893c5/opentelemetry_api-1.32.0-py3-none-any.whl", hash = "sha256:15df743c765078611f376037b0d9111ec5c1febf2ec9440cdd919370faa1ce55", size = 65285 }, + { url = "https://files.pythonhosted.org/packages/12/f2/89ea3361a305466bc6460a532188830351220b5f0851a5fa133155c16eca/opentelemetry_api-1.32.1-py3-none-any.whl", hash = "sha256:bbd19f14ab9f15f0e85e43e6a958aa4cb1f36870ee62b7fd205783a112012724", size = 65287, upload_time = "2025-04-15T16:01:49.747Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-common" -version = "1.32.0" +version = "1.32.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-proto" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/23/d1/17cae7d133d9e826050f999e282650c7aa7a45cc44e2bab9ca25b65a9bb7/opentelemetry_exporter_otlp_proto_common-1.32.0.tar.gz", hash = "sha256:2bca672f2a279c4f517115e635c0cc1269d07b2982a36681c521f7e56179a222", size = 20624 } +sdist = { url = "https://files.pythonhosted.org/packages/10/a1/466fad0e6a21709f0502ff346545a3d81bc8121b2d87357f74c8a3bc856e/opentelemetry_exporter_otlp_proto_common-1.32.1.tar.gz", hash = "sha256:da4edee4f24aaef109bfe924efad3a98a2e27c91278115505b298ee61da5d68e", size = 20623, upload_time = "2025-04-15T16:02:16.105Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/54/b5fd2489edc26280b3065afb2bfa2b3ebfda224af94d5d560cb5e38eba4c/opentelemetry_exporter_otlp_proto_common-1.32.0-py3-none-any.whl", hash = "sha256:277a63a18768b3b460d082a489f6f80d4ae2c1e6b185bb701c6bd4e91405e4bd", size = 18814 }, + { url = "https://files.pythonhosted.org/packages/72/1a/a51584a8b13cd9d4cb0d8f14f2164d0cf1a1bd1e5d7c81b7974fde2fb47b/opentelemetry_exporter_otlp_proto_common-1.32.1-py3-none-any.whl", hash = "sha256:a1e9ad3d0d9a9405c7ff8cdb54ba9b265da16da9844fe36b8c9661114b56c5d9", size = 18816, upload_time = "2025-04-15T16:01:53.353Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-http" -version = "1.32.0" +version = "1.32.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecated" }, @@ -3057,14 +3107,14 @@ dependencies = [ { name = "opentelemetry-sdk" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a4/12/73653c6ad0a8dd63fe314ae10682f80b8ad3aad0c4d15661f355c5ba2fed/opentelemetry_exporter_otlp_proto_http-1.32.0.tar.gz", hash = "sha256:a5dfd94603da86e313e4f4fb8d181fd3b64a7c2a9c7b408c3653d2b1bc68d14f", size = 15129 } +sdist = { url = "https://files.pythonhosted.org/packages/7b/b1/35d88066d628c469ec5152c4b8f072cc203c13c55d591df190ba91eaea13/opentelemetry_exporter_otlp_proto_http-1.32.1.tar.gz", hash = "sha256:f854a6e7128858213850dbf1929478a802faf50e799ffd2eb4d7424390023828", size = 15133, upload_time = "2025-04-15T16:02:18.701Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/09/431d56e8ee769afd3dea847ef4851e453c81d71d0d48b8832d2936273f9c/opentelemetry_exporter_otlp_proto_http-1.32.0-py3-none-any.whl", hash = "sha256:e2ffecd6d2220eaf1291a46339f109bc0a57ee7c4c6abb8174df418bf00ce01f", size = 17241 }, + { url = "https://files.pythonhosted.org/packages/01/75/73f96e43431c7ed4deac7a61820f218b0a8e75d2ad6ba78c354b16a9c730/opentelemetry_exporter_otlp_proto_http-1.32.1-py3-none-any.whl", hash = "sha256:3cc048b0c295aa2cbafb883feaf217c7525b396567eeeabb5459affb08b7fefe", size = 17242, upload_time = "2025-04-15T16:01:55.357Z" }, ] [[package]] name = "opentelemetry-instrumentation" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -3072,14 +3122,14 @@ dependencies = [ { name = "packaging" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/93/3b7cc47eb1dd4a347a46d47cafb92767a4ee518d3cbb931d114b4c15d97a/opentelemetry_instrumentation-0.53b0.tar.gz", hash = "sha256:f2c21d71a3cdf28c656e3d90d247ee7558fb9b0239b3d9e9190266499dbed9d2", size = 27902 } +sdist = { url = "https://files.pythonhosted.org/packages/5a/84/d778d8900c5694727516af205f84fa646fad4fb9bef6b2d21ba361ff25aa/opentelemetry_instrumentation-0.53b1.tar.gz", hash = "sha256:0e69ca2c75727e8a300de671c4a2ec0e86e63a8e906beaa5d6c9f5228e8687e5", size = 28175, upload_time = "2025-04-15T16:04:47.422Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/a5/353c9511673615f51b45e0c6a0ba4881370104848f6da7471898fc9cf84f/opentelemetry_instrumentation-0.53b0-py3-none-any.whl", hash = "sha256:70600778fd567c9c5fbfca181378ae179c0dec3ff613171707d3d77c360ff105", size = 30694 }, + { url = "https://files.pythonhosted.org/packages/3f/5e/1897e0cb579f4a215c42316021a52f588eaee4d008477e85b3ca9fa792c4/opentelemetry_instrumentation-0.53b1-py3-none-any.whl", hash = "sha256:c07850cecfbc51e8b357f56d5886ae5ccaa828635b220d0f5e78f941ea9a83ca", size = 30814, upload_time = "2025-04-15T16:03:47.497Z" }, ] [[package]] name = "opentelemetry-instrumentation-asgi" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref" }, @@ -3088,14 +3138,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/43/8bf33d949202ce2f66e184ed5343208ab2b73a85175d77469338bfc24fb1/opentelemetry_instrumentation_asgi-0.53b0.tar.gz", hash = "sha256:b82d7cecdd6a4239ee87e1c629bfd7dae208142ddbb24528d9a9274eb2bc4e44", size = 24231 } +sdist = { url = "https://files.pythonhosted.org/packages/21/a7/bba046a42000ef20fa6a8dd0be2e7c15c7dd0d1aad7d886afcb8ca35a4f1/opentelemetry_instrumentation_asgi-0.53b1.tar.gz", hash = "sha256:74b7a023787c574f2dd5ed9376e5b921c14501ba1b281ec8527eaadc442563e7", size = 24231, upload_time = "2025-04-15T16:04:50.891Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/87/c38d049c82436a2b889117f96e0cbab6e98a619407f68eeebd128c1b8ff0/opentelemetry_instrumentation_asgi-0.53b0-py3-none-any.whl", hash = "sha256:a2e242e0633541150bf8e42ed983f8aeec94acb397bc67a3dbdb47933bfdc7f8", size = 16338 }, + { url = "https://files.pythonhosted.org/packages/6c/b1/fb7bef68b08025659d6fe90839e38603c79c77c4b6af53f82f8fb66a1a2a/opentelemetry_instrumentation_asgi-0.53b1-py3-none-any.whl", hash = "sha256:5f8422eff0a9e3ecb052a8726335925610bb9bd7bb1acf1619c2c28dc3c04842", size = 16337, upload_time = "2025-04-15T16:03:52.582Z" }, ] [[package]] name = "opentelemetry-instrumentation-dbapi" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -3103,14 +3153,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a2/91/b1ce1ff5dd21e8b58a7ad140fb7965e1b81146e16197b6cb01716e226f4e/opentelemetry_instrumentation_dbapi-0.53b0.tar.gz", hash = "sha256:64baa1499094789e8af65384f9d100238417c05d419d940fdcce2db30353f882", size = 14143 } +sdist = { url = "https://files.pythonhosted.org/packages/32/8b/f637534c38f98af720c16891f6b9bf21ff08299349a3dcad7c326e4f10df/opentelemetry_instrumentation_dbapi-0.53b1.tar.gz", hash = "sha256:eb8c8d610045ab4e74001bf9e944bfb1238a419839ea612c81a94b38ea890a9d", size = 14143, upload_time = "2025-04-15T16:04:58.763Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/4d/4908faa5d2303812f03a333e937d149306d6c8ce53424eccf0681a602cf7/opentelemetry_instrumentation_dbapi-0.53b0-py3-none-any.whl", hash = "sha256:0a3134a6ba366b0b8455412f86d0e689657db5f2b7296dc4d76810aa33257943", size = 12450 }, + { url = "https://files.pythonhosted.org/packages/20/2c/cb6f672fec4254b146a25245de3ed8917b818939a6d0eba507e77ccf4cf5/opentelemetry_instrumentation_dbapi-0.53b1-py3-none-any.whl", hash = "sha256:38eec30b7ba58bc9000cf86ff7cc8a1b6d4fd4dd669f07b251f540d2a9dd7a9a", size = 12452, upload_time = "2025-04-15T16:04:05.305Z" }, ] [[package]] name = "opentelemetry-instrumentation-fastapi" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -3119,14 +3169,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2b/c4/480029aaec9151f4d38c9bffa5f686a7ed86387ddba2344af0fb634df2e1/opentelemetry_instrumentation_fastapi-0.53b0.tar.gz", hash = "sha256:a901ded31595d6e64d35c92379c08d8314baffc8715653ac42349b6140c725ce", size = 19324 } +sdist = { url = "https://files.pythonhosted.org/packages/2f/65/75298953a469e9abe8ee2e5d2ff116a75d130313812697de74336374a43f/opentelemetry_instrumentation_fastapi-0.53b1.tar.gz", hash = "sha256:24e98ddd1bd8164069e68e36c47bb729fefb0a851e6dd520f4fc81c3bbc54147", size = 19321, upload_time = "2025-04-15T16:05:01.256Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/58/cb008bffa3e59bd3a6a8c9796f5439c9e4d00e95c2c912d41a84d929d482/opentelemetry_instrumentation_fastapi-0.53b0-py3-none-any.whl", hash = "sha256:c29b7b3f5ca5aeb89436a605ac481467630bc761a241cc4258058ba00e6d40ed", size = 12128 }, + { url = "https://files.pythonhosted.org/packages/01/06/b996a3b1f243938ebff7ca1a2290174a155c98791ff6f2e5db50bce0a1a2/opentelemetry_instrumentation_fastapi-0.53b1-py3-none-any.whl", hash = "sha256:f8ed5b65e9086b86caeae191fcf798ec7b47469ac7f0341461acc03886278741", size = 12125, upload_time = "2025-04-15T16:04:09.636Z" }, ] [[package]] name = "opentelemetry-instrumentation-httpx" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -3135,28 +3185,28 @@ dependencies = [ { name = "opentelemetry-util-http" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e7/8f/c8432ce48bba5b3a8b1d6a686986ab58a256dcac648d9bea4de4648f04c6/opentelemetry_instrumentation_httpx-0.53b0.tar.gz", hash = "sha256:35b3f84ff0f9cd4ee88b9878776eacdada288136a1a2e87a66120096c4901258", size = 17734 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/cb/8cf953b9ec0d458d15c4306aef77d9986f280cdac7eecb3e6af97484b091/opentelemetry_instrumentation_httpx-0.53b1.tar.gz", hash = "sha256:aa8636ad704a99c6dcb73b649035d820506e93d5a80e45254fa435f131611a9c", size = 17735, upload_time = "2025-04-15T16:05:03.182Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/26/03e736ed2ef50614a20af7317f447b9a41db505877d44810b0dfb7bc86a5/opentelemetry_instrumentation_httpx-0.53b0-py3-none-any.whl", hash = "sha256:b460764ebe98a0fb8f0939848fc577c16e5be7904aa390b8bd6d8f1b40008cca", size = 14131 }, + { url = "https://files.pythonhosted.org/packages/25/39/36136ebbfe0484e204c2afcd0c3cc6365c74fd478a0c680a85915a3f7337/opentelemetry_instrumentation_httpx-0.53b1-py3-none-any.whl", hash = "sha256:34d0057f2601036b85ad958ed052f1b8ea3439f964cb8f8493cb6cf05d7d1715", size = 14130, upload_time = "2025-04-15T16:04:12.207Z" }, ] [[package]] name = "opentelemetry-instrumentation-jinja2" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-instrumentation" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/e5/ecc50073a0ad5313ff45e270477985d24df6c7c9ca71f205c303a381f3c9/opentelemetry_instrumentation_jinja2-0.53b0.tar.gz", hash = "sha256:e5e8a4aed9b3d0abbbf3ad14fb6ebb7ee0cb7a5cfa8e098695cb27a5b42cfcbf", size = 8468 } +sdist = { url = "https://files.pythonhosted.org/packages/d2/65/125fd6bb3840c83dd0017094ee5d8e6ddecf006e959cb46e575f0d0eb7cf/opentelemetry_instrumentation_jinja2-0.53b1.tar.gz", hash = "sha256:d389c6c1e34dd40953eb8081f4ecd3dc1a604d674f0bad59bee917c675eb484c", size = 8468, upload_time = "2025-04-15T16:05:04.034Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/18/22d90db173a1fb00d7f859adb22982b1183fa59d6a94247d9529e65ebfd1/opentelemetry_instrumentation_jinja2-0.53b0-py3-none-any.whl", hash = "sha256:d05a7218ca66a719093e034aa881332d4cd91a74ad14063f9432b6706bababd6", size = 9427 }, + { url = "https://files.pythonhosted.org/packages/ad/bb/45e37577877e672b6bb67d6433143dae946e0dec91d53910fbf99cf6bd88/opentelemetry_instrumentation_jinja2-0.53b1-py3-none-any.whl", hash = "sha256:e115c03a218550c317d1060f136a9b90db1b725892a0e052d5f0358168ad8105", size = 9426, upload_time = "2025-04-15T16:04:14.16Z" }, ] [[package]] name = "opentelemetry-instrumentation-requests" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -3164,42 +3214,42 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/bb/39983a82eef85dc26779797dc61b423b46c2c10c7fd10bdb86ab98667129/opentelemetry_instrumentation_requests-0.53b0.tar.gz", hash = "sha256:e6e1d2e9d2e98ce6993f0f4224e5f5cd42cb8843cf594aaa6ff436682c0a200a", size = 14377 } +sdist = { url = "https://files.pythonhosted.org/packages/b1/6a/b51d15bc72d337cb743a83e91a24b3c9290ac5cf0ebc3c9774ed567995dd/opentelemetry_instrumentation_requests-0.53b1.tar.gz", hash = "sha256:7684555346fbdb4e4bc2859b17167ffacdbf2764c6210703b1b5a201ff355c54", size = 14374, upload_time = "2025-04-15T16:05:15.304Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/3f/df98d052613e11e643ed2aeaa660a91d2adbd334b346c5f9a5e8b7c82ab1/opentelemetry_instrumentation_requests-0.53b0-py3-none-any.whl", hash = "sha256:d3fe68fee86e281223d5590f1c37f69b86db7dacd6d69e4a879a32c2281cc2c7", size = 12746 }, + { url = "https://files.pythonhosted.org/packages/1a/9c/fc1c86e07b69611d33940f1030b89f885ea6368a5ff2404c75ca9ef84eed/opentelemetry_instrumentation_requests-0.53b1-py3-none-any.whl", hash = "sha256:f7e82ea8095062c471ae8329af30175b75e771ed5f8bf429a41176d9a763287f", size = 12745, upload_time = "2025-04-15T16:04:28.52Z" }, ] [[package]] name = "opentelemetry-instrumentation-sqlite3" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-instrumentation" }, { name = "opentelemetry-instrumentation-dbapi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/ad/5d08e2a7feb474fc363ab41ff9d5f7fa207485db2633c08c9e16e886832f/opentelemetry_instrumentation_sqlite3-0.53b0.tar.gz", hash = "sha256:4c82214228af8b1fdbef921458c42d204770fc283e7054a23e043e657ae16fab", size = 7931 } +sdist = { url = "https://files.pythonhosted.org/packages/e1/65/bce30934a6b6fb57241ebfc051e8868741ae4abc95e16153da19fc486782/opentelemetry_instrumentation_sqlite3-0.53b1.tar.gz", hash = "sha256:4fa2cbede734f3d196b402dbda8b5acb0297aa2776d8960336347c5119e10252", size = 7930, upload_time = "2025-04-15T16:05:16.603Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/7a/8a8a8d39006db41587392ceda54583bc54c8c04360a47cae216fbc2ce8d6/opentelemetry_instrumentation_sqlite3-0.53b0-py3-none-any.whl", hash = "sha256:39895e81c821192485ef132e1a9fa3865dfaf49a7a6a0a714866b693b27bc844", size = 9340 }, + { url = "https://files.pythonhosted.org/packages/01/76/d7b7811ed0602fc086541e5a4914defce1df1d651f0d1ecc3dc1a76d7cf2/opentelemetry_instrumentation_sqlite3-0.53b1-py3-none-any.whl", hash = "sha256:f2309b1d68fc456824d7d4f3d94dcabf138d1fa4481c5728c5cc0304f21db0ae", size = 9342, upload_time = "2025-04-15T16:04:30.234Z" }, ] [[package]] name = "opentelemetry-instrumentation-system-metrics" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-instrumentation" }, { name = "psutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4c/24/67d93a698f9a9c6c14f5f39b0520e6116099ad3a3836a2792c9a2d16c42b/opentelemetry_instrumentation_system_metrics-0.53b0.tar.gz", hash = "sha256:fbcc15900f5e8a0c99d85ee6cb9529ecfcbfbe9e6b6d6e158ac80340f40df779", size = 15008 } +sdist = { url = "https://files.pythonhosted.org/packages/0f/0c/375b31c0806d45806681b635490b03eead1df974313b4a44a8010880853c/opentelemetry_instrumentation_system_metrics-0.53b1.tar.gz", hash = "sha256:e93c3e0e4f4e2088ae3fcd01df80d9d9a760b04deaaa3bbd8b0fb255a86fbc19", size = 15008, upload_time = "2025-04-15T16:05:17.737Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/26/6678e948955301821f3ef0e3f21138df2b6b0980b5b5ca960ee743c6bee5/opentelemetry_instrumentation_system_metrics-0.53b0-py3-none-any.whl", hash = "sha256:d0c57bc9bb0b5828113d562b9530c399189e1c66b22a7a40a8f2a3966cd6dfbe", size = 13093 }, + { url = "https://files.pythonhosted.org/packages/ae/45/c050cbe102baa0b8f4bd2947087673ce69b3136fcc5bd29f13e47c126ea0/opentelemetry_instrumentation_system_metrics-0.53b1-py3-none-any.whl", hash = "sha256:634900c83a1c3981f3553b7e4783e5d38075c83e825d00c5b870e372b55975f8", size = 13093, upload_time = "2025-04-15T16:04:31.834Z" }, ] [[package]] name = "opentelemetry-instrumentation-tornado" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -3207,14 +3257,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d4/b9/39f23cee423083fd1ffcac4494ada724f8aef0d17c54f5f682c8bc454577/opentelemetry_instrumentation_tornado-0.53b0.tar.gz", hash = "sha256:41fb3928767194d72733557b1364d13d6a26baabd47d9a0e129c42697fa417e3", size = 17085 } +sdist = { url = "https://files.pythonhosted.org/packages/03/df/879f2cff1c7865d29fa93befd764d483239277cb543fcb118b8abdad51fd/opentelemetry_instrumentation_tornado-0.53b1.tar.gz", hash = "sha256:45b73af18a55f6480178892adcc28a097059d2ea9b17493045b00b8cadce2876", size = 17083, upload_time = "2025-04-15T16:05:19.301Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/2e/ab23c83855ccadc6b4bb54fabb9a91e3f55b04be4a5bb41ae49fefbd0eed/opentelemetry_instrumentation_tornado-0.53b0-py3-none-any.whl", hash = "sha256:03a86b72cef422eaac58332886aeb0daf4b044c683f56752c6ab9aa49886a861", size = 15319 }, + { url = "https://files.pythonhosted.org/packages/76/c6/2add9210c12aa5c41ed24e616135ea16b7d06eeff695751c697ad39b5ac5/opentelemetry_instrumentation_tornado-0.53b1-py3-none-any.whl", hash = "sha256:02b201e6a3284bb9ac19a6c5670f713cd47a8fe4fc1f69fd7fd5cb6ada4f3237", size = 15321, upload_time = "2025-04-15T16:04:33.89Z" }, ] [[package]] name = "opentelemetry-instrumentation-urllib" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -3222,14 +3272,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/a8/65be8833eba7500ea801410253f9233ad694d023cbbbee3458cb7f3852ea/opentelemetry_instrumentation_urllib-0.53b0.tar.gz", hash = "sha256:1cbbc161a5e2a6a268edce777eb766aae7de79f74b177669eb4f4a20e4cf2f7c", size = 13790 } +sdist = { url = "https://files.pythonhosted.org/packages/f5/a6/cc6ff7e172f2d39dd02aaecd37965f11be07646e5959e31fdd12f03f22ec/opentelemetry_instrumentation_urllib-0.53b1.tar.gz", hash = "sha256:f8cd0990b3b45c06f547bd944589a3eac8ebea91b21f1e65f0d3ec7efdabcbc7", size = 13790, upload_time = "2025-04-15T16:05:20.438Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/cc/83dd2ab34556926662133d6860195590c26960f132dc27e4e1b34f318f19/opentelemetry_instrumentation_urllib-0.53b0-py3-none-any.whl", hash = "sha256:6c650f13b37f1ce9a3b743d184491b54cf099dedd95d3ac259b6404fb06b686b", size = 12626 }, + { url = "https://files.pythonhosted.org/packages/35/75/6464762ac94661eb5985e0cad221541ad59ee53ab89e2f8be7acabc8a146/opentelemetry_instrumentation_urllib-0.53b1-py3-none-any.whl", hash = "sha256:906386336dff6f4106b9fd180a30a2a9eade44a8c60843f165a1dc2e0cc0e3af", size = 12625, upload_time = "2025-04-15T16:04:36.618Z" }, ] [[package]] name = "opentelemetry-instrumentation-urllib3" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, @@ -3238,106 +3288,106 @@ dependencies = [ { name = "opentelemetry-util-http" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/4b/5a9fcc20123d1b211bf4d7e5801212a40462ec69ddbf220bd241b9129299/opentelemetry_instrumentation_urllib3-0.53b0.tar.gz", hash = "sha256:6741157ade407d971c4ffabda843461c0ad1d3d3b87eecdf8c4f64d46ccfa395", size = 15696 } +sdist = { url = "https://files.pythonhosted.org/packages/1a/20/30071fbeb89c719610bd4add48db8a7516c4cfdcdee5a89768840dfc7cd3/opentelemetry_instrumentation_urllib3-0.53b1.tar.gz", hash = "sha256:3fcf41b4401686f8db97aabcca02040418380a766f9c66051347cbac072fe665", size = 15697, upload_time = "2025-04-15T16:05:21.458Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/8c/0753c35e8464ae52abd039b0c0463342b4a3da3373cbdaa77bbb42bee3b2/opentelemetry_instrumentation_urllib3-0.53b0-py3-none-any.whl", hash = "sha256:ab743da7e564068fc7aaaf686c7cb219fe54ff2bcf8aa2cdb7cde14000ed9679", size = 13126 }, + { url = "https://files.pythonhosted.org/packages/42/be/9f3dcd8f8761890db0b71041d49a92b8c19bc5374e7cf32facc75e22b879/opentelemetry_instrumentation_urllib3-0.53b1-py3-none-any.whl", hash = "sha256:0361c61cbd028358d67e10bbef6fba1c231b594990658b36bc1e2f83bd528ffe", size = 13124, upload_time = "2025-04-15T16:04:37.849Z" }, ] [[package]] name = "opentelemetry-proto" -version = "1.32.0" +version = "1.32.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9b/49/1fa0b05e49667c964b59e08770f80c08a17075fe9b5cdea2bb18ae9bf40d/opentelemetry_proto-1.32.0.tar.gz", hash = "sha256:f8b70ae52f4ef8a4e4c0760e87c9071e07ece2618c080d4839bef44c0156cd44", size = 34359 } +sdist = { url = "https://files.pythonhosted.org/packages/31/9b/17f31b0dff06b21fc30bf032ce3f3d443391d3f5cebb65b4d680c4e770c4/opentelemetry_proto-1.32.1.tar.gz", hash = "sha256:bc6385ccf87768f029371535312071a2d09e6c9ebf119ac17dbc825a6a56ba53", size = 34360, upload_time = "2025-04-15T16:02:27.82Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/7d/6246def5239d9e70861b00e713bd51a880aabdd5d09b3d2453eaadc73a08/opentelemetry_proto-1.32.0-py3-none-any.whl", hash = "sha256:f699269dc037e18fba05442580a8682c9fbd0f4c7f5addfed82c44be0c53c5ff", size = 55852 }, + { url = "https://files.pythonhosted.org/packages/a5/89/16a40a3c64611cb32509751ef6370e3e96c24a39ba493b4d67f5671ef4c1/opentelemetry_proto-1.32.1-py3-none-any.whl", hash = "sha256:fe56df31033ab0c40af7525f8bf4c487313377bbcfdf94184b701a8ccebc800e", size = 55854, upload_time = "2025-04-15T16:02:07.582Z" }, ] [[package]] name = "opentelemetry-sdk" -version = "1.32.0" +version = "1.32.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-semantic-conventions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e8/0c/842aed73035cab0302ec70057f3180f4f023974d74bd9764ef3046f358fb/opentelemetry_sdk-1.32.0.tar.gz", hash = "sha256:5ff07fb371d1ab1189fa7047702e2e888b5403c5efcbb18083cae0d5aa5f58d2", size = 161043 } +sdist = { url = "https://files.pythonhosted.org/packages/a3/65/2069caef9257fae234ca0040d945c741aa7afbd83a7298ee70fc0bc6b6f4/opentelemetry_sdk-1.32.1.tar.gz", hash = "sha256:8ef373d490961848f525255a42b193430a0637e064dd132fd2a014d94792a092", size = 161044, upload_time = "2025-04-15T16:02:28.905Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/6a/b8cb562234bd94bcf12ad3058ef7f31319b94a8df65130ce9cc2ff3c8d55/opentelemetry_sdk-1.32.0-py3-none-any.whl", hash = "sha256:ed252d035c22a15536c1f603ca089298daab60850fc2f5ddfa95d95cc1c043ea", size = 118990 }, + { url = "https://files.pythonhosted.org/packages/dc/00/d3976cdcb98027aaf16f1e980e54935eb820872792f0eaedd4fd7abb5964/opentelemetry_sdk-1.32.1-py3-none-any.whl", hash = "sha256:bba37b70a08038613247bc42beee5a81b0ddca422c7d7f1b097b32bf1c7e2f17", size = 118989, upload_time = "2025-04-15T16:02:08.814Z" }, ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecated" }, { name = "opentelemetry-api" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c2/c4/213d23239df175b420b74c6e25899c482701e6614822dc51f8c20dae7e2d/opentelemetry_semantic_conventions-0.53b0.tar.gz", hash = "sha256:05b7908e1da62d72f9bf717ed25c72f566fe005a2dd260c61b11e025f2552cf6", size = 114343 } +sdist = { url = "https://files.pythonhosted.org/packages/5e/b6/3c56e22e9b51bcb89edab30d54830958f049760bbd9ab0a759cece7bca88/opentelemetry_semantic_conventions-0.53b1.tar.gz", hash = "sha256:4c5a6fede9de61211b2e9fc1e02e8acacce882204cd770177342b6a3be682992", size = 114350, upload_time = "2025-04-15T16:02:29.793Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/23/0bef11f394f828f910f32567d057f097dbaba23edf33114018a380a0d0bf/opentelemetry_semantic_conventions-0.53b0-py3-none-any.whl", hash = "sha256:561da89f766ab51615c0e72b12329e0a1bc16945dbd62c8646ffc74e36a1edff", size = 188441 }, + { url = "https://files.pythonhosted.org/packages/27/6b/a8fb94760ef8da5ec283e488eb43235eac3ae7514385a51b6accf881e671/opentelemetry_semantic_conventions-0.53b1-py3-none-any.whl", hash = "sha256:21df3ed13f035f8f3ea42d07cbebae37020367a53b47f1ebee3b10a381a00208", size = 188443, upload_time = "2025-04-15T16:02:10.095Z" }, ] [[package]] name = "opentelemetry-util-http" -version = "0.53b0" +version = "0.53b1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/83/c3b4641f79f1cc9979c4d5ae8cd8125fa0ddad965044688cd5a7acd4c0be/opentelemetry_util_http-0.53b0.tar.gz", hash = "sha256:521111872be0cdfd4346e15e9d4822aeeb8501b094c721ef49c26277b286084e", size = 8044 } +sdist = { url = "https://files.pythonhosted.org/packages/53/c6/89dd3bddadac2da18b4fe5704c8da00d81f7bf891a0e5f4e578197e65a39/opentelemetry_util_http-0.53b1.tar.gz", hash = "sha256:7b0356584400b3406a643e244d36ff1bbb7c95e3b5ed0509d212e4a11c050a0e", size = 8042, upload_time = "2025-04-15T16:05:23.836Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/25/f2f7c8d288abdbb32bbef5756f2b7812e6f1a0ab9315d99ad44f3e57fb9c/opentelemetry_util_http-0.53b0-py3-none-any.whl", hash = "sha256:eca40d8cd1c1149081142c44756c0a2da0be306931339b839e1b436a9de101a4", size = 7303 }, + { url = "https://files.pythonhosted.org/packages/82/f3/cd04c208fd50a60c7a521d33e6a17ff2949f81330ca2f086bcdbbd08dd8c/opentelemetry_util_http-0.53b1-py3-none-any.whl", hash = "sha256:ee7ecc1cbe4598535a95eaf7742f80c0c924843bf8f7ef3bab4963a228a94dd0", size = 7303, upload_time = "2025-04-15T16:04:42.526Z" }, ] [[package]] name = "orjson" version = "3.10.16" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/c7/03913cc4332174071950acf5b0735463e3f63760c80585ef369270c2b372/orjson-3.10.16.tar.gz", hash = "sha256:d2aaa5c495e11d17b9b93205f5fa196737ee3202f000aaebf028dc9a73750f10", size = 5410415 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/29/43f91a5512b5d2535594438eb41c5357865fd5e64dec745d90a588820c75/orjson-3.10.16-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44fcbe1a1884f8bc9e2e863168b0f84230c3d634afe41c678637d2728ea8e739", size = 249180 }, - { url = "https://files.pythonhosted.org/packages/0c/36/2a72d55e266473c19a86d97b7363bb8bf558ab450f75205689a287d5ce61/orjson-3.10.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78177bf0a9d0192e0b34c3d78bcff7fe21d1b5d84aeb5ebdfe0dbe637b885225", size = 138510 }, - { url = "https://files.pythonhosted.org/packages/bb/ad/f86d6f55c1a68b57ff6ea7966bce5f4e5163f2e526ddb7db9fc3c2c8d1c4/orjson-3.10.16-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12824073a010a754bb27330cad21d6e9b98374f497f391b8707752b96f72e741", size = 132373 }, - { url = "https://files.pythonhosted.org/packages/5e/8b/d18f2711493a809f3082a88fda89342bc8e16767743b909cd3c34989fba3/orjson-3.10.16-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddd41007e56284e9867864aa2f29f3136bb1dd19a49ca43c0b4eda22a579cf53", size = 136773 }, - { url = "https://files.pythonhosted.org/packages/a1/dc/ce025f002f8e0749e3f057c4d773a4d4de32b7b4c1fc5a50b429e7532586/orjson-3.10.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0877c4d35de639645de83666458ca1f12560d9fa7aa9b25d8bb8f52f61627d14", size = 138029 }, - { url = "https://files.pythonhosted.org/packages/0e/1b/cf9df85852b91160029d9f26014230366a2b4deb8cc51fabe68e250a8c1a/orjson-3.10.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a09a539e9cc3beead3e7107093b4ac176d015bec64f811afb5965fce077a03c", size = 142677 }, - { url = "https://files.pythonhosted.org/packages/92/18/5b1e1e995bffad49dc4311a0bdfd874bc6f135fd20f0e1f671adc2c9910e/orjson-3.10.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31b98bc9b40610fec971d9a4d67bb2ed02eec0a8ae35f8ccd2086320c28526ca", size = 132800 }, - { url = "https://files.pythonhosted.org/packages/d6/eb/467f25b580e942fcca1344adef40633b7f05ac44a65a63fc913f9a805d58/orjson-3.10.16-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0ce243f5a8739f3a18830bc62dc2e05b69a7545bafd3e3249f86668b2bcd8e50", size = 135451 }, - { url = "https://files.pythonhosted.org/packages/8d/4b/9d10888038975cb375982e9339d9495bac382d5c976c500b8d6f2c8e2e4e/orjson-3.10.16-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:64792c0025bae049b3074c6abe0cf06f23c8e9f5a445f4bab31dc5ca23dbf9e1", size = 412358 }, - { url = "https://files.pythonhosted.org/packages/3b/e2/cfbcfcc4fbe619e0ca9bdbbfccb2d62b540bbfe41e0ee77d44a628594f59/orjson-3.10.16-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ea53f7e68eec718b8e17e942f7ca56c6bd43562eb19db3f22d90d75e13f0431d", size = 152772 }, - { url = "https://files.pythonhosted.org/packages/b9/d6/627a1b00569be46173007c11dde3da4618c9bfe18409325b0e3e2a82fe29/orjson-3.10.16-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a741ba1a9488c92227711bde8c8c2b63d7d3816883268c808fbeada00400c164", size = 137225 }, - { url = "https://files.pythonhosted.org/packages/0a/7b/a73c67b505021af845b9f05c7c848793258ea141fa2058b52dd9b067c2b4/orjson-3.10.16-cp311-cp311-win32.whl", hash = "sha256:c7ed2c61bb8226384c3fdf1fb01c51b47b03e3f4536c985078cccc2fd19f1619", size = 141733 }, - { url = "https://files.pythonhosted.org/packages/f4/22/5e8217c48d68c0adbfb181e749d6a733761074e598b083c69a1383d18147/orjson-3.10.16-cp311-cp311-win_amd64.whl", hash = "sha256:cd67d8b3e0e56222a2e7b7f7da9031e30ecd1fe251c023340b9f12caca85ab60", size = 133784 }, - { url = "https://files.pythonhosted.org/packages/5d/15/67ce9d4c959c83f112542222ea3b9209c1d424231d71d74c4890ea0acd2b/orjson-3.10.16-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6d3444abbfa71ba21bb042caa4b062535b122248259fdb9deea567969140abca", size = 249325 }, - { url = "https://files.pythonhosted.org/packages/da/2c/1426b06f30a1b9ada74b6f512c1ddf9d2760f53f61cdb59efeb9ad342133/orjson-3.10.16-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:30245c08d818fdcaa48b7d5b81499b8cae09acabb216fe61ca619876b128e184", size = 133621 }, - { url = "https://files.pythonhosted.org/packages/9e/88/18d26130954bc73bee3be10f95371ea1dfb8679e0e2c46b0f6d8c6289402/orjson-3.10.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0ba1d0baa71bf7579a4ccdcf503e6f3098ef9542106a0eca82395898c8a500a", size = 138270 }, - { url = "https://files.pythonhosted.org/packages/4f/f9/6d8b64fcd58fae072e80ee7981be8ba0d7c26ace954e5cd1d027fc80518f/orjson-3.10.16-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb0beefa5ef3af8845f3a69ff2a4aa62529b5acec1cfe5f8a6b4141033fd46ef", size = 132346 }, - { url = "https://files.pythonhosted.org/packages/16/3f/2513fd5bc786f40cd12af569c23cae6381aeddbefeed2a98f0a666eb5d0d/orjson-3.10.16-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6daa0e1c9bf2e030e93c98394de94506f2a4d12e1e9dadd7c53d5e44d0f9628e", size = 136845 }, - { url = "https://files.pythonhosted.org/packages/6d/42/b0e7b36720f5ab722b48e8ccf06514d4f769358dd73c51abd8728ef58d0b/orjson-3.10.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9da9019afb21e02410ef600e56666652b73eb3e4d213a0ec919ff391a7dd52aa", size = 138078 }, - { url = "https://files.pythonhosted.org/packages/a3/a8/d220afb8a439604be74fc755dbc740bded5ed14745ca536b304ed32eb18a/orjson-3.10.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:daeb3a1ee17b69981d3aae30c3b4e786b0f8c9e6c71f2b48f1aef934f63f38f4", size = 142712 }, - { url = "https://files.pythonhosted.org/packages/8c/88/7e41e9883c00f84f92fe357a8371edae816d9d7ef39c67b5106960c20389/orjson-3.10.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fed80eaf0e20a31942ae5d0728849862446512769692474be5e6b73123a23b", size = 133136 }, - { url = "https://files.pythonhosted.org/packages/e9/ca/61116095307ad0be828ea26093febaf59e38596d84a9c8d765c3c5e4934f/orjson-3.10.16-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73390ed838f03764540a7bdc4071fe0123914c2cc02fb6abf35182d5fd1b7a42", size = 135258 }, - { url = "https://files.pythonhosted.org/packages/dc/1b/09493cf7d801505f094c9295f79c98c1e0af2ac01c7ed8d25b30fcb19ada/orjson-3.10.16-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a22bba012a0c94ec02a7768953020ab0d3e2b884760f859176343a36c01adf87", size = 412326 }, - { url = "https://files.pythonhosted.org/packages/ea/02/125d7bbd7f7a500190ddc8ae5d2d3c39d87ed3ed28f5b37cfe76962c678d/orjson-3.10.16-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5385bbfdbc90ff5b2635b7e6bebf259652db00a92b5e3c45b616df75b9058e88", size = 152800 }, - { url = "https://files.pythonhosted.org/packages/f9/09/7658a9e3e793d5b3b00598023e0fb6935d0e7bbb8ff72311c5415a8ce677/orjson-3.10.16-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:02c6279016346e774dd92625d46c6c40db687b8a0d685aadb91e26e46cc33e1e", size = 137516 }, - { url = "https://files.pythonhosted.org/packages/29/87/32b7a4831e909d347278101a48d4cf9f3f25901b2295e7709df1651f65a1/orjson-3.10.16-cp312-cp312-win32.whl", hash = "sha256:7ca55097a11426db80f79378e873a8c51f4dde9ffc22de44850f9696b7eb0e8c", size = 141759 }, - { url = "https://files.pythonhosted.org/packages/35/ce/81a27e7b439b807bd393585271364cdddf50dc281fc57c4feef7ccb186a6/orjson-3.10.16-cp312-cp312-win_amd64.whl", hash = "sha256:86d127efdd3f9bf5f04809b70faca1e6836556ea3cc46e662b44dab3fe71f3d6", size = 133944 }, - { url = "https://files.pythonhosted.org/packages/87/b9/ff6aa28b8c86af9526160905593a2fe8d004ac7a5e592ee0b0ff71017511/orjson-3.10.16-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:148a97f7de811ba14bc6dbc4a433e0341ffd2cc285065199fb5f6a98013744bd", size = 249289 }, - { url = "https://files.pythonhosted.org/packages/6c/81/6d92a586149b52684ab8fd70f3623c91d0e6a692f30fd8c728916ab2263c/orjson-3.10.16-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1d960c1bf0e734ea36d0adc880076de3846aaec45ffad29b78c7f1b7962516b8", size = 133640 }, - { url = "https://files.pythonhosted.org/packages/c2/88/b72443f4793d2e16039ab85d0026677932b15ab968595fb7149750d74134/orjson-3.10.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a318cd184d1269f68634464b12871386808dc8b7c27de8565234d25975a7a137", size = 138286 }, - { url = "https://files.pythonhosted.org/packages/c3/3c/72a22d4b28c076c4016d5a52bd644a8e4d849d3bb0373d9e377f9e3b2250/orjson-3.10.16-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df23f8df3ef9223d1d6748bea63fca55aae7da30a875700809c500a05975522b", size = 132307 }, - { url = "https://files.pythonhosted.org/packages/8a/a2/f1259561bdb6ad7061ff1b95dab082fe32758c4bc143ba8d3d70831f0a06/orjson-3.10.16-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b94dda8dd6d1378f1037d7f3f6b21db769ef911c4567cbaa962bb6dc5021cf90", size = 136739 }, - { url = "https://files.pythonhosted.org/packages/3d/af/c7583c4b34f33d8b8b90cfaab010ff18dd64e7074cc1e117a5f1eff20dcf/orjson-3.10.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12970a26666a8775346003fd94347d03ccb98ab8aa063036818381acf5f523e", size = 138076 }, - { url = "https://files.pythonhosted.org/packages/d7/59/d7fc7fbdd3d4a64c2eae4fc7341a5aa39cf9549bd5e2d7f6d3c07f8b715b/orjson-3.10.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15a1431a245d856bd56e4d29ea0023eb4d2c8f71efe914beb3dee8ab3f0cd7fb", size = 142643 }, - { url = "https://files.pythonhosted.org/packages/92/0e/3bd8f2197d27601f16b4464ae948826da2bcf128af31230a9dbbad7ceb57/orjson-3.10.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83655cfc247f399a222567d146524674a7b217af7ef8289c0ff53cfe8db09f0", size = 133168 }, - { url = "https://files.pythonhosted.org/packages/af/a8/351fd87b664b02f899f9144d2c3dc848b33ac04a5df05234cbfb9e2a7540/orjson-3.10.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fa59ae64cb6ddde8f09bdbf7baf933c4cd05734ad84dcf4e43b887eb24e37652", size = 135271 }, - { url = "https://files.pythonhosted.org/packages/ba/b0/a6d42a7d412d867c60c0337d95123517dd5a9370deea705ea1be0f89389e/orjson-3.10.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ca5426e5aacc2e9507d341bc169d8af9c3cbe88f4cd4c1cf2f87e8564730eb56", size = 412444 }, - { url = "https://files.pythonhosted.org/packages/79/ec/7572cd4e20863f60996f3f10bc0a6da64a6fd9c35954189a914cec0b7377/orjson-3.10.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6fd5da4edf98a400946cd3a195680de56f1e7575109b9acb9493331047157430", size = 152737 }, - { url = "https://files.pythonhosted.org/packages/a9/19/ceb9e8fed5403b2e76a8ac15f581b9d25780a3be3c9b3aa54b7777a210d5/orjson-3.10.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:980ecc7a53e567169282a5e0ff078393bac78320d44238da4e246d71a4e0e8f5", size = 137482 }, - { url = "https://files.pythonhosted.org/packages/1b/78/a78bb810f3786579dbbbd94768284cbe8f2fd65167cd7020260679665c17/orjson-3.10.16-cp313-cp313-win32.whl", hash = "sha256:28f79944dd006ac540a6465ebd5f8f45dfdf0948ff998eac7a908275b4c1add6", size = 141714 }, - { url = "https://files.pythonhosted.org/packages/81/9c/b66ce9245ff319df2c3278acd351a3f6145ef34b4a2d7f4b0f739368370f/orjson-3.10.16-cp313-cp313-win_amd64.whl", hash = "sha256:fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7", size = 133954 }, +sdist = { url = "https://files.pythonhosted.org/packages/98/c7/03913cc4332174071950acf5b0735463e3f63760c80585ef369270c2b372/orjson-3.10.16.tar.gz", hash = "sha256:d2aaa5c495e11d17b9b93205f5fa196737ee3202f000aaebf028dc9a73750f10", size = 5410415, upload_time = "2025-03-24T17:00:23.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/29/43f91a5512b5d2535594438eb41c5357865fd5e64dec745d90a588820c75/orjson-3.10.16-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:44fcbe1a1884f8bc9e2e863168b0f84230c3d634afe41c678637d2728ea8e739", size = 249180, upload_time = "2025-03-24T16:59:01.507Z" }, + { url = "https://files.pythonhosted.org/packages/0c/36/2a72d55e266473c19a86d97b7363bb8bf558ab450f75205689a287d5ce61/orjson-3.10.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78177bf0a9d0192e0b34c3d78bcff7fe21d1b5d84aeb5ebdfe0dbe637b885225", size = 138510, upload_time = "2025-03-24T16:59:02.876Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ad/f86d6f55c1a68b57ff6ea7966bce5f4e5163f2e526ddb7db9fc3c2c8d1c4/orjson-3.10.16-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12824073a010a754bb27330cad21d6e9b98374f497f391b8707752b96f72e741", size = 132373, upload_time = "2025-03-24T16:59:04.103Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8b/d18f2711493a809f3082a88fda89342bc8e16767743b909cd3c34989fba3/orjson-3.10.16-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddd41007e56284e9867864aa2f29f3136bb1dd19a49ca43c0b4eda22a579cf53", size = 136773, upload_time = "2025-03-24T16:59:05.636Z" }, + { url = "https://files.pythonhosted.org/packages/a1/dc/ce025f002f8e0749e3f057c4d773a4d4de32b7b4c1fc5a50b429e7532586/orjson-3.10.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0877c4d35de639645de83666458ca1f12560d9fa7aa9b25d8bb8f52f61627d14", size = 138029, upload_time = "2025-03-24T16:59:06.99Z" }, + { url = "https://files.pythonhosted.org/packages/0e/1b/cf9df85852b91160029d9f26014230366a2b4deb8cc51fabe68e250a8c1a/orjson-3.10.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a09a539e9cc3beead3e7107093b4ac176d015bec64f811afb5965fce077a03c", size = 142677, upload_time = "2025-03-24T16:59:08.22Z" }, + { url = "https://files.pythonhosted.org/packages/92/18/5b1e1e995bffad49dc4311a0bdfd874bc6f135fd20f0e1f671adc2c9910e/orjson-3.10.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31b98bc9b40610fec971d9a4d67bb2ed02eec0a8ae35f8ccd2086320c28526ca", size = 132800, upload_time = "2025-03-24T16:59:09.529Z" }, + { url = "https://files.pythonhosted.org/packages/d6/eb/467f25b580e942fcca1344adef40633b7f05ac44a65a63fc913f9a805d58/orjson-3.10.16-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0ce243f5a8739f3a18830bc62dc2e05b69a7545bafd3e3249f86668b2bcd8e50", size = 135451, upload_time = "2025-03-24T16:59:10.823Z" }, + { url = "https://files.pythonhosted.org/packages/8d/4b/9d10888038975cb375982e9339d9495bac382d5c976c500b8d6f2c8e2e4e/orjson-3.10.16-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:64792c0025bae049b3074c6abe0cf06f23c8e9f5a445f4bab31dc5ca23dbf9e1", size = 412358, upload_time = "2025-03-24T16:59:12.113Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e2/cfbcfcc4fbe619e0ca9bdbbfccb2d62b540bbfe41e0ee77d44a628594f59/orjson-3.10.16-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ea53f7e68eec718b8e17e942f7ca56c6bd43562eb19db3f22d90d75e13f0431d", size = 152772, upload_time = "2025-03-24T16:59:13.919Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d6/627a1b00569be46173007c11dde3da4618c9bfe18409325b0e3e2a82fe29/orjson-3.10.16-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a741ba1a9488c92227711bde8c8c2b63d7d3816883268c808fbeada00400c164", size = 137225, upload_time = "2025-03-24T16:59:15.355Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7b/a73c67b505021af845b9f05c7c848793258ea141fa2058b52dd9b067c2b4/orjson-3.10.16-cp311-cp311-win32.whl", hash = "sha256:c7ed2c61bb8226384c3fdf1fb01c51b47b03e3f4536c985078cccc2fd19f1619", size = 141733, upload_time = "2025-03-24T16:59:16.791Z" }, + { url = "https://files.pythonhosted.org/packages/f4/22/5e8217c48d68c0adbfb181e749d6a733761074e598b083c69a1383d18147/orjson-3.10.16-cp311-cp311-win_amd64.whl", hash = "sha256:cd67d8b3e0e56222a2e7b7f7da9031e30ecd1fe251c023340b9f12caca85ab60", size = 133784, upload_time = "2025-03-24T16:59:18.106Z" }, + { url = "https://files.pythonhosted.org/packages/5d/15/67ce9d4c959c83f112542222ea3b9209c1d424231d71d74c4890ea0acd2b/orjson-3.10.16-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6d3444abbfa71ba21bb042caa4b062535b122248259fdb9deea567969140abca", size = 249325, upload_time = "2025-03-24T16:59:19.784Z" }, + { url = "https://files.pythonhosted.org/packages/da/2c/1426b06f30a1b9ada74b6f512c1ddf9d2760f53f61cdb59efeb9ad342133/orjson-3.10.16-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:30245c08d818fdcaa48b7d5b81499b8cae09acabb216fe61ca619876b128e184", size = 133621, upload_time = "2025-03-24T16:59:21.207Z" }, + { url = "https://files.pythonhosted.org/packages/9e/88/18d26130954bc73bee3be10f95371ea1dfb8679e0e2c46b0f6d8c6289402/orjson-3.10.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0ba1d0baa71bf7579a4ccdcf503e6f3098ef9542106a0eca82395898c8a500a", size = 138270, upload_time = "2025-03-24T16:59:22.514Z" }, + { url = "https://files.pythonhosted.org/packages/4f/f9/6d8b64fcd58fae072e80ee7981be8ba0d7c26ace954e5cd1d027fc80518f/orjson-3.10.16-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb0beefa5ef3af8845f3a69ff2a4aa62529b5acec1cfe5f8a6b4141033fd46ef", size = 132346, upload_time = "2025-03-24T16:59:24.277Z" }, + { url = "https://files.pythonhosted.org/packages/16/3f/2513fd5bc786f40cd12af569c23cae6381aeddbefeed2a98f0a666eb5d0d/orjson-3.10.16-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6daa0e1c9bf2e030e93c98394de94506f2a4d12e1e9dadd7c53d5e44d0f9628e", size = 136845, upload_time = "2025-03-24T16:59:25.588Z" }, + { url = "https://files.pythonhosted.org/packages/6d/42/b0e7b36720f5ab722b48e8ccf06514d4f769358dd73c51abd8728ef58d0b/orjson-3.10.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9da9019afb21e02410ef600e56666652b73eb3e4d213a0ec919ff391a7dd52aa", size = 138078, upload_time = "2025-03-24T16:59:27.288Z" }, + { url = "https://files.pythonhosted.org/packages/a3/a8/d220afb8a439604be74fc755dbc740bded5ed14745ca536b304ed32eb18a/orjson-3.10.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:daeb3a1ee17b69981d3aae30c3b4e786b0f8c9e6c71f2b48f1aef934f63f38f4", size = 142712, upload_time = "2025-03-24T16:59:28.613Z" }, + { url = "https://files.pythonhosted.org/packages/8c/88/7e41e9883c00f84f92fe357a8371edae816d9d7ef39c67b5106960c20389/orjson-3.10.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fed80eaf0e20a31942ae5d0728849862446512769692474be5e6b73123a23b", size = 133136, upload_time = "2025-03-24T16:59:29.987Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ca/61116095307ad0be828ea26093febaf59e38596d84a9c8d765c3c5e4934f/orjson-3.10.16-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73390ed838f03764540a7bdc4071fe0123914c2cc02fb6abf35182d5fd1b7a42", size = 135258, upload_time = "2025-03-24T16:59:31.339Z" }, + { url = "https://files.pythonhosted.org/packages/dc/1b/09493cf7d801505f094c9295f79c98c1e0af2ac01c7ed8d25b30fcb19ada/orjson-3.10.16-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a22bba012a0c94ec02a7768953020ab0d3e2b884760f859176343a36c01adf87", size = 412326, upload_time = "2025-03-24T16:59:32.709Z" }, + { url = "https://files.pythonhosted.org/packages/ea/02/125d7bbd7f7a500190ddc8ae5d2d3c39d87ed3ed28f5b37cfe76962c678d/orjson-3.10.16-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5385bbfdbc90ff5b2635b7e6bebf259652db00a92b5e3c45b616df75b9058e88", size = 152800, upload_time = "2025-03-24T16:59:34.134Z" }, + { url = "https://files.pythonhosted.org/packages/f9/09/7658a9e3e793d5b3b00598023e0fb6935d0e7bbb8ff72311c5415a8ce677/orjson-3.10.16-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:02c6279016346e774dd92625d46c6c40db687b8a0d685aadb91e26e46cc33e1e", size = 137516, upload_time = "2025-03-24T16:59:35.446Z" }, + { url = "https://files.pythonhosted.org/packages/29/87/32b7a4831e909d347278101a48d4cf9f3f25901b2295e7709df1651f65a1/orjson-3.10.16-cp312-cp312-win32.whl", hash = "sha256:7ca55097a11426db80f79378e873a8c51f4dde9ffc22de44850f9696b7eb0e8c", size = 141759, upload_time = "2025-03-24T16:59:37.509Z" }, + { url = "https://files.pythonhosted.org/packages/35/ce/81a27e7b439b807bd393585271364cdddf50dc281fc57c4feef7ccb186a6/orjson-3.10.16-cp312-cp312-win_amd64.whl", hash = "sha256:86d127efdd3f9bf5f04809b70faca1e6836556ea3cc46e662b44dab3fe71f3d6", size = 133944, upload_time = "2025-03-24T16:59:38.814Z" }, + { url = "https://files.pythonhosted.org/packages/87/b9/ff6aa28b8c86af9526160905593a2fe8d004ac7a5e592ee0b0ff71017511/orjson-3.10.16-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:148a97f7de811ba14bc6dbc4a433e0341ffd2cc285065199fb5f6a98013744bd", size = 249289, upload_time = "2025-03-24T16:59:40.117Z" }, + { url = "https://files.pythonhosted.org/packages/6c/81/6d92a586149b52684ab8fd70f3623c91d0e6a692f30fd8c728916ab2263c/orjson-3.10.16-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1d960c1bf0e734ea36d0adc880076de3846aaec45ffad29b78c7f1b7962516b8", size = 133640, upload_time = "2025-03-24T16:59:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/c2/88/b72443f4793d2e16039ab85d0026677932b15ab968595fb7149750d74134/orjson-3.10.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a318cd184d1269f68634464b12871386808dc8b7c27de8565234d25975a7a137", size = 138286, upload_time = "2025-03-24T16:59:42.769Z" }, + { url = "https://files.pythonhosted.org/packages/c3/3c/72a22d4b28c076c4016d5a52bd644a8e4d849d3bb0373d9e377f9e3b2250/orjson-3.10.16-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df23f8df3ef9223d1d6748bea63fca55aae7da30a875700809c500a05975522b", size = 132307, upload_time = "2025-03-24T16:59:44.143Z" }, + { url = "https://files.pythonhosted.org/packages/8a/a2/f1259561bdb6ad7061ff1b95dab082fe32758c4bc143ba8d3d70831f0a06/orjson-3.10.16-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b94dda8dd6d1378f1037d7f3f6b21db769ef911c4567cbaa962bb6dc5021cf90", size = 136739, upload_time = "2025-03-24T16:59:45.995Z" }, + { url = "https://files.pythonhosted.org/packages/3d/af/c7583c4b34f33d8b8b90cfaab010ff18dd64e7074cc1e117a5f1eff20dcf/orjson-3.10.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f12970a26666a8775346003fd94347d03ccb98ab8aa063036818381acf5f523e", size = 138076, upload_time = "2025-03-24T16:59:47.776Z" }, + { url = "https://files.pythonhosted.org/packages/d7/59/d7fc7fbdd3d4a64c2eae4fc7341a5aa39cf9549bd5e2d7f6d3c07f8b715b/orjson-3.10.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15a1431a245d856bd56e4d29ea0023eb4d2c8f71efe914beb3dee8ab3f0cd7fb", size = 142643, upload_time = "2025-03-24T16:59:49.258Z" }, + { url = "https://files.pythonhosted.org/packages/92/0e/3bd8f2197d27601f16b4464ae948826da2bcf128af31230a9dbbad7ceb57/orjson-3.10.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c83655cfc247f399a222567d146524674a7b217af7ef8289c0ff53cfe8db09f0", size = 133168, upload_time = "2025-03-24T16:59:51.027Z" }, + { url = "https://files.pythonhosted.org/packages/af/a8/351fd87b664b02f899f9144d2c3dc848b33ac04a5df05234cbfb9e2a7540/orjson-3.10.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fa59ae64cb6ddde8f09bdbf7baf933c4cd05734ad84dcf4e43b887eb24e37652", size = 135271, upload_time = "2025-03-24T16:59:52.449Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b0/a6d42a7d412d867c60c0337d95123517dd5a9370deea705ea1be0f89389e/orjson-3.10.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ca5426e5aacc2e9507d341bc169d8af9c3cbe88f4cd4c1cf2f87e8564730eb56", size = 412444, upload_time = "2025-03-24T16:59:53.825Z" }, + { url = "https://files.pythonhosted.org/packages/79/ec/7572cd4e20863f60996f3f10bc0a6da64a6fd9c35954189a914cec0b7377/orjson-3.10.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6fd5da4edf98a400946cd3a195680de56f1e7575109b9acb9493331047157430", size = 152737, upload_time = "2025-03-24T16:59:55.599Z" }, + { url = "https://files.pythonhosted.org/packages/a9/19/ceb9e8fed5403b2e76a8ac15f581b9d25780a3be3c9b3aa54b7777a210d5/orjson-3.10.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:980ecc7a53e567169282a5e0ff078393bac78320d44238da4e246d71a4e0e8f5", size = 137482, upload_time = "2025-03-24T16:59:57.045Z" }, + { url = "https://files.pythonhosted.org/packages/1b/78/a78bb810f3786579dbbbd94768284cbe8f2fd65167cd7020260679665c17/orjson-3.10.16-cp313-cp313-win32.whl", hash = "sha256:28f79944dd006ac540a6465ebd5f8f45dfdf0948ff998eac7a908275b4c1add6", size = 141714, upload_time = "2025-03-24T16:59:58.666Z" }, + { url = "https://files.pythonhosted.org/packages/81/9c/b66ce9245ff319df2c3278acd351a3f6145ef34b4a2d7f4b0f739368370f/orjson-3.10.16-cp313-cp313-win_amd64.whl", hash = "sha256:fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7", size = 133954, upload_time = "2025-03-24T17:00:00.101Z" }, ] [[package]] @@ -3347,36 +3397,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/df/77698abfac98571e65ffeb0c1fba8ffd692ab8458d617a0eed7d9a8d38f2/outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", size = 21060 } +sdist = { url = "https://files.pythonhosted.org/packages/98/df/77698abfac98571e65ffeb0c1fba8ffd692ab8458d617a0eed7d9a8d38f2/outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", size = 21060, upload_time = "2023-10-26T04:26:04.361Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b", size = 10692 }, + { url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b", size = 10692, upload_time = "2023-10-26T04:26:02.532Z" }, ] [[package]] name = "overrides" version = "7.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812 } +sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812, upload_time = "2024-01-27T21:01:33.423Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832 }, + { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832, upload_time = "2024-01-27T21:01:31.393Z" }, ] [[package]] name = "packageurl-python" version = "0.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/68/7d/0bd319dc94c7956b4d864e87d3dc03739f125ce174671e3128edd566a63e/packageurl_python-0.16.0.tar.gz", hash = "sha256:69e3bf8a3932fe9c2400f56aaeb9f86911ecee2f9398dbe1b58ec34340be365d", size = 40492 } +sdist = { url = "https://files.pythonhosted.org/packages/68/7d/0bd319dc94c7956b4d864e87d3dc03739f125ce174671e3128edd566a63e/packageurl_python-0.16.0.tar.gz", hash = "sha256:69e3bf8a3932fe9c2400f56aaeb9f86911ecee2f9398dbe1b58ec34340be365d", size = 40492, upload_time = "2024-10-22T05:51:25.708Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/47/3c197fb7596a813afef2e4198d507b761aed2c7150d90be64dff9fe0ea71/packageurl_python-0.16.0-py3-none-any.whl", hash = "sha256:5c3872638b177b0f1cf01c3673017b7b27ebee485693ae12a8bed70fa7fa7c35", size = 28544 }, + { url = "https://files.pythonhosted.org/packages/c4/47/3c197fb7596a813afef2e4198d507b761aed2c7150d90be64dff9fe0ea71/packageurl_python-0.16.0-py3-none-any.whl", hash = "sha256:5c3872638b177b0f1cf01c3673017b7b27ebee485693ae12a8bed70fa7fa7c35", size = 28544, upload_time = "2024-10-22T05:51:23.924Z" }, ] [[package]] name = "packaging" version = "24.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950, upload_time = "2024-11-08T09:47:47.202Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451, upload_time = "2024-11-08T09:47:44.722Z" }, ] [[package]] @@ -3389,53 +3439,62 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222 }, - { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274 }, - { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836 }, - { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505 }, - { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420 }, - { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457 }, - { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166 }, - { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 }, - { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 }, - { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 }, - { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 }, - { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 }, - { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 }, - { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 }, - { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 }, - { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 }, - { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 }, - { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 }, - { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 }, - { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 }, - { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 }, - { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 }, - { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 }, - { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 }, - { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 }, - { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 }, - { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload_time = "2024-09-20T13:10:04.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222, upload_time = "2024-09-20T13:08:56.254Z" }, + { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274, upload_time = "2024-09-20T13:08:58.645Z" }, + { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836, upload_time = "2024-09-20T19:01:57.571Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505, upload_time = "2024-09-20T13:09:01.501Z" }, + { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420, upload_time = "2024-09-20T19:02:00.678Z" }, + { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457, upload_time = "2024-09-20T13:09:04.105Z" }, + { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166, upload_time = "2024-09-20T13:09:06.917Z" }, + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload_time = "2024-09-20T13:09:09.655Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload_time = "2024-09-20T13:09:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload_time = "2024-09-20T19:02:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload_time = "2024-09-20T13:09:17.621Z" }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload_time = "2024-09-20T19:02:07.094Z" }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload_time = "2024-09-20T13:09:20.474Z" }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload_time = "2024-09-20T13:09:23.137Z" }, + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643, upload_time = "2024-09-20T13:09:25.522Z" }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573, upload_time = "2024-09-20T13:09:28.012Z" }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085, upload_time = "2024-09-20T19:02:10.451Z" }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809, upload_time = "2024-09-20T13:09:30.814Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316, upload_time = "2024-09-20T19:02:13.825Z" }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055, upload_time = "2024-09-20T13:09:33.462Z" }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175, upload_time = "2024-09-20T13:09:35.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650, upload_time = "2024-09-20T13:09:38.685Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177, upload_time = "2024-09-20T13:09:41.141Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526, upload_time = "2024-09-20T19:02:16.905Z" }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013, upload_time = "2024-09-20T13:09:44.39Z" }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620, upload_time = "2024-09-20T19:02:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436, upload_time = "2024-09-20T13:09:48.112Z" }, ] [[package]] name = "pandocfilters" version = "1.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454 } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload_time = "2024-01-18T20:08:13.726Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663 }, + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload_time = "2024-01-18T20:08:11.28Z" }, ] [[package]] name = "parso" version = "0.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload_time = "2024-04-05T09:43:55.897Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload_time = "2024-04-05T09:43:53.299Z" }, +] + +[[package]] +name = "pathvalidate" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/87/c7a2f51cc62df0495acb0ed2533a7c74cc895e569a1b020ee5f6e9fa4e21/pathvalidate-3.2.3.tar.gz", hash = "sha256:59b5b9278e30382d6d213497623043ebe63f10e29055be4419a9c04c721739cb", size = 61717, upload_time = "2025-01-03T14:06:42.789Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/14/c5a0e1a947909810fc4c043b84cac472b70e438148d34f5393be1bac663f/pathvalidate-3.2.3-py3-none-any.whl", hash = "sha256:5eaf0562e345d4b6d0c0239d0f690c3bd84d2a9a3c4c73b99ea667401b27bee1", size = 24130, upload_time = "2025-01-03T14:06:39.568Z" }, ] [[package]] @@ -3445,67 +3504,77 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ptyprocess" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload_time = "2023-11-25T09:07:26.339Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload_time = "2023-11-25T06:56:14.81Z" }, ] [[package]] name = "pillow" -version = "11.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b/pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", size = 46742715 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/dd/d6/2000bfd8d5414fb70cbbe52c8332f2283ff30ed66a9cde42716c8ecbe22c/pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457", size = 3229968 }, - { url = "https://files.pythonhosted.org/packages/d9/45/3fe487010dd9ce0a06adf9b8ff4f273cc0a44536e234b0fad3532a42c15b/pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35", size = 3101806 }, - { url = "https://files.pythonhosted.org/packages/e3/72/776b3629c47d9d5f1c160113158a7a7ad177688d3a1159cd3b62ded5a33a/pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2", size = 4322283 }, - { url = "https://files.pythonhosted.org/packages/e4/c2/e25199e7e4e71d64eeb869f5b72c7ddec70e0a87926398785ab944d92375/pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070", size = 4402945 }, - { url = "https://files.pythonhosted.org/packages/c1/ed/51d6136c9d5911f78632b1b86c45241c712c5a80ed7fa7f9120a5dff1eba/pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6", size = 4361228 }, - { url = "https://files.pythonhosted.org/packages/48/a4/fbfe9d5581d7b111b28f1d8c2762dee92e9821bb209af9fa83c940e507a0/pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1", size = 4484021 }, - { url = "https://files.pythonhosted.org/packages/39/db/0b3c1a5018117f3c1d4df671fb8e47d08937f27519e8614bbe86153b65a5/pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2", size = 4287449 }, - { url = "https://files.pythonhosted.org/packages/d9/58/bc128da7fea8c89fc85e09f773c4901e95b5936000e6f303222490c052f3/pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96", size = 4419972 }, - { url = "https://files.pythonhosted.org/packages/5f/bb/58f34379bde9fe197f51841c5bbe8830c28bbb6d3801f16a83b8f2ad37df/pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f", size = 2291201 }, - { url = "https://files.pythonhosted.org/packages/3a/c6/fce9255272bcf0c39e15abd2f8fd8429a954cf344469eaceb9d0d1366913/pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761", size = 2625686 }, - { url = "https://files.pythonhosted.org/packages/c8/52/8ba066d569d932365509054859f74f2a9abee273edcef5cd75e4bc3e831e/pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71", size = 2375194 }, - { url = "https://files.pythonhosted.org/packages/95/20/9ce6ed62c91c073fcaa23d216e68289e19d95fb8188b9fb7a63d36771db8/pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a", size = 3226818 }, - { url = "https://files.pythonhosted.org/packages/b9/d8/f6004d98579a2596c098d1e30d10b248798cceff82d2b77aa914875bfea1/pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b", size = 3101662 }, - { url = "https://files.pythonhosted.org/packages/08/d9/892e705f90051c7a2574d9f24579c9e100c828700d78a63239676f960b74/pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3", size = 4329317 }, - { url = "https://files.pythonhosted.org/packages/8c/aa/7f29711f26680eab0bcd3ecdd6d23ed6bce180d82e3f6380fb7ae35fcf3b/pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a", size = 4412999 }, - { url = "https://files.pythonhosted.org/packages/c8/c4/8f0fe3b9e0f7196f6d0bbb151f9fba323d72a41da068610c4c960b16632a/pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1", size = 4368819 }, - { url = "https://files.pythonhosted.org/packages/38/0d/84200ed6a871ce386ddc82904bfadc0c6b28b0c0ec78176871a4679e40b3/pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f", size = 4496081 }, - { url = "https://files.pythonhosted.org/packages/84/9c/9bcd66f714d7e25b64118e3952d52841a4babc6d97b6d28e2261c52045d4/pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91", size = 4296513 }, - { url = "https://files.pythonhosted.org/packages/db/61/ada2a226e22da011b45f7104c95ebda1b63dcbb0c378ad0f7c2a710f8fd2/pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c", size = 4431298 }, - { url = "https://files.pythonhosted.org/packages/e7/c4/fc6e86750523f367923522014b821c11ebc5ad402e659d8c9d09b3c9d70c/pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6", size = 2291630 }, - { url = "https://files.pythonhosted.org/packages/08/5c/2104299949b9d504baf3f4d35f73dbd14ef31bbd1ddc2c1b66a5b7dfda44/pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf", size = 2626369 }, - { url = "https://files.pythonhosted.org/packages/37/f3/9b18362206b244167c958984b57c7f70a0289bfb59a530dd8af5f699b910/pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5", size = 2375240 }, - { url = "https://files.pythonhosted.org/packages/b3/31/9ca79cafdce364fd5c980cd3416c20ce1bebd235b470d262f9d24d810184/pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", size = 3226640 }, - { url = "https://files.pythonhosted.org/packages/ac/0f/ff07ad45a1f172a497aa393b13a9d81a32e1477ef0e869d030e3c1532521/pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", size = 3101437 }, - { url = "https://files.pythonhosted.org/packages/08/2f/9906fca87a68d29ec4530be1f893149e0cb64a86d1f9f70a7cfcdfe8ae44/pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", size = 4326605 }, - { url = "https://files.pythonhosted.org/packages/b0/0f/f3547ee15b145bc5c8b336401b2d4c9d9da67da9dcb572d7c0d4103d2c69/pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", size = 4411173 }, - { url = "https://files.pythonhosted.org/packages/b1/df/bf8176aa5db515c5de584c5e00df9bab0713548fd780c82a86cba2c2fedb/pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", size = 4369145 }, - { url = "https://files.pythonhosted.org/packages/de/7c/7433122d1cfadc740f577cb55526fdc39129a648ac65ce64db2eb7209277/pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", size = 4496340 }, - { url = "https://files.pythonhosted.org/packages/25/46/dd94b93ca6bd555588835f2504bd90c00d5438fe131cf01cfa0c5131a19d/pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", size = 4296906 }, - { url = "https://files.pythonhosted.org/packages/a8/28/2f9d32014dfc7753e586db9add35b8a41b7a3b46540e965cb6d6bc607bd2/pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", size = 4431759 }, - { url = "https://files.pythonhosted.org/packages/33/48/19c2cbe7403870fbe8b7737d19eb013f46299cdfe4501573367f6396c775/pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", size = 2291657 }, - { url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", size = 2626304 }, - { url = "https://files.pythonhosted.org/packages/e5/7b/ef35a71163bf36db06e9c8729608f78dedf032fc8313d19bd4be5c2588f3/pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", size = 2375117 }, - { url = "https://files.pythonhosted.org/packages/79/30/77f54228401e84d6791354888549b45824ab0ffde659bafa67956303a09f/pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", size = 3230060 }, - { url = "https://files.pythonhosted.org/packages/ce/b1/56723b74b07dd64c1010fee011951ea9c35a43d8020acd03111f14298225/pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", size = 3106192 }, - { url = "https://files.pythonhosted.org/packages/e1/cd/7bf7180e08f80a4dcc6b4c3a0aa9e0b0ae57168562726a05dc8aa8fa66b0/pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", size = 4446805 }, - { url = "https://files.pythonhosted.org/packages/97/42/87c856ea30c8ed97e8efbe672b58c8304dee0573f8c7cab62ae9e31db6ae/pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", size = 4530623 }, - { url = "https://files.pythonhosted.org/packages/ff/41/026879e90c84a88e33fb00cc6bd915ac2743c67e87a18f80270dfe3c2041/pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", size = 4465191 }, - { url = "https://files.pythonhosted.org/packages/e5/fb/a7960e838bc5df57a2ce23183bfd2290d97c33028b96bde332a9057834d3/pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", size = 2295494 }, - { url = "https://files.pythonhosted.org/packages/d7/6c/6ec83ee2f6f0fda8d4cf89045c6be4b0373ebfc363ba8538f8c999f63fcd/pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", size = 2631595 }, - { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 }, +version = "11.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707, upload_time = "2025-04-12T17:50:03.289Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/08/3fbf4b98924c73037a8e8b4c2c774784805e0fb4ebca6c5bb60795c40125/pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70", size = 3198450, upload_time = "2025-04-12T17:47:37.135Z" }, + { url = "https://files.pythonhosted.org/packages/84/92/6505b1af3d2849d5e714fc75ba9e69b7255c05ee42383a35a4d58f576b16/pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf", size = 3030550, upload_time = "2025-04-12T17:47:39.345Z" }, + { url = "https://files.pythonhosted.org/packages/3c/8c/ac2f99d2a70ff966bc7eb13dacacfaab57c0549b2ffb351b6537c7840b12/pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7", size = 4415018, upload_time = "2025-04-12T17:47:41.128Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e3/0a58b5d838687f40891fff9cbaf8669f90c96b64dc8f91f87894413856c6/pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8", size = 4498006, upload_time = "2025-04-12T17:47:42.912Z" }, + { url = "https://files.pythonhosted.org/packages/21/f5/6ba14718135f08fbfa33308efe027dd02b781d3f1d5c471444a395933aac/pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600", size = 4517773, upload_time = "2025-04-12T17:47:44.611Z" }, + { url = "https://files.pythonhosted.org/packages/20/f2/805ad600fc59ebe4f1ba6129cd3a75fb0da126975c8579b8f57abeb61e80/pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788", size = 4607069, upload_time = "2025-04-12T17:47:46.46Z" }, + { url = "https://files.pythonhosted.org/packages/71/6b/4ef8a288b4bb2e0180cba13ca0a519fa27aa982875882392b65131401099/pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e", size = 4583460, upload_time = "2025-04-12T17:47:49.255Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/f29c705a09cbc9e2a456590816e5c234382ae5d32584f451c3eb41a62062/pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e", size = 4661304, upload_time = "2025-04-12T17:47:51.067Z" }, + { url = "https://files.pythonhosted.org/packages/6e/1a/c8217b6f2f73794a5e219fbad087701f412337ae6dbb956db37d69a9bc43/pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6", size = 2331809, upload_time = "2025-04-12T17:47:54.425Z" }, + { url = "https://files.pythonhosted.org/packages/e2/72/25a8f40170dc262e86e90f37cb72cb3de5e307f75bf4b02535a61afcd519/pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193", size = 2676338, upload_time = "2025-04-12T17:47:56.535Z" }, + { url = "https://files.pythonhosted.org/packages/06/9e/76825e39efee61efea258b479391ca77d64dbd9e5804e4ad0fa453b4ba55/pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7", size = 2414918, upload_time = "2025-04-12T17:47:58.217Z" }, + { url = "https://files.pythonhosted.org/packages/c7/40/052610b15a1b8961f52537cc8326ca6a881408bc2bdad0d852edeb6ed33b/pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f", size = 3190185, upload_time = "2025-04-12T17:48:00.417Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7e/b86dbd35a5f938632093dc40d1682874c33dcfe832558fc80ca56bfcb774/pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b", size = 3030306, upload_time = "2025-04-12T17:48:02.391Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5c/467a161f9ed53e5eab51a42923c33051bf8d1a2af4626ac04f5166e58e0c/pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d", size = 4416121, upload_time = "2025-04-12T17:48:04.554Z" }, + { url = "https://files.pythonhosted.org/packages/62/73/972b7742e38ae0e2ac76ab137ca6005dcf877480da0d9d61d93b613065b4/pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4", size = 4501707, upload_time = "2025-04-12T17:48:06.831Z" }, + { url = "https://files.pythonhosted.org/packages/e4/3a/427e4cb0b9e177efbc1a84798ed20498c4f233abde003c06d2650a6d60cb/pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d", size = 4522921, upload_time = "2025-04-12T17:48:09.229Z" }, + { url = "https://files.pythonhosted.org/packages/fe/7c/d8b1330458e4d2f3f45d9508796d7caf0c0d3764c00c823d10f6f1a3b76d/pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4", size = 4612523, upload_time = "2025-04-12T17:48:11.631Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2f/65738384e0b1acf451de5a573d8153fe84103772d139e1e0bdf1596be2ea/pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443", size = 4587836, upload_time = "2025-04-12T17:48:13.592Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c5/e795c9f2ddf3debb2dedd0df889f2fe4b053308bb59a3cc02a0cd144d641/pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c", size = 4669390, upload_time = "2025-04-12T17:48:15.938Z" }, + { url = "https://files.pythonhosted.org/packages/96/ae/ca0099a3995976a9fce2f423166f7bff9b12244afdc7520f6ed38911539a/pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3", size = 2332309, upload_time = "2025-04-12T17:48:17.885Z" }, + { url = "https://files.pythonhosted.org/packages/7c/18/24bff2ad716257fc03da964c5e8f05d9790a779a8895d6566e493ccf0189/pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941", size = 2676768, upload_time = "2025-04-12T17:48:19.655Z" }, + { url = "https://files.pythonhosted.org/packages/da/bb/e8d656c9543276517ee40184aaa39dcb41e683bca121022f9323ae11b39d/pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb", size = 2415087, upload_time = "2025-04-12T17:48:21.991Z" }, + { url = "https://files.pythonhosted.org/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098, upload_time = "2025-04-12T17:48:23.915Z" }, + { url = "https://files.pythonhosted.org/packages/b5/09/29d5cd052f7566a63e5b506fac9c60526e9ecc553825551333e1e18a4858/pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830", size = 3030166, upload_time = "2025-04-12T17:48:25.738Z" }, + { url = "https://files.pythonhosted.org/packages/71/5d/446ee132ad35e7600652133f9c2840b4799bbd8e4adba881284860da0a36/pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0", size = 4408674, upload_time = "2025-04-12T17:48:27.908Z" }, + { url = "https://files.pythonhosted.org/packages/69/5f/cbe509c0ddf91cc3a03bbacf40e5c2339c4912d16458fcb797bb47bcb269/pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1", size = 4496005, upload_time = "2025-04-12T17:48:29.888Z" }, + { url = "https://files.pythonhosted.org/packages/f9/b3/dd4338d8fb8a5f312021f2977fb8198a1184893f9b00b02b75d565c33b51/pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f", size = 4518707, upload_time = "2025-04-12T17:48:31.874Z" }, + { url = "https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155", size = 4610008, upload_time = "2025-04-12T17:48:34.422Z" }, + { url = "https://files.pythonhosted.org/packages/72/d1/924ce51bea494cb6e7959522d69d7b1c7e74f6821d84c63c3dc430cbbf3b/pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14", size = 4585420, upload_time = "2025-04-12T17:48:37.641Z" }, + { url = "https://files.pythonhosted.org/packages/43/ab/8f81312d255d713b99ca37479a4cb4b0f48195e530cdc1611990eb8fd04b/pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b", size = 4667655, upload_time = "2025-04-12T17:48:39.652Z" }, + { url = "https://files.pythonhosted.org/packages/94/86/8f2e9d2dc3d308dfd137a07fe1cc478df0a23d42a6c4093b087e738e4827/pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2", size = 2332329, upload_time = "2025-04-12T17:48:41.765Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ec/1179083b8d6067a613e4d595359b5fdea65d0a3b7ad623fee906e1b3c4d2/pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691", size = 2676388, upload_time = "2025-04-12T17:48:43.625Z" }, + { url = "https://files.pythonhosted.org/packages/23/f1/2fc1e1e294de897df39fa8622d829b8828ddad938b0eaea256d65b84dd72/pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c", size = 2414950, upload_time = "2025-04-12T17:48:45.475Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3e/c328c48b3f0ead7bab765a84b4977acb29f101d10e4ef57a5e3400447c03/pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22", size = 3192759, upload_time = "2025-04-12T17:48:47.866Z" }, + { url = "https://files.pythonhosted.org/packages/18/0e/1c68532d833fc8b9f404d3a642991441d9058eccd5606eab31617f29b6d4/pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7", size = 3033284, upload_time = "2025-04-12T17:48:50.189Z" }, + { url = "https://files.pythonhosted.org/packages/b7/cb/6faf3fb1e7705fd2db74e070f3bf6f88693601b0ed8e81049a8266de4754/pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16", size = 4445826, upload_time = "2025-04-12T17:48:52.346Z" }, + { url = "https://files.pythonhosted.org/packages/07/94/8be03d50b70ca47fb434a358919d6a8d6580f282bbb7af7e4aa40103461d/pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b", size = 4527329, upload_time = "2025-04-12T17:48:54.403Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a4/bfe78777076dc405e3bd2080bc32da5ab3945b5a25dc5d8acaa9de64a162/pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406", size = 4549049, upload_time = "2025-04-12T17:48:56.383Z" }, + { url = "https://files.pythonhosted.org/packages/65/4d/eaf9068dc687c24979e977ce5677e253624bd8b616b286f543f0c1b91662/pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91", size = 4635408, upload_time = "2025-04-12T17:48:58.782Z" }, + { url = "https://files.pythonhosted.org/packages/1d/26/0fd443365d9c63bc79feb219f97d935cd4b93af28353cba78d8e77b61719/pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751", size = 4614863, upload_time = "2025-04-12T17:49:00.709Z" }, + { url = "https://files.pythonhosted.org/packages/49/65/dca4d2506be482c2c6641cacdba5c602bc76d8ceb618fd37de855653a419/pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9", size = 4692938, upload_time = "2025-04-12T17:49:02.946Z" }, + { url = "https://files.pythonhosted.org/packages/b3/92/1ca0c3f09233bd7decf8f7105a1c4e3162fb9142128c74adad0fb361b7eb/pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd", size = 2335774, upload_time = "2025-04-12T17:49:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ac/77525347cb43b83ae905ffe257bbe2cc6fd23acb9796639a1f56aa59d191/pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e", size = 2681895, upload_time = "2025-04-12T17:49:06.635Z" }, + { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234, upload_time = "2025-04-12T17:49:08.399Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ad/2613c04633c7257d9481ab21d6b5364b59fc5d75faafd7cb8693523945a3/pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed", size = 3181734, upload_time = "2025-04-12T17:49:46.789Z" }, + { url = "https://files.pythonhosted.org/packages/a4/fd/dcdda4471ed667de57bb5405bb42d751e6cfdd4011a12c248b455c778e03/pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c", size = 2999841, upload_time = "2025-04-12T17:49:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/ac/89/8a2536e95e77432833f0db6fd72a8d310c8e4272a04461fb833eb021bf94/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd", size = 3437470, upload_time = "2025-04-12T17:49:50.831Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8f/abd47b73c60712f88e9eda32baced7bfc3e9bd6a7619bb64b93acff28c3e/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076", size = 3460013, upload_time = "2025-04-12T17:49:53.278Z" }, + { url = "https://files.pythonhosted.org/packages/f6/20/5c0a0aa83b213b7a07ec01e71a3d6ea2cf4ad1d2c686cc0168173b6089e7/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b", size = 3527165, upload_time = "2025-04-12T17:49:55.164Z" }, + { url = "https://files.pythonhosted.org/packages/58/0e/2abab98a72202d91146abc839e10c14f7cf36166f12838ea0c4db3ca6ecb/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f", size = 3571586, upload_time = "2025-04-12T17:49:57.171Z" }, + { url = "https://files.pythonhosted.org/packages/21/2c/5e05f58658cf49b6667762cca03d6e7d85cededde2caf2ab37b81f80e574/pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044", size = 2674751, upload_time = "2025-04-12T17:49:59.628Z" }, ] [[package]] name = "pip" -version = "25.0.1" +version = "25.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/53/b309b4a497b09655cb7e07088966881a57d082f48ac3cb54ea729fd2c6cf/pip-25.0.1.tar.gz", hash = "sha256:88f96547ea48b940a3a385494e181e29fb8637898f88d88737c5049780f196ea", size = 1950850 } +sdist = { url = "https://files.pythonhosted.org/packages/79/67/c06f625e2968c417052b3a4a0eef40656d5d4d44033e57b40ec474af1d28/pip-25.1.tar.gz", hash = "sha256:272bdd1289f80165e9070a4f881e8f9e1001bbb50378561d1af20e49bf5a2200", size = 1939624, upload_time = "2025-04-26T09:45:36.149Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/bc/b7db44f5f39f9d0494071bddae6880eb645970366d0a200022a1a93d57f5/pip-25.0.1-py3-none-any.whl", hash = "sha256:c46efd13b6aa8279f33f2864459c8ce587ea6a1a59ee20de055868d8f7688f7f", size = 1841526 }, + { url = "https://files.pythonhosted.org/packages/e0/f0/8a2806114cd36e282823fd4d8e88e3b94dc943c2569c350d0c826a49db38/pip-25.1-py3-none-any.whl", hash = "sha256:13b4aa0aaad055020a11bec8a1c2a70a2b2d080e12d89b962266029fff0a16ba", size = 1824948, upload_time = "2025-04-26T09:45:33.871Z" }, ] [[package]] @@ -3515,9 +3584,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pip" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/f1/ee85f8c7e82bccf90a3c7aad22863cc6e20057860a1361083cd2adacb92e/pip_api-0.0.34.tar.gz", hash = "sha256:9b75e958f14c5a2614bae415f2adf7eeb54d50a2cfbe7e24fd4826471bac3625", size = 123017 } +sdist = { url = "https://files.pythonhosted.org/packages/b9/f1/ee85f8c7e82bccf90a3c7aad22863cc6e20057860a1361083cd2adacb92e/pip_api-0.0.34.tar.gz", hash = "sha256:9b75e958f14c5a2614bae415f2adf7eeb54d50a2cfbe7e24fd4826471bac3625", size = 123017, upload_time = "2024-07-09T20:32:30.641Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/f7/ebf5003e1065fd00b4cbef53bf0a65c3d3e1b599b676d5383ccb7a8b88ba/pip_api-0.0.34-py3-none-any.whl", hash = "sha256:8b2d7d7c37f2447373aa2cf8b1f60a2f2b27a84e1e9e0294a3f6ef10eb3ba6bb", size = 120369 }, + { url = "https://files.pythonhosted.org/packages/91/f7/ebf5003e1065fd00b4cbef53bf0a65c3d3e1b599b676d5383ccb7a8b88ba/pip_api-0.0.34-py3-none-any.whl", hash = "sha256:8b2d7d7c37f2447373aa2cf8b1f60a2f2b27a84e1e9e0294a3f6ef10eb3ba6bb", size = 120369, upload_time = "2024-07-09T20:32:29.099Z" }, ] [[package]] @@ -3535,9 +3604,9 @@ dependencies = [ { name = "rich" }, { name = "toml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cc/7f/28fad19a9806f796f13192ab6974c07c4a04d9cbb8e30dd895c3c11ce7ee/pip_audit-2.9.0.tar.gz", hash = "sha256:0b998410b58339d7a231e5aa004326a294e4c7c6295289cdc9d5e1ef07b1f44d", size = 52089 } +sdist = { url = "https://files.pythonhosted.org/packages/cc/7f/28fad19a9806f796f13192ab6974c07c4a04d9cbb8e30dd895c3c11ce7ee/pip_audit-2.9.0.tar.gz", hash = "sha256:0b998410b58339d7a231e5aa004326a294e4c7c6295289cdc9d5e1ef07b1f44d", size = 52089, upload_time = "2025-04-07T16:45:23.679Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/9e/f4dfd9d3dadb6d6dc9406f1111062f871e2e248ed7b584cca6020baf2ac1/pip_audit-2.9.0-py3-none-any.whl", hash = "sha256:348b16e60895749a0839875d7cc27ebd692e1584ebe5d5cb145941c8e25a80bd", size = 58634 }, + { url = "https://files.pythonhosted.org/packages/43/9e/f4dfd9d3dadb6d6dc9406f1111062f871e2e248ed7b584cca6020baf2ac1/pip_audit-2.9.0-py3-none-any.whl", hash = "sha256:348b16e60895749a0839875d7cc27ebd692e1584ebe5d5cb145941c8e25a80bd", size = 58634, upload_time = "2025-04-07T16:45:22.056Z" }, ] [[package]] @@ -3557,27 +3626,27 @@ dependencies = [ { name = "packaging" }, { name = "pyparsing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/2a/63b574101850e7f7b306ddbdb02cb294380d37948140eecd468fae392b54/pip-requirements-parser-32.0.1.tar.gz", hash = "sha256:b4fa3a7a0be38243123cf9d1f3518da10c51bdb165a2b2985566247f9155a7d3", size = 209359 } +sdist = { url = "https://files.pythonhosted.org/packages/5e/2a/63b574101850e7f7b306ddbdb02cb294380d37948140eecd468fae392b54/pip-requirements-parser-32.0.1.tar.gz", hash = "sha256:b4fa3a7a0be38243123cf9d1f3518da10c51bdb165a2b2985566247f9155a7d3", size = 209359, upload_time = "2022-12-21T15:25:22.732Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/d0/d04f1d1e064ac901439699ee097f58688caadea42498ec9c4b4ad2ef84ab/pip_requirements_parser-32.0.1-py3-none-any.whl", hash = "sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526", size = 35648 }, + { url = "https://files.pythonhosted.org/packages/54/d0/d04f1d1e064ac901439699ee097f58688caadea42498ec9c4b4ad2ef84ab/pip_requirements_parser-32.0.1-py3-none-any.whl", hash = "sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526", size = 35648, upload_time = "2022-12-21T15:25:21.046Z" }, ] [[package]] name = "platformdirs" version = "4.3.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291 } +sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291, upload_time = "2025-03-19T20:36:10.989Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499 }, + { url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499, upload_time = "2025-03-19T20:36:09.038Z" }, ] [[package]] name = "pluggy" version = "1.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload_time = "2024-04-20T21:34:42.531Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload_time = "2024-04-20T21:34:40.434Z" }, ] [[package]] @@ -3591,9 +3660,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424 } +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload_time = "2025-03-18T21:35:20.987Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707 }, + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload_time = "2025-03-18T21:35:19.343Z" }, ] [[package]] @@ -3603,103 +3672,103 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/b1/85e18ac92afd08c533603e3393977b6bc1443043115a47bb094f3b98f94f/prettytable-3.16.0.tar.gz", hash = "sha256:3c64b31719d961bf69c9a7e03d0c1e477320906a98da63952bc6698d6164ff57", size = 66276 } +sdist = { url = "https://files.pythonhosted.org/packages/99/b1/85e18ac92afd08c533603e3393977b6bc1443043115a47bb094f3b98f94f/prettytable-3.16.0.tar.gz", hash = "sha256:3c64b31719d961bf69c9a7e03d0c1e477320906a98da63952bc6698d6164ff57", size = 66276, upload_time = "2025-03-24T19:39:04.008Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/c7/5613524e606ea1688b3bdbf48aa64bafb6d0a4ac3750274c43b6158a390f/prettytable-3.16.0-py3-none-any.whl", hash = "sha256:b5eccfabb82222f5aa46b798ff02a8452cf530a352c31bddfa29be41242863aa", size = 33863 }, + { url = "https://files.pythonhosted.org/packages/02/c7/5613524e606ea1688b3bdbf48aa64bafb6d0a4ac3750274c43b6158a390f/prettytable-3.16.0-py3-none-any.whl", hash = "sha256:b5eccfabb82222f5aa46b798ff02a8452cf530a352c31bddfa29be41242863aa", size = 33863, upload_time = "2025-03-24T19:39:02.359Z" }, ] [[package]] name = "prometheus-client" version = "0.21.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/62/14/7d0f567991f3a9af8d1cd4f619040c93b68f09a02b6d0b6ab1b2d1ded5fe/prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", size = 78551 } +sdist = { url = "https://files.pythonhosted.org/packages/62/14/7d0f567991f3a9af8d1cd4f619040c93b68f09a02b6d0b6ab1b2d1ded5fe/prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", size = 78551, upload_time = "2024-12-03T14:59:12.164Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301", size = 54682 }, + { url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301", size = 54682, upload_time = "2024-12-03T14:59:10.935Z" }, ] [[package]] name = "prompt-toolkit" -version = "3.0.50" +version = "3.0.51" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab", size = 429087 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940, upload_time = "2025-04-15T09:18:47.731Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810, upload_time = "2025-04-15T09:18:44.753Z" }, ] [[package]] name = "propcache" version = "0.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/0f/5a5319ee83bd651f75311fcb0c492c21322a7fc8f788e4eef23f44243427/propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", size = 80243 }, - { url = "https://files.pythonhosted.org/packages/ce/84/3db5537e0879942783e2256616ff15d870a11d7ac26541336fe1b673c818/propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", size = 46503 }, - { url = "https://files.pythonhosted.org/packages/e2/c8/b649ed972433c3f0d827d7f0cf9ea47162f4ef8f4fe98c5f3641a0bc63ff/propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", size = 45934 }, - { url = "https://files.pythonhosted.org/packages/59/f9/4c0a5cf6974c2c43b1a6810c40d889769cc8f84cea676cbe1e62766a45f8/propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", size = 233633 }, - { url = "https://files.pythonhosted.org/packages/e7/64/66f2f4d1b4f0007c6e9078bd95b609b633d3957fe6dd23eac33ebde4b584/propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", size = 241124 }, - { url = "https://files.pythonhosted.org/packages/aa/bf/7b8c9fd097d511638fa9b6af3d986adbdf567598a567b46338c925144c1b/propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", size = 240283 }, - { url = "https://files.pythonhosted.org/packages/fa/c9/e85aeeeaae83358e2a1ef32d6ff50a483a5d5248bc38510d030a6f4e2816/propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", size = 232498 }, - { url = "https://files.pythonhosted.org/packages/8e/66/acb88e1f30ef5536d785c283af2e62931cb934a56a3ecf39105887aa8905/propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", size = 221486 }, - { url = "https://files.pythonhosted.org/packages/f5/f9/233ddb05ffdcaee4448508ee1d70aa7deff21bb41469ccdfcc339f871427/propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", size = 222675 }, - { url = "https://files.pythonhosted.org/packages/98/b8/eb977e28138f9e22a5a789daf608d36e05ed93093ef12a12441030da800a/propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", size = 215727 }, - { url = "https://files.pythonhosted.org/packages/89/2d/5f52d9c579f67b8ee1edd9ec073c91b23cc5b7ff7951a1e449e04ed8fdf3/propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", size = 217878 }, - { url = "https://files.pythonhosted.org/packages/7a/fd/5283e5ed8a82b00c7a989b99bb6ea173db1ad750bf0bf8dff08d3f4a4e28/propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", size = 230558 }, - { url = "https://files.pythonhosted.org/packages/90/38/ab17d75938ef7ac87332c588857422ae126b1c76253f0f5b1242032923ca/propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", size = 233754 }, - { url = "https://files.pythonhosted.org/packages/06/5d/3b921b9c60659ae464137508d3b4c2b3f52f592ceb1964aa2533b32fcf0b/propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", size = 226088 }, - { url = "https://files.pythonhosted.org/packages/54/6e/30a11f4417d9266b5a464ac5a8c5164ddc9dd153dfa77bf57918165eb4ae/propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", size = 40859 }, - { url = "https://files.pythonhosted.org/packages/1d/3a/8a68dd867da9ca2ee9dfd361093e9cb08cb0f37e5ddb2276f1b5177d7731/propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", size = 45153 }, - { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430 }, - { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637 }, - { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123 }, - { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031 }, - { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100 }, - { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170 }, - { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000 }, - { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262 }, - { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772 }, - { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133 }, - { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741 }, - { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047 }, - { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467 }, - { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022 }, - { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647 }, - { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784 }, - { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865 }, - { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452 }, - { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800 }, - { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804 }, - { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235 }, - { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249 }, - { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964 }, - { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501 }, - { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917 }, - { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089 }, - { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102 }, - { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122 }, - { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818 }, - { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112 }, - { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034 }, - { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613 }, - { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763 }, - { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175 }, - { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265 }, - { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412 }, - { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290 }, - { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926 }, - { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808 }, - { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916 }, - { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661 }, - { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384 }, - { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420 }, - { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880 }, - { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407 }, - { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573 }, - { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757 }, - { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376 }, +sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651, upload_time = "2025-03-26T03:06:12.05Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/0f/5a5319ee83bd651f75311fcb0c492c21322a7fc8f788e4eef23f44243427/propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", size = 80243, upload_time = "2025-03-26T03:04:01.912Z" }, + { url = "https://files.pythonhosted.org/packages/ce/84/3db5537e0879942783e2256616ff15d870a11d7ac26541336fe1b673c818/propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", size = 46503, upload_time = "2025-03-26T03:04:03.704Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c8/b649ed972433c3f0d827d7f0cf9ea47162f4ef8f4fe98c5f3641a0bc63ff/propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", size = 45934, upload_time = "2025-03-26T03:04:05.257Z" }, + { url = "https://files.pythonhosted.org/packages/59/f9/4c0a5cf6974c2c43b1a6810c40d889769cc8f84cea676cbe1e62766a45f8/propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", size = 233633, upload_time = "2025-03-26T03:04:07.044Z" }, + { url = "https://files.pythonhosted.org/packages/e7/64/66f2f4d1b4f0007c6e9078bd95b609b633d3957fe6dd23eac33ebde4b584/propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", size = 241124, upload_time = "2025-03-26T03:04:08.676Z" }, + { url = "https://files.pythonhosted.org/packages/aa/bf/7b8c9fd097d511638fa9b6af3d986adbdf567598a567b46338c925144c1b/propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", size = 240283, upload_time = "2025-03-26T03:04:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c9/e85aeeeaae83358e2a1ef32d6ff50a483a5d5248bc38510d030a6f4e2816/propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", size = 232498, upload_time = "2025-03-26T03:04:11.616Z" }, + { url = "https://files.pythonhosted.org/packages/8e/66/acb88e1f30ef5536d785c283af2e62931cb934a56a3ecf39105887aa8905/propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", size = 221486, upload_time = "2025-03-26T03:04:13.102Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f9/233ddb05ffdcaee4448508ee1d70aa7deff21bb41469ccdfcc339f871427/propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", size = 222675, upload_time = "2025-03-26T03:04:14.658Z" }, + { url = "https://files.pythonhosted.org/packages/98/b8/eb977e28138f9e22a5a789daf608d36e05ed93093ef12a12441030da800a/propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", size = 215727, upload_time = "2025-03-26T03:04:16.207Z" }, + { url = "https://files.pythonhosted.org/packages/89/2d/5f52d9c579f67b8ee1edd9ec073c91b23cc5b7ff7951a1e449e04ed8fdf3/propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", size = 217878, upload_time = "2025-03-26T03:04:18.11Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fd/5283e5ed8a82b00c7a989b99bb6ea173db1ad750bf0bf8dff08d3f4a4e28/propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", size = 230558, upload_time = "2025-03-26T03:04:19.562Z" }, + { url = "https://files.pythonhosted.org/packages/90/38/ab17d75938ef7ac87332c588857422ae126b1c76253f0f5b1242032923ca/propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", size = 233754, upload_time = "2025-03-26T03:04:21.065Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/3b921b9c60659ae464137508d3b4c2b3f52f592ceb1964aa2533b32fcf0b/propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", size = 226088, upload_time = "2025-03-26T03:04:22.718Z" }, + { url = "https://files.pythonhosted.org/packages/54/6e/30a11f4417d9266b5a464ac5a8c5164ddc9dd153dfa77bf57918165eb4ae/propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", size = 40859, upload_time = "2025-03-26T03:04:24.039Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/8a68dd867da9ca2ee9dfd361093e9cb08cb0f37e5ddb2276f1b5177d7731/propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", size = 45153, upload_time = "2025-03-26T03:04:25.211Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430, upload_time = "2025-03-26T03:04:26.436Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637, upload_time = "2025-03-26T03:04:27.932Z" }, + { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123, upload_time = "2025-03-26T03:04:30.659Z" }, + { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031, upload_time = "2025-03-26T03:04:31.977Z" }, + { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100, upload_time = "2025-03-26T03:04:33.45Z" }, + { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170, upload_time = "2025-03-26T03:04:35.542Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000, upload_time = "2025-03-26T03:04:37.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262, upload_time = "2025-03-26T03:04:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772, upload_time = "2025-03-26T03:04:41.109Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133, upload_time = "2025-03-26T03:04:42.544Z" }, + { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741, upload_time = "2025-03-26T03:04:44.06Z" }, + { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047, upload_time = "2025-03-26T03:04:45.983Z" }, + { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467, upload_time = "2025-03-26T03:04:47.699Z" }, + { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022, upload_time = "2025-03-26T03:04:49.195Z" }, + { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647, upload_time = "2025-03-26T03:04:50.595Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784, upload_time = "2025-03-26T03:04:51.791Z" }, + { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865, upload_time = "2025-03-26T03:04:53.406Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452, upload_time = "2025-03-26T03:04:54.624Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800, upload_time = "2025-03-26T03:04:55.844Z" }, + { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804, upload_time = "2025-03-26T03:04:57.158Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650, upload_time = "2025-03-26T03:04:58.61Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235, upload_time = "2025-03-26T03:05:00.599Z" }, + { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249, upload_time = "2025-03-26T03:05:02.11Z" }, + { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964, upload_time = "2025-03-26T03:05:03.599Z" }, + { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501, upload_time = "2025-03-26T03:05:05.107Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917, upload_time = "2025-03-26T03:05:06.59Z" }, + { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089, upload_time = "2025-03-26T03:05:08.1Z" }, + { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102, upload_time = "2025-03-26T03:05:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122, upload_time = "2025-03-26T03:05:11.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818, upload_time = "2025-03-26T03:05:12.909Z" }, + { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112, upload_time = "2025-03-26T03:05:14.289Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034, upload_time = "2025-03-26T03:05:15.616Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613, upload_time = "2025-03-26T03:05:16.913Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763, upload_time = "2025-03-26T03:05:18.607Z" }, + { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175, upload_time = "2025-03-26T03:05:19.85Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265, upload_time = "2025-03-26T03:05:21.654Z" }, + { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412, upload_time = "2025-03-26T03:05:23.147Z" }, + { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290, upload_time = "2025-03-26T03:05:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926, upload_time = "2025-03-26T03:05:26.459Z" }, + { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808, upload_time = "2025-03-26T03:05:28.188Z" }, + { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916, upload_time = "2025-03-26T03:05:29.757Z" }, + { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661, upload_time = "2025-03-26T03:05:31.472Z" }, + { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384, upload_time = "2025-03-26T03:05:32.984Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420, upload_time = "2025-03-26T03:05:34.496Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880, upload_time = "2025-03-26T03:05:36.256Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407, upload_time = "2025-03-26T03:05:37.799Z" }, + { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573, upload_time = "2025-03-26T03:05:39.193Z" }, + { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757, upload_time = "2025-03-26T03:05:40.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376, upload_time = "2025-03-26T03:06:10.5Z" }, ] [[package]] @@ -3709,127 +3778,127 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142 } +sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142, upload_time = "2025-03-10T15:54:38.843Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163 }, + { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163, upload_time = "2025-03-10T15:54:37.335Z" }, ] [[package]] name = "protobuf" version = "5.29.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/17/7d/b9dca7365f0e2c4fa7c193ff795427cfa6290147e5185ab11ece280a18e7/protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99", size = 424902 } +sdist = { url = "https://files.pythonhosted.org/packages/17/7d/b9dca7365f0e2c4fa7c193ff795427cfa6290147e5185ab11ece280a18e7/protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99", size = 424902, upload_time = "2025-03-19T21:23:24.25Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/b2/043a1a1a20edd134563699b0e91862726a0dc9146c090743b6c44d798e75/protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7", size = 422709 }, - { url = "https://files.pythonhosted.org/packages/79/fc/2474b59570daa818de6124c0a15741ee3e5d6302e9d6ce0bdfd12e98119f/protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d", size = 434506 }, - { url = "https://files.pythonhosted.org/packages/46/de/7c126bbb06aa0f8a7b38aaf8bd746c514d70e6a2a3f6dd460b3b7aad7aae/protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0", size = 417826 }, - { url = "https://files.pythonhosted.org/packages/a2/b5/bade14ae31ba871a139aa45e7a8183d869efe87c34a4850c87b936963261/protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e", size = 319574 }, - { url = "https://files.pythonhosted.org/packages/46/88/b01ed2291aae68b708f7d334288ad5fb3e7aa769a9c309c91a0d55cb91b0/protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922", size = 319672 }, - { url = "https://files.pythonhosted.org/packages/12/fb/a586e0c973c95502e054ac5f81f88394f24ccc7982dac19c515acd9e2c93/protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862", size = 172551 }, + { url = "https://files.pythonhosted.org/packages/9a/b2/043a1a1a20edd134563699b0e91862726a0dc9146c090743b6c44d798e75/protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7", size = 422709, upload_time = "2025-03-19T21:23:08.293Z" }, + { url = "https://files.pythonhosted.org/packages/79/fc/2474b59570daa818de6124c0a15741ee3e5d6302e9d6ce0bdfd12e98119f/protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d", size = 434506, upload_time = "2025-03-19T21:23:11.253Z" }, + { url = "https://files.pythonhosted.org/packages/46/de/7c126bbb06aa0f8a7b38aaf8bd746c514d70e6a2a3f6dd460b3b7aad7aae/protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0", size = 417826, upload_time = "2025-03-19T21:23:13.132Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b5/bade14ae31ba871a139aa45e7a8183d869efe87c34a4850c87b936963261/protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e", size = 319574, upload_time = "2025-03-19T21:23:14.531Z" }, + { url = "https://files.pythonhosted.org/packages/46/88/b01ed2291aae68b708f7d334288ad5fb3e7aa769a9c309c91a0d55cb91b0/protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922", size = 319672, upload_time = "2025-03-19T21:23:15.839Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/a586e0c973c95502e054ac5f81f88394f24ccc7982dac19c515acd9e2c93/protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862", size = 172551, upload_time = "2025-03-19T21:23:22.682Z" }, ] [[package]] name = "proxy-tools" version = "0.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/cf/77d3e19b7fabd03895caca7857ef51e4c409e0ca6b37ee6e9f7daa50b642/proxy_tools-0.1.0.tar.gz", hash = "sha256:ccb3751f529c047e2d8a58440d86b205303cf0fe8146f784d1cbcd94f0a28010", size = 2978 } +sdist = { url = "https://files.pythonhosted.org/packages/f2/cf/77d3e19b7fabd03895caca7857ef51e4c409e0ca6b37ee6e9f7daa50b642/proxy_tools-0.1.0.tar.gz", hash = "sha256:ccb3751f529c047e2d8a58440d86b205303cf0fe8146f784d1cbcd94f0a28010", size = 2978, upload_time = "2014-05-05T21:02:24.606Z" } [[package]] name = "pscript" version = "0.7.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/59/68/f918702e270eddc5f7c54108f6a2f2afc2d299985820dbb0db9beb77d66d/pscript-0.7.7.tar.gz", hash = "sha256:8632f7a4483f235514aadee110edee82eb6d67336bf68744a7b18d76e50442f8", size = 176138 } +sdist = { url = "https://files.pythonhosted.org/packages/59/68/f918702e270eddc5f7c54108f6a2f2afc2d299985820dbb0db9beb77d66d/pscript-0.7.7.tar.gz", hash = "sha256:8632f7a4483f235514aadee110edee82eb6d67336bf68744a7b18d76e50442f8", size = 176138, upload_time = "2022-01-10T10:55:02.559Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/bc/980e2ebd442d2a8f1d22780f73db76f2a1df3bf79b3fb501b054b4b4dd03/pscript-0.7.7-py3-none-any.whl", hash = "sha256:b0fdac0df0393a4d7497153fea6a82e6429f32327c4c0a4817f1cd68adc08083", size = 126689 }, + { url = "https://files.pythonhosted.org/packages/f1/bc/980e2ebd442d2a8f1d22780f73db76f2a1df3bf79b3fb501b054b4b4dd03/pscript-0.7.7-py3-none-any.whl", hash = "sha256:b0fdac0df0393a4d7497153fea6a82e6429f32327c4c0a4817f1cd68adc08083", size = 126689, upload_time = "2022-01-10T10:55:00.793Z" }, ] [[package]] name = "psutil" version = "7.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload_time = "2025-02-13T21:54:07.946Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, - { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, - { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, - { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, - { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, - { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, - { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload_time = "2025-02-13T21:54:12.36Z" }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload_time = "2025-02-13T21:54:16.07Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload_time = "2025-02-13T21:54:18.662Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload_time = "2025-02-13T21:54:21.811Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload_time = "2025-02-13T21:54:24.68Z" }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload_time = "2025-02-13T21:54:34.31Z" }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload_time = "2025-02-13T21:54:37.486Z" }, ] [[package]] name = "ptyprocess" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload_time = "2020-12-28T15:15:30.155Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload_time = "2020-12-28T15:15:28.35Z" }, ] [[package]] name = "pure-eval" version = "0.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload_time = "2024-07-21T12:58:21.801Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload_time = "2024-07-21T12:58:20.04Z" }, ] [[package]] name = "py-serializable" -version = "1.1.2" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "defusedxml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/16/cf/6e482507764034d6c41423a19f33fdd59655052fdb2ca4358faa3b0bcfd1/py_serializable-1.1.2.tar.gz", hash = "sha256:89af30bc319047d4aa0d8708af412f6ce73835e18bacf1a080028bb9e2f42bdb", size = 55844 } +sdist = { url = "https://files.pythonhosted.org/packages/f0/75/813967eae0542776314c6def33feac687642a193b9d5591c20684b2eafd8/py_serializable-2.0.0.tar.gz", hash = "sha256:e9e6491dd7d29c31daf1050232b57f9657f9e8a43b867cca1ff204752cf420a5", size = 51617, upload_time = "2025-02-09T13:41:55.768Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/f2/3483060562245668bb07193b65277f0ea619cabf530deb351911eb0453eb/py_serializable-1.1.2-py3-none-any.whl", hash = "sha256:801be61b0a1ba64c3861f7c624f1de5cfbbabf8b458acc9cdda91e8f7e5effa1", size = 22786 }, + { url = "https://files.pythonhosted.org/packages/6d/0e/8601d2331dea0825f3be769688b48a95f387a83c918cca6a8c9cee4b9eb7/py_serializable-2.0.0-py3-none-any.whl", hash = "sha256:1721e4c0368adeec965c183168da4b912024702f19e15e13f8577098b9a4f8fe", size = 22824, upload_time = "2025-02-09T13:41:54.236Z" }, ] [[package]] name = "pyarrow" version = "19.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7f/09/a9046344212690f0632b9c709f9bf18506522feb333c894d0de81d62341a/pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e", size = 1129437 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/55/f1a8d838ec07fe3ca53edbe76f782df7b9aafd4417080eebf0b42aab0c52/pyarrow-19.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc55d71898ea30dc95900297d191377caba257612f384207fe9f8293b5850f90", size = 30713987 }, - { url = "https://files.pythonhosted.org/packages/13/12/428861540bb54c98a140ae858a11f71d041ef9e501e6b7eb965ca7909505/pyarrow-19.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7a544ec12de66769612b2d6988c36adc96fb9767ecc8ee0a4d270b10b1c51e00", size = 32135613 }, - { url = "https://files.pythonhosted.org/packages/2f/8a/23d7cc5ae2066c6c736bce1db8ea7bc9ac3ef97ac7e1c1667706c764d2d9/pyarrow-19.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0148bb4fc158bfbc3d6dfe5001d93ebeed253793fff4435167f6ce1dc4bddeae", size = 41149147 }, - { url = "https://files.pythonhosted.org/packages/a2/7a/845d151bb81a892dfb368bf11db584cf8b216963ccce40a5cf50a2492a18/pyarrow-19.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f24faab6ed18f216a37870d8c5623f9c044566d75ec586ef884e13a02a9d62c5", size = 42178045 }, - { url = "https://files.pythonhosted.org/packages/a7/31/e7282d79a70816132cf6cae7e378adfccce9ae10352d21c2fecf9d9756dd/pyarrow-19.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:4982f8e2b7afd6dae8608d70ba5bd91699077323f812a0448d8b7abdff6cb5d3", size = 40532998 }, - { url = "https://files.pythonhosted.org/packages/b8/82/20f3c290d6e705e2ee9c1fa1d5a0869365ee477e1788073d8b548da8b64c/pyarrow-19.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:49a3aecb62c1be1d822f8bf629226d4a96418228a42f5b40835c1f10d42e4db6", size = 42084055 }, - { url = "https://files.pythonhosted.org/packages/ff/77/e62aebd343238863f2c9f080ad2ef6ace25c919c6ab383436b5b81cbeef7/pyarrow-19.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:008a4009efdb4ea3d2e18f05cd31f9d43c388aad29c636112c2966605ba33466", size = 25283133 }, - { url = "https://files.pythonhosted.org/packages/78/b4/94e828704b050e723f67d67c3535cf7076c7432cd4cf046e4bb3b96a9c9d/pyarrow-19.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b", size = 30670749 }, - { url = "https://files.pythonhosted.org/packages/7e/3b/4692965e04bb1df55e2c314c4296f1eb12b4f3052d4cf43d29e076aedf66/pyarrow-19.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294", size = 32128007 }, - { url = "https://files.pythonhosted.org/packages/22/f7/2239af706252c6582a5635c35caa17cb4d401cd74a87821ef702e3888957/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14", size = 41144566 }, - { url = "https://files.pythonhosted.org/packages/fb/e3/c9661b2b2849cfefddd9fd65b64e093594b231b472de08ff658f76c732b2/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34", size = 42202991 }, - { url = "https://files.pythonhosted.org/packages/fe/4f/a2c0ed309167ef436674782dfee4a124570ba64299c551e38d3fdaf0a17b/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6", size = 40507986 }, - { url = "https://files.pythonhosted.org/packages/27/2e/29bb28a7102a6f71026a9d70d1d61df926887e36ec797f2e6acfd2dd3867/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832", size = 42087026 }, - { url = "https://files.pythonhosted.org/packages/16/33/2a67c0f783251106aeeee516f4806161e7b481f7d744d0d643d2f30230a5/pyarrow-19.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960", size = 25250108 }, - { url = "https://files.pythonhosted.org/packages/2b/8d/275c58d4b00781bd36579501a259eacc5c6dfb369be4ddeb672ceb551d2d/pyarrow-19.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c", size = 30653552 }, - { url = "https://files.pythonhosted.org/packages/a0/9e/e6aca5cc4ef0c7aec5f8db93feb0bde08dbad8c56b9014216205d271101b/pyarrow-19.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae", size = 32103413 }, - { url = "https://files.pythonhosted.org/packages/6a/fa/a7033f66e5d4f1308c7eb0dfcd2ccd70f881724eb6fd1776657fdf65458f/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4", size = 41134869 }, - { url = "https://files.pythonhosted.org/packages/2d/92/34d2569be8e7abdc9d145c98dc410db0071ac579b92ebc30da35f500d630/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2", size = 42192626 }, - { url = "https://files.pythonhosted.org/packages/0a/1f/80c617b1084fc833804dc3309aa9d8daacd46f9ec8d736df733f15aebe2c/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6", size = 40496708 }, - { url = "https://files.pythonhosted.org/packages/e6/90/83698fcecf939a611c8d9a78e38e7fed7792dcc4317e29e72cf8135526fb/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136", size = 42075728 }, - { url = "https://files.pythonhosted.org/packages/40/49/2325f5c9e7a1c125c01ba0c509d400b152c972a47958768e4e35e04d13d8/pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef", size = 25242568 }, - { url = "https://files.pythonhosted.org/packages/3f/72/135088d995a759d4d916ec4824cb19e066585b4909ebad4ab196177aa825/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0", size = 30702371 }, - { url = "https://files.pythonhosted.org/packages/2e/01/00beeebd33d6bac701f20816a29d2018eba463616bbc07397fdf99ac4ce3/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9", size = 32116046 }, - { url = "https://files.pythonhosted.org/packages/1f/c9/23b1ea718dfe967cbd986d16cf2a31fe59d015874258baae16d7ea0ccabc/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3", size = 41091183 }, - { url = "https://files.pythonhosted.org/packages/3a/d4/b4a3aa781a2c715520aa8ab4fe2e7fa49d33a1d4e71c8fc6ab7b5de7a3f8/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6", size = 42171896 }, - { url = "https://files.pythonhosted.org/packages/23/1b/716d4cd5a3cbc387c6e6745d2704c4b46654ba2668260d25c402626c5ddb/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a", size = 40464851 }, - { url = "https://files.pythonhosted.org/packages/ed/bd/54907846383dcc7ee28772d7e646f6c34276a17da740002a5cefe90f04f7/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8", size = 42085744 }, +sdist = { url = "https://files.pythonhosted.org/packages/7f/09/a9046344212690f0632b9c709f9bf18506522feb333c894d0de81d62341a/pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e", size = 1129437, upload_time = "2025-02-18T18:55:57.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/55/f1a8d838ec07fe3ca53edbe76f782df7b9aafd4417080eebf0b42aab0c52/pyarrow-19.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc55d71898ea30dc95900297d191377caba257612f384207fe9f8293b5850f90", size = 30713987, upload_time = "2025-02-18T18:52:20.463Z" }, + { url = "https://files.pythonhosted.org/packages/13/12/428861540bb54c98a140ae858a11f71d041ef9e501e6b7eb965ca7909505/pyarrow-19.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7a544ec12de66769612b2d6988c36adc96fb9767ecc8ee0a4d270b10b1c51e00", size = 32135613, upload_time = "2025-02-18T18:52:25.29Z" }, + { url = "https://files.pythonhosted.org/packages/2f/8a/23d7cc5ae2066c6c736bce1db8ea7bc9ac3ef97ac7e1c1667706c764d2d9/pyarrow-19.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0148bb4fc158bfbc3d6dfe5001d93ebeed253793fff4435167f6ce1dc4bddeae", size = 41149147, upload_time = "2025-02-18T18:52:30.975Z" }, + { url = "https://files.pythonhosted.org/packages/a2/7a/845d151bb81a892dfb368bf11db584cf8b216963ccce40a5cf50a2492a18/pyarrow-19.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f24faab6ed18f216a37870d8c5623f9c044566d75ec586ef884e13a02a9d62c5", size = 42178045, upload_time = "2025-02-18T18:52:36.859Z" }, + { url = "https://files.pythonhosted.org/packages/a7/31/e7282d79a70816132cf6cae7e378adfccce9ae10352d21c2fecf9d9756dd/pyarrow-19.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:4982f8e2b7afd6dae8608d70ba5bd91699077323f812a0448d8b7abdff6cb5d3", size = 40532998, upload_time = "2025-02-18T18:52:42.578Z" }, + { url = "https://files.pythonhosted.org/packages/b8/82/20f3c290d6e705e2ee9c1fa1d5a0869365ee477e1788073d8b548da8b64c/pyarrow-19.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:49a3aecb62c1be1d822f8bf629226d4a96418228a42f5b40835c1f10d42e4db6", size = 42084055, upload_time = "2025-02-18T18:52:48.749Z" }, + { url = "https://files.pythonhosted.org/packages/ff/77/e62aebd343238863f2c9f080ad2ef6ace25c919c6ab383436b5b81cbeef7/pyarrow-19.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:008a4009efdb4ea3d2e18f05cd31f9d43c388aad29c636112c2966605ba33466", size = 25283133, upload_time = "2025-02-18T18:52:54.549Z" }, + { url = "https://files.pythonhosted.org/packages/78/b4/94e828704b050e723f67d67c3535cf7076c7432cd4cf046e4bb3b96a9c9d/pyarrow-19.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b", size = 30670749, upload_time = "2025-02-18T18:53:00.062Z" }, + { url = "https://files.pythonhosted.org/packages/7e/3b/4692965e04bb1df55e2c314c4296f1eb12b4f3052d4cf43d29e076aedf66/pyarrow-19.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294", size = 32128007, upload_time = "2025-02-18T18:53:06.581Z" }, + { url = "https://files.pythonhosted.org/packages/22/f7/2239af706252c6582a5635c35caa17cb4d401cd74a87821ef702e3888957/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14", size = 41144566, upload_time = "2025-02-18T18:53:11.958Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/c9661b2b2849cfefddd9fd65b64e093594b231b472de08ff658f76c732b2/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34", size = 42202991, upload_time = "2025-02-18T18:53:17.678Z" }, + { url = "https://files.pythonhosted.org/packages/fe/4f/a2c0ed309167ef436674782dfee4a124570ba64299c551e38d3fdaf0a17b/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6", size = 40507986, upload_time = "2025-02-18T18:53:26.263Z" }, + { url = "https://files.pythonhosted.org/packages/27/2e/29bb28a7102a6f71026a9d70d1d61df926887e36ec797f2e6acfd2dd3867/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832", size = 42087026, upload_time = "2025-02-18T18:53:33.063Z" }, + { url = "https://files.pythonhosted.org/packages/16/33/2a67c0f783251106aeeee516f4806161e7b481f7d744d0d643d2f30230a5/pyarrow-19.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960", size = 25250108, upload_time = "2025-02-18T18:53:38.462Z" }, + { url = "https://files.pythonhosted.org/packages/2b/8d/275c58d4b00781bd36579501a259eacc5c6dfb369be4ddeb672ceb551d2d/pyarrow-19.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c", size = 30653552, upload_time = "2025-02-18T18:53:44.357Z" }, + { url = "https://files.pythonhosted.org/packages/a0/9e/e6aca5cc4ef0c7aec5f8db93feb0bde08dbad8c56b9014216205d271101b/pyarrow-19.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae", size = 32103413, upload_time = "2025-02-18T18:53:52.971Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fa/a7033f66e5d4f1308c7eb0dfcd2ccd70f881724eb6fd1776657fdf65458f/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4", size = 41134869, upload_time = "2025-02-18T18:53:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/2d/92/34d2569be8e7abdc9d145c98dc410db0071ac579b92ebc30da35f500d630/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2", size = 42192626, upload_time = "2025-02-18T18:54:06.062Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1f/80c617b1084fc833804dc3309aa9d8daacd46f9ec8d736df733f15aebe2c/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6", size = 40496708, upload_time = "2025-02-18T18:54:12.347Z" }, + { url = "https://files.pythonhosted.org/packages/e6/90/83698fcecf939a611c8d9a78e38e7fed7792dcc4317e29e72cf8135526fb/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136", size = 42075728, upload_time = "2025-02-18T18:54:19.364Z" }, + { url = "https://files.pythonhosted.org/packages/40/49/2325f5c9e7a1c125c01ba0c509d400b152c972a47958768e4e35e04d13d8/pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef", size = 25242568, upload_time = "2025-02-18T18:54:25.846Z" }, + { url = "https://files.pythonhosted.org/packages/3f/72/135088d995a759d4d916ec4824cb19e066585b4909ebad4ab196177aa825/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0", size = 30702371, upload_time = "2025-02-18T18:54:30.665Z" }, + { url = "https://files.pythonhosted.org/packages/2e/01/00beeebd33d6bac701f20816a29d2018eba463616bbc07397fdf99ac4ce3/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9", size = 32116046, upload_time = "2025-02-18T18:54:35.995Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c9/23b1ea718dfe967cbd986d16cf2a31fe59d015874258baae16d7ea0ccabc/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3", size = 41091183, upload_time = "2025-02-18T18:54:42.662Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d4/b4a3aa781a2c715520aa8ab4fe2e7fa49d33a1d4e71c8fc6ab7b5de7a3f8/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6", size = 42171896, upload_time = "2025-02-18T18:54:49.808Z" }, + { url = "https://files.pythonhosted.org/packages/23/1b/716d4cd5a3cbc387c6e6745d2704c4b46654ba2668260d25c402626c5ddb/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a", size = 40464851, upload_time = "2025-02-18T18:54:57.073Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bd/54907846383dcc7ee28772d7e646f6c34276a17da740002a5cefe90f04f7/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8", size = 42085744, upload_time = "2025-02-18T18:55:08.562Z" }, ] [[package]] name = "pyasn1" version = "0.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322 } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload_time = "2024-09-10T22:41:42.55Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload_time = "2024-09-11T16:00:36.122Z" }, ] [[package]] @@ -3839,18 +3908,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892 } +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload_time = "2025-03-28T02:41:22.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259 }, + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload_time = "2025-03-28T02:41:19.028Z" }, ] [[package]] name = "pycparser" version = "2.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload_time = "2024-03-30T13:22:22.564Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload_time = "2024-03-30T13:22:20.476Z" }, ] [[package]] @@ -3860,35 +3929,35 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/3a/0dc288991068a7a5819065357972572e37bd5cbbe40d76d791a826cef53c/pycrdt-0.11.1.tar.gz", hash = "sha256:e5ccf99d859e4eba7d969cbb3ab83af368f70218d02fc6538c7fbea9e388b8e7", size = 66095 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/ac/fdbd80fcdf96a03d8ef6a8968b254981cc3067abaf69d996f19f77fbdebf/pycrdt-0.11.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:68a89404bce5a634c077ebd2148e37af41a29afc0a47cdea8b1de737f71d1f59", size = 1656237 }, - { url = "https://files.pythonhosted.org/packages/7b/fb/a577e4e33ca03a22a6f8bb25d0a3d448b4d8e818b66ee133b403eb6a1adb/pycrdt-0.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322e327109937993caa08db2eaa9a7ef1a0467188508c5e4766c64d6b0896814", size = 900221 }, - { url = "https://files.pythonhosted.org/packages/48/31/8530981730d51e8fb605cda5d0c5d0271eb2a00f1f53fb75bd764f17d7d2/pycrdt-0.11.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3ae1aa439ee6303b7cd8e38a380671a6f4c9f6ba5a452f3961cd831bb43f891", size = 930464 }, - { url = "https://files.pythonhosted.org/packages/c4/ef/7f2608cfd7dcfef4a90f3e09624249d463247cc5e7cfb0859bdd542ae005/pycrdt-0.11.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03eab086b3fbfef67194361ccf339cc866f08f9cc5951d0104034accd5b97b16", size = 1000123 }, - { url = "https://files.pythonhosted.org/packages/d1/7e/1b8c68c1613df14caeb76a212e76ba709f5e7467b28f998a41a3ea11f0c0/pycrdt-0.11.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d94b72aa380ef9e8418109431598d155d260423e4779a325b44212501524437b", size = 1113063 }, - { url = "https://files.pythonhosted.org/packages/b3/22/0cf82a4ef51642011aeabe1b5404fac9ce75b39c9f40b2c39025323c71b8/pycrdt-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4f2111d6349fe5bfcc4c5242341c5f3bcecdf3465bec3d156e83e8ec8f9e0ef", size = 925810 }, - { url = "https://files.pythonhosted.org/packages/ce/7a/e7efdcb373d2cb1cc93b02bb31fb08e02085e21741823cb315c254058d33/pycrdt-0.11.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:952bdb0f947dd46f83196296946cff581c81234d83382d0d3542f45ef9c85845", size = 1012868 }, - { url = "https://files.pythonhosted.org/packages/c2/46/17c682bc23c0ec42fb1c01d7587aa59ba5832487c125b0acb90a23108c44/pycrdt-0.11.1-cp311-cp311-win32.whl", hash = "sha256:83b05e2d235657bed03559949343df94ba5bde15732cd4dcf3f7491188a4e59f", size = 665388 }, - { url = "https://files.pythonhosted.org/packages/06/b8/e5846e3cbba069b288aecfd0a8b68acb005af174aafbb54f91aa6a8c383c/pycrdt-0.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:7a072ea2884dc45585c220456015ecb1e89ad43a584a951647c57f3934c2241b", size = 700573 }, - { url = "https://files.pythonhosted.org/packages/95/13/59d7c4859f8729b56322a8e30d5d6d715b3e15c6e5a740ac3d3e564e094e/pycrdt-0.11.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fdb6b0d6620caf1be0b6a829a9eae6ffeec1d9e7d9ec4bcc4c3b3f21922d43c5", size = 1642453 }, - { url = "https://files.pythonhosted.org/packages/ca/46/b619036cc42e4d1490b14f573047d439c196502ce67f57b9483411cfd33e/pycrdt-0.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:586ef115355660e2a355e6b660a71c8984ae5f7156dbcc7da760086afa2b5c7c", size = 900167 }, - { url = "https://files.pythonhosted.org/packages/67/3c/2e8808b7535418221d0593452385ee438d95694cf4a6eec56aa6cb0763a0/pycrdt-0.11.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:afbd19b14b491aca52d0d31f5615234c584a088bbf1f4dab69d84a27cfe41cb3", size = 931947 }, - { url = "https://files.pythonhosted.org/packages/16/51/55a5d1f2a003feb5499048400d682a05f72d5d54582a962dbeb0f774100d/pycrdt-0.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8e6169d225300da8bd2562ff70e8ddbd7b6c59da2ab9c9aa0c353211186670d", size = 999232 }, - { url = "https://files.pythonhosted.org/packages/0b/d6/2f4434838ccff250a5a9339fbace7c7c76176541c49859f3baace0f691f4/pycrdt-0.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7289a9ffd5075fe8d15ffdeeedeaec85f53b4b811910b7f46b30bfbf44b7706a", size = 1110753 }, - { url = "https://files.pythonhosted.org/packages/54/76/a76d906ac96ddce5c3a9bad6ef327be5e4bcb7938f697919d50b0e63354b/pycrdt-0.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14fe51af6112594980c8a6afc47702ef9ec8b9dc834ca0af86afecc866e4327e", size = 926634 }, - { url = "https://files.pythonhosted.org/packages/6a/90/495ce70d7e081a85f71dd19f0d505b9ef50e362d8ce5658c10aa18acd22b/pycrdt-0.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:590c477195f5752245aa7915c0fb307b3904974fd801b49008ff7fbea018faf6", size = 1014669 }, - { url = "https://files.pythonhosted.org/packages/0a/72/291cf573abf5af09a3baf8cc5a1103a7fa8cc74c135e0d19eeb46f6b080a/pycrdt-0.11.1-cp312-cp312-win32.whl", hash = "sha256:6f0fd26ce4fa5a99447300ed43fae88927ec665a66213ba4c53915d5f79c03b3", size = 664395 }, - { url = "https://files.pythonhosted.org/packages/62/15/a426c0b230a1cd0dbc93940e086bd6fd40ece31dd02354d3251578c9e2bd/pycrdt-0.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:31d2271d4ee5b1f76a959118316b4d17e8bafe0220eecc18d47a1f931c4ccd26", size = 702142 }, - { url = "https://files.pythonhosted.org/packages/34/76/0f00df6f4026d2202bed9f4c2d2d5405e0f0ff0305bf193961a72d837bf6/pycrdt-0.11.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3dab8f453d40aaa159e3d55bb7539f0f479584c5c3aab13726cec138b0d6367b", size = 1641832 }, - { url = "https://files.pythonhosted.org/packages/59/f0/d3a146debb211392adca33ec780bc54368dfee2f84302b6a5b6a330fe7ec/pycrdt-0.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d0d60294631eb29dd44b0aa926d81bb1856436b45b01c914aa44b98b382659", size = 900272 }, - { url = "https://files.pythonhosted.org/packages/3d/05/5a52575dcdef622b08c4633eb150b844c7b710949ec58ceea4bbe6d1a5a7/pycrdt-0.11.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a24c05060800f5f735a09172a4d0fa1680ef5ec3b6f50fad3ae7ae65446932ad", size = 931034 }, - { url = "https://files.pythonhosted.org/packages/95/82/ef8ffccf67da7fa51ed223b3d2e36c30c06bf9da567c540b1e31312d5fc3/pycrdt-0.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:794ce5d4c8e08132d09fda9f13a1041720d0bd6a09ed4f288420ed1cf7dc2ab0", size = 999007 }, - { url = "https://files.pythonhosted.org/packages/10/ae/995e59069d614586af7b3404673907c3bb257e8a547bcecbd38dde345b49/pycrdt-0.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48cb1e923148f36def66fa4507e35616f1c4d9d815ff9b0ade71a43813991c93", size = 1109769 }, - { url = "https://files.pythonhosted.org/packages/0d/ea/fd7c85dd183ef4520b3520ffd82b0574fc3982e13a4fdc0bb1b5de29a0a7/pycrdt-0.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a6958f94033f2aa4c08a472a09cbf042b89c3c5a06cf2d390741f178ba2afd5", size = 926238 }, - { url = "https://files.pythonhosted.org/packages/1f/90/de5bb2e4f730d2b2f6cdd5ae1882b67953fc4074478019b7ea0ae36bafb3/pycrdt-0.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f9ce53ed17c0a1a82fd8a52e69975c4eb0ef1065a37fee64f0bf7f5923c3cfc", size = 1014142 }, - { url = "https://files.pythonhosted.org/packages/c2/12/bc7db31409f4a508d942ad84adf77d4f56b42d28c1329c841c4b3242952e/pycrdt-0.11.1-cp313-cp313-win32.whl", hash = "sha256:a551bdec7626330569dd9f634a5484e245ee1c2096ab46f571dc203a239ebb80", size = 664263 }, - { url = "https://files.pythonhosted.org/packages/07/02/45a9f20cc0c50b39993afdbfb22d6998c221f4e5b19981dfc816024ec0a4/pycrdt-0.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:2473f130364fde8499f39b6576f43302aa8d401a66df4ede7d466e5c65409df4", size = 702075 }, +sdist = { url = "https://files.pythonhosted.org/packages/61/3a/0dc288991068a7a5819065357972572e37bd5cbbe40d76d791a826cef53c/pycrdt-0.11.1.tar.gz", hash = "sha256:e5ccf99d859e4eba7d969cbb3ab83af368f70218d02fc6538c7fbea9e388b8e7", size = 66095, upload_time = "2025-01-03T10:16:44.337Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/ac/fdbd80fcdf96a03d8ef6a8968b254981cc3067abaf69d996f19f77fbdebf/pycrdt-0.11.1-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:68a89404bce5a634c077ebd2148e37af41a29afc0a47cdea8b1de737f71d1f59", size = 1656237, upload_time = "2025-01-03T10:15:08.939Z" }, + { url = "https://files.pythonhosted.org/packages/7b/fb/a577e4e33ca03a22a6f8bb25d0a3d448b4d8e818b66ee133b403eb6a1adb/pycrdt-0.11.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:322e327109937993caa08db2eaa9a7ef1a0467188508c5e4766c64d6b0896814", size = 900221, upload_time = "2025-01-03T10:15:10.322Z" }, + { url = "https://files.pythonhosted.org/packages/48/31/8530981730d51e8fb605cda5d0c5d0271eb2a00f1f53fb75bd764f17d7d2/pycrdt-0.11.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3ae1aa439ee6303b7cd8e38a380671a6f4c9f6ba5a452f3961cd831bb43f891", size = 930464, upload_time = "2025-01-03T10:15:12.471Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ef/7f2608cfd7dcfef4a90f3e09624249d463247cc5e7cfb0859bdd542ae005/pycrdt-0.11.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03eab086b3fbfef67194361ccf339cc866f08f9cc5951d0104034accd5b97b16", size = 1000123, upload_time = "2025-01-03T10:15:15.893Z" }, + { url = "https://files.pythonhosted.org/packages/d1/7e/1b8c68c1613df14caeb76a212e76ba709f5e7467b28f998a41a3ea11f0c0/pycrdt-0.11.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d94b72aa380ef9e8418109431598d155d260423e4779a325b44212501524437b", size = 1113063, upload_time = "2025-01-03T10:15:18.451Z" }, + { url = "https://files.pythonhosted.org/packages/b3/22/0cf82a4ef51642011aeabe1b5404fac9ce75b39c9f40b2c39025323c71b8/pycrdt-0.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4f2111d6349fe5bfcc4c5242341c5f3bcecdf3465bec3d156e83e8ec8f9e0ef", size = 925810, upload_time = "2025-01-03T10:15:20.372Z" }, + { url = "https://files.pythonhosted.org/packages/ce/7a/e7efdcb373d2cb1cc93b02bb31fb08e02085e21741823cb315c254058d33/pycrdt-0.11.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:952bdb0f947dd46f83196296946cff581c81234d83382d0d3542f45ef9c85845", size = 1012868, upload_time = "2025-01-03T10:15:22.737Z" }, + { url = "https://files.pythonhosted.org/packages/c2/46/17c682bc23c0ec42fb1c01d7587aa59ba5832487c125b0acb90a23108c44/pycrdt-0.11.1-cp311-cp311-win32.whl", hash = "sha256:83b05e2d235657bed03559949343df94ba5bde15732cd4dcf3f7491188a4e59f", size = 665388, upload_time = "2025-01-03T10:15:25.095Z" }, + { url = "https://files.pythonhosted.org/packages/06/b8/e5846e3cbba069b288aecfd0a8b68acb005af174aafbb54f91aa6a8c383c/pycrdt-0.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:7a072ea2884dc45585c220456015ecb1e89ad43a584a951647c57f3934c2241b", size = 700573, upload_time = "2025-01-03T10:15:26.403Z" }, + { url = "https://files.pythonhosted.org/packages/95/13/59d7c4859f8729b56322a8e30d5d6d715b3e15c6e5a740ac3d3e564e094e/pycrdt-0.11.1-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fdb6b0d6620caf1be0b6a829a9eae6ffeec1d9e7d9ec4bcc4c3b3f21922d43c5", size = 1642453, upload_time = "2025-01-03T10:15:28.399Z" }, + { url = "https://files.pythonhosted.org/packages/ca/46/b619036cc42e4d1490b14f573047d439c196502ce67f57b9483411cfd33e/pycrdt-0.11.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:586ef115355660e2a355e6b660a71c8984ae5f7156dbcc7da760086afa2b5c7c", size = 900167, upload_time = "2025-01-03T10:15:31.516Z" }, + { url = "https://files.pythonhosted.org/packages/67/3c/2e8808b7535418221d0593452385ee438d95694cf4a6eec56aa6cb0763a0/pycrdt-0.11.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:afbd19b14b491aca52d0d31f5615234c584a088bbf1f4dab69d84a27cfe41cb3", size = 931947, upload_time = "2025-01-03T10:15:34.052Z" }, + { url = "https://files.pythonhosted.org/packages/16/51/55a5d1f2a003feb5499048400d682a05f72d5d54582a962dbeb0f774100d/pycrdt-0.11.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8e6169d225300da8bd2562ff70e8ddbd7b6c59da2ab9c9aa0c353211186670d", size = 999232, upload_time = "2025-01-03T10:15:36.943Z" }, + { url = "https://files.pythonhosted.org/packages/0b/d6/2f4434838ccff250a5a9339fbace7c7c76176541c49859f3baace0f691f4/pycrdt-0.11.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7289a9ffd5075fe8d15ffdeeedeaec85f53b4b811910b7f46b30bfbf44b7706a", size = 1110753, upload_time = "2025-01-03T10:15:38.677Z" }, + { url = "https://files.pythonhosted.org/packages/54/76/a76d906ac96ddce5c3a9bad6ef327be5e4bcb7938f697919d50b0e63354b/pycrdt-0.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14fe51af6112594980c8a6afc47702ef9ec8b9dc834ca0af86afecc866e4327e", size = 926634, upload_time = "2025-01-03T10:15:41.24Z" }, + { url = "https://files.pythonhosted.org/packages/6a/90/495ce70d7e081a85f71dd19f0d505b9ef50e362d8ce5658c10aa18acd22b/pycrdt-0.11.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:590c477195f5752245aa7915c0fb307b3904974fd801b49008ff7fbea018faf6", size = 1014669, upload_time = "2025-01-03T10:15:42.647Z" }, + { url = "https://files.pythonhosted.org/packages/0a/72/291cf573abf5af09a3baf8cc5a1103a7fa8cc74c135e0d19eeb46f6b080a/pycrdt-0.11.1-cp312-cp312-win32.whl", hash = "sha256:6f0fd26ce4fa5a99447300ed43fae88927ec665a66213ba4c53915d5f79c03b3", size = 664395, upload_time = "2025-01-03T10:15:43.978Z" }, + { url = "https://files.pythonhosted.org/packages/62/15/a426c0b230a1cd0dbc93940e086bd6fd40ece31dd02354d3251578c9e2bd/pycrdt-0.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:31d2271d4ee5b1f76a959118316b4d17e8bafe0220eecc18d47a1f931c4ccd26", size = 702142, upload_time = "2025-01-03T10:15:45.258Z" }, + { url = "https://files.pythonhosted.org/packages/34/76/0f00df6f4026d2202bed9f4c2d2d5405e0f0ff0305bf193961a72d837bf6/pycrdt-0.11.1-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3dab8f453d40aaa159e3d55bb7539f0f479584c5c3aab13726cec138b0d6367b", size = 1641832, upload_time = "2025-01-03T10:15:46.847Z" }, + { url = "https://files.pythonhosted.org/packages/59/f0/d3a146debb211392adca33ec780bc54368dfee2f84302b6a5b6a330fe7ec/pycrdt-0.11.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d0d60294631eb29dd44b0aa926d81bb1856436b45b01c914aa44b98b382659", size = 900272, upload_time = "2025-01-03T10:15:48.161Z" }, + { url = "https://files.pythonhosted.org/packages/3d/05/5a52575dcdef622b08c4633eb150b844c7b710949ec58ceea4bbe6d1a5a7/pycrdt-0.11.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a24c05060800f5f735a09172a4d0fa1680ef5ec3b6f50fad3ae7ae65446932ad", size = 931034, upload_time = "2025-01-03T10:15:49.507Z" }, + { url = "https://files.pythonhosted.org/packages/95/82/ef8ffccf67da7fa51ed223b3d2e36c30c06bf9da567c540b1e31312d5fc3/pycrdt-0.11.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:794ce5d4c8e08132d09fda9f13a1041720d0bd6a09ed4f288420ed1cf7dc2ab0", size = 999007, upload_time = "2025-01-03T10:15:51.953Z" }, + { url = "https://files.pythonhosted.org/packages/10/ae/995e59069d614586af7b3404673907c3bb257e8a547bcecbd38dde345b49/pycrdt-0.11.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48cb1e923148f36def66fa4507e35616f1c4d9d815ff9b0ade71a43813991c93", size = 1109769, upload_time = "2025-01-03T10:15:53.976Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ea/fd7c85dd183ef4520b3520ffd82b0574fc3982e13a4fdc0bb1b5de29a0a7/pycrdt-0.11.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a6958f94033f2aa4c08a472a09cbf042b89c3c5a06cf2d390741f178ba2afd5", size = 926238, upload_time = "2025-01-03T10:15:55.317Z" }, + { url = "https://files.pythonhosted.org/packages/1f/90/de5bb2e4f730d2b2f6cdd5ae1882b67953fc4074478019b7ea0ae36bafb3/pycrdt-0.11.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f9ce53ed17c0a1a82fd8a52e69975c4eb0ef1065a37fee64f0bf7f5923c3cfc", size = 1014142, upload_time = "2025-01-03T10:15:56.74Z" }, + { url = "https://files.pythonhosted.org/packages/c2/12/bc7db31409f4a508d942ad84adf77d4f56b42d28c1329c841c4b3242952e/pycrdt-0.11.1-cp313-cp313-win32.whl", hash = "sha256:a551bdec7626330569dd9f634a5484e245ee1c2096ab46f571dc203a239ebb80", size = 664263, upload_time = "2025-01-03T10:15:58.158Z" }, + { url = "https://files.pythonhosted.org/packages/07/02/45a9f20cc0c50b39993afdbfb22d6998c221f4e5b19981dfc816024ec0a4/pycrdt-0.11.1-cp313-cp313-win_amd64.whl", hash = "sha256:2473f130364fde8499f39b6576f43302aa8d401a66df4ede7d466e5c65409df4", size = 702075, upload_time = "2025-01-03T10:15:59.512Z" }, ] [[package]] @@ -3901,9 +3970,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513 } +sdist = { url = "https://files.pythonhosted.org/packages/10/2e/ca897f093ee6c5f3b0bee123ee4465c50e75431c3d5b6a3b44a47134e891/pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", size = 785513, upload_time = "2025-04-08T13:27:06.399Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591 }, + { url = "https://files.pythonhosted.org/packages/b0/1d/407b29780a289868ed696d1616f4aad49d6388e5a77f567dcd2629dcd7b8/pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f", size = 443591, upload_time = "2025-04-08T13:27:03.789Z" }, ] [[package]] @@ -3913,62 +3982,62 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224 }, - { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845 }, - { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029 }, - { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784 }, - { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075 }, - { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849 }, - { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794 }, - { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237 }, - { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351 }, - { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914 }, - { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385 }, - { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765 }, - { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688 }, - { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185 }, - { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640 }, - { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649 }, - { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472 }, - { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509 }, - { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702 }, - { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428 }, - { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753 }, - { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849 }, - { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541 }, - { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225 }, - { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373 }, - { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034 }, - { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848 }, - { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986 }, - { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551 }, - { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785 }, - { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758 }, - { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109 }, - { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159 }, - { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222 }, - { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980 }, - { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840 }, - { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518 }, - { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025 }, - { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991 }, - { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262 }, - { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626 }, - { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590 }, - { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963 }, - { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896 }, - { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810 }, - { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858 }, - { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745 }, - { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188 }, - { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479 }, - { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415 }, - { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623 }, - { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175 }, - { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674 }, - { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951 }, +sdist = { url = "https://files.pythonhosted.org/packages/17/19/ed6a078a5287aea7922de6841ef4c06157931622c89c2a47940837b5eecd/pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", size = 434395, upload_time = "2025-04-02T09:49:41.8Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/7f/c6298830cb780c46b4f46bb24298d01019ffa4d21769f39b908cd14bbd50/pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", size = 2044224, upload_time = "2025-04-02T09:47:04.199Z" }, + { url = "https://files.pythonhosted.org/packages/a8/65/6ab3a536776cad5343f625245bd38165d6663256ad43f3a200e5936afd6c/pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", size = 1858845, upload_time = "2025-04-02T09:47:05.686Z" }, + { url = "https://files.pythonhosted.org/packages/e9/15/9a22fd26ba5ee8c669d4b8c9c244238e940cd5d818649603ca81d1c69861/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", size = 1910029, upload_time = "2025-04-02T09:47:07.042Z" }, + { url = "https://files.pythonhosted.org/packages/d5/33/8cb1a62818974045086f55f604044bf35b9342900318f9a2a029a1bec460/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", size = 1997784, upload_time = "2025-04-02T09:47:08.63Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ca/49958e4df7715c71773e1ea5be1c74544923d10319173264e6db122543f9/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", size = 2141075, upload_time = "2025-04-02T09:47:10.267Z" }, + { url = "https://files.pythonhosted.org/packages/7b/a6/0b3a167a9773c79ba834b959b4e18c3ae9216b8319bd8422792abc8a41b1/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", size = 2745849, upload_time = "2025-04-02T09:47:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/0b/60/516484135173aa9e5861d7a0663dce82e4746d2e7f803627d8c25dfa5578/pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", size = 2005794, upload_time = "2025-04-02T09:47:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/86/70/05b1eb77459ad47de00cf78ee003016da0cedf8b9170260488d7c21e9181/pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", size = 2123237, upload_time = "2025-04-02T09:47:14.355Z" }, + { url = "https://files.pythonhosted.org/packages/c7/57/12667a1409c04ae7dc95d3b43158948eb0368e9c790be8b095cb60611459/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", size = 2086351, upload_time = "2025-04-02T09:47:15.676Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/cc6d1d1c1664b58fdd6ecc64c84366c34ec9b606aeb66cafab6f4088974c/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", size = 2258914, upload_time = "2025-04-02T09:47:17Z" }, + { url = "https://files.pythonhosted.org/packages/d1/0a/edb137176a1f5419b2ddee8bde6a0a548cfa3c74f657f63e56232df8de88/pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", size = 2257385, upload_time = "2025-04-02T09:47:18.631Z" }, + { url = "https://files.pythonhosted.org/packages/26/3c/48ca982d50e4b0e1d9954919c887bdc1c2b462801bf408613ccc641b3daa/pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", size = 1923765, upload_time = "2025-04-02T09:47:20.34Z" }, + { url = "https://files.pythonhosted.org/packages/33/cd/7ab70b99e5e21559f5de38a0928ea84e6f23fdef2b0d16a6feaf942b003c/pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", size = 1950688, upload_time = "2025-04-02T09:47:22.029Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ae/db1fc237b82e2cacd379f63e3335748ab88b5adde98bf7544a1b1bd10a84/pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", size = 1908185, upload_time = "2025-04-02T09:47:23.385Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ce/3cb22b07c29938f97ff5f5bb27521f95e2ebec399b882392deb68d6c440e/pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", size = 2026640, upload_time = "2025-04-02T09:47:25.394Z" }, + { url = "https://files.pythonhosted.org/packages/19/78/f381d643b12378fee782a72126ec5d793081ef03791c28a0fd542a5bee64/pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", size = 1852649, upload_time = "2025-04-02T09:47:27.417Z" }, + { url = "https://files.pythonhosted.org/packages/9d/2b/98a37b80b15aac9eb2c6cfc6dbd35e5058a352891c5cce3a8472d77665a6/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", size = 1892472, upload_time = "2025-04-02T09:47:29.006Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d4/3c59514e0f55a161004792b9ff3039da52448f43f5834f905abef9db6e4a/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", size = 1977509, upload_time = "2025-04-02T09:47:33.464Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b6/c2c7946ef70576f79a25db59a576bce088bdc5952d1b93c9789b091df716/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", size = 2128702, upload_time = "2025-04-02T09:47:34.812Z" }, + { url = "https://files.pythonhosted.org/packages/88/fe/65a880f81e3f2a974312b61f82a03d85528f89a010ce21ad92f109d94deb/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", size = 2679428, upload_time = "2025-04-02T09:47:37.315Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ff/4459e4146afd0462fb483bb98aa2436d69c484737feaceba1341615fb0ac/pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", size = 2008753, upload_time = "2025-04-02T09:47:39.013Z" }, + { url = "https://files.pythonhosted.org/packages/7c/76/1c42e384e8d78452ededac8b583fe2550c84abfef83a0552e0e7478ccbc3/pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", size = 2114849, upload_time = "2025-04-02T09:47:40.427Z" }, + { url = "https://files.pythonhosted.org/packages/00/72/7d0cf05095c15f7ffe0eb78914b166d591c0eed72f294da68378da205101/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", size = 2069541, upload_time = "2025-04-02T09:47:42.01Z" }, + { url = "https://files.pythonhosted.org/packages/b3/69/94a514066bb7d8be499aa764926937409d2389c09be0b5107a970286ef81/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", size = 2239225, upload_time = "2025-04-02T09:47:43.425Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/e390071eadb44b41f4f54c3cef64d8bf5f9612c92686c9299eaa09e267e2/pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", size = 2248373, upload_time = "2025-04-02T09:47:44.979Z" }, + { url = "https://files.pythonhosted.org/packages/d6/b2/288b3579ffc07e92af66e2f1a11be3b056fe1214aab314748461f21a31c3/pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", size = 1907034, upload_time = "2025-04-02T09:47:46.843Z" }, + { url = "https://files.pythonhosted.org/packages/02/28/58442ad1c22b5b6742b992ba9518420235adced665513868f99a1c2638a5/pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", size = 1956848, upload_time = "2025-04-02T09:47:48.404Z" }, + { url = "https://files.pythonhosted.org/packages/a1/eb/f54809b51c7e2a1d9f439f158b8dd94359321abcc98767e16fc48ae5a77e/pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", size = 1903986, upload_time = "2025-04-02T09:47:49.839Z" }, + { url = "https://files.pythonhosted.org/packages/7a/24/eed3466a4308d79155f1cdd5c7432c80ddcc4530ba8623b79d5ced021641/pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", size = 2033551, upload_time = "2025-04-02T09:47:51.648Z" }, + { url = "https://files.pythonhosted.org/packages/ab/14/df54b1a0bc9b6ded9b758b73139d2c11b4e8eb43e8ab9c5847c0a2913ada/pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", size = 1852785, upload_time = "2025-04-02T09:47:53.149Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/e275f15ff3d34bb04b0125d9bc8848bf69f25d784d92a63676112451bfb9/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", size = 1897758, upload_time = "2025-04-02T09:47:55.006Z" }, + { url = "https://files.pythonhosted.org/packages/b7/d8/96bc536e975b69e3a924b507d2a19aedbf50b24e08c80fb00e35f9baaed8/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", size = 1986109, upload_time = "2025-04-02T09:47:56.532Z" }, + { url = "https://files.pythonhosted.org/packages/90/72/ab58e43ce7e900b88cb571ed057b2fcd0e95b708a2e0bed475b10130393e/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", size = 2129159, upload_time = "2025-04-02T09:47:58.088Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3f/52d85781406886c6870ac995ec0ba7ccc028b530b0798c9080531b409fdb/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", size = 2680222, upload_time = "2025-04-02T09:47:59.591Z" }, + { url = "https://files.pythonhosted.org/packages/f4/56/6e2ef42f363a0eec0fd92f74a91e0ac48cd2e49b695aac1509ad81eee86a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", size = 2006980, upload_time = "2025-04-02T09:48:01.397Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c0/604536c4379cc78359f9ee0aa319f4aedf6b652ec2854953f5a14fc38c5a/pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", size = 2120840, upload_time = "2025-04-02T09:48:03.056Z" }, + { url = "https://files.pythonhosted.org/packages/1f/46/9eb764814f508f0edfb291a0f75d10854d78113fa13900ce13729aaec3ae/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", size = 2072518, upload_time = "2025-04-02T09:48:04.662Z" }, + { url = "https://files.pythonhosted.org/packages/42/e3/fb6b2a732b82d1666fa6bf53e3627867ea3131c5f39f98ce92141e3e3dc1/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", size = 2248025, upload_time = "2025-04-02T09:48:06.226Z" }, + { url = "https://files.pythonhosted.org/packages/5c/9d/fbe8fe9d1aa4dac88723f10a921bc7418bd3378a567cb5e21193a3c48b43/pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", size = 2254991, upload_time = "2025-04-02T09:48:08.114Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/07e2237b8a66438d9b26482332cda99a9acccb58d284af7bc7c946a42fd3/pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", size = 1915262, upload_time = "2025-04-02T09:48:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f4/e457a7849beeed1e5defbcf5051c6f7b3c91a0624dd31543a64fc9adcf52/pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", size = 1956626, upload_time = "2025-04-02T09:48:11.288Z" }, + { url = "https://files.pythonhosted.org/packages/20/d0/e8d567a7cff7b04e017ae164d98011f1e1894269fe8e90ea187a3cbfb562/pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", size = 1909590, upload_time = "2025-04-02T09:48:12.861Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fd/24ea4302d7a527d672c5be06e17df16aabfb4e9fdc6e0b345c21580f3d2a/pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", size = 1812963, upload_time = "2025-04-02T09:48:14.553Z" }, + { url = "https://files.pythonhosted.org/packages/5f/95/4fbc2ecdeb5c1c53f1175a32d870250194eb2fdf6291b795ab08c8646d5d/pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", size = 1986896, upload_time = "2025-04-02T09:48:16.222Z" }, + { url = "https://files.pythonhosted.org/packages/71/ae/fe31e7f4a62431222d8f65a3bd02e3fa7e6026d154a00818e6d30520ea77/pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", size = 1931810, upload_time = "2025-04-02T09:48:17.97Z" }, + { url = "https://files.pythonhosted.org/packages/0b/76/1794e440c1801ed35415238d2c728f26cd12695df9057154ad768b7b991c/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", size = 2042858, upload_time = "2025-04-02T09:49:03.419Z" }, + { url = "https://files.pythonhosted.org/packages/73/b4/9cd7b081fb0b1b4f8150507cd59d27b275c3e22ad60b35cb19ea0977d9b9/pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", size = 1873745, upload_time = "2025-04-02T09:49:05.391Z" }, + { url = "https://files.pythonhosted.org/packages/e1/d7/9ddb7575d4321e40d0363903c2576c8c0c3280ebea137777e5ab58d723e3/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", size = 1904188, upload_time = "2025-04-02T09:49:07.352Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/3194ccfe461bb08da19377ebec8cb4f13c9bd82e13baebc53c5c7c39a029/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", size = 2083479, upload_time = "2025-04-02T09:49:09.304Z" }, + { url = "https://files.pythonhosted.org/packages/42/c7/84cb569555d7179ca0b3f838cef08f66f7089b54432f5b8599aac6e9533e/pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", size = 2118415, upload_time = "2025-04-02T09:49:11.25Z" }, + { url = "https://files.pythonhosted.org/packages/3b/67/72abb8c73e0837716afbb58a59cc9e3ae43d1aa8677f3b4bc72c16142716/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", size = 2079623, upload_time = "2025-04-02T09:49:13.292Z" }, + { url = "https://files.pythonhosted.org/packages/0b/cd/c59707e35a47ba4cbbf153c3f7c56420c58653b5801b055dc52cccc8e2dc/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", size = 2250175, upload_time = "2025-04-02T09:49:15.597Z" }, + { url = "https://files.pythonhosted.org/packages/84/32/e4325a6676b0bed32d5b084566ec86ed7fd1e9bcbfc49c578b1755bde920/pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", size = 2254674, upload_time = "2025-04-02T09:49:17.61Z" }, + { url = "https://files.pythonhosted.org/packages/12/6f/5596dc418f2e292ffc661d21931ab34591952e2843e7168ea5a52591f6ff/pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", size = 2080951, upload_time = "2025-04-02T09:49:19.559Z" }, ] [[package]] @@ -3979,9 +4048,9 @@ dependencies = [ { name = "pydantic" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/53/fa/6b268a47839f8af46ffeb5bb6aee7bded44fbad54e6bf826c11f17aef91a/pydantic_extra_types-2.10.3.tar.gz", hash = "sha256:dcc0a7b90ac9ef1b58876c9b8fdede17fbdde15420de9d571a9fccde2ae175bb", size = 95128 } +sdist = { url = "https://files.pythonhosted.org/packages/53/fa/6b268a47839f8af46ffeb5bb6aee7bded44fbad54e6bf826c11f17aef91a/pydantic_extra_types-2.10.3.tar.gz", hash = "sha256:dcc0a7b90ac9ef1b58876c9b8fdede17fbdde15420de9d571a9fccde2ae175bb", size = 95128, upload_time = "2025-03-11T13:00:42.473Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/0a/f6f8e5f79d188e2f3fa9ecfccfa72538b685985dd5c7c2886c67af70e685/pydantic_extra_types-2.10.3-py3-none-any.whl", hash = "sha256:e8b372752b49019cd8249cc192c62a820d8019f5382a8789d0f887338a59c0f3", size = 37175 }, + { url = "https://files.pythonhosted.org/packages/38/0a/f6f8e5f79d188e2f3fa9ecfccfa72538b685985dd5c7c2886c67af70e685/pydantic_extra_types-2.10.3-py3-none-any.whl", hash = "sha256:e8b372752b49019cd8249cc192c62a820d8019f5382a8789d0f887338a59c0f3", size = 37175, upload_time = "2025-03-11T13:00:40.919Z" }, ] [[package]] @@ -3993,9 +4062,9 @@ dependencies = [ { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234 } +sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234, upload_time = "2025-04-18T16:44:48.265Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356 }, + { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356, upload_time = "2025-04-18T16:44:46.617Z" }, ] [[package]] @@ -4006,27 +4075,27 @@ dependencies = [ { name = "jinja2" }, { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/ca/40e14e196864a0f61a92abb14d09b3d3da98f94ccb03b49cf51688140dab/pydeck-0.9.1.tar.gz", hash = "sha256:f74475ae637951d63f2ee58326757f8d4f9cd9f2a457cf42950715003e2cb605", size = 3832240 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/ca/40e14e196864a0f61a92abb14d09b3d3da98f94ccb03b49cf51688140dab/pydeck-0.9.1.tar.gz", hash = "sha256:f74475ae637951d63f2ee58326757f8d4f9cd9f2a457cf42950715003e2cb605", size = 3832240, upload_time = "2024-05-10T15:36:21.153Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl", hash = "sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038", size = 6900403 }, + { url = "https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl", hash = "sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038", size = 6900403, upload_time = "2024-05-10T15:36:17.36Z" }, ] [[package]] name = "pydicom" version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/6f/55ea163b344c91df2e03c007bebf94781f0817656e2c037d7c5bf86c3bfc/pydicom-3.0.1.tar.gz", hash = "sha256:7b8be344b5b62493c9452ba6f5a299f78f8a6ab79786c729b0613698209603ec", size = 2884731 } +sdist = { url = "https://files.pythonhosted.org/packages/d7/6f/55ea163b344c91df2e03c007bebf94781f0817656e2c037d7c5bf86c3bfc/pydicom-3.0.1.tar.gz", hash = "sha256:7b8be344b5b62493c9452ba6f5a299f78f8a6ab79786c729b0613698209603ec", size = 2884731, upload_time = "2024-09-22T02:02:43.202Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/a6/98651e752a49f341aa99aa3f6c8ba361728dfc064242884355419df63669/pydicom-3.0.1-py3-none-any.whl", hash = "sha256:db32f78b2641bd7972096b8289111ddab01fb221610de8d7afa835eb938adb41", size = 2376126 }, + { url = "https://files.pythonhosted.org/packages/27/a6/98651e752a49f341aa99aa3f6c8ba361728dfc064242884355419df63669/pydicom-3.0.1-py3-none-any.whl", hash = "sha256:db32f78b2641bd7972096b8289111ddab01fb221610de8d7afa835eb938adb41", size = 2376126, upload_time = "2024-09-22T02:02:41.616Z" }, ] [[package]] name = "pygments" version = "2.19.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload_time = "2025-01-06T17:26:30.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload_time = "2025-01-06T17:26:25.553Z" }, ] [[package]] @@ -4036,32 +4105,32 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2c/59/98f5e19752ae8ffea9b0d15b4ad3b20022d96479201b9674d4708e3293d1/pyjpegls-1.5.1.tar.gz", hash = "sha256:d0fe09dfb7f75ce78e3b1e0519912a42f1827d68bbc3609652f4f8743c956025", size = 1103288 } +sdist = { url = "https://files.pythonhosted.org/packages/2c/59/98f5e19752ae8ffea9b0d15b4ad3b20022d96479201b9674d4708e3293d1/pyjpegls-1.5.1.tar.gz", hash = "sha256:d0fe09dfb7f75ce78e3b1e0519912a42f1827d68bbc3609652f4f8743c956025", size = 1103288, upload_time = "2024-10-28T11:23:24.705Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/ca/32f520feb652c78359c96b2603c7cd2e7bf87600e8239c78e19c86af56c1/pyjpegls-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14b870392e6796ea0e2fac226e97ac730a634549923c475d173bc9c291f02658", size = 1201446 }, - { url = "https://files.pythonhosted.org/packages/e1/1d/058786659fdb8ffa38a50949c8ba91dc41606269868e88d409ec7e08bac7/pyjpegls-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e206e4ade507f6a3066a134d04a68b7c2570a2365f18e43ee2b01a08f3efcd30", size = 1190920 }, - { url = "https://files.pythonhosted.org/packages/dc/50/cb385d00b028037e2b814936bc77e3992a921f40e0d6855e8ef1b171dfef/pyjpegls-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:496ae75dc1b06a5e3fb6893593665fa40093e18a162de518ee0609c77cb7d4fe", size = 2659348 }, - { url = "https://files.pythonhosted.org/packages/ee/67/a42ff2401f9accf8b245c7b503e6d71bba3ebdb95cd185a053aa7deedca7/pyjpegls-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ec9eb9f7bd5332f86b3c9749f17aa8429a7965acfa7f2ab568eb11b70631472", size = 2665938 }, - { url = "https://files.pythonhosted.org/packages/3d/2a/64057a0a464105e40e22adc7a527b1c5453fe374b4002c214123abba6ff5/pyjpegls-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:acbe5ba2dde9b97bb98571a17a949bfbba7c9e40e78dfb79c08ecc568db50cee", size = 1143691 }, - { url = "https://files.pythonhosted.org/packages/d3/63/9e65815ea2c1b8abefda341d8fadb7d4d19c4fc9e7f3eb4bff1706a95371/pyjpegls-1.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a5430dcd735bc4c0c1eb478510d73a5178a4743cbad1d72113926accdd738921", size = 1200829 }, - { url = "https://files.pythonhosted.org/packages/84/5f/08760f98d1a49bee3046a2da6af4c1da339b49c8ebcbd976e36177af0c89/pyjpegls-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c3e6355a4bc9d3da46f7d4377793576b261bf60df297cea7167b3556adb98eb7", size = 1191073 }, - { url = "https://files.pythonhosted.org/packages/bc/83/153aedc15c9064091b2251fba99998866e4a2c0624905b9bae1c31644e5e/pyjpegls-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45630167eb37990701854f882455f4611c24902a2de1d27635076c3fed4a04a7", size = 2670175 }, - { url = "https://files.pythonhosted.org/packages/4d/f6/597cd0566f90b33428d6979f2967ac7ff1f7be0631e72c3a170dd966a98a/pyjpegls-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e8c7257bfd1700d563c4fdc60a8794519e00da21798221d964271bc5a027a49", size = 2678115 }, - { url = "https://files.pythonhosted.org/packages/50/32/b011c2c33850c8d6f7815cf30257e0e00d9fcb70e0a8052448257636bf19/pyjpegls-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:14d7cf5e61ffdb9343a888dde5e3f9b7e527cc805c31c7f48a1e2cdb73d9d9fa", size = 1143350 }, - { url = "https://files.pythonhosted.org/packages/2d/f7/c3e0e7d5067ce71930b757e61d82aef129b69e7c95ad881adae571ee49b1/pyjpegls-1.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bba892f411091a0de0736f39ac8da11e667a929fbc1e474657f1291d5e303d37", size = 1200012 }, - { url = "https://files.pythonhosted.org/packages/6d/91/59f22460a9f64b38bbd83de859963a4b5688f9cfac9e67c7d7a33b54373e/pyjpegls-1.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0080024c9e9e6be7bb0276ea54510488c28c8c9f2c0841049c64ab8b66d899f2", size = 1190156 }, - { url = "https://files.pythonhosted.org/packages/f1/9d/219cd41b62aec45f8f635c0f2175abcbc6642f334d94276da852d077b0d4/pyjpegls-1.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfecd3ea08ff2df367eb90791e3ff5288ccc0293fc13e99adc5542629a97a493", size = 2669034 }, - { url = "https://files.pythonhosted.org/packages/48/db/08ce5743ca250750776bf39729d495442966a2ddb23017e61ac43567c5bf/pyjpegls-1.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb56f056868561a1e49995bcbbe7ba8c38d56838d5c975ef5a0ff887d9189230", size = 2677947 }, - { url = "https://files.pythonhosted.org/packages/d8/8a/98c33dae7a420fdd0078df7eed406748abe68eed43622258e03da9049c77/pyjpegls-1.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:5812655f1fbb93bd2666ff05616bf3c7eae2474c6c4f8bf8afb6d5e5c0d6e9cf", size = 1142653 }, + { url = "https://files.pythonhosted.org/packages/97/ca/32f520feb652c78359c96b2603c7cd2e7bf87600e8239c78e19c86af56c1/pyjpegls-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14b870392e6796ea0e2fac226e97ac730a634549923c475d173bc9c291f02658", size = 1201446, upload_time = "2024-10-28T11:22:52.573Z" }, + { url = "https://files.pythonhosted.org/packages/e1/1d/058786659fdb8ffa38a50949c8ba91dc41606269868e88d409ec7e08bac7/pyjpegls-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e206e4ade507f6a3066a134d04a68b7c2570a2365f18e43ee2b01a08f3efcd30", size = 1190920, upload_time = "2024-10-28T11:22:54.205Z" }, + { url = "https://files.pythonhosted.org/packages/dc/50/cb385d00b028037e2b814936bc77e3992a921f40e0d6855e8ef1b171dfef/pyjpegls-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:496ae75dc1b06a5e3fb6893593665fa40093e18a162de518ee0609c77cb7d4fe", size = 2659348, upload_time = "2024-10-28T11:22:55.505Z" }, + { url = "https://files.pythonhosted.org/packages/ee/67/a42ff2401f9accf8b245c7b503e6d71bba3ebdb95cd185a053aa7deedca7/pyjpegls-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ec9eb9f7bd5332f86b3c9749f17aa8429a7965acfa7f2ab568eb11b70631472", size = 2665938, upload_time = "2024-10-28T11:22:57.578Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2a/64057a0a464105e40e22adc7a527b1c5453fe374b4002c214123abba6ff5/pyjpegls-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:acbe5ba2dde9b97bb98571a17a949bfbba7c9e40e78dfb79c08ecc568db50cee", size = 1143691, upload_time = "2024-10-28T11:22:59.354Z" }, + { url = "https://files.pythonhosted.org/packages/d3/63/9e65815ea2c1b8abefda341d8fadb7d4d19c4fc9e7f3eb4bff1706a95371/pyjpegls-1.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a5430dcd735bc4c0c1eb478510d73a5178a4743cbad1d72113926accdd738921", size = 1200829, upload_time = "2024-10-28T11:23:00.715Z" }, + { url = "https://files.pythonhosted.org/packages/84/5f/08760f98d1a49bee3046a2da6af4c1da339b49c8ebcbd976e36177af0c89/pyjpegls-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c3e6355a4bc9d3da46f7d4377793576b261bf60df297cea7167b3556adb98eb7", size = 1191073, upload_time = "2024-10-28T11:23:02.655Z" }, + { url = "https://files.pythonhosted.org/packages/bc/83/153aedc15c9064091b2251fba99998866e4a2c0624905b9bae1c31644e5e/pyjpegls-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45630167eb37990701854f882455f4611c24902a2de1d27635076c3fed4a04a7", size = 2670175, upload_time = "2024-10-28T11:23:04.726Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f6/597cd0566f90b33428d6979f2967ac7ff1f7be0631e72c3a170dd966a98a/pyjpegls-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e8c7257bfd1700d563c4fdc60a8794519e00da21798221d964271bc5a027a49", size = 2678115, upload_time = "2024-10-28T11:23:06.06Z" }, + { url = "https://files.pythonhosted.org/packages/50/32/b011c2c33850c8d6f7815cf30257e0e00d9fcb70e0a8052448257636bf19/pyjpegls-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:14d7cf5e61ffdb9343a888dde5e3f9b7e527cc805c31c7f48a1e2cdb73d9d9fa", size = 1143350, upload_time = "2024-10-28T11:23:07.978Z" }, + { url = "https://files.pythonhosted.org/packages/2d/f7/c3e0e7d5067ce71930b757e61d82aef129b69e7c95ad881adae571ee49b1/pyjpegls-1.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bba892f411091a0de0736f39ac8da11e667a929fbc1e474657f1291d5e303d37", size = 1200012, upload_time = "2024-10-28T11:23:09.715Z" }, + { url = "https://files.pythonhosted.org/packages/6d/91/59f22460a9f64b38bbd83de859963a4b5688f9cfac9e67c7d7a33b54373e/pyjpegls-1.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0080024c9e9e6be7bb0276ea54510488c28c8c9f2c0841049c64ab8b66d899f2", size = 1190156, upload_time = "2024-10-28T11:23:11.124Z" }, + { url = "https://files.pythonhosted.org/packages/f1/9d/219cd41b62aec45f8f635c0f2175abcbc6642f334d94276da852d077b0d4/pyjpegls-1.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfecd3ea08ff2df367eb90791e3ff5288ccc0293fc13e99adc5542629a97a493", size = 2669034, upload_time = "2024-10-28T11:23:12.463Z" }, + { url = "https://files.pythonhosted.org/packages/48/db/08ce5743ca250750776bf39729d495442966a2ddb23017e61ac43567c5bf/pyjpegls-1.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb56f056868561a1e49995bcbbe7ba8c38d56838d5c975ef5a0ff887d9189230", size = 2677947, upload_time = "2024-10-28T11:23:13.998Z" }, + { url = "https://files.pythonhosted.org/packages/d8/8a/98c33dae7a420fdd0078df7eed406748abe68eed43622258e03da9049c77/pyjpegls-1.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:5812655f1fbb93bd2666ff05616bf3c7eae2474c6c4f8bf8afb6d5e5c0d6e9cf", size = 1142653, upload_time = "2024-10-28T11:23:16.023Z" }, ] [[package]] name = "pyjwt" version = "2.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785 } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload_time = "2024-11-28T03:43:29.933Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997 }, + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload_time = "2024-11-28T03:43:27.893Z" }, ] [package.optional-dependencies] @@ -4077,21 +4146,21 @@ dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7c/44/e6de2fdc880ad0ec7547ca2e087212be815efbc9a425a8d5ba9ede602cbb/pymdown_extensions-10.14.3.tar.gz", hash = "sha256:41e576ce3f5d650be59e900e4ceff231e0aed2a88cf30acaee41e02f063a061b", size = 846846 } +sdist = { url = "https://files.pythonhosted.org/packages/7c/44/e6de2fdc880ad0ec7547ca2e087212be815efbc9a425a8d5ba9ede602cbb/pymdown_extensions-10.14.3.tar.gz", hash = "sha256:41e576ce3f5d650be59e900e4ceff231e0aed2a88cf30acaee41e02f063a061b", size = 846846, upload_time = "2025-02-01T15:43:15.42Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/f5/b9e2a42aa8f9e34d52d66de87941ecd236570c7ed2e87775ed23bbe4e224/pymdown_extensions-10.14.3-py3-none-any.whl", hash = "sha256:05e0bee73d64b9c71a4ae17c72abc2f700e8bc8403755a00580b49a4e9f189e9", size = 264467 }, + { url = "https://files.pythonhosted.org/packages/eb/f5/b9e2a42aa8f9e34d52d66de87941ecd236570c7ed2e87775ed23bbe4e224/pymdown_extensions-10.14.3-py3-none-any.whl", hash = "sha256:05e0bee73d64b9c71a4ae17c72abc2f700e8bc8403755a00580b49a4e9f189e9", size = 264467, upload_time = "2025-02-01T15:43:13.995Z" }, ] [[package]] name = "pyobjc-core" version = "11.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/94/a111239b98260869780a5767e5d74bfd3a8c13a40457f479c28dcd91f89d/pyobjc_core-11.0.tar.gz", hash = "sha256:63bced211cb8a8fb5c8ff46473603da30e51112861bd02c438fbbbc8578d9a70", size = 994931 } +sdist = { url = "https://files.pythonhosted.org/packages/5c/94/a111239b98260869780a5767e5d74bfd3a8c13a40457f479c28dcd91f89d/pyobjc_core-11.0.tar.gz", hash = "sha256:63bced211cb8a8fb5c8ff46473603da30e51112861bd02c438fbbbc8578d9a70", size = 994931, upload_time = "2025-01-14T19:02:13.938Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/05/fa97309c3b1bc1ec90d701db89902e0bd5e1024023aa2c5387b889458b1b/pyobjc_core-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:50675c0bb8696fe960a28466f9baf6943df2928a1fd85625d678fa2f428bd0bd", size = 727295 }, - { url = "https://files.pythonhosted.org/packages/56/ce/bf3ff9a9347721a398c3dfb83e29b43fb166b7ef590f3f7b7ddcd283df39/pyobjc_core-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a03061d4955c62ddd7754224a80cdadfdf17b6b5f60df1d9169a3b1b02923f0b", size = 739750 }, - { url = "https://files.pythonhosted.org/packages/72/16/0c468e73dbecb821e3da8819236fe832dfc53eb5f66a11775b055a7589ea/pyobjc_core-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c338c1deb7ab2e9436d4175d1127da2eeed4a1b564b3d83b9f3ae4844ba97e86", size = 743900 }, - { url = "https://files.pythonhosted.org/packages/f3/88/cecec88fd51f62a6cd7775cc4fb6bfde16652f97df88d28c84fb77ca0c18/pyobjc_core-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b4e9dc4296110f251a4033ff3f40320b35873ea7f876bd29a1c9705bb5e08c59", size = 791905 }, + { url = "https://files.pythonhosted.org/packages/52/05/fa97309c3b1bc1ec90d701db89902e0bd5e1024023aa2c5387b889458b1b/pyobjc_core-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:50675c0bb8696fe960a28466f9baf6943df2928a1fd85625d678fa2f428bd0bd", size = 727295, upload_time = "2025-01-14T18:46:50.208Z" }, + { url = "https://files.pythonhosted.org/packages/56/ce/bf3ff9a9347721a398c3dfb83e29b43fb166b7ef590f3f7b7ddcd283df39/pyobjc_core-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a03061d4955c62ddd7754224a80cdadfdf17b6b5f60df1d9169a3b1b02923f0b", size = 739750, upload_time = "2025-01-14T18:46:53.039Z" }, + { url = "https://files.pythonhosted.org/packages/72/16/0c468e73dbecb821e3da8819236fe832dfc53eb5f66a11775b055a7589ea/pyobjc_core-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c338c1deb7ab2e9436d4175d1127da2eeed4a1b564b3d83b9f3ae4844ba97e86", size = 743900, upload_time = "2025-01-14T18:46:54.654Z" }, + { url = "https://files.pythonhosted.org/packages/f3/88/cecec88fd51f62a6cd7775cc4fb6bfde16652f97df88d28c84fb77ca0c18/pyobjc_core-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b4e9dc4296110f251a4033ff3f40320b35873ea7f876bd29a1c9705bb5e08c59", size = 791905, upload_time = "2025-01-14T18:46:56.473Z" }, ] [[package]] @@ -4101,12 +4170,12 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyobjc-core" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/32/53809096ad5fc3e7a2c5ddea642590a5f2cb5b81d0ad6ea67fdb2263d9f9/pyobjc_framework_cocoa-11.0.tar.gz", hash = "sha256:00346a8cb81ad7b017b32ff7bf596000f9faa905807b1bd234644ebd47f692c5", size = 6173848 } +sdist = { url = "https://files.pythonhosted.org/packages/c5/32/53809096ad5fc3e7a2c5ddea642590a5f2cb5b81d0ad6ea67fdb2263d9f9/pyobjc_framework_cocoa-11.0.tar.gz", hash = "sha256:00346a8cb81ad7b017b32ff7bf596000f9faa905807b1bd234644ebd47f692c5", size = 6173848, upload_time = "2025-01-14T19:03:00.125Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/97/81fd41ad90e9c241172110aa635a6239d56f50d75923aaedbbe351828580/pyobjc_framework_Cocoa-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3ea7be6e6dd801b297440de02d312ba3fa7fd3c322db747ae1cb237e975f5d33", size = 385534 }, - { url = "https://files.pythonhosted.org/packages/5b/8d/0e2558447c26b3ba64f7c9776a5a6c9d2ae8abf9d34308b174ae0934402e/pyobjc_framework_Cocoa-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:280a577b83c68175a28b2b7138d1d2d3111f2b2b66c30e86f81a19c2b02eae71", size = 385811 }, - { url = "https://files.pythonhosted.org/packages/1d/a5/609281a7e89efefbef9db1d8fe66bc0458c3b4e74e2227c644f9c18926fa/pyobjc_framework_Cocoa-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:15b2bd977ed340074f930f1330f03d42912d5882b697d78bd06f8ebe263ef92e", size = 385889 }, - { url = "https://files.pythonhosted.org/packages/93/f6/2d5a863673ef7b85a3cba875c43e6c495fb1307427a6801001ae94bb5e54/pyobjc_framework_Cocoa-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5750001db544e67f2b66f02067d8f0da96bb2ef71732bde104f01b8628f9d7ea", size = 389831 }, + { url = "https://files.pythonhosted.org/packages/23/97/81fd41ad90e9c241172110aa635a6239d56f50d75923aaedbbe351828580/pyobjc_framework_Cocoa-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3ea7be6e6dd801b297440de02d312ba3fa7fd3c322db747ae1cb237e975f5d33", size = 385534, upload_time = "2025-01-14T18:49:27.898Z" }, + { url = "https://files.pythonhosted.org/packages/5b/8d/0e2558447c26b3ba64f7c9776a5a6c9d2ae8abf9d34308b174ae0934402e/pyobjc_framework_Cocoa-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:280a577b83c68175a28b2b7138d1d2d3111f2b2b66c30e86f81a19c2b02eae71", size = 385811, upload_time = "2025-01-14T18:49:29.259Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a5/609281a7e89efefbef9db1d8fe66bc0458c3b4e74e2227c644f9c18926fa/pyobjc_framework_Cocoa-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:15b2bd977ed340074f930f1330f03d42912d5882b697d78bd06f8ebe263ef92e", size = 385889, upload_time = "2025-01-14T18:49:30.605Z" }, + { url = "https://files.pythonhosted.org/packages/93/f6/2d5a863673ef7b85a3cba875c43e6c495fb1307427a6801001ae94bb5e54/pyobjc_framework_Cocoa-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5750001db544e67f2b66f02067d8f0da96bb2ef71732bde104f01b8628f9d7ea", size = 389831, upload_time = "2025-01-14T18:49:31.963Z" }, ] [[package]] @@ -4117,12 +4186,12 @@ dependencies = [ { name = "pyobjc-core" }, { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/ad/f00f3f53387c23bbf4e0bb1410e11978cbf87c82fa6baff0ee86f74c5fb6/pyobjc_framework_quartz-11.0.tar.gz", hash = "sha256:3205bf7795fb9ae34747f701486b3db6dfac71924894d1f372977c4d70c3c619", size = 3952463 } +sdist = { url = "https://files.pythonhosted.org/packages/a5/ad/f00f3f53387c23bbf4e0bb1410e11978cbf87c82fa6baff0ee86f74c5fb6/pyobjc_framework_quartz-11.0.tar.gz", hash = "sha256:3205bf7795fb9ae34747f701486b3db6dfac71924894d1f372977c4d70c3c619", size = 3952463, upload_time = "2025-01-14T19:05:07.931Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/6a/68957c8c5e8f0128d4d419728bac397d48fa7ad7a66e82b70e64d129ffca/pyobjc_framework_Quartz-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d251696bfd8e8ef72fbc90eb29fec95cb9d1cc409008a183d5cc3246130ae8c2", size = 212349 }, - { url = "https://files.pythonhosted.org/packages/60/5d/df827b78dcb5140652ad08af8038c9ddd7e01e6bdf84462bfee644e6e661/pyobjc_framework_Quartz-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cb4a9f2d9d580ea15e25e6b270f47681afb5689cafc9e25712445ce715bcd18e", size = 212061 }, - { url = "https://files.pythonhosted.org/packages/a6/9e/54c48fe8faab06ee5eb80796c8c17ec61fc313d84398540ee70abeaf7070/pyobjc_framework_Quartz-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:973b4f9b8ab844574461a038bd5269f425a7368d6e677e3cc81fcc9b27b65498", size = 212478 }, - { url = "https://files.pythonhosted.org/packages/4a/28/456b54a59bfe11a91b7b4e94f8ffdcf174ffd1efa169f4283e5b3bc10194/pyobjc_framework_Quartz-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:66ab58d65348863b8707e63b2ec5cdc54569ee8189d1af90d52f29f5fdf6272c", size = 217973 }, + { url = "https://files.pythonhosted.org/packages/a3/6a/68957c8c5e8f0128d4d419728bac397d48fa7ad7a66e82b70e64d129ffca/pyobjc_framework_Quartz-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d251696bfd8e8ef72fbc90eb29fec95cb9d1cc409008a183d5cc3246130ae8c2", size = 212349, upload_time = "2025-01-14T18:58:08.963Z" }, + { url = "https://files.pythonhosted.org/packages/60/5d/df827b78dcb5140652ad08af8038c9ddd7e01e6bdf84462bfee644e6e661/pyobjc_framework_Quartz-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cb4a9f2d9d580ea15e25e6b270f47681afb5689cafc9e25712445ce715bcd18e", size = 212061, upload_time = "2025-01-14T18:58:10.2Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9e/54c48fe8faab06ee5eb80796c8c17ec61fc313d84398540ee70abeaf7070/pyobjc_framework_Quartz-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:973b4f9b8ab844574461a038bd5269f425a7368d6e677e3cc81fcc9b27b65498", size = 212478, upload_time = "2025-01-14T18:58:11.491Z" }, + { url = "https://files.pythonhosted.org/packages/4a/28/456b54a59bfe11a91b7b4e94f8ffdcf174ffd1efa169f4283e5b3bc10194/pyobjc_framework_Quartz-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:66ab58d65348863b8707e63b2ec5cdc54569ee8189d1af90d52f29f5fdf6272c", size = 217973, upload_time = "2025-01-14T18:58:12.739Z" }, ] [[package]] @@ -4133,12 +4202,12 @@ dependencies = [ { name = "pyobjc-core" }, { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/75/4b916bff8c650e387077a35916b7a7d331d5ff03bed7275099d96dcc6cd9/pyobjc_framework_security-11.0.tar.gz", hash = "sha256:ac078bb9cc6762d6f0f25f68325dcd7fe77acdd8c364bf4378868493f06a0758", size = 347059 } +sdist = { url = "https://files.pythonhosted.org/packages/c5/75/4b916bff8c650e387077a35916b7a7d331d5ff03bed7275099d96dcc6cd9/pyobjc_framework_security-11.0.tar.gz", hash = "sha256:ac078bb9cc6762d6f0f25f68325dcd7fe77acdd8c364bf4378868493f06a0758", size = 347059, upload_time = "2025-01-14T19:05:26.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/d8/092940f8c46cf09000a9d026e9854772846d5335e3e8a44d0a81aa1f359e/pyobjc_framework_Security-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:93bc23630563de2551ac49048af010ac9cb40f927cc25c898b7cc48550ccd526", size = 41499 }, - { url = "https://files.pythonhosted.org/packages/0b/fc/8710bbe80b825c97ecc312aaead3b0f606a23b62b895f6e0a07df8bfeeae/pyobjc_framework_Security-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:421e03b8560ed296a7f5ee67f42f5f978f8c7959d65c8fec99cd77dc65786355", size = 41523 }, - { url = "https://files.pythonhosted.org/packages/ab/9f/79c1713be83d58199e5379e928c2c94bb3ca44d294de2a0a0edefc6b3ba8/pyobjc_framework_Security-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dda83260c5638dd0470c01ca9d37eccedbce15d0642d9c28b357329e4145528f", size = 41530 }, - { url = "https://files.pythonhosted.org/packages/80/f2/d71306d4431b5492a1c178a44ae922caabc40b884b081aa428bb06f642e6/pyobjc_framework_Security-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:51dd6fb24235f4623d68a02bda4dabd85f48bce00f9b0b306016cf2c891392c4", size = 42057 }, + { url = "https://files.pythonhosted.org/packages/fa/d8/092940f8c46cf09000a9d026e9854772846d5335e3e8a44d0a81aa1f359e/pyobjc_framework_Security-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:93bc23630563de2551ac49048af010ac9cb40f927cc25c898b7cc48550ccd526", size = 41499, upload_time = "2025-01-14T18:59:22.819Z" }, + { url = "https://files.pythonhosted.org/packages/0b/fc/8710bbe80b825c97ecc312aaead3b0f606a23b62b895f6e0a07df8bfeeae/pyobjc_framework_Security-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:421e03b8560ed296a7f5ee67f42f5f978f8c7959d65c8fec99cd77dc65786355", size = 41523, upload_time = "2025-01-14T18:59:25.368Z" }, + { url = "https://files.pythonhosted.org/packages/ab/9f/79c1713be83d58199e5379e928c2c94bb3ca44d294de2a0a0edefc6b3ba8/pyobjc_framework_Security-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dda83260c5638dd0470c01ca9d37eccedbce15d0642d9c28b357329e4145528f", size = 41530, upload_time = "2025-01-14T18:59:26.589Z" }, + { url = "https://files.pythonhosted.org/packages/80/f2/d71306d4431b5492a1c178a44ae922caabc40b884b081aa428bb06f642e6/pyobjc_framework_Security-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:51dd6fb24235f4623d68a02bda4dabd85f48bce00f9b0b306016cf2c891392c4", size = 42057, upload_time = "2025-01-14T18:59:27.566Z" }, ] [[package]] @@ -4149,43 +4218,61 @@ dependencies = [ { name = "pyobjc-core" }, { name = "pyobjc-framework-cocoa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/79/4f/02a6270acf225c2a34339677e796002c77506238475059ae6e855358a40c/pyobjc_framework_webkit-11.0.tar.gz", hash = "sha256:fa6bedf9873786b3376a74ce2ea9dcd311f2a80f61e33dcbd931cc956aa29644", size = 767210 } +sdist = { url = "https://files.pythonhosted.org/packages/79/4f/02a6270acf225c2a34339677e796002c77506238475059ae6e855358a40c/pyobjc_framework_webkit-11.0.tar.gz", hash = "sha256:fa6bedf9873786b3376a74ce2ea9dcd311f2a80f61e33dcbd931cc956aa29644", size = 767210, upload_time = "2025-01-14T19:05:59.3Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/63/6f04faa75c4c39c54007b256a8e13838c1de213d487f561937d342ec2eac/pyobjc_framework_WebKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:163abaa5a665b59626ef20cdc3dcc5e2e3fcd9830d5fc328507e13f663acd0ed", size = 44940 }, - { url = "https://files.pythonhosted.org/packages/3e/61/934f03510e7f49454fbf6eeff8ad2eca5d8bfbe71aa4b8a034f8132af2fa/pyobjc_framework_WebKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2e4911519e94822011d99fdb9addf4a176f45a79808dab18dc303293f4590f7c", size = 44901 }, - { url = "https://files.pythonhosted.org/packages/dc/8b/e880680429fbac494687626c1338758e70b5dfb75883d9cb78f66635f381/pyobjc_framework_WebKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:22d09bb22c3c48d9243f300f8264a68ecc0bdfe09d25794ee86ab2239eae7da2", size = 44938 }, - { url = "https://files.pythonhosted.org/packages/ec/8f/f0ba035f682038264b1e05bde8fb538e8fa61267dc3ac22e3c2e3d3001bc/pyobjc_framework_WebKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6141a416f1eb33ded2c6685931d1b4d5f17c83814f2d17b7e2febff03c6f6bee", size = 45443 }, + { url = "https://files.pythonhosted.org/packages/47/63/6f04faa75c4c39c54007b256a8e13838c1de213d487f561937d342ec2eac/pyobjc_framework_WebKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:163abaa5a665b59626ef20cdc3dcc5e2e3fcd9830d5fc328507e13f663acd0ed", size = 44940, upload_time = "2025-01-14T19:01:44.396Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/934f03510e7f49454fbf6eeff8ad2eca5d8bfbe71aa4b8a034f8132af2fa/pyobjc_framework_WebKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2e4911519e94822011d99fdb9addf4a176f45a79808dab18dc303293f4590f7c", size = 44901, upload_time = "2025-01-14T19:01:45.476Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8b/e880680429fbac494687626c1338758e70b5dfb75883d9cb78f66635f381/pyobjc_framework_WebKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:22d09bb22c3c48d9243f300f8264a68ecc0bdfe09d25794ee86ab2239eae7da2", size = 44938, upload_time = "2025-01-14T19:01:46.526Z" }, + { url = "https://files.pythonhosted.org/packages/ec/8f/f0ba035f682038264b1e05bde8fb538e8fa61267dc3ac22e3c2e3d3001bc/pyobjc_framework_WebKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6141a416f1eb33ded2c6685931d1b4d5f17c83814f2d17b7e2febff03c6f6bee", size = 45443, upload_time = "2025-01-14T19:01:47.508Z" }, ] [[package]] name = "pyparsing" version = "3.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload_time = "2025-03-25T05:01:28.114Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120 }, + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload_time = "2025-03-25T05:01:24.908Z" }, ] [[package]] name = "pyright" -version = "1.1.399" +version = "1.1.400" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nodeenv" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/db/9d/d91d5f6d26b2db95476fefc772e2b9a16d54c6bd0ea6bb5c1b6d635ab8b4/pyright-1.1.399.tar.gz", hash = "sha256:439035d707a36c3d1b443aec980bc37053fbda88158eded24b8eedcf1c7b7a1b", size = 3856954 } +sdist = { url = "https://files.pythonhosted.org/packages/6c/cb/c306618a02d0ee8aed5fb8d0fe0ecfed0dbf075f71468f03a30b5f4e1fe0/pyright-1.1.400.tar.gz", hash = "sha256:b8a3ba40481aa47ba08ffb3228e821d22f7d391f83609211335858bf05686bdb", size = 3846546, upload_time = "2025-04-24T12:55:18.907Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/b5/380380c9e7a534cb1783c70c3e8ac6d1193c599650a55838d0557586796e/pyright-1.1.399-py3-none-any.whl", hash = "sha256:55f9a875ddf23c9698f24208c764465ffdfd38be6265f7faf9a176e1dc549f3b", size = 5592584 }, + { url = "https://files.pythonhosted.org/packages/c8/a5/5d285e4932cf149c90e3c425610c5efaea005475d5f96f1bfdb452956c62/pyright-1.1.400-py3-none-any.whl", hash = "sha256:c80d04f98b5a4358ad3a35e241dbf2a408eee33a40779df365644f8054d2517e", size = 5563460, upload_time = "2025-04-24T12:55:17.002Z" }, ] [[package]] name = "pysocks" version = "1.7.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bd/11/293dd436aea955d45fc4e8a35b6ae7270f5b8e00b53cf6c024c83b657a11/PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0", size = 284429 } +sdist = { url = "https://files.pythonhosted.org/packages/bd/11/293dd436aea955d45fc4e8a35b6ae7270f5b8e00b53cf6c024c83b657a11/PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0", size = 284429, upload_time = "2019-09-20T02:07:35.714Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", size = 16725, upload_time = "2019-09-20T02:06:22.938Z" }, +] + +[[package]] +name = "pytablewriter" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dataproperty" }, + { name = "mbstrdecoder" }, + { name = "pathvalidate" }, + { name = "setuptools" }, + { name = "tabledata" }, + { name = "tcolorpy" }, + { name = "typepy", extra = ["datetime"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/a1/617730f290f04d347103ab40bf67d317df6691b14746f6e1ea039fb57062/pytablewriter-1.2.1.tar.gz", hash = "sha256:7bd0f4f397e070e3b8a34edcf1b9257ccbb18305493d8350a5dbc9957fced959", size = 619241, upload_time = "2025-01-01T15:37:00.04Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", size = 16725 }, + { url = "https://files.pythonhosted.org/packages/21/4c/c199512f01c845dfe5a7840ab3aae6c60463b5dc2a775be72502dfd9170a/pytablewriter-1.2.1-py3-none-any.whl", hash = "sha256:e906ff7ff5151d70a5f66e0f7b75642a7f2dce8d893c265b79cc9cf6bc04ddb4", size = 91083, upload_time = "2025-01-01T15:36:55.63Z" }, ] [[package]] @@ -4198,9 +4285,9 @@ dependencies = [ { name = "packaging" }, { name = "pluggy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 } +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload_time = "2025-03-02T12:54:54.503Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 }, + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload_time = "2025-03-02T12:54:52.069Z" }, ] [[package]] @@ -4210,9 +4297,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f", size = 54156 } +sdist = { url = "https://files.pythonhosted.org/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f", size = 54156, upload_time = "2025-03-25T06:22:28.883Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0", size = 19694 }, + { url = "https://files.pythonhosted.org/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0", size = 19694, upload_time = "2025-03-25T06:22:27.807Z" }, ] [[package]] @@ -4223,9 +4310,9 @@ dependencies = [ { name = "pytest" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/1a/b64ac368de6b993135cb70ca4e5d958a5c268094a3a2a4cac6f0021b6c4f/pytest_base_url-2.1.0.tar.gz", hash = "sha256:02748589a54f9e63fcbe62301d6b0496da0d10231b753e950c63e03aee745d45", size = 6702 } +sdist = { url = "https://files.pythonhosted.org/packages/ae/1a/b64ac368de6b993135cb70ca4e5d958a5c268094a3a2a4cac6f0021b6c4f/pytest_base_url-2.1.0.tar.gz", hash = "sha256:02748589a54f9e63fcbe62301d6b0496da0d10231b753e950c63e03aee745d45", size = 6702, upload_time = "2024-01-31T22:43:00.81Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/1c/b00940ab9eb8ede7897443b771987f2f4a76f06be02f1b3f01eb7567e24a/pytest_base_url-2.1.0-py3-none-any.whl", hash = "sha256:3ad15611778764d451927b2a53240c1a7a591b521ea44cebfe45849d2d2812e6", size = 5302 }, + { url = "https://files.pythonhosted.org/packages/98/1c/b00940ab9eb8ede7897443b771987f2f4a76f06be02f1b3f01eb7567e24a/pytest_base_url-2.1.0-py3-none-any.whl", hash = "sha256:3ad15611778764d451927b2a53240c1a7a591b521ea44cebfe45849d2d2812e6", size = 5302, upload_time = "2024-01-31T22:42:58.897Z" }, ] [[package]] @@ -4236,9 +4323,9 @@ dependencies = [ { name = "coverage", extra = ["toml"] }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/69/5f1e57f6c5a39f81411b550027bf72842c4567ff5fd572bed1edc9e4b5d9/pytest_cov-6.1.1.tar.gz", hash = "sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a", size = 66857 } +sdist = { url = "https://files.pythonhosted.org/packages/25/69/5f1e57f6c5a39f81411b550027bf72842c4567ff5fd572bed1edc9e4b5d9/pytest_cov-6.1.1.tar.gz", hash = "sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a", size = 66857, upload_time = "2025-04-05T14:07:51.592Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/d0/def53b4a790cfb21483016430ed828f64830dd981ebe1089971cd10cab25/pytest_cov-6.1.1-py3-none-any.whl", hash = "sha256:bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde", size = 23841 }, + { url = "https://files.pythonhosted.org/packages/28/d0/def53b4a790cfb21483016430ed828f64830dd981ebe1089971cd10cab25/pytest_cov-6.1.1-py3-none-any.whl", hash = "sha256:bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde", size = 23841, upload_time = "2025-04-05T14:07:49.641Z" }, ] [[package]] @@ -4248,9 +4335,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/0e/63301415b9233f0131339799d49ce0c0e8804d82f3f12615056a70e563c5/pytest_datadir-1.6.1.tar.gz", hash = "sha256:4d204cf93cfe62ddc37b19922df6c8c0f133c2899c224bd339b24920e84e7fd3", size = 9391 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/0e/63301415b9233f0131339799d49ce0c0e8804d82f3f12615056a70e563c5/pytest_datadir-1.6.1.tar.gz", hash = "sha256:4d204cf93cfe62ddc37b19922df6c8c0f133c2899c224bd339b24920e84e7fd3", size = 9391, upload_time = "2025-02-07T18:29:55.226Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/f1/5e4d95ce96c03332726d7fd87b7b500f178994b638ca6a88b4ed3ca64438/pytest_datadir-1.6.1-py3-none-any.whl", hash = "sha256:aa427f6218d3fc7481129d59c892bd7adfb8822613a2726ffc97f51968879cdb", size = 5156 }, + { url = "https://files.pythonhosted.org/packages/55/f1/5e4d95ce96c03332726d7fd87b7b500f178994b638ca6a88b4ed3ca64438/pytest_datadir-1.6.1-py3-none-any.whl", hash = "sha256:aa427f6218d3fc7481129d59c892bd7adfb8822613a2726ffc97f51968879cdb", size = 5156, upload_time = "2025-02-07T18:29:53.788Z" }, ] [[package]] @@ -4261,9 +4348,9 @@ dependencies = [ { name = "attrs" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/38/ba9344240455a09195863f2c4466468b41a08be0dff8c5611f7ec63f260d/pytest_docker-3.2.1.tar.gz", hash = "sha256:fc2cd9d1d317ac0854c140738182a60331fbcee8c0ef655b790e8f40a96e226f", size = 13499 } +sdist = { url = "https://files.pythonhosted.org/packages/dd/38/ba9344240455a09195863f2c4466468b41a08be0dff8c5611f7ec63f260d/pytest_docker-3.2.1.tar.gz", hash = "sha256:fc2cd9d1d317ac0854c140738182a60331fbcee8c0ef655b790e8f40a96e226f", size = 13499, upload_time = "2025-04-07T10:30:20.173Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/22/8495ea7fbb9685efccb969e5139d564cbc5a8645b86278b28cbaa21bce0d/pytest_docker-3.2.1-py3-none-any.whl", hash = "sha256:ad1be411336959bee768b965c1c4949657e743eec9cf9e7a921fadf83ad97526", size = 8584 }, + { url = "https://files.pythonhosted.org/packages/d5/22/8495ea7fbb9685efccb969e5139d564cbc5a8645b86278b28cbaa21bce0d/pytest_docker-3.2.1-py3-none-any.whl", hash = "sha256:ad1be411336959bee768b965c1c4949657e743eec9cf9e7a921fadf83ad97526", size = 8584, upload_time = "2025-04-07T10:30:18.95Z" }, ] [[package]] @@ -4273,9 +4360,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1f/31/27f28431a16b83cab7a636dce59cf397517807d247caa38ee67d65e71ef8/pytest_env-1.1.5.tar.gz", hash = "sha256:91209840aa0e43385073ac464a554ad2947cc2fd663a9debf88d03b01e0cc1cf", size = 8911 } +sdist = { url = "https://files.pythonhosted.org/packages/1f/31/27f28431a16b83cab7a636dce59cf397517807d247caa38ee67d65e71ef8/pytest_env-1.1.5.tar.gz", hash = "sha256:91209840aa0e43385073ac464a554ad2947cc2fd663a9debf88d03b01e0cc1cf", size = 8911, upload_time = "2024-09-17T22:39:18.566Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/b8/87cfb16045c9d4092cfcf526135d73b88101aac83bc1adcf82dfb5fd3833/pytest_env-1.1.5-py3-none-any.whl", hash = "sha256:ce90cf8772878515c24b31cd97c7fa1f4481cd68d588419fd45f10ecaee6bc30", size = 6141 }, + { url = "https://files.pythonhosted.org/packages/de/b8/87cfb16045c9d4092cfcf526135d73b88101aac83bc1adcf82dfb5fd3833/pytest_env-1.1.5-py3-none-any.whl", hash = "sha256:ce90cf8772878515c24b31cd97c7fa1f4481cd68d588419fd45f10ecaee6bc30", size = 6141, upload_time = "2024-09-17T22:39:16.942Z" }, ] [[package]] @@ -4287,9 +4374,24 @@ dependencies = [ { name = "pytest" }, { name = "pytest-metadata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/ab/4862dcb5a8a514bd87747e06b8d55483c0c9e987e1b66972336946e49b49/pytest_html-4.1.1.tar.gz", hash = "sha256:70a01e8ae5800f4a074b56a4cb1025c8f4f9b038bba5fe31e3c98eb996686f07", size = 150773 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/ab/4862dcb5a8a514bd87747e06b8d55483c0c9e987e1b66972336946e49b49/pytest_html-4.1.1.tar.gz", hash = "sha256:70a01e8ae5800f4a074b56a4cb1025c8f4f9b038bba5fe31e3c98eb996686f07", size = 150773, upload_time = "2023-11-07T15:44:28.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/c7/c160021cbecd956cc1a6f79e5fe155f7868b2e5b848f1320dad0b3e3122f/pytest_html-4.1.1-py3-none-any.whl", hash = "sha256:c8152cea03bd4e9bee6d525573b67bbc6622967b72b9628dda0ea3e2a0b5dd71", size = 23491, upload_time = "2023-11-07T15:44:27.149Z" }, +] + +[[package]] +name = "pytest-md-report" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytablewriter" }, + { name = "pytest" }, + { name = "tcolorpy" }, + { name = "typepy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/ec/5864e21c74e6ab2c493578bd6bbef775c4db4c1e69a2aad8830408341170/pytest_md_report-0.6.3.tar.gz", hash = "sha256:7e91ed0c0421b1493c1126ef996bdb521882a96a20cbd5b2cf0a38945495a852", size = 283723, upload_time = "2025-01-02T09:10:48.201Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/c7/c160021cbecd956cc1a6f79e5fe155f7868b2e5b848f1320dad0b3e3122f/pytest_html-4.1.1-py3-none-any.whl", hash = "sha256:c8152cea03bd4e9bee6d525573b67bbc6622967b72b9628dda0ea3e2a0b5dd71", size = 23491 }, + { url = "https://files.pythonhosted.org/packages/22/ad/99382de65e29fa6230b592f176c4290084667dbf1404c0ef266a34bb2c46/pytest_md_report-0.6.3-py3-none-any.whl", hash = "sha256:374126c013b29aab4dc585a318c4bbc5213fabafc101f9812f428cc4847b6a92", size = 13928, upload_time = "2025-01-02T09:10:45.227Z" }, ] [[package]] @@ -4299,9 +4401,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/85/8c969f8bec4e559f8f2b958a15229a35495f5b4ce499f6b865eac54b878d/pytest_metadata-3.1.1.tar.gz", hash = "sha256:d2a29b0355fbc03f168aa96d41ff88b1a3b44a3b02acbe491801c98a048017c8", size = 9952 } +sdist = { url = "https://files.pythonhosted.org/packages/a6/85/8c969f8bec4e559f8f2b958a15229a35495f5b4ce499f6b865eac54b878d/pytest_metadata-3.1.1.tar.gz", hash = "sha256:d2a29b0355fbc03f168aa96d41ff88b1a3b44a3b02acbe491801c98a048017c8", size = 9952, upload_time = "2024-02-12T19:38:44.887Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/43/7e7b2ec865caa92f67b8f0e9231a798d102724ca4c0e1f414316be1c1ef2/pytest_metadata-3.1.1-py3-none-any.whl", hash = "sha256:c8e0844db684ee1c798cfa38908d20d67d0463ecb6137c72e91f418558dd5f4b", size = 11428 }, + { url = "https://files.pythonhosted.org/packages/3e/43/7e7b2ec865caa92f67b8f0e9231a798d102724ca4c0e1f414316be1c1ef2/pytest_metadata-3.1.1-py3-none-any.whl", hash = "sha256:c8e0844db684ee1c798cfa38908d20d67d0463ecb6137c72e91f418558dd5f4b", size = 11428, upload_time = "2024-02-12T19:38:42.531Z" }, ] [[package]] @@ -4313,9 +4415,9 @@ dependencies = [ { name = "pytest-datadir" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/07/40/2e233d49a86e2ba88325bcfdcad77fa56b05ba7ca61b58bc0212330e560a/pytest_regressions-2.7.0.tar.gz", hash = "sha256:4c30064e0923929012c94f5d6f35205be06fd8709c7f0dba0228e05c460af05e", size = 116270 } +sdist = { url = "https://files.pythonhosted.org/packages/07/40/2e233d49a86e2ba88325bcfdcad77fa56b05ba7ca61b58bc0212330e560a/pytest_regressions-2.7.0.tar.gz", hash = "sha256:4c30064e0923929012c94f5d6f35205be06fd8709c7f0dba0228e05c460af05e", size = 116270, upload_time = "2025-01-10T10:28:07.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/83/3eaf30c06a1cf8bb58b1e5dba0345d1c747b720e889cbae81750c7659e9f/pytest_regressions-2.7.0-py3-none-any.whl", hash = "sha256:69f5e3f03493cf0ef84d96d23e50a546617c198b1d7746f2e2b9e441cbab4847", size = 24497 }, + { url = "https://files.pythonhosted.org/packages/6d/83/3eaf30c06a1cf8bb58b1e5dba0345d1c747b720e889cbae81750c7659e9f/pytest_regressions-2.7.0-py3-none-any.whl", hash = "sha256:69f5e3f03493cf0ef84d96d23e50a546617c198b1d7746f2e2b9e441cbab4847", size = 24497, upload_time = "2025-01-10T10:28:04.718Z" }, ] [[package]] @@ -4331,9 +4433,9 @@ dependencies = [ { name = "selenium" }, { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5a/a9/c275839e461fdde9ccaaf7ec46f67ad08dbd28bfebc5f8480f883d9da690/pytest_selenium-4.1.0.tar.gz", hash = "sha256:b0a4e1f27750cde631c513c87ae4863dcf9e180e5a1d680a66077da8a669156c", size = 41059 } +sdist = { url = "https://files.pythonhosted.org/packages/5a/a9/c275839e461fdde9ccaaf7ec46f67ad08dbd28bfebc5f8480f883d9da690/pytest_selenium-4.1.0.tar.gz", hash = "sha256:b0a4e1f27750cde631c513c87ae4863dcf9e180e5a1d680a66077da8a669156c", size = 41059, upload_time = "2024-02-01T15:05:42.488Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/df/27/bac432528c2b20a382ef2423731c1bb8c6292ea5328e3522eccfa9bf0687/pytest_selenium-4.1.0-py3-none-any.whl", hash = "sha256:c6f2c18e91596d3ef360d74c450953767a15193879d3971296498151d1843c01", size = 24131 }, + { url = "https://files.pythonhosted.org/packages/df/27/bac432528c2b20a382ef2423731c1bb8c6292ea5328e3522eccfa9bf0687/pytest_selenium-4.1.0-py3-none-any.whl", hash = "sha256:c6f2c18e91596d3ef360d74c450953767a15193879d3971296498151d1843c01", size = 24131, upload_time = "2024-02-01T15:05:40.592Z" }, ] [[package]] @@ -4343,9 +4445,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/ae/3ad5c609a5088936608af12f42ad72567a877d3c64303500ebc3b7df0297/pytest_subprocess-1.5.3.tar.gz", hash = "sha256:c00b1140fb0211b3153e09500d770db10770baccbe6e05ee9c140036d1d811d5", size = 42282 } +sdist = { url = "https://files.pythonhosted.org/packages/32/ae/3ad5c609a5088936608af12f42ad72567a877d3c64303500ebc3b7df0297/pytest_subprocess-1.5.3.tar.gz", hash = "sha256:c00b1140fb0211b3153e09500d770db10770baccbe6e05ee9c140036d1d811d5", size = 42282, upload_time = "2025-01-04T13:08:16.877Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/82/a038e8fdb86d5494a39b8730547ec79767731d02ecb556121e40c0892803/pytest_subprocess-1.5.3-py3-none-any.whl", hash = "sha256:b62580f5a84335fb9f2ec65d49e56a3c93f4722c148fe1771a002835d310a75b", size = 21759 }, + { url = "https://files.pythonhosted.org/packages/1b/82/a038e8fdb86d5494a39b8730547ec79767731d02ecb556121e40c0892803/pytest_subprocess-1.5.3-py3-none-any.whl", hash = "sha256:b62580f5a84335fb9f2ec65d49e56a3c93f4722c148fe1771a002835d310a75b", size = 21759, upload_time = "2025-01-04T13:08:13.775Z" }, ] [[package]] @@ -4355,9 +4457,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/93/0d/04719abc7a4bdb3a7a1f968f24b0f5253d698c9cc94975330e9d3145befb/pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9", size = 17697 } +sdist = { url = "https://files.pythonhosted.org/packages/93/0d/04719abc7a4bdb3a7a1f968f24b0f5253d698c9cc94975330e9d3145befb/pytest-timeout-2.3.1.tar.gz", hash = "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9", size = 17697, upload_time = "2024-03-07T21:04:01.069Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/27/14af9ef8321f5edc7527e47def2a21d8118c6f329a9342cc61387a0c0599/pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e", size = 14148 }, + { url = "https://files.pythonhosted.org/packages/03/27/14af9ef8321f5edc7527e47def2a21d8118c6f329a9342cc61387a0c0599/pytest_timeout-2.3.1-py3-none-any.whl", hash = "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e", size = 14148, upload_time = "2024-03-07T21:03:58.764Z" }, ] [[package]] @@ -4367,9 +4469,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/65/52/d756c9704a80119f2e8a84e418290f8bd1b7e1415c3417a1b9c13fcd2a87/pytest_variables-3.1.0.tar.gz", hash = "sha256:4719b07f0f6e5d07829b19284a99d9159543a2e0336311f7bc4ee3b1617f595d", size = 7420 } +sdist = { url = "https://files.pythonhosted.org/packages/65/52/d756c9704a80119f2e8a84e418290f8bd1b7e1415c3417a1b9c13fcd2a87/pytest_variables-3.1.0.tar.gz", hash = "sha256:4719b07f0f6e5d07829b19284a99d9159543a2e0336311f7bc4ee3b1617f595d", size = 7420, upload_time = "2024-02-01T15:55:20.122Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/fe/30dbeccfeafa242b3c9577db059019022cd96db20942c4a74ef9361c5b3c/pytest_variables-3.1.0-py3-none-any.whl", hash = "sha256:4c864d2b7093f9053a2bed61e4b1d027bb26456924e637fcef2d1455d32732b1", size = 6070 }, + { url = "https://files.pythonhosted.org/packages/4b/fe/30dbeccfeafa242b3c9577db059019022cd96db20942c4a74ef9361c5b3c/pytest_variables-3.1.0-py3-none-any.whl", hash = "sha256:4c864d2b7093f9053a2bed61e4b1d027bb26456924e637fcef2d1455d32732b1", size = 6070, upload_time = "2024-02-01T15:55:18.342Z" }, ] [[package]] @@ -4379,9 +4481,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/72/a2a1e81f1b272ddd9a1848af4959c87c39aa95c0bbfb3007cacb86c47fa9/pytest_watcher-0.4.3.tar.gz", hash = "sha256:0cb0e4661648c8c0ff2b2d25efa5a8e421784b9e4c60fcecbf9b7c30b2d731b3", size = 10386 } +sdist = { url = "https://files.pythonhosted.org/packages/72/72/a2a1e81f1b272ddd9a1848af4959c87c39aa95c0bbfb3007cacb86c47fa9/pytest_watcher-0.4.3.tar.gz", hash = "sha256:0cb0e4661648c8c0ff2b2d25efa5a8e421784b9e4c60fcecbf9b7c30b2d731b3", size = 10386, upload_time = "2024-08-28T17:37:46.662Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/3a/c44a76c6bb5e9e896d9707fb1c704a31a0136950dec9514373ced0684d56/pytest_watcher-0.4.3-py3-none-any.whl", hash = "sha256:d59b1e1396f33a65ea4949b713d6884637755d641646960056a90b267c3460f9", size = 11852 }, + { url = "https://files.pythonhosted.org/packages/5b/3a/c44a76c6bb5e9e896d9707fb1c704a31a0136950dec9514373ced0684d56/pytest_watcher-0.4.3-py3-none-any.whl", hash = "sha256:d59b1e1396f33a65ea4949b713d6884637755d641646960056a90b267c3460f9", size = 11852, upload_time = "2024-08-28T17:37:45.731Z" }, ] [[package]] @@ -4392,9 +4494,9 @@ dependencies = [ { name = "execnet" }, { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/c4/3c310a19bc1f1e9ef50075582652673ef2bfc8cd62afef9585683821902f/pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d", size = 84060 } +sdist = { url = "https://files.pythonhosted.org/packages/41/c4/3c310a19bc1f1e9ef50075582652673ef2bfc8cd62afef9585683821902f/pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d", size = 84060, upload_time = "2024-04-28T19:29:54.414Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", size = 46108 }, + { url = "https://files.pythonhosted.org/packages/6d/82/1d96bf03ee4c0fdc3c0cbe61470070e659ca78dc0086fb88b66c185e2449/pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", size = 46108, upload_time = "2024-04-28T19:29:52.813Z" }, ] [package.optional-dependencies] @@ -4409,18 +4511,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload_time = "2024-03-01T18:36:20.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload_time = "2024-03-01T18:36:18.57Z" }, ] [[package]] name = "python-dotenv" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 } +sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920, upload_time = "2025-03-25T10:14:56.835Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 }, + { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256, upload_time = "2025-03-25T10:14:55.034Z" }, ] [[package]] @@ -4430,27 +4532,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "simple-websocket" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f7/e1/eee1129544b7f78fa2afa9fa0fce153cdcb21015b9b331d1b8adf90f45cb/python_engineio-4.12.0.tar.gz", hash = "sha256:f42a36a868d7063aa10ddccf6bd6117a169b6bd00d7ca53999772093b62014f9", size = 91503 } +sdist = { url = "https://files.pythonhosted.org/packages/f7/e1/eee1129544b7f78fa2afa9fa0fce153cdcb21015b9b331d1b8adf90f45cb/python_engineio-4.12.0.tar.gz", hash = "sha256:f42a36a868d7063aa10ddccf6bd6117a169b6bd00d7ca53999772093b62014f9", size = 91503, upload_time = "2025-04-12T15:30:23.905Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/f7/0aeea75424c47633c1d98557a2323be23bed31fa950f00161b34a5150d06/python_engineio-4.12.0-py3-none-any.whl", hash = "sha256:a0c47c129c39777e8ebc6d18011efd50db2144e4e8f08983acae8a3614626535", size = 59319 }, + { url = "https://files.pythonhosted.org/packages/2b/f7/0aeea75424c47633c1d98557a2323be23bed31fa950f00161b34a5150d06/python_engineio-4.12.0-py3-none-any.whl", hash = "sha256:a0c47c129c39777e8ebc6d18011efd50db2144e4e8f08983acae8a3614626535", size = 59319, upload_time = "2025-04-12T15:30:22.325Z" }, ] [[package]] name = "python-json-logger" version = "3.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9e/de/d3144a0bceede957f961e975f3752760fbe390d57fbe194baf709d8f1f7b/python_json_logger-3.3.0.tar.gz", hash = "sha256:12b7e74b17775e7d565129296105bbe3910842d9d0eb083fc83a6a617aa8df84", size = 16642 } +sdist = { url = "https://files.pythonhosted.org/packages/9e/de/d3144a0bceede957f961e975f3752760fbe390d57fbe194baf709d8f1f7b/python_json_logger-3.3.0.tar.gz", hash = "sha256:12b7e74b17775e7d565129296105bbe3910842d9d0eb083fc83a6a617aa8df84", size = 16642, upload_time = "2025-03-07T07:08:27.301Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/20/0f2523b9e50a8052bc6a8b732dfc8568abbdc42010aef03a2d750bdab3b2/python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7", size = 15163 }, + { url = "https://files.pythonhosted.org/packages/08/20/0f2523b9e50a8052bc6a8b732dfc8568abbdc42010aef03a2d750bdab3b2/python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7", size = 15163, upload_time = "2025-03-07T07:08:25.627Z" }, ] [[package]] name = "python-multipart" version = "0.0.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158 } +sdist = { url = "https://files.pythonhosted.org/packages/f3/87/f44d7c9f274c7ee665a29b885ec97089ec5dc034c7f3fafa03da9e39a09e/python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13", size = 37158, upload_time = "2024-12-16T19:45:46.972Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546 }, + { url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", size = 24546, upload_time = "2024-12-16T19:45:44.423Z" }, ] [[package]] @@ -4461,9 +4563,9 @@ dependencies = [ { name = "bidict" }, { name = "python-engineio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/21/1a/396d50ccf06ee539fa758ce5623b59a9cb27637fc4b2dc07ed08bf495e77/python_socketio-5.13.0.tar.gz", hash = "sha256:ac4e19a0302ae812e23b712ec8b6427ca0521f7c582d6abb096e36e24a263029", size = 121125 } +sdist = { url = "https://files.pythonhosted.org/packages/21/1a/396d50ccf06ee539fa758ce5623b59a9cb27637fc4b2dc07ed08bf495e77/python_socketio-5.13.0.tar.gz", hash = "sha256:ac4e19a0302ae812e23b712ec8b6427ca0521f7c582d6abb096e36e24a263029", size = 121125, upload_time = "2025-04-12T15:46:59.933Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-py3-none-any.whl", hash = "sha256:51f68d6499f2df8524668c24bcec13ba1414117cfb3a90115c559b601ab10caf", size = 77800 }, + { url = "https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-py3-none-any.whl", hash = "sha256:51f68d6499f2df8524668c24bcec13ba1414117cfb3a90115c559b601ab10caf", size = 77800, upload_time = "2025-04-12T15:46:58.412Z" }, ] [package.optional-dependencies] @@ -4478,18 +4580,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "clr-loader" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/d6/1afd75edd932306ae9bd2c2d961d603dc2b52fcec51b04afea464f1f6646/pythonnet-3.0.5.tar.gz", hash = "sha256:48e43ca463941b3608b32b4e236db92d8d40db4c58a75ace902985f76dac21cf", size = 239212 } +sdist = { url = "https://files.pythonhosted.org/packages/9a/d6/1afd75edd932306ae9bd2c2d961d603dc2b52fcec51b04afea464f1f6646/pythonnet-3.0.5.tar.gz", hash = "sha256:48e43ca463941b3608b32b4e236db92d8d40db4c58a75ace902985f76dac21cf", size = 239212, upload_time = "2024-12-13T08:30:44.393Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/f1/bfb6811df4745f92f14c47a29e50e89a36b1533130fcc56452d4660bd2d6/pythonnet-3.0.5-py3-none-any.whl", hash = "sha256:f6702d694d5d5b163c9f3f5cc34e0bed8d6857150237fae411fefb883a656d20", size = 297506 }, + { url = "https://files.pythonhosted.org/packages/cd/f1/bfb6811df4745f92f14c47a29e50e89a36b1533130fcc56452d4660bd2d6/pythonnet-3.0.5-py3-none-any.whl", hash = "sha256:f6702d694d5d5b163c9f3f5cc34e0bed8d6857150237fae411fefb883a656d20", size = 297506, upload_time = "2024-12-13T08:30:40.661Z" }, ] [[package]] name = "pytz" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload_time = "2025-03-25T02:25:00.538Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload_time = "2025-03-25T02:24:58.468Z" }, ] [[package]] @@ -4508,9 +4610,9 @@ dependencies = [ { name = "qtpy", marker = "sys_platform == 'openbsd6'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7a/c7/645f3b0bb190bf58c5cea9cfbcaa337ce3b54531ad207d3748676eb8cdc9/pywebview-5.4.tar.gz", hash = "sha256:b5e2c6c7502aaf72a9ae6034daf83785f5fad874fac7fa82bf4fcf854f1f083a", size = 466398 } +sdist = { url = "https://files.pythonhosted.org/packages/7a/c7/645f3b0bb190bf58c5cea9cfbcaa337ce3b54531ad207d3748676eb8cdc9/pywebview-5.4.tar.gz", hash = "sha256:b5e2c6c7502aaf72a9ae6034daf83785f5fad874fac7fa82bf4fcf854f1f083a", size = 466398, upload_time = "2025-01-27T21:59:05.762Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/5a/7af3b9f8fb51d544b31f2f6c12635eac77d1e9a99f72dd12c9364062d59d/pywebview-5.4-py3-none-any.whl", hash = "sha256:0559c47db543556498dd38604a2a0479896c320f86c9b23499b8e580b58b699d", size = 475504 }, + { url = "https://files.pythonhosted.org/packages/4c/5a/7af3b9f8fb51d544b31f2f6c12635eac77d1e9a99f72dd12c9364062d59d/pywebview-5.4-py3-none-any.whl", hash = "sha256:0559c47db543556498dd38604a2a0479896c320f86c9b23499b8e580b58b699d", size = 475504, upload_time = "2025-01-27T21:59:02.459Z" }, ] [[package]] @@ -4518,62 +4620,62 @@ name = "pywin32" version = "310" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284 }, - { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748 }, - { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941 }, - { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239 }, - { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839 }, - { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470 }, - { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384 }, - { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039 }, - { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152 }, + { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284, upload_time = "2025-03-17T00:55:53.124Z" }, + { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748, upload_time = "2025-03-17T00:55:55.203Z" }, + { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941, upload_time = "2025-03-17T00:55:57.048Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload_time = "2025-03-17T00:55:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload_time = "2025-03-17T00:56:00.8Z" }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload_time = "2025-03-17T00:56:02.601Z" }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload_time = "2025-03-17T00:56:04.383Z" }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload_time = "2025-03-17T00:56:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload_time = "2025-03-17T00:56:07.819Z" }, ] [[package]] name = "pywinpty" version = "2.0.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2d/7c/917f9c4681bb8d34bfbe0b79d36bbcd902651aeab48790df3d30ba0202fb/pywinpty-2.0.15.tar.gz", hash = "sha256:312cf39153a8736c617d45ce8b6ad6cd2107de121df91c455b10ce6bba7a39b2", size = 29017 } +sdist = { url = "https://files.pythonhosted.org/packages/2d/7c/917f9c4681bb8d34bfbe0b79d36bbcd902651aeab48790df3d30ba0202fb/pywinpty-2.0.15.tar.gz", hash = "sha256:312cf39153a8736c617d45ce8b6ad6cd2107de121df91c455b10ce6bba7a39b2", size = 29017, upload_time = "2025-02-03T21:53:23.265Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/ac/6884dcb7108af66ad53f73ef4dad096e768c9203a6e6ce5e6b0c4a46e238/pywinpty-2.0.15-cp311-cp311-win_amd64.whl", hash = "sha256:9a6bcec2df2707aaa9d08b86071970ee32c5026e10bcc3cc5f6f391d85baf7ca", size = 1405249 }, - { url = "https://files.pythonhosted.org/packages/88/e5/9714def18c3a411809771a3fbcec70bffa764b9675afb00048a620fca604/pywinpty-2.0.15-cp312-cp312-win_amd64.whl", hash = "sha256:83a8f20b430bbc5d8957249f875341a60219a4e971580f2ba694fbfb54a45ebc", size = 1405243 }, - { url = "https://files.pythonhosted.org/packages/fb/16/2ab7b3b7f55f3c6929e5f629e1a68362981e4e5fed592a2ed1cb4b4914a5/pywinpty-2.0.15-cp313-cp313-win_amd64.whl", hash = "sha256:ab5920877dd632c124b4ed17bc6dd6ef3b9f86cd492b963ffdb1a67b85b0f408", size = 1405020 }, - { url = "https://files.pythonhosted.org/packages/7c/16/edef3515dd2030db2795dbfbe392232c7a0f3dc41b98e92b38b42ba497c7/pywinpty-2.0.15-cp313-cp313t-win_amd64.whl", hash = "sha256:a4560ad8c01e537708d2790dbe7da7d986791de805d89dd0d3697ca59e9e4901", size = 1404151 }, + { url = "https://files.pythonhosted.org/packages/5e/ac/6884dcb7108af66ad53f73ef4dad096e768c9203a6e6ce5e6b0c4a46e238/pywinpty-2.0.15-cp311-cp311-win_amd64.whl", hash = "sha256:9a6bcec2df2707aaa9d08b86071970ee32c5026e10bcc3cc5f6f391d85baf7ca", size = 1405249, upload_time = "2025-02-03T21:55:47.114Z" }, + { url = "https://files.pythonhosted.org/packages/88/e5/9714def18c3a411809771a3fbcec70bffa764b9675afb00048a620fca604/pywinpty-2.0.15-cp312-cp312-win_amd64.whl", hash = "sha256:83a8f20b430bbc5d8957249f875341a60219a4e971580f2ba694fbfb54a45ebc", size = 1405243, upload_time = "2025-02-03T21:56:52.476Z" }, + { url = "https://files.pythonhosted.org/packages/fb/16/2ab7b3b7f55f3c6929e5f629e1a68362981e4e5fed592a2ed1cb4b4914a5/pywinpty-2.0.15-cp313-cp313-win_amd64.whl", hash = "sha256:ab5920877dd632c124b4ed17bc6dd6ef3b9f86cd492b963ffdb1a67b85b0f408", size = 1405020, upload_time = "2025-02-03T21:56:04.753Z" }, + { url = "https://files.pythonhosted.org/packages/7c/16/edef3515dd2030db2795dbfbe392232c7a0f3dc41b98e92b38b42ba497c7/pywinpty-2.0.15-cp313-cp313t-win_amd64.whl", hash = "sha256:a4560ad8c01e537708d2790dbe7da7d986791de805d89dd0d3697ca59e9e4901", size = 1404151, upload_time = "2025-02-03T21:55:53.628Z" }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload_time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload_time = "2024-08-06T20:32:03.408Z" }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload_time = "2024-08-06T20:32:04.926Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload_time = "2024-08-06T20:32:06.459Z" }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload_time = "2024-08-06T20:32:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload_time = "2024-08-06T20:32:14.124Z" }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload_time = "2024-08-06T20:32:16.17Z" }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload_time = "2024-08-06T20:32:18.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload_time = "2024-08-06T20:32:19.889Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload_time = "2024-08-06T20:32:21.273Z" }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload_time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload_time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload_time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload_time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload_time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload_time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload_time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload_time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload_time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload_time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload_time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload_time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload_time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload_time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload_time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload_time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload_time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload_time = "2024-08-06T20:33:04.33Z" }, ] [[package]] @@ -4583,54 +4685,54 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/11/b9213d25230ac18a71b39b3723494e57adebe36e066397b961657b3b41c1/pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d", size = 278293 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/6d/234e3b0aa82fd0290b1896e9992f56bdddf1f97266110be54d0177a9d2d9/pyzmq-26.4.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:bfcf82644c9b45ddd7cd2a041f3ff8dce4a0904429b74d73a439e8cab1bd9e54", size = 1339723 }, - { url = "https://files.pythonhosted.org/packages/4f/11/6d561efe29ad83f7149a7cd48e498e539ed09019c6cd7ecc73f4cc725028/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9bcae3979b2654d5289d3490742378b2f3ce804b0b5fd42036074e2bf35b030", size = 672645 }, - { url = "https://files.pythonhosted.org/packages/19/fd/81bfe3e23f418644660bad1a90f0d22f0b3eebe33dd65a79385530bceb3d/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccdff8ac4246b6fb60dcf3982dfaeeff5dd04f36051fe0632748fc0aa0679c01", size = 910133 }, - { url = "https://files.pythonhosted.org/packages/97/68/321b9c775595ea3df832a9516252b653fe32818db66fdc8fa31c9b9fce37/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4550af385b442dc2d55ab7717837812799d3674cb12f9a3aa897611839c18e9e", size = 867428 }, - { url = "https://files.pythonhosted.org/packages/4e/6e/159cbf2055ef36aa2aa297e01b24523176e5b48ead283c23a94179fb2ba2/pyzmq-26.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f7ffe9db1187a253fca95191854b3fda24696f086e8789d1d449308a34b88", size = 862409 }, - { url = "https://files.pythonhosted.org/packages/05/1c/45fb8db7be5a7d0cadea1070a9cbded5199a2d578de2208197e592f219bd/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3709c9ff7ba61589b7372923fd82b99a81932b592a5c7f1a24147c91da9a68d6", size = 1205007 }, - { url = "https://files.pythonhosted.org/packages/f8/fa/658c7f583af6498b463f2fa600f34e298e1b330886f82f1feba0dc2dd6c3/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f8f3c30fb2d26ae5ce36b59768ba60fb72507ea9efc72f8f69fa088450cff1df", size = 1514599 }, - { url = "https://files.pythonhosted.org/packages/4d/d7/44d641522353ce0a2bbd150379cb5ec32f7120944e6bfba4846586945658/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:382a4a48c8080e273427fc692037e3f7d2851959ffe40864f2db32646eeb3cef", size = 1414546 }, - { url = "https://files.pythonhosted.org/packages/72/76/c8ed7263218b3d1e9bce07b9058502024188bd52cc0b0a267a9513b431fc/pyzmq-26.4.0-cp311-cp311-win32.whl", hash = "sha256:d56aad0517d4c09e3b4f15adebba8f6372c5102c27742a5bdbfc74a7dceb8fca", size = 579247 }, - { url = "https://files.pythonhosted.org/packages/c3/d0/2d9abfa2571a0b1a67c0ada79a8aa1ba1cce57992d80f771abcdf99bb32c/pyzmq-26.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:963977ac8baed7058c1e126014f3fe58b3773f45c78cce7af5c26c09b6823896", size = 644727 }, - { url = "https://files.pythonhosted.org/packages/0d/d1/c8ad82393be6ccedfc3c9f3adb07f8f3976e3c4802640fe3f71441941e70/pyzmq-26.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0c8e8cadc81e44cc5088fcd53b9b3b4ce9344815f6c4a03aec653509296fae3", size = 559942 }, - { url = "https://files.pythonhosted.org/packages/10/44/a778555ebfdf6c7fc00816aad12d185d10a74d975800341b1bc36bad1187/pyzmq-26.4.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:5227cb8da4b6f68acfd48d20c588197fd67745c278827d5238c707daf579227b", size = 1341586 }, - { url = "https://files.pythonhosted.org/packages/9c/4f/f3a58dc69ac757e5103be3bd41fb78721a5e17da7cc617ddb56d973a365c/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1c07a7fa7f7ba86554a2b1bef198c9fed570c08ee062fd2fd6a4dcacd45f905", size = 665880 }, - { url = "https://files.pythonhosted.org/packages/fe/45/50230bcfb3ae5cb98bee683b6edeba1919f2565d7cc1851d3c38e2260795/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae775fa83f52f52de73183f7ef5395186f7105d5ed65b1ae65ba27cb1260de2b", size = 902216 }, - { url = "https://files.pythonhosted.org/packages/41/59/56bbdc5689be5e13727491ad2ba5efd7cd564365750514f9bc8f212eef82/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c760d0226ebd52f1e6b644a9e839b5db1e107a23f2fcd46ec0569a4fdd4e63", size = 859814 }, - { url = "https://files.pythonhosted.org/packages/81/b1/57db58cfc8af592ce94f40649bd1804369c05b2190e4cbc0a2dad572baeb/pyzmq-26.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ef8c6ecc1d520debc147173eaa3765d53f06cd8dbe7bd377064cdbc53ab456f5", size = 855889 }, - { url = "https://files.pythonhosted.org/packages/e8/92/47542e629cbac8f221c230a6d0f38dd3d9cff9f6f589ed45fdf572ffd726/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3150ef4084e163dec29ae667b10d96aad309b668fac6810c9e8c27cf543d6e0b", size = 1197153 }, - { url = "https://files.pythonhosted.org/packages/07/e5/b10a979d1d565d54410afc87499b16c96b4a181af46e7645ab4831b1088c/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4448c9e55bf8329fa1dcedd32f661bf611214fa70c8e02fee4347bc589d39a84", size = 1507352 }, - { url = "https://files.pythonhosted.org/packages/ab/58/5a23db84507ab9c01c04b1232a7a763be66e992aa2e66498521bbbc72a71/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e07dde3647afb084d985310d067a3efa6efad0621ee10826f2cb2f9a31b89d2f", size = 1406834 }, - { url = "https://files.pythonhosted.org/packages/22/74/aaa837b331580c13b79ac39396601fb361454ee184ca85e8861914769b99/pyzmq-26.4.0-cp312-cp312-win32.whl", hash = "sha256:ba034a32ecf9af72adfa5ee383ad0fd4f4e38cdb62b13624278ef768fe5b5b44", size = 577992 }, - { url = "https://files.pythonhosted.org/packages/30/0f/55f8c02c182856743b82dde46b2dc3e314edda7f1098c12a8227eeda0833/pyzmq-26.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be", size = 640466 }, - { url = "https://files.pythonhosted.org/packages/e4/29/073779afc3ef6f830b8de95026ef20b2d1ec22d0324d767748d806e57379/pyzmq-26.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f23c750e485ce1eb639dbd576d27d168595908aa2d60b149e2d9e34c9df40e0", size = 556342 }, - { url = "https://files.pythonhosted.org/packages/d7/20/fb2c92542488db70f833b92893769a569458311a76474bda89dc4264bd18/pyzmq-26.4.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:c43fac689880f5174d6fc864857d1247fe5cfa22b09ed058a344ca92bf5301e3", size = 1339484 }, - { url = "https://files.pythonhosted.org/packages/58/29/2f06b9cabda3a6ea2c10f43e67ded3e47fc25c54822e2506dfb8325155d4/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902aca7eba477657c5fb81c808318460328758e8367ecdd1964b6330c73cae43", size = 666106 }, - { url = "https://files.pythonhosted.org/packages/77/e4/dcf62bd29e5e190bd21bfccaa4f3386e01bf40d948c239239c2f1e726729/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e48a830bfd152fe17fbdeaf99ac5271aa4122521bf0d275b6b24e52ef35eb6", size = 902056 }, - { url = "https://files.pythonhosted.org/packages/1a/cf/b36b3d7aea236087d20189bec1a87eeb2b66009731d7055e5c65f845cdba/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31be2b6de98c824c06f5574331f805707c667dc8f60cb18580b7de078479891e", size = 860148 }, - { url = "https://files.pythonhosted.org/packages/18/a6/f048826bc87528c208e90604c3bf573801e54bd91e390cbd2dfa860e82dc/pyzmq-26.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6332452034be001bbf3206ac59c0d2a7713de5f25bb38b06519fc6967b7cf771", size = 855983 }, - { url = "https://files.pythonhosted.org/packages/0a/27/454d34ab6a1d9772a36add22f17f6b85baf7c16e14325fa29e7202ca8ee8/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:da8c0f5dd352136853e6a09b1b986ee5278dfddfebd30515e16eae425c872b30", size = 1197274 }, - { url = "https://files.pythonhosted.org/packages/f4/3d/7abfeab6b83ad38aa34cbd57c6fc29752c391e3954fd12848bd8d2ec0df6/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f4ccc1a0a2c9806dda2a2dd118a3b7b681e448f3bb354056cad44a65169f6d86", size = 1507120 }, - { url = "https://files.pythonhosted.org/packages/13/ff/bc8d21dbb9bc8705126e875438a1969c4f77e03fc8565d6901c7933a3d01/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c0b5fceadbab461578daf8d1dcc918ebe7ddd2952f748cf30c7cf2de5d51101", size = 1406738 }, - { url = "https://files.pythonhosted.org/packages/f5/5d/d4cd85b24de71d84d81229e3bbb13392b2698432cf8fdcea5afda253d587/pyzmq-26.4.0-cp313-cp313-win32.whl", hash = "sha256:28e2b0ff5ba4b3dd11062d905682bad33385cfa3cc03e81abd7f0822263e6637", size = 577826 }, - { url = "https://files.pythonhosted.org/packages/c6/6c/f289c1789d7bb6e5a3b3bef7b2a55089b8561d17132be7d960d3ff33b14e/pyzmq-26.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b", size = 640406 }, - { url = "https://files.pythonhosted.org/packages/b3/99/676b8851cb955eb5236a0c1e9ec679ea5ede092bf8bf2c8a68d7e965cac3/pyzmq-26.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:1edb0385c7f025045d6e0f759d4d3afe43c17a3d898914ec6582e6f464203c08", size = 556216 }, - { url = "https://files.pythonhosted.org/packages/65/c2/1fac340de9d7df71efc59d9c50fc7a635a77b103392d1842898dd023afcb/pyzmq-26.4.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:93a29e882b2ba1db86ba5dd5e88e18e0ac6b627026c5cfbec9983422011b82d4", size = 1333769 }, - { url = "https://files.pythonhosted.org/packages/5c/c7/6c03637e8d742c3b00bec4f5e4cd9d1c01b2f3694c6f140742e93ca637ed/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45684f276f57110bb89e4300c00f1233ca631f08f5f42528a5c408a79efc4a", size = 658826 }, - { url = "https://files.pythonhosted.org/packages/a5/97/a8dca65913c0f78e0545af2bb5078aebfc142ca7d91cdaffa1fbc73e5dbd/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72073e75260cb301aad4258ad6150fa7f57c719b3f498cb91e31df16784d89b", size = 891650 }, - { url = "https://files.pythonhosted.org/packages/7d/7e/f63af1031eb060bf02d033732b910fe48548dcfdbe9c785e9f74a6cc6ae4/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be37e24b13026cfedd233bcbbccd8c0bcd2fdd186216094d095f60076201538d", size = 849776 }, - { url = "https://files.pythonhosted.org/packages/f6/fa/1a009ce582802a895c0d5fe9413f029c940a0a8ee828657a3bb0acffd88b/pyzmq-26.4.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:237b283044934d26f1eeff4075f751b05d2f3ed42a257fc44386d00df6a270cf", size = 842516 }, - { url = "https://files.pythonhosted.org/packages/6e/bc/f88b0bad0f7a7f500547d71e99f10336f2314e525d4ebf576a1ea4a1d903/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b30f862f6768b17040929a68432c8a8be77780317f45a353cb17e423127d250c", size = 1189183 }, - { url = "https://files.pythonhosted.org/packages/d9/8c/db446a3dd9cf894406dec2e61eeffaa3c07c3abb783deaebb9812c4af6a5/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:c80fcd3504232f13617c6ab501124d373e4895424e65de8b72042333316f64a8", size = 1495501 }, - { url = "https://files.pythonhosted.org/packages/05/4c/bf3cad0d64c3214ac881299c4562b815f05d503bccc513e3fd4fdc6f67e4/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:26a2a7451606b87f67cdeca2c2789d86f605da08b4bd616b1a9981605ca3a364", size = 1395540 }, - { url = "https://files.pythonhosted.org/packages/04/52/a70fcd5592715702248306d8e1729c10742c2eac44529984413b05c68658/pyzmq-26.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4478b14cb54a805088299c25a79f27eaf530564a7a4f72bf432a040042b554eb", size = 834405 }, - { url = "https://files.pythonhosted.org/packages/25/f9/1a03f1accff16b3af1a6fa22cbf7ced074776abbf688b2e9cb4629700c62/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a28ac29c60e4ba84b5f58605ace8ad495414a724fe7aceb7cf06cd0598d04e1", size = 569578 }, - { url = "https://files.pythonhosted.org/packages/76/0c/3a633acd762aa6655fcb71fa841907eae0ab1e8582ff494b137266de341d/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43b03c1ceea27c6520124f4fb2ba9c647409b9abdf9a62388117148a90419494", size = 798248 }, - { url = "https://files.pythonhosted.org/packages/cd/cc/6c99c84aa60ac1cc56747bed6be8ce6305b9b861d7475772e7a25ce019d3/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7731abd23a782851426d4e37deb2057bf9410848a4459b5ede4fe89342e687a9", size = 756757 }, - { url = "https://files.pythonhosted.org/packages/13/9c/d8073bd898eb896e94c679abe82e47506e2b750eb261cf6010ced869797c/pyzmq-26.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a222ad02fbe80166b0526c038776e8042cd4e5f0dec1489a006a1df47e9040e0", size = 555371 }, +sdist = { url = "https://files.pythonhosted.org/packages/b1/11/b9213d25230ac18a71b39b3723494e57adebe36e066397b961657b3b41c1/pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d", size = 278293, upload_time = "2025-04-04T12:05:44.049Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/6d/234e3b0aa82fd0290b1896e9992f56bdddf1f97266110be54d0177a9d2d9/pyzmq-26.4.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:bfcf82644c9b45ddd7cd2a041f3ff8dce4a0904429b74d73a439e8cab1bd9e54", size = 1339723, upload_time = "2025-04-04T12:03:24.358Z" }, + { url = "https://files.pythonhosted.org/packages/4f/11/6d561efe29ad83f7149a7cd48e498e539ed09019c6cd7ecc73f4cc725028/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9bcae3979b2654d5289d3490742378b2f3ce804b0b5fd42036074e2bf35b030", size = 672645, upload_time = "2025-04-04T12:03:25.693Z" }, + { url = "https://files.pythonhosted.org/packages/19/fd/81bfe3e23f418644660bad1a90f0d22f0b3eebe33dd65a79385530bceb3d/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccdff8ac4246b6fb60dcf3982dfaeeff5dd04f36051fe0632748fc0aa0679c01", size = 910133, upload_time = "2025-04-04T12:03:27.625Z" }, + { url = "https://files.pythonhosted.org/packages/97/68/321b9c775595ea3df832a9516252b653fe32818db66fdc8fa31c9b9fce37/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4550af385b442dc2d55ab7717837812799d3674cb12f9a3aa897611839c18e9e", size = 867428, upload_time = "2025-04-04T12:03:29.004Z" }, + { url = "https://files.pythonhosted.org/packages/4e/6e/159cbf2055ef36aa2aa297e01b24523176e5b48ead283c23a94179fb2ba2/pyzmq-26.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f7ffe9db1187a253fca95191854b3fda24696f086e8789d1d449308a34b88", size = 862409, upload_time = "2025-04-04T12:03:31.032Z" }, + { url = "https://files.pythonhosted.org/packages/05/1c/45fb8db7be5a7d0cadea1070a9cbded5199a2d578de2208197e592f219bd/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3709c9ff7ba61589b7372923fd82b99a81932b592a5c7f1a24147c91da9a68d6", size = 1205007, upload_time = "2025-04-04T12:03:32.687Z" }, + { url = "https://files.pythonhosted.org/packages/f8/fa/658c7f583af6498b463f2fa600f34e298e1b330886f82f1feba0dc2dd6c3/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f8f3c30fb2d26ae5ce36b59768ba60fb72507ea9efc72f8f69fa088450cff1df", size = 1514599, upload_time = "2025-04-04T12:03:34.084Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d7/44d641522353ce0a2bbd150379cb5ec32f7120944e6bfba4846586945658/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:382a4a48c8080e273427fc692037e3f7d2851959ffe40864f2db32646eeb3cef", size = 1414546, upload_time = "2025-04-04T12:03:35.478Z" }, + { url = "https://files.pythonhosted.org/packages/72/76/c8ed7263218b3d1e9bce07b9058502024188bd52cc0b0a267a9513b431fc/pyzmq-26.4.0-cp311-cp311-win32.whl", hash = "sha256:d56aad0517d4c09e3b4f15adebba8f6372c5102c27742a5bdbfc74a7dceb8fca", size = 579247, upload_time = "2025-04-04T12:03:36.846Z" }, + { url = "https://files.pythonhosted.org/packages/c3/d0/2d9abfa2571a0b1a67c0ada79a8aa1ba1cce57992d80f771abcdf99bb32c/pyzmq-26.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:963977ac8baed7058c1e126014f3fe58b3773f45c78cce7af5c26c09b6823896", size = 644727, upload_time = "2025-04-04T12:03:38.578Z" }, + { url = "https://files.pythonhosted.org/packages/0d/d1/c8ad82393be6ccedfc3c9f3adb07f8f3976e3c4802640fe3f71441941e70/pyzmq-26.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0c8e8cadc81e44cc5088fcd53b9b3b4ce9344815f6c4a03aec653509296fae3", size = 559942, upload_time = "2025-04-04T12:03:40.143Z" }, + { url = "https://files.pythonhosted.org/packages/10/44/a778555ebfdf6c7fc00816aad12d185d10a74d975800341b1bc36bad1187/pyzmq-26.4.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:5227cb8da4b6f68acfd48d20c588197fd67745c278827d5238c707daf579227b", size = 1341586, upload_time = "2025-04-04T12:03:41.954Z" }, + { url = "https://files.pythonhosted.org/packages/9c/4f/f3a58dc69ac757e5103be3bd41fb78721a5e17da7cc617ddb56d973a365c/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1c07a7fa7f7ba86554a2b1bef198c9fed570c08ee062fd2fd6a4dcacd45f905", size = 665880, upload_time = "2025-04-04T12:03:43.45Z" }, + { url = "https://files.pythonhosted.org/packages/fe/45/50230bcfb3ae5cb98bee683b6edeba1919f2565d7cc1851d3c38e2260795/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae775fa83f52f52de73183f7ef5395186f7105d5ed65b1ae65ba27cb1260de2b", size = 902216, upload_time = "2025-04-04T12:03:45.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/59/56bbdc5689be5e13727491ad2ba5efd7cd564365750514f9bc8f212eef82/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c760d0226ebd52f1e6b644a9e839b5db1e107a23f2fcd46ec0569a4fdd4e63", size = 859814, upload_time = "2025-04-04T12:03:47.188Z" }, + { url = "https://files.pythonhosted.org/packages/81/b1/57db58cfc8af592ce94f40649bd1804369c05b2190e4cbc0a2dad572baeb/pyzmq-26.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ef8c6ecc1d520debc147173eaa3765d53f06cd8dbe7bd377064cdbc53ab456f5", size = 855889, upload_time = "2025-04-04T12:03:49.223Z" }, + { url = "https://files.pythonhosted.org/packages/e8/92/47542e629cbac8f221c230a6d0f38dd3d9cff9f6f589ed45fdf572ffd726/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3150ef4084e163dec29ae667b10d96aad309b668fac6810c9e8c27cf543d6e0b", size = 1197153, upload_time = "2025-04-04T12:03:50.591Z" }, + { url = "https://files.pythonhosted.org/packages/07/e5/b10a979d1d565d54410afc87499b16c96b4a181af46e7645ab4831b1088c/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4448c9e55bf8329fa1dcedd32f661bf611214fa70c8e02fee4347bc589d39a84", size = 1507352, upload_time = "2025-04-04T12:03:52.473Z" }, + { url = "https://files.pythonhosted.org/packages/ab/58/5a23db84507ab9c01c04b1232a7a763be66e992aa2e66498521bbbc72a71/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e07dde3647afb084d985310d067a3efa6efad0621ee10826f2cb2f9a31b89d2f", size = 1406834, upload_time = "2025-04-04T12:03:54Z" }, + { url = "https://files.pythonhosted.org/packages/22/74/aaa837b331580c13b79ac39396601fb361454ee184ca85e8861914769b99/pyzmq-26.4.0-cp312-cp312-win32.whl", hash = "sha256:ba034a32ecf9af72adfa5ee383ad0fd4f4e38cdb62b13624278ef768fe5b5b44", size = 577992, upload_time = "2025-04-04T12:03:55.815Z" }, + { url = "https://files.pythonhosted.org/packages/30/0f/55f8c02c182856743b82dde46b2dc3e314edda7f1098c12a8227eeda0833/pyzmq-26.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be", size = 640466, upload_time = "2025-04-04T12:03:57.231Z" }, + { url = "https://files.pythonhosted.org/packages/e4/29/073779afc3ef6f830b8de95026ef20b2d1ec22d0324d767748d806e57379/pyzmq-26.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f23c750e485ce1eb639dbd576d27d168595908aa2d60b149e2d9e34c9df40e0", size = 556342, upload_time = "2025-04-04T12:03:59.218Z" }, + { url = "https://files.pythonhosted.org/packages/d7/20/fb2c92542488db70f833b92893769a569458311a76474bda89dc4264bd18/pyzmq-26.4.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:c43fac689880f5174d6fc864857d1247fe5cfa22b09ed058a344ca92bf5301e3", size = 1339484, upload_time = "2025-04-04T12:04:00.671Z" }, + { url = "https://files.pythonhosted.org/packages/58/29/2f06b9cabda3a6ea2c10f43e67ded3e47fc25c54822e2506dfb8325155d4/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902aca7eba477657c5fb81c808318460328758e8367ecdd1964b6330c73cae43", size = 666106, upload_time = "2025-04-04T12:04:02.366Z" }, + { url = "https://files.pythonhosted.org/packages/77/e4/dcf62bd29e5e190bd21bfccaa4f3386e01bf40d948c239239c2f1e726729/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e48a830bfd152fe17fbdeaf99ac5271aa4122521bf0d275b6b24e52ef35eb6", size = 902056, upload_time = "2025-04-04T12:04:03.919Z" }, + { url = "https://files.pythonhosted.org/packages/1a/cf/b36b3d7aea236087d20189bec1a87eeb2b66009731d7055e5c65f845cdba/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31be2b6de98c824c06f5574331f805707c667dc8f60cb18580b7de078479891e", size = 860148, upload_time = "2025-04-04T12:04:05.581Z" }, + { url = "https://files.pythonhosted.org/packages/18/a6/f048826bc87528c208e90604c3bf573801e54bd91e390cbd2dfa860e82dc/pyzmq-26.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6332452034be001bbf3206ac59c0d2a7713de5f25bb38b06519fc6967b7cf771", size = 855983, upload_time = "2025-04-04T12:04:07.096Z" }, + { url = "https://files.pythonhosted.org/packages/0a/27/454d34ab6a1d9772a36add22f17f6b85baf7c16e14325fa29e7202ca8ee8/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:da8c0f5dd352136853e6a09b1b986ee5278dfddfebd30515e16eae425c872b30", size = 1197274, upload_time = "2025-04-04T12:04:08.523Z" }, + { url = "https://files.pythonhosted.org/packages/f4/3d/7abfeab6b83ad38aa34cbd57c6fc29752c391e3954fd12848bd8d2ec0df6/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f4ccc1a0a2c9806dda2a2dd118a3b7b681e448f3bb354056cad44a65169f6d86", size = 1507120, upload_time = "2025-04-04T12:04:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/13/ff/bc8d21dbb9bc8705126e875438a1969c4f77e03fc8565d6901c7933a3d01/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c0b5fceadbab461578daf8d1dcc918ebe7ddd2952f748cf30c7cf2de5d51101", size = 1406738, upload_time = "2025-04-04T12:04:12.509Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5d/d4cd85b24de71d84d81229e3bbb13392b2698432cf8fdcea5afda253d587/pyzmq-26.4.0-cp313-cp313-win32.whl", hash = "sha256:28e2b0ff5ba4b3dd11062d905682bad33385cfa3cc03e81abd7f0822263e6637", size = 577826, upload_time = "2025-04-04T12:04:14.289Z" }, + { url = "https://files.pythonhosted.org/packages/c6/6c/f289c1789d7bb6e5a3b3bef7b2a55089b8561d17132be7d960d3ff33b14e/pyzmq-26.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b", size = 640406, upload_time = "2025-04-04T12:04:15.757Z" }, + { url = "https://files.pythonhosted.org/packages/b3/99/676b8851cb955eb5236a0c1e9ec679ea5ede092bf8bf2c8a68d7e965cac3/pyzmq-26.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:1edb0385c7f025045d6e0f759d4d3afe43c17a3d898914ec6582e6f464203c08", size = 556216, upload_time = "2025-04-04T12:04:17.212Z" }, + { url = "https://files.pythonhosted.org/packages/65/c2/1fac340de9d7df71efc59d9c50fc7a635a77b103392d1842898dd023afcb/pyzmq-26.4.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:93a29e882b2ba1db86ba5dd5e88e18e0ac6b627026c5cfbec9983422011b82d4", size = 1333769, upload_time = "2025-04-04T12:04:18.665Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c7/6c03637e8d742c3b00bec4f5e4cd9d1c01b2f3694c6f140742e93ca637ed/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45684f276f57110bb89e4300c00f1233ca631f08f5f42528a5c408a79efc4a", size = 658826, upload_time = "2025-04-04T12:04:20.405Z" }, + { url = "https://files.pythonhosted.org/packages/a5/97/a8dca65913c0f78e0545af2bb5078aebfc142ca7d91cdaffa1fbc73e5dbd/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72073e75260cb301aad4258ad6150fa7f57c719b3f498cb91e31df16784d89b", size = 891650, upload_time = "2025-04-04T12:04:22.413Z" }, + { url = "https://files.pythonhosted.org/packages/7d/7e/f63af1031eb060bf02d033732b910fe48548dcfdbe9c785e9f74a6cc6ae4/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be37e24b13026cfedd233bcbbccd8c0bcd2fdd186216094d095f60076201538d", size = 849776, upload_time = "2025-04-04T12:04:23.959Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/1a009ce582802a895c0d5fe9413f029c940a0a8ee828657a3bb0acffd88b/pyzmq-26.4.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:237b283044934d26f1eeff4075f751b05d2f3ed42a257fc44386d00df6a270cf", size = 842516, upload_time = "2025-04-04T12:04:25.449Z" }, + { url = "https://files.pythonhosted.org/packages/6e/bc/f88b0bad0f7a7f500547d71e99f10336f2314e525d4ebf576a1ea4a1d903/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b30f862f6768b17040929a68432c8a8be77780317f45a353cb17e423127d250c", size = 1189183, upload_time = "2025-04-04T12:04:27.035Z" }, + { url = "https://files.pythonhosted.org/packages/d9/8c/db446a3dd9cf894406dec2e61eeffaa3c07c3abb783deaebb9812c4af6a5/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:c80fcd3504232f13617c6ab501124d373e4895424e65de8b72042333316f64a8", size = 1495501, upload_time = "2025-04-04T12:04:28.833Z" }, + { url = "https://files.pythonhosted.org/packages/05/4c/bf3cad0d64c3214ac881299c4562b815f05d503bccc513e3fd4fdc6f67e4/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:26a2a7451606b87f67cdeca2c2789d86f605da08b4bd616b1a9981605ca3a364", size = 1395540, upload_time = "2025-04-04T12:04:30.562Z" }, + { url = "https://files.pythonhosted.org/packages/04/52/a70fcd5592715702248306d8e1729c10742c2eac44529984413b05c68658/pyzmq-26.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4478b14cb54a805088299c25a79f27eaf530564a7a4f72bf432a040042b554eb", size = 834405, upload_time = "2025-04-04T12:05:13.3Z" }, + { url = "https://files.pythonhosted.org/packages/25/f9/1a03f1accff16b3af1a6fa22cbf7ced074776abbf688b2e9cb4629700c62/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a28ac29c60e4ba84b5f58605ace8ad495414a724fe7aceb7cf06cd0598d04e1", size = 569578, upload_time = "2025-04-04T12:05:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/76/0c/3a633acd762aa6655fcb71fa841907eae0ab1e8582ff494b137266de341d/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43b03c1ceea27c6520124f4fb2ba9c647409b9abdf9a62388117148a90419494", size = 798248, upload_time = "2025-04-04T12:05:17.376Z" }, + { url = "https://files.pythonhosted.org/packages/cd/cc/6c99c84aa60ac1cc56747bed6be8ce6305b9b861d7475772e7a25ce019d3/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7731abd23a782851426d4e37deb2057bf9410848a4459b5ede4fe89342e687a9", size = 756757, upload_time = "2025-04-04T12:05:19.19Z" }, + { url = "https://files.pythonhosted.org/packages/13/9c/d8073bd898eb896e94c679abe82e47506e2b750eb261cf6010ced869797c/pyzmq-26.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a222ad02fbe80166b0526c038776e8042cd4e5f0dec1489a006a1df47e9040e0", size = 555371, upload_time = "2025-04-04T12:05:20.702Z" }, ] [[package]] @@ -4640,9 +4742,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/01/392eba83c8e47b946b929d7c46e0f04b35e9671f8bb6fc36b6f7945b4de8/qtpy-2.4.3.tar.gz", hash = "sha256:db744f7832e6d3da90568ba6ccbca3ee2b3b4a890c3d6fbbc63142f6e4cdf5bb", size = 66982 } +sdist = { url = "https://files.pythonhosted.org/packages/70/01/392eba83c8e47b946b929d7c46e0f04b35e9671f8bb6fc36b6f7945b4de8/qtpy-2.4.3.tar.gz", hash = "sha256:db744f7832e6d3da90568ba6ccbca3ee2b3b4a890c3d6fbbc63142f6e4cdf5bb", size = 66982, upload_time = "2025-02-11T15:09:25.759Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/76/37c0ccd5ab968a6a438f9c623aeecc84c202ab2fabc6a8fd927580c15b5a/QtPy-2.4.3-py3-none-any.whl", hash = "sha256:72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1", size = 95045 }, + { url = "https://files.pythonhosted.org/packages/69/76/37c0ccd5ab968a6a438f9c623aeecc84c202ab2fabc6a8fd927580c15b5a/QtPy-2.4.3-py3-none-any.whl", hash = "sha256:72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1", size = 95045, upload_time = "2025-02-11T15:09:24.162Z" }, ] [[package]] @@ -4652,9 +4754,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "prompt-toolkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/b8/d16eb579277f3de9e56e5ad25280fab52fc5774117fb70362e8c2e016559/questionary-2.1.0.tar.gz", hash = "sha256:6302cdd645b19667d8f6e6634774e9538bfcd1aad9be287e743d96cacaf95587", size = 26775 } +sdist = { url = "https://files.pythonhosted.org/packages/a8/b8/d16eb579277f3de9e56e5ad25280fab52fc5774117fb70362e8c2e016559/questionary-2.1.0.tar.gz", hash = "sha256:6302cdd645b19667d8f6e6634774e9538bfcd1aad9be287e743d96cacaf95587", size = 26775, upload_time = "2024-12-29T11:49:17.802Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/3f/11dd4cd4f39e05128bfd20138faea57bec56f9ffba6185d276e3107ba5b2/questionary-2.1.0-py3-none-any.whl", hash = "sha256:44174d237b68bc828e4878c763a9ad6790ee61990e0ae72927694ead57bab8ec", size = 36747 }, + { url = "https://files.pythonhosted.org/packages/ad/3f/11dd4cd4f39e05128bfd20138faea57bec56f9ffba6185d276e3107ba5b2/questionary-2.1.0-py3-none-any.whl", hash = "sha256:44174d237b68bc828e4878c763a9ad6790ee61990e0ae72927694ead57bab8ec", size = 36747, upload_time = "2024-12-29T11:49:16.734Z" }, ] [[package]] @@ -4666,9 +4768,9 @@ dependencies = [ { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 } +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload_time = "2025-01-25T08:48:16.138Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload_time = "2025-01-25T08:48:14.241Z" }, ] [[package]] @@ -4681,9 +4783,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload_time = "2024-05-29T15:37:49.536Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload_time = "2024-05-29T15:37:47.027Z" }, ] [[package]] @@ -4694,9 +4796,9 @@ dependencies = [ { name = "oauthlib" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650 } +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload_time = "2024-03-22T20:32:29.939Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179 }, + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload_time = "2024-03-22T20:32:28.055Z" }, ] [[package]] @@ -4706,9 +4808,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/70/15ce8551d65b324e18c5aa6ef6998880f21ead51ebe5ed743c0950d7d9dd/retrying-1.3.4.tar.gz", hash = "sha256:345da8c5765bd982b1d1915deb9102fd3d1f7ad16bd84a9700b85f64d24e8f3e", size = 10929 } +sdist = { url = "https://files.pythonhosted.org/packages/ce/70/15ce8551d65b324e18c5aa6ef6998880f21ead51ebe5ed743c0950d7d9dd/retrying-1.3.4.tar.gz", hash = "sha256:345da8c5765bd982b1d1915deb9102fd3d1f7ad16bd84a9700b85f64d24e8f3e", size = 10929, upload_time = "2022-11-25T09:57:49.43Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/04/9e36f28be4c0532c0e9207ff9dc01fb13a2b0eb036476a213b0000837d0e/retrying-1.3.4-py3-none-any.whl", hash = "sha256:8cc4d43cb8e1125e0ff3344e9de678fefd85db3b750b81b2240dc0183af37b35", size = 11602 }, + { url = "https://files.pythonhosted.org/packages/8f/04/9e36f28be4c0532c0e9207ff9dc01fb13a2b0eb036476a213b0000837d0e/retrying-1.3.4-py3-none-any.whl", hash = "sha256:8cc4d43cb8e1125e0ff3344e9de678fefd85db3b750b81b2240dc0183af37b35", size = 11602, upload_time = "2022-11-25T09:57:47.494Z" }, ] [[package]] @@ -4718,27 +4820,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513 } +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload_time = "2021-05-12T16:37:54.178Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490 }, + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload_time = "2021-05-12T16:37:52.536Z" }, ] [[package]] name = "rfc3986-validator" version = "0.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760 } +sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760, upload_time = "2019-10-28T16:00:19.144Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242 }, + { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload_time = "2019-10-28T16:00:13.976Z" }, ] [[package]] name = "rfc3987" version = "1.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/14/bb/f1395c4b62f251a1cb503ff884500ebd248eed593f41b469f89caa3547bd/rfc3987-1.3.8.tar.gz", hash = "sha256:d3c4d257a560d544e9826b38bc81db676890c79ab9d7ac92b39c7a253d5ca733", size = 20700 } +sdist = { url = "https://files.pythonhosted.org/packages/14/bb/f1395c4b62f251a1cb503ff884500ebd248eed593f41b469f89caa3547bd/rfc3987-1.3.8.tar.gz", hash = "sha256:d3c4d257a560d544e9826b38bc81db676890c79ab9d7ac92b39c7a253d5ca733", size = 20700, upload_time = "2018-07-29T17:23:47.954Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/65/d4/f7407c3d15d5ac779c3dd34fbbc6ea2090f77bd7dd12f207ccf881551208/rfc3987-1.3.8-py2.py3-none-any.whl", hash = "sha256:10702b1e51e5658843460b189b185c0366d2cf4cff716f13111b0ea9fd2dce53", size = 13377 }, + { url = "https://files.pythonhosted.org/packages/65/d4/f7407c3d15d5ac779c3dd34fbbc6ea2090f77bd7dd12f207ccf881551208/rfc3987-1.3.8-py2.py3-none-any.whl", hash = "sha256:10702b1e51e5658843460b189b185c0366d2cf4cff716f13111b0ea9fd2dce53", size = 13377, upload_time = "2018-07-29T17:23:45.313Z" }, ] [[package]] @@ -4749,9 +4851,9 @@ dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078, upload_time = "2025-03-30T14:15:14.23Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, + { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229, upload_time = "2025-03-30T14:15:12.283Z" }, ] [[package]] @@ -4763,124 +4865,124 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/7a/4b78c5997f2a799a8c5c07f3b2145bbcda40115c4d35c76fbadd418a3c89/rich_click-1.8.8.tar.gz", hash = "sha256:547c618dea916620af05d4a6456da797fbde904c97901f44d2f32f89d85d6c84", size = 39066 } +sdist = { url = "https://files.pythonhosted.org/packages/a6/7a/4b78c5997f2a799a8c5c07f3b2145bbcda40115c4d35c76fbadd418a3c89/rich_click-1.8.8.tar.gz", hash = "sha256:547c618dea916620af05d4a6456da797fbde904c97901f44d2f32f89d85d6c84", size = 39066, upload_time = "2025-03-09T23:20:31.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/69/963f0bf44a654f6465bdb66fb5a91051b0d7af9f742b5bd7202607165036/rich_click-1.8.8-py3-none-any.whl", hash = "sha256:205aabd5a98e64ab2c105dee9e368be27480ba004c7dfa2accd0ed44f9f1550e", size = 35747 }, + { url = "https://files.pythonhosted.org/packages/fa/69/963f0bf44a654f6465bdb66fb5a91051b0d7af9f742b5bd7202607165036/rich_click-1.8.8-py3-none-any.whl", hash = "sha256:205aabd5a98e64ab2c105dee9e368be27480ba004c7dfa2accd0ed44f9f1550e", size = 35747, upload_time = "2025-03-09T23:20:29.831Z" }, ] [[package]] name = "rich-toolkit" -version = "0.14.1" +version = "0.14.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/ea/13945d58d556a28dfb0f774ad5c8af759527390e59505a40d164bf8ce1ce/rich_toolkit-0.14.1.tar.gz", hash = "sha256:9248e2d087bfc01f3e4c5c8987e05f7fa744d00dd22fa2be3aa6e50255790b3f", size = 104416 } +sdist = { url = "https://files.pythonhosted.org/packages/1f/69/e328fb8986814147562b2617f22b06723f60b0c85c85afc0408b9f324a97/rich_toolkit-0.14.3.tar.gz", hash = "sha256:b72a342e52253b912681b027e94226e2deea616494420eec0b09a7219a72a0a5", size = 104469, upload_time = "2025-04-23T14:54:52.908Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/e8/61c5b12d1567fdba41a6775db12a090d88b8305424ee7c47259c70d33cb4/rich_toolkit-0.14.1-py3-none-any.whl", hash = "sha256:dc92c0117d752446d04fdc828dbca5873bcded213a091a5d3742a2beec2e6559", size = 24177 }, + { url = "https://files.pythonhosted.org/packages/b4/09/e0c7b06657ca1d4317d9e37ea5657a88a20dc3507b2ee6939ace0ff9036e/rich_toolkit-0.14.3-py3-none-any.whl", hash = "sha256:2ec72dcdf1bbb09b6a9286a4eddcd4d43369da3b22fe3f28e5a92143618b8ac6", size = 24258, upload_time = "2025-04-23T14:54:51.443Z" }, ] [[package]] name = "roman-numerals-py" version = "3.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017 } +sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload_time = "2025-02-22T07:34:54.333Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742 }, + { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload_time = "2025-02-22T07:34:52.422Z" }, ] [[package]] name = "rpds-py" version = "0.24.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/b3/52b213298a0ba7097c7ea96bee95e1947aa84cc816d48cebb539770cdf41/rpds_py-0.24.0.tar.gz", hash = "sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e", size = 26863 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/80/e6/c1458bbfb257448fdb2528071f1f4e19e26798ed5ef6d47d7aab0cb69661/rpds_py-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2d3ee4615df36ab8eb16c2507b11e764dcc11fd350bbf4da16d09cda11fcedef", size = 377679 }, - { url = "https://files.pythonhosted.org/packages/dd/26/ea4181ef78f58b2c167548c6a833d7dc22408e5b3b181bda9dda440bb92d/rpds_py-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e13ae74a8a3a0c2f22f450f773e35f893484fcfacb00bb4344a7e0f4f48e1f97", size = 362571 }, - { url = "https://files.pythonhosted.org/packages/56/fa/1ec54dd492c64c280a2249a047fc3369e2789dc474eac20445ebfc72934b/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf86f72d705fc2ef776bb7dd9e5fbba79d7e1f3e258bf9377f8204ad0fc1c51e", size = 388012 }, - { url = "https://files.pythonhosted.org/packages/3a/be/bad8b0e0f7e58ef4973bb75e91c472a7d51da1977ed43b09989264bf065c/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c43583ea8517ed2e780a345dd9960896afc1327e8cf3ac8239c167530397440d", size = 394730 }, - { url = "https://files.pythonhosted.org/packages/35/56/ab417fc90c21826df048fc16e55316ac40876e4b790104ececcbce813d8f/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cd031e63bc5f05bdcda120646a0d32f6d729486d0067f09d79c8db5368f4586", size = 448264 }, - { url = "https://files.pythonhosted.org/packages/b6/75/4c63862d5c05408589196c8440a35a14ea4ae337fa70ded1f03638373f06/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34d90ad8c045df9a4259c47d2e16a3f21fdb396665c94520dbfe8766e62187a4", size = 446813 }, - { url = "https://files.pythonhosted.org/packages/e7/0c/91cf17dffa9a38835869797a9f041056091ebba6a53963d3641207e3d467/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e838bf2bb0b91ee67bf2b889a1a841e5ecac06dd7a2b1ef4e6151e2ce155c7ae", size = 389438 }, - { url = "https://files.pythonhosted.org/packages/1b/b0/60e6c72727c978276e02851819f3986bc40668f115be72c1bc4d922c950f/rpds_py-0.24.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04ecf5c1ff4d589987b4d9882872f80ba13da7d42427234fce8f22efb43133bc", size = 420416 }, - { url = "https://files.pythonhosted.org/packages/a1/d7/f46f85b9f863fb59fd3c534b5c874c48bee86b19e93423b9da8784605415/rpds_py-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:630d3d8ea77eabd6cbcd2ea712e1c5cecb5b558d39547ac988351195db433f6c", size = 565236 }, - { url = "https://files.pythonhosted.org/packages/2a/d1/1467620ded6dd70afc45ec822cdf8dfe7139537780d1f3905de143deb6fd/rpds_py-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ebcb786b9ff30b994d5969213a8430cbb984cdd7ea9fd6df06663194bd3c450c", size = 592016 }, - { url = "https://files.pythonhosted.org/packages/5d/13/fb1ded2e6adfaa0c0833106c42feb290973f665300f4facd5bf5d7891d9c/rpds_py-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:174e46569968ddbbeb8a806d9922f17cd2b524aa753b468f35b97ff9c19cb718", size = 560123 }, - { url = "https://files.pythonhosted.org/packages/1e/df/09fc1857ac7cc2eb16465a7199c314cbce7edde53c8ef21d615410d7335b/rpds_py-0.24.0-cp311-cp311-win32.whl", hash = "sha256:5ef877fa3bbfb40b388a5ae1cb00636a624690dcb9a29a65267054c9ea86d88a", size = 222256 }, - { url = "https://files.pythonhosted.org/packages/ff/25/939b40bc4d54bf910e5ee60fb5af99262c92458f4948239e8c06b0b750e7/rpds_py-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:e274f62cbd274359eff63e5c7e7274c913e8e09620f6a57aae66744b3df046d6", size = 234718 }, - { url = "https://files.pythonhosted.org/packages/1a/e0/1c55f4a3be5f1ca1a4fd1f3ff1504a1478c1ed48d84de24574c4fa87e921/rpds_py-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d8551e733626afec514b5d15befabea0dd70a343a9f23322860c4f16a9430205", size = 366945 }, - { url = "https://files.pythonhosted.org/packages/39/1b/a3501574fbf29118164314dbc800d568b8c1c7b3258b505360e8abb3902c/rpds_py-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e374c0ce0ca82e5b67cd61fb964077d40ec177dd2c4eda67dba130de09085c7", size = 351935 }, - { url = "https://files.pythonhosted.org/packages/dc/47/77d3d71c55f6a374edde29f1aca0b2e547325ed00a9da820cabbc9497d2b/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d69d003296df4840bd445a5d15fa5b6ff6ac40496f956a221c4d1f6f7b4bc4d9", size = 390817 }, - { url = "https://files.pythonhosted.org/packages/4e/ec/1e336ee27484379e19c7f9cc170f4217c608aee406d3ae3a2e45336bff36/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8212ff58ac6dfde49946bea57474a386cca3f7706fc72c25b772b9ca4af6b79e", size = 401983 }, - { url = "https://files.pythonhosted.org/packages/07/f8/39b65cbc272c635eaea6d393c2ad1ccc81c39eca2db6723a0ca4b2108fce/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:528927e63a70b4d5f3f5ccc1fa988a35456eb5d15f804d276709c33fc2f19bda", size = 451719 }, - { url = "https://files.pythonhosted.org/packages/32/05/05c2b27dd9c30432f31738afed0300659cb9415db0ff7429b05dfb09bbde/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a824d2c7a703ba6daaca848f9c3d5cb93af0505be505de70e7e66829affd676e", size = 442546 }, - { url = "https://files.pythonhosted.org/packages/7d/e0/19383c8b5d509bd741532a47821c3e96acf4543d0832beba41b4434bcc49/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d51febb7a114293ffd56c6cf4736cb31cd68c0fddd6aa303ed09ea5a48e029", size = 393695 }, - { url = "https://files.pythonhosted.org/packages/9d/15/39f14e96d94981d0275715ae8ea564772237f3fa89bc3c21e24de934f2c7/rpds_py-0.24.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3fab5f4a2c64a8fb64fc13b3d139848817a64d467dd6ed60dcdd6b479e7febc9", size = 427218 }, - { url = "https://files.pythonhosted.org/packages/22/b9/12da7124905a680f690da7a9de6f11de770b5e359f5649972f7181c8bf51/rpds_py-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9be4f99bee42ac107870c61dfdb294d912bf81c3c6d45538aad7aecab468b6b7", size = 568062 }, - { url = "https://files.pythonhosted.org/packages/88/17/75229017a2143d915f6f803721a6d721eca24f2659c5718a538afa276b4f/rpds_py-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:564c96b6076a98215af52f55efa90d8419cc2ef45d99e314fddefe816bc24f91", size = 596262 }, - { url = "https://files.pythonhosted.org/packages/aa/64/8e8a1d8bd1b6b638d6acb6d41ab2cec7f2067a5b8b4c9175703875159a7c/rpds_py-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:75a810b7664c17f24bf2ffd7f92416c00ec84b49bb68e6a0d93e542406336b56", size = 564306 }, - { url = "https://files.pythonhosted.org/packages/68/1c/a7eac8d8ed8cb234a9b1064647824c387753343c3fab6ed7c83481ed0be7/rpds_py-0.24.0-cp312-cp312-win32.whl", hash = "sha256:f6016bd950be4dcd047b7475fdf55fb1e1f59fc7403f387be0e8123e4a576d30", size = 224281 }, - { url = "https://files.pythonhosted.org/packages/bb/46/b8b5424d1d21f2f2f3f2d468660085318d4f74a8df8289e3dd6ad224d488/rpds_py-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034", size = 239719 }, - { url = "https://files.pythonhosted.org/packages/9d/c3/3607abc770395bc6d5a00cb66385a5479fb8cd7416ddef90393b17ef4340/rpds_py-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2d8e4508e15fc05b31285c4b00ddf2e0eb94259c2dc896771966a163122a0c", size = 367072 }, - { url = "https://files.pythonhosted.org/packages/d8/35/8c7ee0fe465793e3af3298dc5a9f3013bd63e7a69df04ccfded8293a4982/rpds_py-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f00c16e089282ad68a3820fd0c831c35d3194b7cdc31d6e469511d9bffc535c", size = 351919 }, - { url = "https://files.pythonhosted.org/packages/91/d3/7e1b972501eb5466b9aca46a9c31bcbbdc3ea5a076e9ab33f4438c1d069d/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951cc481c0c395c4a08639a469d53b7d4afa252529a085418b82a6b43c45c240", size = 390360 }, - { url = "https://files.pythonhosted.org/packages/a2/a8/ccabb50d3c91c26ad01f9b09a6a3b03e4502ce51a33867c38446df9f896b/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9ca89938dff18828a328af41ffdf3902405a19f4131c88e22e776a8e228c5a8", size = 400704 }, - { url = "https://files.pythonhosted.org/packages/53/ae/5fa5bf0f3bc6ce21b5ea88fc0ecd3a439e7cb09dd5f9ffb3dbe1b6894fc5/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0ef550042a8dbcd657dfb284a8ee00f0ba269d3f2286b0493b15a5694f9fe8", size = 450839 }, - { url = "https://files.pythonhosted.org/packages/e3/ac/c4e18b36d9938247e2b54f6a03746f3183ca20e1edd7d3654796867f5100/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2356688e5d958c4d5cb964af865bea84db29971d3e563fb78e46e20fe1848b", size = 441494 }, - { url = "https://files.pythonhosted.org/packages/bf/08/b543969c12a8f44db6c0f08ced009abf8f519191ca6985509e7c44102e3c/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78884d155fd15d9f64f5d6124b486f3d3f7fd7cd71a78e9670a0f6f6ca06fb2d", size = 393185 }, - { url = "https://files.pythonhosted.org/packages/da/7e/f6eb6a7042ce708f9dfc781832a86063cea8a125bbe451d663697b51944f/rpds_py-0.24.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a4a535013aeeef13c5532f802708cecae8d66c282babb5cd916379b72110cf7", size = 426168 }, - { url = "https://files.pythonhosted.org/packages/38/b0/6cd2bb0509ac0b51af4bb138e145b7c4c902bb4b724d6fd143689d6e0383/rpds_py-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:84e0566f15cf4d769dade9b366b7b87c959be472c92dffb70462dd0844d7cbad", size = 567622 }, - { url = "https://files.pythonhosted.org/packages/64/b0/c401f4f077547d98e8b4c2ec6526a80e7cb04f519d416430ec1421ee9e0b/rpds_py-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:823e74ab6fbaa028ec89615ff6acb409e90ff45580c45920d4dfdddb069f2120", size = 595435 }, - { url = "https://files.pythonhosted.org/packages/9f/ec/7993b6e803294c87b61c85bd63e11142ccfb2373cf88a61ec602abcbf9d6/rpds_py-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c61a2cb0085c8783906b2f8b1f16a7e65777823c7f4d0a6aaffe26dc0d358dd9", size = 563762 }, - { url = "https://files.pythonhosted.org/packages/1f/29/4508003204cb2f461dc2b83dd85f8aa2b915bc98fe6046b9d50d4aa05401/rpds_py-0.24.0-cp313-cp313-win32.whl", hash = "sha256:60d9b630c8025b9458a9d114e3af579a2c54bd32df601c4581bd054e85258143", size = 223510 }, - { url = "https://files.pythonhosted.org/packages/f9/12/09e048d1814195e01f354155fb772fb0854bd3450b5f5a82224b3a319f0e/rpds_py-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a", size = 239075 }, - { url = "https://files.pythonhosted.org/packages/d2/03/5027cde39bb2408d61e4dd0cf81f815949bb629932a6c8df1701d0257fc4/rpds_py-0.24.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:d09dc82af2d3c17e7dd17120b202a79b578d79f2b5424bda209d9966efeed114", size = 362974 }, - { url = "https://files.pythonhosted.org/packages/bf/10/24d374a2131b1ffafb783e436e770e42dfdb74b69a2cd25eba8c8b29d861/rpds_py-0.24.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5fc13b44de6419d1e7a7e592a4885b323fbc2f46e1f22151e3a8ed3b8b920405", size = 348730 }, - { url = "https://files.pythonhosted.org/packages/7a/d1/1ef88d0516d46cd8df12e5916966dbf716d5ec79b265eda56ba1b173398c/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c347a20d79cedc0a7bd51c4d4b7dbc613ca4e65a756b5c3e57ec84bd43505b47", size = 387627 }, - { url = "https://files.pythonhosted.org/packages/4e/35/07339051b8b901ecefd449ebf8e5522e92bcb95e1078818cbfd9db8e573c/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20f2712bd1cc26a3cc16c5a1bfee9ed1abc33d4cdf1aabd297fe0eb724df4272", size = 394094 }, - { url = "https://files.pythonhosted.org/packages/dc/62/ee89ece19e0ba322b08734e95441952062391065c157bbd4f8802316b4f1/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad911555286884be1e427ef0dc0ba3929e6821cbeca2194b13dc415a462c7fd", size = 449639 }, - { url = "https://files.pythonhosted.org/packages/15/24/b30e9f9e71baa0b9dada3a4ab43d567c6b04a36d1cb531045f7a8a0a7439/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0aeb3329c1721c43c58cae274d7d2ca85c1690d89485d9c63a006cb79a85771a", size = 438584 }, - { url = "https://files.pythonhosted.org/packages/28/d9/49f7b8f3b4147db13961e19d5e30077cd0854ccc08487026d2cb2142aa4a/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0f156e9509cee987283abd2296ec816225145a13ed0391df8f71bf1d789e2d", size = 391047 }, - { url = "https://files.pythonhosted.org/packages/49/b0/e66918d0972c33a259ba3cd7b7ff10ed8bd91dbcfcbec6367b21f026db75/rpds_py-0.24.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa6800adc8204ce898c8a424303969b7aa6a5e4ad2789c13f8648739830323b7", size = 418085 }, - { url = "https://files.pythonhosted.org/packages/e1/6b/99ed7ea0a94c7ae5520a21be77a82306aac9e4e715d4435076ead07d05c6/rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a18fc371e900a21d7392517c6f60fe859e802547309e94313cd8181ad9db004d", size = 564498 }, - { url = "https://files.pythonhosted.org/packages/28/26/1cacfee6b800e6fb5f91acecc2e52f17dbf8b0796a7c984b4568b6d70e38/rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9168764133fd919f8dcca2ead66de0105f4ef5659cbb4fa044f7014bed9a1797", size = 590202 }, - { url = "https://files.pythonhosted.org/packages/a9/9e/57bd2f9fba04a37cef673f9a66b11ca8c43ccdd50d386c455cd4380fe461/rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f6e3cec44ba05ee5cbdebe92d052f69b63ae792e7d05f1020ac5e964394080c", size = 561771 }, - { url = "https://files.pythonhosted.org/packages/9f/cf/b719120f375ab970d1c297dbf8de1e3c9edd26fe92c0ed7178dd94b45992/rpds_py-0.24.0-cp313-cp313t-win32.whl", hash = "sha256:8ebc7e65ca4b111d928b669713865f021b7773350eeac4a31d3e70144297baba", size = 221195 }, - { url = "https://files.pythonhosted.org/packages/2d/e5/22865285789f3412ad0c3d7ec4dc0a3e86483b794be8a5d9ed5a19390900/rpds_py-0.24.0-cp313-cp313t-win_amd64.whl", hash = "sha256:675269d407a257b8c00a6b58205b72eec8231656506c56fd429d924ca00bb350", size = 237354 }, - { url = "https://files.pythonhosted.org/packages/65/53/40bcc246a8354530d51a26d2b5b9afd1deacfb0d79e67295cc74df362f52/rpds_py-0.24.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f9e0057a509e096e47c87f753136c9b10d7a91842d8042c2ee6866899a717c0d", size = 378386 }, - { url = "https://files.pythonhosted.org/packages/80/b0/5ea97dd2f53e3618560aa1f9674e896e63dff95a9b796879a201bc4c1f00/rpds_py-0.24.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6e109a454412ab82979c5b1b3aee0604eca4bbf9a02693bb9df027af2bfa91a", size = 363440 }, - { url = "https://files.pythonhosted.org/packages/57/9d/259b6eada6f747cdd60c9a5eb3efab15f6704c182547149926c38e5bd0d5/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc1c892b1ec1f8cbd5da8de287577b455e388d9c328ad592eabbdcb6fc93bee5", size = 388816 }, - { url = "https://files.pythonhosted.org/packages/94/c1/faafc7183712f89f4b7620c3c15979ada13df137d35ef3011ae83e93b005/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c39438c55983d48f4bb3487734d040e22dad200dab22c41e331cee145e7a50d", size = 395058 }, - { url = "https://files.pythonhosted.org/packages/6c/96/d7fa9d2a7b7604a61da201cc0306a355006254942093779d7121c64700ce/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d7e8ce990ae17dda686f7e82fd41a055c668e13ddcf058e7fb5e9da20b57793", size = 448692 }, - { url = "https://files.pythonhosted.org/packages/96/37/a3146c6eebc65d6d8c96cc5ffdcdb6af2987412c789004213227fbe52467/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ea7f4174d2e4194289cb0c4e172d83e79a6404297ff95f2875cf9ac9bced8ba", size = 446462 }, - { url = "https://files.pythonhosted.org/packages/1f/13/6481dfd9ac7de43acdaaa416e3a7da40bc4bb8f5c6ca85e794100aa54596/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb2954155bb8f63bb19d56d80e5e5320b61d71084617ed89efedb861a684baea", size = 390460 }, - { url = "https://files.pythonhosted.org/packages/61/e1/37e36bce65e109543cc4ff8d23206908649023549604fa2e7fbeba5342f7/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04f2b712a2206e13800a8136b07aaedc23af3facab84918e7aa89e4be0260032", size = 421609 }, - { url = "https://files.pythonhosted.org/packages/20/dd/1f1a923d6cd798b8582176aca8a0784676f1a0449fb6f07fce6ac1cdbfb6/rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:eda5c1e2a715a4cbbca2d6d304988460942551e4e5e3b7457b50943cd741626d", size = 565818 }, - { url = "https://files.pythonhosted.org/packages/56/ec/d8da6df6a1eb3a418944a17b1cb38dd430b9e5a2e972eafd2b06f10c7c46/rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:9abc80fe8c1f87218db116016de575a7998ab1629078c90840e8d11ab423ee25", size = 592627 }, - { url = "https://files.pythonhosted.org/packages/b3/14/c492b9c7d5dd133e13f211ddea6bb9870f99e4f73932f11aa00bc09a9be9/rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6a727fd083009bc83eb83d6950f0c32b3c94c8b80a9b667c87f4bd1274ca30ba", size = 560885 }, +sdist = { url = "https://files.pythonhosted.org/packages/0b/b3/52b213298a0ba7097c7ea96bee95e1947aa84cc816d48cebb539770cdf41/rpds_py-0.24.0.tar.gz", hash = "sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e", size = 26863, upload_time = "2025-03-26T14:56:01.518Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/e6/c1458bbfb257448fdb2528071f1f4e19e26798ed5ef6d47d7aab0cb69661/rpds_py-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2d3ee4615df36ab8eb16c2507b11e764dcc11fd350bbf4da16d09cda11fcedef", size = 377679, upload_time = "2025-03-26T14:53:06.557Z" }, + { url = "https://files.pythonhosted.org/packages/dd/26/ea4181ef78f58b2c167548c6a833d7dc22408e5b3b181bda9dda440bb92d/rpds_py-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e13ae74a8a3a0c2f22f450f773e35f893484fcfacb00bb4344a7e0f4f48e1f97", size = 362571, upload_time = "2025-03-26T14:53:08.439Z" }, + { url = "https://files.pythonhosted.org/packages/56/fa/1ec54dd492c64c280a2249a047fc3369e2789dc474eac20445ebfc72934b/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf86f72d705fc2ef776bb7dd9e5fbba79d7e1f3e258bf9377f8204ad0fc1c51e", size = 388012, upload_time = "2025-03-26T14:53:10.314Z" }, + { url = "https://files.pythonhosted.org/packages/3a/be/bad8b0e0f7e58ef4973bb75e91c472a7d51da1977ed43b09989264bf065c/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c43583ea8517ed2e780a345dd9960896afc1327e8cf3ac8239c167530397440d", size = 394730, upload_time = "2025-03-26T14:53:11.953Z" }, + { url = "https://files.pythonhosted.org/packages/35/56/ab417fc90c21826df048fc16e55316ac40876e4b790104ececcbce813d8f/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cd031e63bc5f05bdcda120646a0d32f6d729486d0067f09d79c8db5368f4586", size = 448264, upload_time = "2025-03-26T14:53:13.42Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/4c63862d5c05408589196c8440a35a14ea4ae337fa70ded1f03638373f06/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34d90ad8c045df9a4259c47d2e16a3f21fdb396665c94520dbfe8766e62187a4", size = 446813, upload_time = "2025-03-26T14:53:15.036Z" }, + { url = "https://files.pythonhosted.org/packages/e7/0c/91cf17dffa9a38835869797a9f041056091ebba6a53963d3641207e3d467/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e838bf2bb0b91ee67bf2b889a1a841e5ecac06dd7a2b1ef4e6151e2ce155c7ae", size = 389438, upload_time = "2025-03-26T14:53:17.037Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b0/60e6c72727c978276e02851819f3986bc40668f115be72c1bc4d922c950f/rpds_py-0.24.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04ecf5c1ff4d589987b4d9882872f80ba13da7d42427234fce8f22efb43133bc", size = 420416, upload_time = "2025-03-26T14:53:18.671Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d7/f46f85b9f863fb59fd3c534b5c874c48bee86b19e93423b9da8784605415/rpds_py-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:630d3d8ea77eabd6cbcd2ea712e1c5cecb5b558d39547ac988351195db433f6c", size = 565236, upload_time = "2025-03-26T14:53:20.357Z" }, + { url = "https://files.pythonhosted.org/packages/2a/d1/1467620ded6dd70afc45ec822cdf8dfe7139537780d1f3905de143deb6fd/rpds_py-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ebcb786b9ff30b994d5969213a8430cbb984cdd7ea9fd6df06663194bd3c450c", size = 592016, upload_time = "2025-03-26T14:53:22.216Z" }, + { url = "https://files.pythonhosted.org/packages/5d/13/fb1ded2e6adfaa0c0833106c42feb290973f665300f4facd5bf5d7891d9c/rpds_py-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:174e46569968ddbbeb8a806d9922f17cd2b524aa753b468f35b97ff9c19cb718", size = 560123, upload_time = "2025-03-26T14:53:23.733Z" }, + { url = "https://files.pythonhosted.org/packages/1e/df/09fc1857ac7cc2eb16465a7199c314cbce7edde53c8ef21d615410d7335b/rpds_py-0.24.0-cp311-cp311-win32.whl", hash = "sha256:5ef877fa3bbfb40b388a5ae1cb00636a624690dcb9a29a65267054c9ea86d88a", size = 222256, upload_time = "2025-03-26T14:53:25.217Z" }, + { url = "https://files.pythonhosted.org/packages/ff/25/939b40bc4d54bf910e5ee60fb5af99262c92458f4948239e8c06b0b750e7/rpds_py-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:e274f62cbd274359eff63e5c7e7274c913e8e09620f6a57aae66744b3df046d6", size = 234718, upload_time = "2025-03-26T14:53:26.631Z" }, + { url = "https://files.pythonhosted.org/packages/1a/e0/1c55f4a3be5f1ca1a4fd1f3ff1504a1478c1ed48d84de24574c4fa87e921/rpds_py-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d8551e733626afec514b5d15befabea0dd70a343a9f23322860c4f16a9430205", size = 366945, upload_time = "2025-03-26T14:53:28.149Z" }, + { url = "https://files.pythonhosted.org/packages/39/1b/a3501574fbf29118164314dbc800d568b8c1c7b3258b505360e8abb3902c/rpds_py-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e374c0ce0ca82e5b67cd61fb964077d40ec177dd2c4eda67dba130de09085c7", size = 351935, upload_time = "2025-03-26T14:53:29.684Z" }, + { url = "https://files.pythonhosted.org/packages/dc/47/77d3d71c55f6a374edde29f1aca0b2e547325ed00a9da820cabbc9497d2b/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d69d003296df4840bd445a5d15fa5b6ff6ac40496f956a221c4d1f6f7b4bc4d9", size = 390817, upload_time = "2025-03-26T14:53:31.177Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ec/1e336ee27484379e19c7f9cc170f4217c608aee406d3ae3a2e45336bff36/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8212ff58ac6dfde49946bea57474a386cca3f7706fc72c25b772b9ca4af6b79e", size = 401983, upload_time = "2025-03-26T14:53:33.163Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/39b65cbc272c635eaea6d393c2ad1ccc81c39eca2db6723a0ca4b2108fce/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:528927e63a70b4d5f3f5ccc1fa988a35456eb5d15f804d276709c33fc2f19bda", size = 451719, upload_time = "2025-03-26T14:53:34.721Z" }, + { url = "https://files.pythonhosted.org/packages/32/05/05c2b27dd9c30432f31738afed0300659cb9415db0ff7429b05dfb09bbde/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a824d2c7a703ba6daaca848f9c3d5cb93af0505be505de70e7e66829affd676e", size = 442546, upload_time = "2025-03-26T14:53:36.26Z" }, + { url = "https://files.pythonhosted.org/packages/7d/e0/19383c8b5d509bd741532a47821c3e96acf4543d0832beba41b4434bcc49/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d51febb7a114293ffd56c6cf4736cb31cd68c0fddd6aa303ed09ea5a48e029", size = 393695, upload_time = "2025-03-26T14:53:37.728Z" }, + { url = "https://files.pythonhosted.org/packages/9d/15/39f14e96d94981d0275715ae8ea564772237f3fa89bc3c21e24de934f2c7/rpds_py-0.24.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3fab5f4a2c64a8fb64fc13b3d139848817a64d467dd6ed60dcdd6b479e7febc9", size = 427218, upload_time = "2025-03-26T14:53:39.326Z" }, + { url = "https://files.pythonhosted.org/packages/22/b9/12da7124905a680f690da7a9de6f11de770b5e359f5649972f7181c8bf51/rpds_py-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9be4f99bee42ac107870c61dfdb294d912bf81c3c6d45538aad7aecab468b6b7", size = 568062, upload_time = "2025-03-26T14:53:40.885Z" }, + { url = "https://files.pythonhosted.org/packages/88/17/75229017a2143d915f6f803721a6d721eca24f2659c5718a538afa276b4f/rpds_py-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:564c96b6076a98215af52f55efa90d8419cc2ef45d99e314fddefe816bc24f91", size = 596262, upload_time = "2025-03-26T14:53:42.544Z" }, + { url = "https://files.pythonhosted.org/packages/aa/64/8e8a1d8bd1b6b638d6acb6d41ab2cec7f2067a5b8b4c9175703875159a7c/rpds_py-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:75a810b7664c17f24bf2ffd7f92416c00ec84b49bb68e6a0d93e542406336b56", size = 564306, upload_time = "2025-03-26T14:53:44.2Z" }, + { url = "https://files.pythonhosted.org/packages/68/1c/a7eac8d8ed8cb234a9b1064647824c387753343c3fab6ed7c83481ed0be7/rpds_py-0.24.0-cp312-cp312-win32.whl", hash = "sha256:f6016bd950be4dcd047b7475fdf55fb1e1f59fc7403f387be0e8123e4a576d30", size = 224281, upload_time = "2025-03-26T14:53:45.769Z" }, + { url = "https://files.pythonhosted.org/packages/bb/46/b8b5424d1d21f2f2f3f2d468660085318d4f74a8df8289e3dd6ad224d488/rpds_py-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034", size = 239719, upload_time = "2025-03-26T14:53:47.187Z" }, + { url = "https://files.pythonhosted.org/packages/9d/c3/3607abc770395bc6d5a00cb66385a5479fb8cd7416ddef90393b17ef4340/rpds_py-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2d8e4508e15fc05b31285c4b00ddf2e0eb94259c2dc896771966a163122a0c", size = 367072, upload_time = "2025-03-26T14:53:48.686Z" }, + { url = "https://files.pythonhosted.org/packages/d8/35/8c7ee0fe465793e3af3298dc5a9f3013bd63e7a69df04ccfded8293a4982/rpds_py-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f00c16e089282ad68a3820fd0c831c35d3194b7cdc31d6e469511d9bffc535c", size = 351919, upload_time = "2025-03-26T14:53:50.229Z" }, + { url = "https://files.pythonhosted.org/packages/91/d3/7e1b972501eb5466b9aca46a9c31bcbbdc3ea5a076e9ab33f4438c1d069d/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951cc481c0c395c4a08639a469d53b7d4afa252529a085418b82a6b43c45c240", size = 390360, upload_time = "2025-03-26T14:53:51.909Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a8/ccabb50d3c91c26ad01f9b09a6a3b03e4502ce51a33867c38446df9f896b/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9ca89938dff18828a328af41ffdf3902405a19f4131c88e22e776a8e228c5a8", size = 400704, upload_time = "2025-03-26T14:53:53.47Z" }, + { url = "https://files.pythonhosted.org/packages/53/ae/5fa5bf0f3bc6ce21b5ea88fc0ecd3a439e7cb09dd5f9ffb3dbe1b6894fc5/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0ef550042a8dbcd657dfb284a8ee00f0ba269d3f2286b0493b15a5694f9fe8", size = 450839, upload_time = "2025-03-26T14:53:55.005Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ac/c4e18b36d9938247e2b54f6a03746f3183ca20e1edd7d3654796867f5100/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2356688e5d958c4d5cb964af865bea84db29971d3e563fb78e46e20fe1848b", size = 441494, upload_time = "2025-03-26T14:53:57.047Z" }, + { url = "https://files.pythonhosted.org/packages/bf/08/b543969c12a8f44db6c0f08ced009abf8f519191ca6985509e7c44102e3c/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78884d155fd15d9f64f5d6124b486f3d3f7fd7cd71a78e9670a0f6f6ca06fb2d", size = 393185, upload_time = "2025-03-26T14:53:59.032Z" }, + { url = "https://files.pythonhosted.org/packages/da/7e/f6eb6a7042ce708f9dfc781832a86063cea8a125bbe451d663697b51944f/rpds_py-0.24.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a4a535013aeeef13c5532f802708cecae8d66c282babb5cd916379b72110cf7", size = 426168, upload_time = "2025-03-26T14:54:00.661Z" }, + { url = "https://files.pythonhosted.org/packages/38/b0/6cd2bb0509ac0b51af4bb138e145b7c4c902bb4b724d6fd143689d6e0383/rpds_py-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:84e0566f15cf4d769dade9b366b7b87c959be472c92dffb70462dd0844d7cbad", size = 567622, upload_time = "2025-03-26T14:54:02.312Z" }, + { url = "https://files.pythonhosted.org/packages/64/b0/c401f4f077547d98e8b4c2ec6526a80e7cb04f519d416430ec1421ee9e0b/rpds_py-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:823e74ab6fbaa028ec89615ff6acb409e90ff45580c45920d4dfdddb069f2120", size = 595435, upload_time = "2025-03-26T14:54:04.388Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ec/7993b6e803294c87b61c85bd63e11142ccfb2373cf88a61ec602abcbf9d6/rpds_py-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c61a2cb0085c8783906b2f8b1f16a7e65777823c7f4d0a6aaffe26dc0d358dd9", size = 563762, upload_time = "2025-03-26T14:54:06.422Z" }, + { url = "https://files.pythonhosted.org/packages/1f/29/4508003204cb2f461dc2b83dd85f8aa2b915bc98fe6046b9d50d4aa05401/rpds_py-0.24.0-cp313-cp313-win32.whl", hash = "sha256:60d9b630c8025b9458a9d114e3af579a2c54bd32df601c4581bd054e85258143", size = 223510, upload_time = "2025-03-26T14:54:08.344Z" }, + { url = "https://files.pythonhosted.org/packages/f9/12/09e048d1814195e01f354155fb772fb0854bd3450b5f5a82224b3a319f0e/rpds_py-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a", size = 239075, upload_time = "2025-03-26T14:54:09.992Z" }, + { url = "https://files.pythonhosted.org/packages/d2/03/5027cde39bb2408d61e4dd0cf81f815949bb629932a6c8df1701d0257fc4/rpds_py-0.24.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:d09dc82af2d3c17e7dd17120b202a79b578d79f2b5424bda209d9966efeed114", size = 362974, upload_time = "2025-03-26T14:54:11.484Z" }, + { url = "https://files.pythonhosted.org/packages/bf/10/24d374a2131b1ffafb783e436e770e42dfdb74b69a2cd25eba8c8b29d861/rpds_py-0.24.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5fc13b44de6419d1e7a7e592a4885b323fbc2f46e1f22151e3a8ed3b8b920405", size = 348730, upload_time = "2025-03-26T14:54:13.145Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d1/1ef88d0516d46cd8df12e5916966dbf716d5ec79b265eda56ba1b173398c/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c347a20d79cedc0a7bd51c4d4b7dbc613ca4e65a756b5c3e57ec84bd43505b47", size = 387627, upload_time = "2025-03-26T14:54:14.711Z" }, + { url = "https://files.pythonhosted.org/packages/4e/35/07339051b8b901ecefd449ebf8e5522e92bcb95e1078818cbfd9db8e573c/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20f2712bd1cc26a3cc16c5a1bfee9ed1abc33d4cdf1aabd297fe0eb724df4272", size = 394094, upload_time = "2025-03-26T14:54:16.961Z" }, + { url = "https://files.pythonhosted.org/packages/dc/62/ee89ece19e0ba322b08734e95441952062391065c157bbd4f8802316b4f1/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad911555286884be1e427ef0dc0ba3929e6821cbeca2194b13dc415a462c7fd", size = 449639, upload_time = "2025-03-26T14:54:19.047Z" }, + { url = "https://files.pythonhosted.org/packages/15/24/b30e9f9e71baa0b9dada3a4ab43d567c6b04a36d1cb531045f7a8a0a7439/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0aeb3329c1721c43c58cae274d7d2ca85c1690d89485d9c63a006cb79a85771a", size = 438584, upload_time = "2025-03-26T14:54:20.722Z" }, + { url = "https://files.pythonhosted.org/packages/28/d9/49f7b8f3b4147db13961e19d5e30077cd0854ccc08487026d2cb2142aa4a/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0f156e9509cee987283abd2296ec816225145a13ed0391df8f71bf1d789e2d", size = 391047, upload_time = "2025-03-26T14:54:22.426Z" }, + { url = "https://files.pythonhosted.org/packages/49/b0/e66918d0972c33a259ba3cd7b7ff10ed8bd91dbcfcbec6367b21f026db75/rpds_py-0.24.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa6800adc8204ce898c8a424303969b7aa6a5e4ad2789c13f8648739830323b7", size = 418085, upload_time = "2025-03-26T14:54:23.949Z" }, + { url = "https://files.pythonhosted.org/packages/e1/6b/99ed7ea0a94c7ae5520a21be77a82306aac9e4e715d4435076ead07d05c6/rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a18fc371e900a21d7392517c6f60fe859e802547309e94313cd8181ad9db004d", size = 564498, upload_time = "2025-03-26T14:54:25.573Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/1cacfee6b800e6fb5f91acecc2e52f17dbf8b0796a7c984b4568b6d70e38/rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9168764133fd919f8dcca2ead66de0105f4ef5659cbb4fa044f7014bed9a1797", size = 590202, upload_time = "2025-03-26T14:54:27.569Z" }, + { url = "https://files.pythonhosted.org/packages/a9/9e/57bd2f9fba04a37cef673f9a66b11ca8c43ccdd50d386c455cd4380fe461/rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f6e3cec44ba05ee5cbdebe92d052f69b63ae792e7d05f1020ac5e964394080c", size = 561771, upload_time = "2025-03-26T14:54:29.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cf/b719120f375ab970d1c297dbf8de1e3c9edd26fe92c0ed7178dd94b45992/rpds_py-0.24.0-cp313-cp313t-win32.whl", hash = "sha256:8ebc7e65ca4b111d928b669713865f021b7773350eeac4a31d3e70144297baba", size = 221195, upload_time = "2025-03-26T14:54:31.581Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e5/22865285789f3412ad0c3d7ec4dc0a3e86483b794be8a5d9ed5a19390900/rpds_py-0.24.0-cp313-cp313t-win_amd64.whl", hash = "sha256:675269d407a257b8c00a6b58205b72eec8231656506c56fd429d924ca00bb350", size = 237354, upload_time = "2025-03-26T14:54:33.199Z" }, + { url = "https://files.pythonhosted.org/packages/65/53/40bcc246a8354530d51a26d2b5b9afd1deacfb0d79e67295cc74df362f52/rpds_py-0.24.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f9e0057a509e096e47c87f753136c9b10d7a91842d8042c2ee6866899a717c0d", size = 378386, upload_time = "2025-03-26T14:55:20.381Z" }, + { url = "https://files.pythonhosted.org/packages/80/b0/5ea97dd2f53e3618560aa1f9674e896e63dff95a9b796879a201bc4c1f00/rpds_py-0.24.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6e109a454412ab82979c5b1b3aee0604eca4bbf9a02693bb9df027af2bfa91a", size = 363440, upload_time = "2025-03-26T14:55:22.121Z" }, + { url = "https://files.pythonhosted.org/packages/57/9d/259b6eada6f747cdd60c9a5eb3efab15f6704c182547149926c38e5bd0d5/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc1c892b1ec1f8cbd5da8de287577b455e388d9c328ad592eabbdcb6fc93bee5", size = 388816, upload_time = "2025-03-26T14:55:23.737Z" }, + { url = "https://files.pythonhosted.org/packages/94/c1/faafc7183712f89f4b7620c3c15979ada13df137d35ef3011ae83e93b005/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c39438c55983d48f4bb3487734d040e22dad200dab22c41e331cee145e7a50d", size = 395058, upload_time = "2025-03-26T14:55:25.468Z" }, + { url = "https://files.pythonhosted.org/packages/6c/96/d7fa9d2a7b7604a61da201cc0306a355006254942093779d7121c64700ce/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d7e8ce990ae17dda686f7e82fd41a055c668e13ddcf058e7fb5e9da20b57793", size = 448692, upload_time = "2025-03-26T14:55:27.535Z" }, + { url = "https://files.pythonhosted.org/packages/96/37/a3146c6eebc65d6d8c96cc5ffdcdb6af2987412c789004213227fbe52467/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ea7f4174d2e4194289cb0c4e172d83e79a6404297ff95f2875cf9ac9bced8ba", size = 446462, upload_time = "2025-03-26T14:55:29.299Z" }, + { url = "https://files.pythonhosted.org/packages/1f/13/6481dfd9ac7de43acdaaa416e3a7da40bc4bb8f5c6ca85e794100aa54596/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb2954155bb8f63bb19d56d80e5e5320b61d71084617ed89efedb861a684baea", size = 390460, upload_time = "2025-03-26T14:55:31.017Z" }, + { url = "https://files.pythonhosted.org/packages/61/e1/37e36bce65e109543cc4ff8d23206908649023549604fa2e7fbeba5342f7/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04f2b712a2206e13800a8136b07aaedc23af3facab84918e7aa89e4be0260032", size = 421609, upload_time = "2025-03-26T14:55:32.84Z" }, + { url = "https://files.pythonhosted.org/packages/20/dd/1f1a923d6cd798b8582176aca8a0784676f1a0449fb6f07fce6ac1cdbfb6/rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:eda5c1e2a715a4cbbca2d6d304988460942551e4e5e3b7457b50943cd741626d", size = 565818, upload_time = "2025-03-26T14:55:34.538Z" }, + { url = "https://files.pythonhosted.org/packages/56/ec/d8da6df6a1eb3a418944a17b1cb38dd430b9e5a2e972eafd2b06f10c7c46/rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:9abc80fe8c1f87218db116016de575a7998ab1629078c90840e8d11ab423ee25", size = 592627, upload_time = "2025-03-26T14:55:36.26Z" }, + { url = "https://files.pythonhosted.org/packages/b3/14/c492b9c7d5dd133e13f211ddea6bb9870f99e4f73932f11aa00bc09a9be9/rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6a727fd083009bc83eb83d6950f0c32b3c94c8b80a9b667c87f4bd1274ca30ba", size = 560885, upload_time = "2025-03-26T14:55:38Z" }, ] [[package]] name = "rsa" -version = "4.9" +version = "4.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/65/7d973b89c4d2351d7fb232c2e452547ddfa243e93131e7cfa766da627b52/rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21", size = 29711 } +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload_time = "2025-04-16T09:51:18.218Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", size = 34315 }, + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload_time = "2025-04-16T09:51:17.142Z" }, ] [[package]] name = "rstr" version = "3.2.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9f/80/d7449656d45a776b7a443ce3af4eb97c4debe416a1a80f60311c7cfd02ff/rstr-3.2.2.tar.gz", hash = "sha256:c4a564d4dfb4472d931d145c43d1cf1ad78c24592142e7755b8866179eeac012", size = 13560 } +sdist = { url = "https://files.pythonhosted.org/packages/9f/80/d7449656d45a776b7a443ce3af4eb97c4debe416a1a80f60311c7cfd02ff/rstr-3.2.2.tar.gz", hash = "sha256:c4a564d4dfb4472d931d145c43d1cf1ad78c24592142e7755b8866179eeac012", size = 13560, upload_time = "2023-10-11T20:07:57.422Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/8c/a0f14f2fcdd846839c478048032b2fc93293deaa936ff6751f27dcf50995/rstr-3.2.2-py3-none-any.whl", hash = "sha256:f39195d38da1748331eeec52f1276e71eb6295e7949beea91a5e9af2340d7b3b", size = 10030 }, + { url = "https://files.pythonhosted.org/packages/c8/8c/a0f14f2fcdd846839c478048032b2fc93293deaa936ff6751f27dcf50995/rstr-3.2.2-py3-none-any.whl", hash = "sha256:f39195d38da1748331eeec52f1276e71eb6295e7949beea91a5e9af2340d7b3b", size = 10030, upload_time = "2023-10-11T20:07:55.873Z" }, ] [[package]] @@ -4890,101 +4992,130 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ruamel-yaml-clib", marker = "python_full_version < '3.13' and platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/46/f44d8be06b85bc7c4d8c95d658be2b68f27711f279bf9dd0612a5e4794f5/ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58", size = 143447 } +sdist = { url = "https://files.pythonhosted.org/packages/ea/46/f44d8be06b85bc7c4d8c95d658be2b68f27711f279bf9dd0612a5e4794f5/ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58", size = 143447, upload_time = "2025-01-06T14:08:51.334Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/36/dfc1ebc0081e6d39924a2cc53654497f967a084a436bb64402dfce4254d9/ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1", size = 117729 }, + { url = "https://files.pythonhosted.org/packages/c2/36/dfc1ebc0081e6d39924a2cc53654497f967a084a436bb64402dfce4254d9/ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1", size = 117729, upload_time = "2025-01-06T14:08:47.471Z" }, ] [[package]] name = "ruamel-yaml-clib" version = "0.2.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/8f/683c6ad562f558cbc4f7c029abcd9599148c51c54b5ef0f24f2638da9fbb/ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6", size = 132224 }, - { url = "https://files.pythonhosted.org/packages/3c/d2/b79b7d695e2f21da020bd44c782490578f300dd44f0a4c57a92575758a76/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e", size = 641480 }, - { url = "https://files.pythonhosted.org/packages/68/6e/264c50ce2a31473a9fdbf4fa66ca9b2b17c7455b31ef585462343818bd6c/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e", size = 739068 }, - { url = "https://files.pythonhosted.org/packages/86/29/88c2567bc893c84d88b4c48027367c3562ae69121d568e8a3f3a8d363f4d/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52", size = 703012 }, - { url = "https://files.pythonhosted.org/packages/11/46/879763c619b5470820f0cd6ca97d134771e502776bc2b844d2adb6e37753/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642", size = 704352 }, - { url = "https://files.pythonhosted.org/packages/02/80/ece7e6034256a4186bbe50dee28cd032d816974941a6abf6a9d65e4228a7/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2", size = 737344 }, - { url = "https://files.pythonhosted.org/packages/f0/ca/e4106ac7e80efbabdf4bf91d3d32fc424e41418458251712f5672eada9ce/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3", size = 714498 }, - { url = "https://files.pythonhosted.org/packages/67/58/b1f60a1d591b771298ffa0428237afb092c7f29ae23bad93420b1eb10703/ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4", size = 100205 }, - { url = "https://files.pythonhosted.org/packages/b4/4f/b52f634c9548a9291a70dfce26ca7ebce388235c93588a1068028ea23fcc/ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb", size = 118185 }, - { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433 }, - { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362 }, - { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118 }, - { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497 }, - { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042 }, - { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831 }, - { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692 }, - { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777 }, - { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523 }, - { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011 }, - { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488 }, - { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066 }, - { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785 }, - { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017 }, - { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270 }, - { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059 }, - { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583 }, - { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190 }, +sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload_time = "2024-10-20T10:10:56.22Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/8f/683c6ad562f558cbc4f7c029abcd9599148c51c54b5ef0f24f2638da9fbb/ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6", size = 132224, upload_time = "2024-10-20T10:12:45.162Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d2/b79b7d695e2f21da020bd44c782490578f300dd44f0a4c57a92575758a76/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e", size = 641480, upload_time = "2024-10-20T10:12:46.758Z" }, + { url = "https://files.pythonhosted.org/packages/68/6e/264c50ce2a31473a9fdbf4fa66ca9b2b17c7455b31ef585462343818bd6c/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e", size = 739068, upload_time = "2024-10-20T10:12:48.605Z" }, + { url = "https://files.pythonhosted.org/packages/86/29/88c2567bc893c84d88b4c48027367c3562ae69121d568e8a3f3a8d363f4d/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52", size = 703012, upload_time = "2024-10-20T10:12:51.124Z" }, + { url = "https://files.pythonhosted.org/packages/11/46/879763c619b5470820f0cd6ca97d134771e502776bc2b844d2adb6e37753/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642", size = 704352, upload_time = "2024-10-21T11:26:41.438Z" }, + { url = "https://files.pythonhosted.org/packages/02/80/ece7e6034256a4186bbe50dee28cd032d816974941a6abf6a9d65e4228a7/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2", size = 737344, upload_time = "2024-10-21T11:26:43.62Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ca/e4106ac7e80efbabdf4bf91d3d32fc424e41418458251712f5672eada9ce/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3", size = 714498, upload_time = "2024-12-11T19:58:15.592Z" }, + { url = "https://files.pythonhosted.org/packages/67/58/b1f60a1d591b771298ffa0428237afb092c7f29ae23bad93420b1eb10703/ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4", size = 100205, upload_time = "2024-10-20T10:12:52.865Z" }, + { url = "https://files.pythonhosted.org/packages/b4/4f/b52f634c9548a9291a70dfce26ca7ebce388235c93588a1068028ea23fcc/ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb", size = 118185, upload_time = "2024-10-20T10:12:54.652Z" }, + { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload_time = "2024-10-20T10:12:55.657Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload_time = "2024-10-20T10:12:57.155Z" }, + { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload_time = "2024-10-20T10:12:58.501Z" }, + { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload_time = "2024-10-20T10:13:00.211Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload_time = "2024-10-21T11:26:46.038Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload_time = "2024-10-21T11:26:47.487Z" }, + { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload_time = "2024-12-11T19:58:17.252Z" }, + { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload_time = "2024-10-20T10:13:01.395Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload_time = "2024-10-20T10:13:02.768Z" }, + { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload_time = "2024-10-20T10:13:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload_time = "2024-10-20T10:13:05.906Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload_time = "2024-10-20T10:13:07.26Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload_time = "2024-10-20T10:13:08.504Z" }, + { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload_time = "2024-10-21T11:26:48.866Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload_time = "2024-10-21T11:26:50.213Z" }, + { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload_time = "2024-12-11T19:58:18.846Z" }, + { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload_time = "2024-10-20T10:13:09.658Z" }, + { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload_time = "2024-10-20T10:13:10.66Z" }, ] [[package]] name = "ruff" -version = "0.11.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d9/11/bcef6784c7e5d200b8a1f5c2ddf53e5da0efec37e6e5a44d163fb97e04ba/ruff-0.11.6.tar.gz", hash = "sha256:bec8bcc3ac228a45ccc811e45f7eb61b950dbf4cf31a67fa89352574b01c7d79", size = 4010053 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/1f/8848b625100ebcc8740c8bac5b5dd8ba97dd4ee210970e98832092c1635b/ruff-0.11.6-py3-none-linux_armv6l.whl", hash = "sha256:d84dcbe74cf9356d1bdb4a78cf74fd47c740bf7bdeb7529068f69b08272239a1", size = 10248105 }, - { url = "https://files.pythonhosted.org/packages/e0/47/c44036e70c6cc11e6ee24399c2a1e1f1e99be5152bd7dff0190e4b325b76/ruff-0.11.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9bc583628e1096148011a5d51ff3c836f51899e61112e03e5f2b1573a9b726de", size = 11001494 }, - { url = "https://files.pythonhosted.org/packages/ed/5b/170444061650202d84d316e8f112de02d092bff71fafe060d3542f5bc5df/ruff-0.11.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f2959049faeb5ba5e3b378709e9d1bf0cab06528b306b9dd6ebd2a312127964a", size = 10352151 }, - { url = "https://files.pythonhosted.org/packages/ff/91/f02839fb3787c678e112c8865f2c3e87cfe1744dcc96ff9fc56cfb97dda2/ruff-0.11.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63c5d4e30d9d0de7fedbfb3e9e20d134b73a30c1e74b596f40f0629d5c28a193", size = 10541951 }, - { url = "https://files.pythonhosted.org/packages/9e/f3/c09933306096ff7a08abede3cc2534d6fcf5529ccd26504c16bf363989b5/ruff-0.11.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a4b9a4e1439f7d0a091c6763a100cef8fbdc10d68593df6f3cfa5abdd9246e", size = 10079195 }, - { url = "https://files.pythonhosted.org/packages/e0/0d/a87f8933fccbc0d8c653cfbf44bedda69c9582ba09210a309c066794e2ee/ruff-0.11.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5edf270223dd622218256569636dc3e708c2cb989242262fe378609eccf1308", size = 11698918 }, - { url = "https://files.pythonhosted.org/packages/52/7d/8eac0bd083ea8a0b55b7e4628428203441ca68cd55e0b67c135a4bc6e309/ruff-0.11.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f55844e818206a9dd31ff27f91385afb538067e2dc0beb05f82c293ab84f7d55", size = 12319426 }, - { url = "https://files.pythonhosted.org/packages/c2/dc/d0c17d875662d0c86fadcf4ca014ab2001f867621b793d5d7eef01b9dcce/ruff-0.11.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d8f782286c5ff562e4e00344f954b9320026d8e3fae2ba9e6948443fafd9ffc", size = 11791012 }, - { url = "https://files.pythonhosted.org/packages/f9/f3/81a1aea17f1065449a72509fc7ccc3659cf93148b136ff2a8291c4bc3ef1/ruff-0.11.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:01c63ba219514271cee955cd0adc26a4083df1956d57847978383b0e50ffd7d2", size = 13949947 }, - { url = "https://files.pythonhosted.org/packages/61/9f/a3e34de425a668284e7024ee6fd41f452f6fa9d817f1f3495b46e5e3a407/ruff-0.11.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15adac20ef2ca296dd3d8e2bedc6202ea6de81c091a74661c3666e5c4c223ff6", size = 11471753 }, - { url = "https://files.pythonhosted.org/packages/df/c5/4a57a86d12542c0f6e2744f262257b2aa5a3783098ec14e40f3e4b3a354a/ruff-0.11.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4dd6b09e98144ad7aec026f5588e493c65057d1b387dd937d7787baa531d9bc2", size = 10417121 }, - { url = "https://files.pythonhosted.org/packages/58/3f/a3b4346dff07ef5b862e2ba06d98fcbf71f66f04cf01d375e871382b5e4b/ruff-0.11.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:45b2e1d6c0eed89c248d024ea95074d0e09988d8e7b1dad8d3ab9a67017a5b03", size = 10073829 }, - { url = "https://files.pythonhosted.org/packages/93/cc/7ed02e0b86a649216b845b3ac66ed55d8aa86f5898c5f1691797f408fcb9/ruff-0.11.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bd40de4115b2ec4850302f1a1d8067f42e70b4990b68838ccb9ccd9f110c5e8b", size = 11076108 }, - { url = "https://files.pythonhosted.org/packages/39/5e/5b09840fef0eff1a6fa1dea6296c07d09c17cb6fb94ed5593aa591b50460/ruff-0.11.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:77cda2dfbac1ab73aef5e514c4cbfc4ec1fbef4b84a44c736cc26f61b3814cd9", size = 11512366 }, - { url = "https://files.pythonhosted.org/packages/6f/4c/1cd5a84a412d3626335ae69f5f9de2bb554eea0faf46deb1f0cb48534042/ruff-0.11.6-py3-none-win32.whl", hash = "sha256:5151a871554be3036cd6e51d0ec6eef56334d74dfe1702de717a995ee3d5b287", size = 10485900 }, - { url = "https://files.pythonhosted.org/packages/42/46/8997872bc44d43df986491c18d4418f1caff03bc47b7f381261d62c23442/ruff-0.11.6-py3-none-win_amd64.whl", hash = "sha256:cce85721d09c51f3b782c331b0abd07e9d7d5f775840379c640606d3159cae0e", size = 11558592 }, - { url = "https://files.pythonhosted.org/packages/d7/6a/65fecd51a9ca19e1477c3879a7fda24f8904174d1275b419422ac00f6eee/ruff-0.11.6-py3-none-win_arm64.whl", hash = "sha256:3567ba0d07fb170b1b48d944715e3294b77f5b7679e8ba258199a250383ccb79", size = 10682766 }, +version = "0.11.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/89/6f9c9674818ac2e9cc2f2b35b704b7768656e6b7c139064fc7ba8fbc99f1/ruff-0.11.7.tar.gz", hash = "sha256:655089ad3224070736dc32844fde783454f8558e71f501cb207485fe4eee23d4", size = 4054861, upload_time = "2025-04-24T18:49:37.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/ec/21927cb906c5614b786d1621dba405e3d44f6e473872e6df5d1a6bca0455/ruff-0.11.7-py3-none-linux_armv6l.whl", hash = "sha256:d29e909d9a8d02f928d72ab7837b5cbc450a5bdf578ab9ebee3263d0a525091c", size = 10245403, upload_time = "2025-04-24T18:48:40.459Z" }, + { url = "https://files.pythonhosted.org/packages/e2/af/fec85b6c2c725bcb062a354dd7cbc1eed53c33ff3aa665165871c9c16ddf/ruff-0.11.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dd1fb86b168ae349fb01dd497d83537b2c5541fe0626e70c786427dd8363aaee", size = 11007166, upload_time = "2025-04-24T18:48:44.742Z" }, + { url = "https://files.pythonhosted.org/packages/31/9a/2d0d260a58e81f388800343a45898fd8df73c608b8261c370058b675319a/ruff-0.11.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d3d7d2e140a6fbbc09033bce65bd7ea29d6a0adeb90b8430262fbacd58c38ada", size = 10378076, upload_time = "2025-04-24T18:48:47.918Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c4/9b09b45051404d2e7dd6d9dbcbabaa5ab0093f9febcae664876a77b9ad53/ruff-0.11.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4809df77de390a1c2077d9b7945d82f44b95d19ceccf0c287c56e4dc9b91ca64", size = 10557138, upload_time = "2025-04-24T18:48:51.707Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5e/f62a1b6669870a591ed7db771c332fabb30f83c967f376b05e7c91bccd14/ruff-0.11.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3a0c2e169e6b545f8e2dba185eabbd9db4f08880032e75aa0e285a6d3f48201", size = 10095726, upload_time = "2025-04-24T18:48:54.243Z" }, + { url = "https://files.pythonhosted.org/packages/45/59/a7aa8e716f4cbe07c3500a391e58c52caf665bb242bf8be42c62adef649c/ruff-0.11.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49b888200a320dd96a68e86736cf531d6afba03e4f6cf098401406a257fcf3d6", size = 11672265, upload_time = "2025-04-24T18:48:57.639Z" }, + { url = "https://files.pythonhosted.org/packages/dd/e3/101a8b707481f37aca5f0fcc3e42932fa38b51add87bfbd8e41ab14adb24/ruff-0.11.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2b19cdb9cf7dae00d5ee2e7c013540cdc3b31c4f281f1dacb5a799d610e90db4", size = 12331418, upload_time = "2025-04-24T18:49:00.697Z" }, + { url = "https://files.pythonhosted.org/packages/dd/71/037f76cbe712f5cbc7b852e4916cd3cf32301a30351818d32ab71580d1c0/ruff-0.11.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64e0ee994c9e326b43539d133a36a455dbaab477bc84fe7bfbd528abe2f05c1e", size = 11794506, upload_time = "2025-04-24T18:49:03.545Z" }, + { url = "https://files.pythonhosted.org/packages/ca/de/e450b6bab1fc60ef263ef8fcda077fb4977601184877dce1c59109356084/ruff-0.11.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bad82052311479a5865f52c76ecee5d468a58ba44fb23ee15079f17dd4c8fd63", size = 13939084, upload_time = "2025-04-24T18:49:07.159Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2c/1e364cc92970075d7d04c69c928430b23e43a433f044474f57e425cbed37/ruff-0.11.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7940665e74e7b65d427b82bffc1e46710ec7f30d58b4b2d5016e3f0321436502", size = 11450441, upload_time = "2025-04-24T18:49:11.41Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7d/1b048eb460517ff9accd78bca0fa6ae61df2b276010538e586f834f5e402/ruff-0.11.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:169027e31c52c0e36c44ae9a9c7db35e505fee0b39f8d9fca7274a6305295a92", size = 10441060, upload_time = "2025-04-24T18:49:14.184Z" }, + { url = "https://files.pythonhosted.org/packages/3a/57/8dc6ccfd8380e5ca3d13ff7591e8ba46a3b330323515a4996b991b10bd5d/ruff-0.11.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:305b93f9798aee582e91e34437810439acb28b5fc1fee6b8205c78c806845a94", size = 10058689, upload_time = "2025-04-24T18:49:17.559Z" }, + { url = "https://files.pythonhosted.org/packages/23/bf/20487561ed72654147817885559ba2aa705272d8b5dee7654d3ef2dbf912/ruff-0.11.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a681db041ef55550c371f9cd52a3cf17a0da4c75d6bd691092dfc38170ebc4b6", size = 11073703, upload_time = "2025-04-24T18:49:20.247Z" }, + { url = "https://files.pythonhosted.org/packages/9d/27/04f2db95f4ef73dccedd0c21daf9991cc3b7f29901a4362057b132075aa4/ruff-0.11.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:07f1496ad00a4a139f4de220b0c97da6d4c85e0e4aa9b2624167b7d4d44fd6b6", size = 11532822, upload_time = "2025-04-24T18:49:23.765Z" }, + { url = "https://files.pythonhosted.org/packages/e1/72/43b123e4db52144c8add336581de52185097545981ff6e9e58a21861c250/ruff-0.11.7-py3-none-win32.whl", hash = "sha256:f25dfb853ad217e6e5f1924ae8a5b3f6709051a13e9dad18690de6c8ff299e26", size = 10362436, upload_time = "2025-04-24T18:49:27.377Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a0/3e58cd76fdee53d5c8ce7a56d84540833f924ccdf2c7d657cb009e604d82/ruff-0.11.7-py3-none-win_amd64.whl", hash = "sha256:0a931d85959ceb77e92aea4bbedfded0a31534ce191252721128f77e5ae1f98a", size = 11566676, upload_time = "2025-04-24T18:49:30.938Z" }, + { url = "https://files.pythonhosted.org/packages/68/ca/69d7c7752bce162d1516e5592b1cc6b6668e9328c0d270609ddbeeadd7cf/ruff-0.11.7-py3-none-win_arm64.whl", hash = "sha256:778c1e5d6f9e91034142dfd06110534ca13220bfaad5c3735f6cb844654f6177", size = 10677936, upload_time = "2025-04-24T18:49:34.392Z" }, ] [[package]] name = "s3transfer" -version = "0.11.4" +version = "0.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0f/ec/aa1a215e5c126fe5decbee2e107468f51d9ce190b9763cb649f76bb45938/s3transfer-0.11.4.tar.gz", hash = "sha256:559f161658e1cf0a911f45940552c696735f5c74e64362e515f333ebed87d679", size = 148419 } +sdist = { url = "https://files.pythonhosted.org/packages/fc/9e/73b14aed38ee1f62cd30ab93cd0072dec7fb01f3033d116875ae3e7b8b44/s3transfer-0.12.0.tar.gz", hash = "sha256:8ac58bc1989a3fdb7c7f3ee0918a66b160d038a147c7b5db1500930a607e9a1c", size = 149178, upload_time = "2025-04-22T21:08:09.787Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/86/62/8d3fc3ec6640161a5649b2cddbbf2b9fa39c92541225b33f117c37c5a2eb/s3transfer-0.11.4-py3-none-any.whl", hash = "sha256:ac265fa68318763a03bf2dc4f39d5cbd6a9e178d81cc9483ad27da33637e320d", size = 84412 }, + { url = "https://files.pythonhosted.org/packages/89/64/d2b49620039b82688aeebd510bd62ff4cdcdb86cbf650cc72ae42c5254a3/s3transfer-0.12.0-py3-none-any.whl", hash = "sha256:35b314d7d82865756edab59f7baebc6b477189e6ab4c53050e28c1de4d9cce18", size = 84773, upload_time = "2025-04-22T21:08:08.265Z" }, ] [[package]] name = "s5cmd" version = "0.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/ec/7d996b105d299d2189928732d4a6034e9237d24a6a12c57a0f5e718932eb/s5cmd-0.2.0.tar.gz", hash = "sha256:2e8055e2579ae11d8f251afbdc2baac93333f2305f953b080f92ce9629675f76", size = 13092 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/ec/7d996b105d299d2189928732d4a6034e9237d24a6a12c57a0f5e718932eb/s5cmd-0.2.0.tar.gz", hash = "sha256:2e8055e2579ae11d8f251afbdc2baac93333f2305f953b080f92ce9629675f76", size = 13092, upload_time = "2024-05-14T21:23:38.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/01/2f005cf78b96c2e72184eff2de026d64f502fef8c874d1ce57a877585a2d/s5cmd-0.2.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cb797e43fe2a2687a341a57b7795fd7ecebbfb1aa59451bd9b086073e606d445", size = 4732484, upload_time = "2024-05-14T21:23:14.262Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7c/255b7fcccff89c3b2ec816f54f31692290c71750a00cbea01dcdd88a6887/s5cmd-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045844878f2ca345f159333abc321c3d1bcf0acb436778c43c90b10393f6a818", size = 4277121, upload_time = "2024-05-14T21:23:17.025Z" }, + { url = "https://files.pythonhosted.org/packages/c5/54/53f8f4de0752e63b92844215cfaead96b0b5ab748f7809a052e443009230/s5cmd-0.2.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4dc3c19cee6e0447bcc68554bb39ed9ab3aeaf463b1c823cb61a175b6254fa9", size = 4158407, upload_time = "2024-05-14T21:23:19.219Z" }, + { url = "https://files.pythonhosted.org/packages/73/cd/aefd5f093a17ec9f55072a976d135711b16993632fbebbe1824f1d038b1a/s5cmd-0.2.0-py3-none-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5befb0461ad7dd57ba80d6d35b688a4ac9c34179e0690faeec3aad0243adb127", size = 4744781, upload_time = "2024-05-14T21:23:20.7Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ce/5872c73dd7d54c4648772bda0a943b65e15d7056fef24ee7187e4c74e05f/s5cmd-0.2.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc07ded42370ec931aa6b642a70274669d11a332a81f825eaa1093f65245034e", size = 4744785, upload_time = "2024-05-14T21:23:22.644Z" }, + { url = "https://files.pythonhosted.org/packages/92/6f/1e179f96638c38cab32334c35cdec7378b349a5f36a90e5b1fd2e5b210fa/s5cmd-0.2.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fb992f69dcf019e89a9e025c9105d2340b694f68234e4fb86ebbb1827f6046bf", size = 4277108, upload_time = "2024-05-14T21:23:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/ea/68/a1fe36d8ff39c1050f5ba5199a47c5763499f5fe02b4a71a0048446e571b/s5cmd-0.2.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:65fe3aad880625c61b3e210a17c2ddf110d1e3da5f7c63c9d091ce40db28952f", size = 4744763, upload_time = "2024-05-14T21:23:26.481Z" }, + { url = "https://files.pythonhosted.org/packages/ff/09/d347b2e4adce3b610389caab752b03f64285221e555e157e56c1dfe2346e/s5cmd-0.2.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:b6974bc842baa6bfec31121e798fbe08f8a254a617afbdbc47f166c232070b26", size = 4158396, upload_time = "2024-05-14T21:23:28.594Z" }, + { url = "https://files.pythonhosted.org/packages/cf/91/13963410e27453e3de97432f29037630c82e806e35eb4d9dc316b102e890/s5cmd-0.2.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6de4ce8d3ee3c92522fcfd98460bece854026b5f43020c59e0a209c8bcdc083a", size = 4744764, upload_time = "2024-05-14T21:23:30.028Z" }, + { url = "https://files.pythonhosted.org/packages/72/41/beff9ba3da18dfd3757d794d29287a3e2551dda5dfe01a36dee81f1308fd/s5cmd-0.2.0-py3-none-win32.whl", hash = "sha256:2589d2cf6eab6d06fb5dc7e53160daa46c0d5295d971c3ab7567d74001799e44", size = 4867734, upload_time = "2024-05-14T21:23:32.664Z" }, + { url = "https://files.pythonhosted.org/packages/28/b3/2169c2abf2086f5586e1670a0ce765af24a9b560461ca12ce663e6648618/s5cmd-0.2.0-py3-none-win_amd64.whl", hash = "sha256:8d1b8b08e5aabd81473bc8826d403ffe17d435f8972ec05c0c22b29999fef491", size = 4867738, upload_time = "2024-05-14T21:23:34.091Z" }, + { url = "https://files.pythonhosted.org/packages/6c/5d/7247fb2deb8857f8cfef16f28b1a79a85042fee19932c56533211c36585a/s5cmd-0.2.0-py3-none-win_arm64.whl", hash = "sha256:1cda970814aa2e15e4add42a3005a1a6ea7bd23212fc704d7273e7372fb228db", size = 4376083, upload_time = "2024-05-14T21:23:35.649Z" }, +] + +[[package]] +name = "scalene" +version = "1.5.51" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cloudpickle" }, + { name = "jinja2" }, + { name = "numpy" }, + { name = "nvidia-ml-py", marker = "sys_platform != 'darwin'" }, + { name = "psutil" }, + { name = "pydantic" }, + { name = "rich" }, + { name = "wheel" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/a4/e35a4e22a309ad6a886f0f3a66fd25ae1d0317d1aa81d21b79b3fe1b7cb9/scalene-1.5.51.tar.gz", hash = "sha256:ad33b6ce79239b5a6aff4ec78fa576fe2076b46f78c4c7e5fbc78a927b83374d", size = 9168270, upload_time = "2025-01-27T22:26:31.834Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/01/2f005cf78b96c2e72184eff2de026d64f502fef8c874d1ce57a877585a2d/s5cmd-0.2.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cb797e43fe2a2687a341a57b7795fd7ecebbfb1aa59451bd9b086073e606d445", size = 4732484 }, - { url = "https://files.pythonhosted.org/packages/ee/7c/255b7fcccff89c3b2ec816f54f31692290c71750a00cbea01dcdd88a6887/s5cmd-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045844878f2ca345f159333abc321c3d1bcf0acb436778c43c90b10393f6a818", size = 4277121 }, - { url = "https://files.pythonhosted.org/packages/c5/54/53f8f4de0752e63b92844215cfaead96b0b5ab748f7809a052e443009230/s5cmd-0.2.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4dc3c19cee6e0447bcc68554bb39ed9ab3aeaf463b1c823cb61a175b6254fa9", size = 4158407 }, - { url = "https://files.pythonhosted.org/packages/73/cd/aefd5f093a17ec9f55072a976d135711b16993632fbebbe1824f1d038b1a/s5cmd-0.2.0-py3-none-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5befb0461ad7dd57ba80d6d35b688a4ac9c34179e0690faeec3aad0243adb127", size = 4744781 }, - { url = "https://files.pythonhosted.org/packages/6c/ce/5872c73dd7d54c4648772bda0a943b65e15d7056fef24ee7187e4c74e05f/s5cmd-0.2.0-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc07ded42370ec931aa6b642a70274669d11a332a81f825eaa1093f65245034e", size = 4744785 }, - { url = "https://files.pythonhosted.org/packages/92/6f/1e179f96638c38cab32334c35cdec7378b349a5f36a90e5b1fd2e5b210fa/s5cmd-0.2.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fb992f69dcf019e89a9e025c9105d2340b694f68234e4fb86ebbb1827f6046bf", size = 4277108 }, - { url = "https://files.pythonhosted.org/packages/ea/68/a1fe36d8ff39c1050f5ba5199a47c5763499f5fe02b4a71a0048446e571b/s5cmd-0.2.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:65fe3aad880625c61b3e210a17c2ddf110d1e3da5f7c63c9d091ce40db28952f", size = 4744763 }, - { url = "https://files.pythonhosted.org/packages/ff/09/d347b2e4adce3b610389caab752b03f64285221e555e157e56c1dfe2346e/s5cmd-0.2.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:b6974bc842baa6bfec31121e798fbe08f8a254a617afbdbc47f166c232070b26", size = 4158396 }, - { url = "https://files.pythonhosted.org/packages/cf/91/13963410e27453e3de97432f29037630c82e806e35eb4d9dc316b102e890/s5cmd-0.2.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6de4ce8d3ee3c92522fcfd98460bece854026b5f43020c59e0a209c8bcdc083a", size = 4744764 }, - { url = "https://files.pythonhosted.org/packages/72/41/beff9ba3da18dfd3757d794d29287a3e2551dda5dfe01a36dee81f1308fd/s5cmd-0.2.0-py3-none-win32.whl", hash = "sha256:2589d2cf6eab6d06fb5dc7e53160daa46c0d5295d971c3ab7567d74001799e44", size = 4867734 }, - { url = "https://files.pythonhosted.org/packages/28/b3/2169c2abf2086f5586e1670a0ce765af24a9b560461ca12ce663e6648618/s5cmd-0.2.0-py3-none-win_amd64.whl", hash = "sha256:8d1b8b08e5aabd81473bc8826d403ffe17d435f8972ec05c0c22b29999fef491", size = 4867738 }, - { url = "https://files.pythonhosted.org/packages/6c/5d/7247fb2deb8857f8cfef16f28b1a79a85042fee19932c56533211c36585a/s5cmd-0.2.0-py3-none-win_arm64.whl", hash = "sha256:1cda970814aa2e15e4add42a3005a1a6ea7bd23212fc704d7273e7372fb228db", size = 4376083 }, + { url = "https://files.pythonhosted.org/packages/28/b6/298a623ec556f9548ad3329516b6e04c5edbe81e28c7b14d1ccd3e51f8c6/scalene-1.5.51-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:bc9b73db7fc9d088406129a2dae9921a11813c937b1a9084001a86070ca0a554", size = 973953, upload_time = "2025-01-27T22:26:23.19Z" }, + { url = "https://files.pythonhosted.org/packages/cb/93/880af1c86e0df7d5fcb060c7fdc18dfe2326efd08b902edf0b1eb1223625/scalene-1.5.51-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:5c5e216dd604641e8ffd8cbdd2c8682e98cb75afcd4992e5606f3894d453cd68", size = 973363, upload_time = "2025-01-27T22:26:28.854Z" }, + { url = "https://files.pythonhosted.org/packages/9c/7d/7f11218e13c40ae78f63e9624be8d4996e7b8a295814ae45ade4a3ecd9f1/scalene-1.5.51-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:69e01a63de13190ca4c671139f7d94e3d6e34bf38941dbd60f1bda922190530a", size = 1247402, upload_time = "2025-01-27T22:22:37.919Z" }, + { url = "https://files.pythonhosted.org/packages/aa/39/ace88bf09bca876ae9bd5009042dc95e4b9aae01c24dfc03cae33360d486/scalene-1.5.51-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:b9daaefdfc2c20d22aa1ad261cc5965fd73f2dd184fba126be4dc19aae44d141", size = 973804, upload_time = "2025-01-27T22:27:13.173Z" }, + { url = "https://files.pythonhosted.org/packages/db/f7/657b5fdbbf6eed0f1007f97f8992ef945dd3bc0dafb490cc5e660c40d374/scalene-1.5.51-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:4c12d714ce6664c2bd1adab72640bf65fbd9ca2c31164f26b99e898dfe53b754", size = 973209, upload_time = "2025-01-27T22:26:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/11/de/29a375bc1dc77033c5abbf7c465056557fb3f927eceb623c4b085f5dbf1d/scalene-1.5.51-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95fc48f2766f9e6c6b1d51942fe8949d422d0025c17471d80f4a67452508053a", size = 1247804, upload_time = "2025-01-27T22:22:38.842Z" }, + { url = "https://files.pythonhosted.org/packages/48/cb/df80c9f6b0b9b1748b9410e7a10a2f8f791d8588a1e0496bc7d0c6eecf71/scalene-1.5.51-cp312-cp312-win_amd64.whl", hash = "sha256:e53393ffe3fa67d1952b0b7eb8d7787b16f5569553433d6204416591c2e884a3", size = 862381, upload_time = "2025-01-27T22:22:47.273Z" }, + { url = "https://files.pythonhosted.org/packages/c2/33/b385ffba87420535353977d8f5cafe3c0678430681720f61c2bad677589b/scalene-1.5.51-cp313-cp313-macosx_13_0_universal2.whl", hash = "sha256:2a194c427fabff8e0a6b7fe2f3827b6e24db84f830c4bff8a0742d59fb2804ed", size = 973797, upload_time = "2025-01-27T22:27:31.56Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a4/bc99cdab5309e5143d0c0780c44fa3bf747b550af2beaa9cbc2622a844bc/scalene-1.5.51-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:d563356192ff59a4d5e80a921db6d960ebbda6a4e36765cebd2b57b7ca341cc4", size = 973208, upload_time = "2025-01-27T22:27:11.631Z" }, + { url = "https://files.pythonhosted.org/packages/23/98/587b1f21598fc4bba2195c9061ed76886419a1ec168e77865d0139de26eb/scalene-1.5.51-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:839c22aad181345ee19fdf8a7c91d9e232583f471df318e1683e381f8d7b28f0", size = 1247714, upload_time = "2025-01-27T22:22:39.376Z" }, + { url = "https://files.pythonhosted.org/packages/09/62/a3ea6afe4498a3cc2d45c7e544a766ff44449cc25596cbbea43df6c56d01/scalene-1.5.51-cp313-cp313-win_amd64.whl", hash = "sha256:bdb261a2f7f17724fe27e4c7d703136a75dd45da940c18db7c6cbe8937d5315f", size = 862381, upload_time = "2025-01-27T22:23:03.93Z" }, ] [[package]] @@ -4999,40 +5130,40 @@ dependencies = [ { name = "urllib3", extra = ["socks"] }, { name = "websocket-client" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e0/bf/642cce8b5a9edad8e4880fdefbeb24f69bec2086b1121c63f883c412b797/selenium-4.31.0.tar.gz", hash = "sha256:441cffc436a2e6659fe3cfb012692435652efd38b0d368d16f661a5db47825f5", size = 855418 } +sdist = { url = "https://files.pythonhosted.org/packages/e0/bf/642cce8b5a9edad8e4880fdefbeb24f69bec2086b1121c63f883c412b797/selenium-4.31.0.tar.gz", hash = "sha256:441cffc436a2e6659fe3cfb012692435652efd38b0d368d16f661a5db47825f5", size = 855418, upload_time = "2025-04-05T00:43:06.447Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/53/212db779d2481b0a8428365960596f8d5a4d482ae12c441d0507fd54aaf2/selenium-4.31.0-py3-none-any.whl", hash = "sha256:7b8b8d5e424d7133cb7aa656263b19ac505ec26d65c0f921a696e7e2c5ccd95b", size = 9350584 }, + { url = "https://files.pythonhosted.org/packages/32/53/212db779d2481b0a8428365960596f8d5a4d482ae12c441d0507fd54aaf2/selenium-4.31.0-py3-none-any.whl", hash = "sha256:7b8b8d5e424d7133cb7aa656263b19ac505ec26d65c0f921a696e7e2c5ccd95b", size = 9350584, upload_time = "2025-04-05T00:43:04.04Z" }, ] [[package]] name = "send2trash" version = "1.8.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fd/3a/aec9b02217bb79b87bbc1a21bc6abc51e3d5dcf65c30487ac96c0908c722/Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf", size = 17394 } +sdist = { url = "https://files.pythonhosted.org/packages/fd/3a/aec9b02217bb79b87bbc1a21bc6abc51e3d5dcf65c30487ac96c0908c722/Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf", size = 17394, upload_time = "2024-04-07T00:01:09.267Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072 }, + { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072, upload_time = "2024-04-07T00:01:07.438Z" }, ] [[package]] name = "sentry-sdk" -version = "2.26.1" +version = "2.27.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/26/099631caa51abffb1fd9e08c2138bc6681d3f288a5936c2fc4e054729611/sentry_sdk-2.26.1.tar.gz", hash = "sha256:759e019c41551a21519a95e6cef6d91fb4af1054761923dadaee2e6eca9c02c7", size = 323099 } +sdist = { url = "https://files.pythonhosted.org/packages/cf/b6/a92ae6fa6d7e6e536bc586776b1669b84fb724dfe21b8ff08297f2d7c969/sentry_sdk-2.27.0.tar.gz", hash = "sha256:90f4f883f9eff294aff59af3d58c2d1b64e3927b28d5ada2b9b41f5aeda47daf", size = 323556, upload_time = "2025-04-24T10:09:37.927Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/32/0a30b4fafdb3d26d133f99bb566aaa6000004ee7f2c4b72aafea9237ab7e/sentry_sdk-2.26.1-py2.py3-none-any.whl", hash = "sha256:e99390e3f217d13ddcbaeaed08789f1ca614d663b345b9da42e35ad6b60d696a", size = 340558 }, + { url = "https://files.pythonhosted.org/packages/dd/8b/fb496a45854e37930b57564a20fb8e90dd0f8b6add0491527c00f2163b00/sentry_sdk-2.27.0-py2.py3-none-any.whl", hash = "sha256:c58935bfff8af6a0856d37e8adebdbc7b3281c2b632ec823ef03cd108d216ff0", size = 340786, upload_time = "2025-04-24T10:09:35.897Z" }, ] [[package]] name = "setuptools" -version = "78.1.0" +version = "79.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/5a/0db4da3bc908df06e5efae42b44e75c81dd52716e10192ff36d0c1c8e379/setuptools-78.1.0.tar.gz", hash = "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54", size = 1367827 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/71/b6365e6325b3290e14957b2c3a804a529968c77a049b2ed40c095f749707/setuptools-79.0.1.tar.gz", hash = "sha256:128ce7b8f33c3079fd1b067ecbb4051a66e8526e7b65f6cec075dfc650ddfa88", size = 1367909, upload_time = "2025-04-23T22:20:59.241Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/21/f43f0a1fa8b06b32812e0975981f4677d28e0f3271601dc88ac5a5b83220/setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8", size = 1256108 }, + { url = "https://files.pythonhosted.org/packages/0d/6d/b4752b044bf94cb802d88a888dc7d288baaf77d7910b7dedda74b5ceea0c/setuptools-79.0.1-py3-none-any.whl", hash = "sha256:e147c0549f27767ba362f9da434eab9c5dc0045d5304feb602a0af001089fc51", size = 1256281, upload_time = "2025-04-23T22:20:56.768Z" }, ] [[package]] @@ -5042,49 +5173,49 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/fe/3b0d2f828ffaceadcdcb51b75b9c62d98e62dd95ce575278de35f24a1c20/shapely-2.1.0.tar.gz", hash = "sha256:2cbe90e86fa8fc3ca8af6ffb00a77b246b918c7cf28677b7c21489b678f6b02e", size = 313617 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/37/ae448f06f363ff3dfe4bae890abd842c4e3e9edaf01245dbc9b97008c9e6/shapely-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8323031ef7c1bdda7a92d5ddbc7b6b62702e73ba37e9a8ccc8da99ec2c0b87c", size = 1820974 }, - { url = "https://files.pythonhosted.org/packages/78/da/ea2a898e93c6953c5eef353a0e1781a0013a1352f2b90aa9ab0b800e0c75/shapely-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4da7c6cd748d86ec6aace99ad17129d30954ccf5e73e9911cdb5f0fa9658b4f8", size = 1624137 }, - { url = "https://files.pythonhosted.org/packages/64/4a/f903f82f0fabcd3f43ea2e8132cabda079119247330a9fe58018c39c4e22/shapely-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f0cdf85ff80831137067e7a237085a3ee72c225dba1b30beef87f7d396cf02b", size = 2957161 }, - { url = "https://files.pythonhosted.org/packages/92/07/3e2738c542d73182066196b8ce99388cb537d19e300e428d50b1537e3b21/shapely-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f2be5d79aac39886f23000727cf02001aef3af8810176c29ee12cdc3ef3a50", size = 3078530 }, - { url = "https://files.pythonhosted.org/packages/82/08/32210e63d8f8af9142d37c2433ece4846862cdac91a0fe66f040780a71bd/shapely-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:21a4515009f56d7a159cf5c2554264e82f56405b4721f9a422cb397237c5dca8", size = 3902208 }, - { url = "https://files.pythonhosted.org/packages/19/0e/0abb5225f8a32fbdb615476637038a7d2db40c0af46d1bb3a08b869bee39/shapely-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:15cebc323cec2cb6b2eaa310fdfc621f6dbbfaf6bde336d13838fcea76c885a9", size = 4082863 }, - { url = "https://files.pythonhosted.org/packages/f8/1b/7cd816fd388108c872ab7e2930180b02d0c34891213f361e4a66e5e032f2/shapely-2.1.0-cp311-cp311-win32.whl", hash = "sha256:cad51b7a5c8f82f5640472944a74f0f239123dde9a63042b3c5ea311739b7d20", size = 1527488 }, - { url = "https://files.pythonhosted.org/packages/fd/28/7bb5b1944d4002d4b2f967762018500381c3b532f98e456bbda40c3ded68/shapely-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:d4005309dde8658e287ad9c435c81877f6a95a9419b932fa7a1f34b120f270ae", size = 1708311 }, - { url = "https://files.pythonhosted.org/packages/4e/d1/6a9371ec39d3ef08e13225594e6c55b045209629afd9e6d403204507c2a8/shapely-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53e7ee8bd8609cf12ee6dce01ea5affe676976cf7049315751d53d8db6d2b4b2", size = 1830732 }, - { url = "https://files.pythonhosted.org/packages/32/87/799e3e48be7ce848c08509b94d2180f4ddb02e846e3c62d0af33da4d78d3/shapely-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3cab20b665d26dbec0b380e15749bea720885a481fa7b1eedc88195d4a98cfa4", size = 1638404 }, - { url = "https://files.pythonhosted.org/packages/85/00/6665d77f9dd09478ab0993b8bc31668aec4fd3e5f1ddd1b28dd5830e47be/shapely-2.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4a38b39a09340273c3c92b3b9a374272a12cc7e468aeeea22c1c46217a03e5c", size = 2945316 }, - { url = "https://files.pythonhosted.org/packages/34/49/738e07d10bbc67cae0dcfe5a484c6e518a517f4f90550dda2adf3a78b9f2/shapely-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:edaec656bdd9b71278b98e6f77c464b1c3b2daa9eace78012ff0f0b4b5b15b04", size = 3063099 }, - { url = "https://files.pythonhosted.org/packages/88/b8/138098674559362ab29f152bff3b6630de423378fbb0324812742433a4ef/shapely-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c8a732ddd9b25e7a54aa748e7df8fd704e23e5d5d35b7d376d80bffbfc376d04", size = 3887873 }, - { url = "https://files.pythonhosted.org/packages/67/a8/fdae7c2db009244991d86f4d2ca09d2f5ccc9d41c312c3b1ee1404dc55da/shapely-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9c93693ad8adfdc9138a5a2d42da02da94f728dd2e82d2f0f442f10e25027f5f", size = 4067004 }, - { url = "https://files.pythonhosted.org/packages/ed/78/17e17d91b489019379df3ee1afc4bd39787b232aaa1d540f7d376f0280b7/shapely-2.1.0-cp312-cp312-win32.whl", hash = "sha256:d8ac6604eefe807e71a908524de23a37920133a1729fe3a4dfe0ed82c044cbf4", size = 1527366 }, - { url = "https://files.pythonhosted.org/packages/b8/bd/9249bd6dda948441e25e4fb14cbbb5205146b0fff12c66b19331f1ff2141/shapely-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:f4f47e631aa4f9ec5576eac546eb3f38802e2f82aeb0552f9612cb9a14ece1db", size = 1708265 }, - { url = "https://files.pythonhosted.org/packages/8d/77/4e368704b2193e74498473db4461d697cc6083c96f8039367e59009d78bd/shapely-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b64423295b563f43a043eb786e7a03200ebe68698e36d2b4b1c39f31dfb50dfb", size = 1830029 }, - { url = "https://files.pythonhosted.org/packages/71/3c/d888597bda680e4de987316b05ca9db07416fa29523beff64f846503302f/shapely-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1b5578f45adc25b235b22d1ccb9a0348c8dc36f31983e57ea129a88f96f7b870", size = 1637999 }, - { url = "https://files.pythonhosted.org/packages/03/8d/ee0e23b7ef88fba353c63a81f1f329c77f5703835db7b165e7c0b8b7f839/shapely-2.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a7e83d383b27f02b684e50ab7f34e511c92e33b6ca164a6a9065705dd64bcb", size = 2929348 }, - { url = "https://files.pythonhosted.org/packages/d1/a7/5c9cb413e4e2ce52c16be717e94abd40ce91b1f8974624d5d56154c5d40b/shapely-2.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:942031eb4d8f7b3b22f43ba42c09c7aa3d843aa10d5cc1619fe816e923b66e55", size = 3048973 }, - { url = "https://files.pythonhosted.org/packages/84/23/45b90c0bd2157b238490ca56ef2eedf959d3514c7d05475f497a2c88b6d9/shapely-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d2843c456a2e5627ee6271800f07277c0d2652fb287bf66464571a057dbc00b3", size = 3873148 }, - { url = "https://files.pythonhosted.org/packages/c0/bc/ed7d5d37f5395166042576f0c55a12d7e56102799464ba7ea3a72a38c769/shapely-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8c4b17469b7f39a5e6a7cfea79f38ae08a275427f41fe8b48c372e1449147908", size = 4052655 }, - { url = "https://files.pythonhosted.org/packages/c0/8f/a1dafbb10d20d1c569f2db3fb1235488f624dafe8469e8ce65356800ba31/shapely-2.1.0-cp313-cp313-win32.whl", hash = "sha256:30e967abd08fce49513d4187c01b19f139084019f33bec0673e8dbeb557c45e4", size = 1526600 }, - { url = "https://files.pythonhosted.org/packages/e3/f0/9f8cdf2258d7aed742459cea51c70d184de92f5d2d6f5f7f1ded90a18c31/shapely-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:1dc8d4364483a14aba4c844b7bd16a6fa3728887e2c33dfa1afa34a3cf4d08a5", size = 1707115 }, - { url = "https://files.pythonhosted.org/packages/75/ed/32952df461753a65b3e5d24c8efb361d3a80aafaef0b70d419063f6f2c11/shapely-2.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:673e073fea099d1c82f666fb7ab0a00a77eff2999130a69357ce11941260d855", size = 1824847 }, - { url = "https://files.pythonhosted.org/packages/ff/b9/2284de512af30b02f93ddcdd2e5c79834a3cf47fa3ca11b0f74396feb046/shapely-2.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6d1513f915a56de67659fe2047c1ad5ff0f8cbff3519d1e74fced69c9cb0e7da", size = 1631035 }, - { url = "https://files.pythonhosted.org/packages/35/16/a59f252a7e736b73008f10d0950ffeeb0d5953be7c0bdffd39a02a6ba310/shapely-2.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d6a7043178890b9e028d80496ff4c79dc7629bff4d78a2f25323b661756bab8", size = 2968639 }, - { url = "https://files.pythonhosted.org/packages/a5/0a/6a20eca7b0092cfa243117e8e145a58631a4833a0a519ec9b445172e83a0/shapely-2.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb638378dc3d76f7e85b67d7e2bb1366811912430ac9247ac00c127c2b444cdc", size = 3055713 }, - { url = "https://files.pythonhosted.org/packages/fb/44/eeb0c7583b1453d1cf7a319a1d738e08f98a5dc993fa1ef3c372983e4cb5/shapely-2.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:737124e87d91d616acf9a911f74ac55e05db02a43a6a7245b3d663817b876055", size = 3890478 }, - { url = "https://files.pythonhosted.org/packages/5d/6e/37ff3c6af1d408cacb0a7d7bfea7b8ab163a5486e35acb08997eae9d8756/shapely-2.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e6c229e7bb87aae5df82fa00b6718987a43ec168cc5affe095cca59d233f314", size = 4036148 }, - { url = "https://files.pythonhosted.org/packages/c8/6a/8c0b7de3aeb5014a23f06c5e9d3c7852ebcf0d6b00fe660b93261e310e24/shapely-2.1.0-cp313-cp313t-win32.whl", hash = "sha256:a9580bda119b1f42f955aa8e52382d5c73f7957e0203bc0c0c60084846f3db94", size = 1535993 }, - { url = "https://files.pythonhosted.org/packages/a8/91/ae80359a58409d52e4d62c7eacc7eb3ddee4b9135f1db884b6a43cf2e174/shapely-2.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e8ff4e5cfd799ba5b6f37b5d5527dbd85b4a47c65b6d459a03d0962d2a9d4d10", size = 1717777 }, +sdist = { url = "https://files.pythonhosted.org/packages/fb/fe/3b0d2f828ffaceadcdcb51b75b9c62d98e62dd95ce575278de35f24a1c20/shapely-2.1.0.tar.gz", hash = "sha256:2cbe90e86fa8fc3ca8af6ffb00a77b246b918c7cf28677b7c21489b678f6b02e", size = 313617, upload_time = "2025-04-03T09:15:05.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/37/ae448f06f363ff3dfe4bae890abd842c4e3e9edaf01245dbc9b97008c9e6/shapely-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8323031ef7c1bdda7a92d5ddbc7b6b62702e73ba37e9a8ccc8da99ec2c0b87c", size = 1820974, upload_time = "2025-04-03T09:14:11.301Z" }, + { url = "https://files.pythonhosted.org/packages/78/da/ea2a898e93c6953c5eef353a0e1781a0013a1352f2b90aa9ab0b800e0c75/shapely-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4da7c6cd748d86ec6aace99ad17129d30954ccf5e73e9911cdb5f0fa9658b4f8", size = 1624137, upload_time = "2025-04-03T09:14:13.127Z" }, + { url = "https://files.pythonhosted.org/packages/64/4a/f903f82f0fabcd3f43ea2e8132cabda079119247330a9fe58018c39c4e22/shapely-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f0cdf85ff80831137067e7a237085a3ee72c225dba1b30beef87f7d396cf02b", size = 2957161, upload_time = "2025-04-03T09:14:15.031Z" }, + { url = "https://files.pythonhosted.org/packages/92/07/3e2738c542d73182066196b8ce99388cb537d19e300e428d50b1537e3b21/shapely-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f2be5d79aac39886f23000727cf02001aef3af8810176c29ee12cdc3ef3a50", size = 3078530, upload_time = "2025-04-03T09:14:16.562Z" }, + { url = "https://files.pythonhosted.org/packages/82/08/32210e63d8f8af9142d37c2433ece4846862cdac91a0fe66f040780a71bd/shapely-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:21a4515009f56d7a159cf5c2554264e82f56405b4721f9a422cb397237c5dca8", size = 3902208, upload_time = "2025-04-03T09:14:18.342Z" }, + { url = "https://files.pythonhosted.org/packages/19/0e/0abb5225f8a32fbdb615476637038a7d2db40c0af46d1bb3a08b869bee39/shapely-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:15cebc323cec2cb6b2eaa310fdfc621f6dbbfaf6bde336d13838fcea76c885a9", size = 4082863, upload_time = "2025-04-03T09:14:20.233Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1b/7cd816fd388108c872ab7e2930180b02d0c34891213f361e4a66e5e032f2/shapely-2.1.0-cp311-cp311-win32.whl", hash = "sha256:cad51b7a5c8f82f5640472944a74f0f239123dde9a63042b3c5ea311739b7d20", size = 1527488, upload_time = "2025-04-03T09:14:21.597Z" }, + { url = "https://files.pythonhosted.org/packages/fd/28/7bb5b1944d4002d4b2f967762018500381c3b532f98e456bbda40c3ded68/shapely-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:d4005309dde8658e287ad9c435c81877f6a95a9419b932fa7a1f34b120f270ae", size = 1708311, upload_time = "2025-04-03T09:14:23.245Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d1/6a9371ec39d3ef08e13225594e6c55b045209629afd9e6d403204507c2a8/shapely-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53e7ee8bd8609cf12ee6dce01ea5affe676976cf7049315751d53d8db6d2b4b2", size = 1830732, upload_time = "2025-04-03T09:14:25.047Z" }, + { url = "https://files.pythonhosted.org/packages/32/87/799e3e48be7ce848c08509b94d2180f4ddb02e846e3c62d0af33da4d78d3/shapely-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3cab20b665d26dbec0b380e15749bea720885a481fa7b1eedc88195d4a98cfa4", size = 1638404, upload_time = "2025-04-03T09:14:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/85/00/6665d77f9dd09478ab0993b8bc31668aec4fd3e5f1ddd1b28dd5830e47be/shapely-2.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4a38b39a09340273c3c92b3b9a374272a12cc7e468aeeea22c1c46217a03e5c", size = 2945316, upload_time = "2025-04-03T09:14:28.266Z" }, + { url = "https://files.pythonhosted.org/packages/34/49/738e07d10bbc67cae0dcfe5a484c6e518a517f4f90550dda2adf3a78b9f2/shapely-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:edaec656bdd9b71278b98e6f77c464b1c3b2daa9eace78012ff0f0b4b5b15b04", size = 3063099, upload_time = "2025-04-03T09:14:30.067Z" }, + { url = "https://files.pythonhosted.org/packages/88/b8/138098674559362ab29f152bff3b6630de423378fbb0324812742433a4ef/shapely-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c8a732ddd9b25e7a54aa748e7df8fd704e23e5d5d35b7d376d80bffbfc376d04", size = 3887873, upload_time = "2025-04-03T09:14:31.912Z" }, + { url = "https://files.pythonhosted.org/packages/67/a8/fdae7c2db009244991d86f4d2ca09d2f5ccc9d41c312c3b1ee1404dc55da/shapely-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9c93693ad8adfdc9138a5a2d42da02da94f728dd2e82d2f0f442f10e25027f5f", size = 4067004, upload_time = "2025-04-03T09:14:33.976Z" }, + { url = "https://files.pythonhosted.org/packages/ed/78/17e17d91b489019379df3ee1afc4bd39787b232aaa1d540f7d376f0280b7/shapely-2.1.0-cp312-cp312-win32.whl", hash = "sha256:d8ac6604eefe807e71a908524de23a37920133a1729fe3a4dfe0ed82c044cbf4", size = 1527366, upload_time = "2025-04-03T09:14:35.348Z" }, + { url = "https://files.pythonhosted.org/packages/b8/bd/9249bd6dda948441e25e4fb14cbbb5205146b0fff12c66b19331f1ff2141/shapely-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:f4f47e631aa4f9ec5576eac546eb3f38802e2f82aeb0552f9612cb9a14ece1db", size = 1708265, upload_time = "2025-04-03T09:14:36.878Z" }, + { url = "https://files.pythonhosted.org/packages/8d/77/4e368704b2193e74498473db4461d697cc6083c96f8039367e59009d78bd/shapely-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b64423295b563f43a043eb786e7a03200ebe68698e36d2b4b1c39f31dfb50dfb", size = 1830029, upload_time = "2025-04-03T09:14:38.795Z" }, + { url = "https://files.pythonhosted.org/packages/71/3c/d888597bda680e4de987316b05ca9db07416fa29523beff64f846503302f/shapely-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1b5578f45adc25b235b22d1ccb9a0348c8dc36f31983e57ea129a88f96f7b870", size = 1637999, upload_time = "2025-04-03T09:14:40.209Z" }, + { url = "https://files.pythonhosted.org/packages/03/8d/ee0e23b7ef88fba353c63a81f1f329c77f5703835db7b165e7c0b8b7f839/shapely-2.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a7e83d383b27f02b684e50ab7f34e511c92e33b6ca164a6a9065705dd64bcb", size = 2929348, upload_time = "2025-04-03T09:14:42.11Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a7/5c9cb413e4e2ce52c16be717e94abd40ce91b1f8974624d5d56154c5d40b/shapely-2.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:942031eb4d8f7b3b22f43ba42c09c7aa3d843aa10d5cc1619fe816e923b66e55", size = 3048973, upload_time = "2025-04-03T09:14:43.841Z" }, + { url = "https://files.pythonhosted.org/packages/84/23/45b90c0bd2157b238490ca56ef2eedf959d3514c7d05475f497a2c88b6d9/shapely-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d2843c456a2e5627ee6271800f07277c0d2652fb287bf66464571a057dbc00b3", size = 3873148, upload_time = "2025-04-03T09:14:45.924Z" }, + { url = "https://files.pythonhosted.org/packages/c0/bc/ed7d5d37f5395166042576f0c55a12d7e56102799464ba7ea3a72a38c769/shapely-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8c4b17469b7f39a5e6a7cfea79f38ae08a275427f41fe8b48c372e1449147908", size = 4052655, upload_time = "2025-04-03T09:14:47.475Z" }, + { url = "https://files.pythonhosted.org/packages/c0/8f/a1dafbb10d20d1c569f2db3fb1235488f624dafe8469e8ce65356800ba31/shapely-2.1.0-cp313-cp313-win32.whl", hash = "sha256:30e967abd08fce49513d4187c01b19f139084019f33bec0673e8dbeb557c45e4", size = 1526600, upload_time = "2025-04-03T09:14:48.952Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f0/9f8cdf2258d7aed742459cea51c70d184de92f5d2d6f5f7f1ded90a18c31/shapely-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:1dc8d4364483a14aba4c844b7bd16a6fa3728887e2c33dfa1afa34a3cf4d08a5", size = 1707115, upload_time = "2025-04-03T09:14:50.445Z" }, + { url = "https://files.pythonhosted.org/packages/75/ed/32952df461753a65b3e5d24c8efb361d3a80aafaef0b70d419063f6f2c11/shapely-2.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:673e073fea099d1c82f666fb7ab0a00a77eff2999130a69357ce11941260d855", size = 1824847, upload_time = "2025-04-03T09:14:52.358Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b9/2284de512af30b02f93ddcdd2e5c79834a3cf47fa3ca11b0f74396feb046/shapely-2.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6d1513f915a56de67659fe2047c1ad5ff0f8cbff3519d1e74fced69c9cb0e7da", size = 1631035, upload_time = "2025-04-03T09:14:53.739Z" }, + { url = "https://files.pythonhosted.org/packages/35/16/a59f252a7e736b73008f10d0950ffeeb0d5953be7c0bdffd39a02a6ba310/shapely-2.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d6a7043178890b9e028d80496ff4c79dc7629bff4d78a2f25323b661756bab8", size = 2968639, upload_time = "2025-04-03T09:14:55.674Z" }, + { url = "https://files.pythonhosted.org/packages/a5/0a/6a20eca7b0092cfa243117e8e145a58631a4833a0a519ec9b445172e83a0/shapely-2.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb638378dc3d76f7e85b67d7e2bb1366811912430ac9247ac00c127c2b444cdc", size = 3055713, upload_time = "2025-04-03T09:14:57.564Z" }, + { url = "https://files.pythonhosted.org/packages/fb/44/eeb0c7583b1453d1cf7a319a1d738e08f98a5dc993fa1ef3c372983e4cb5/shapely-2.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:737124e87d91d616acf9a911f74ac55e05db02a43a6a7245b3d663817b876055", size = 3890478, upload_time = "2025-04-03T09:14:59.139Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6e/37ff3c6af1d408cacb0a7d7bfea7b8ab163a5486e35acb08997eae9d8756/shapely-2.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e6c229e7bb87aae5df82fa00b6718987a43ec168cc5affe095cca59d233f314", size = 4036148, upload_time = "2025-04-03T09:15:01.328Z" }, + { url = "https://files.pythonhosted.org/packages/c8/6a/8c0b7de3aeb5014a23f06c5e9d3c7852ebcf0d6b00fe660b93261e310e24/shapely-2.1.0-cp313-cp313t-win32.whl", hash = "sha256:a9580bda119b1f42f955aa8e52382d5c73f7957e0203bc0c0c60084846f3db94", size = 1535993, upload_time = "2025-04-03T09:15:02.973Z" }, + { url = "https://files.pythonhosted.org/packages/a8/91/ae80359a58409d52e4d62c7eacc7eb3ddee4b9135f1db884b6a43cf2e174/shapely-2.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e8ff4e5cfd799ba5b6f37b5d5527dbd85b4a47c65b6d459a03d0962d2a9d4d10", size = 1717777, upload_time = "2025-04-03T09:15:04.461Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload_time = "2023-10-24T04:13:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload_time = "2023-10-24T04:13:38.866Z" }, ] [[package]] @@ -5094,18 +5225,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wsproto" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b0/d4/bfa032f961103eba93de583b161f0e6a5b63cebb8f2c7d0c6e6efe1e3d2e/simple_websocket-1.1.0.tar.gz", hash = "sha256:7939234e7aa067c534abdab3a9ed933ec9ce4691b0713c78acb195560aa52ae4", size = 17300 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/d4/bfa032f961103eba93de583b161f0e6a5b63cebb8f2c7d0c6e6efe1e3d2e/simple_websocket-1.1.0.tar.gz", hash = "sha256:7939234e7aa067c534abdab3a9ed933ec9ce4691b0713c78acb195560aa52ae4", size = 17300, upload_time = "2024-10-10T22:39:31.412Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl", hash = "sha256:4af6069630a38ed6c561010f0e11a5bc0d4ca569b36306eb257cd9a192497c8c", size = 13842 }, + { url = "https://files.pythonhosted.org/packages/52/59/0782e51887ac6b07ffd1570e0364cf901ebc36345fea669969d2084baebb/simple_websocket-1.1.0-py3-none-any.whl", hash = "sha256:4af6069630a38ed6c561010f0e11a5bc0d4ca569b36306eb257cd9a192497c8c", size = 13842, upload_time = "2024-10-10T22:39:29.645Z" }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload_time = "2024-12-04T17:35:28.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload_time = "2024-12-04T17:35:26.475Z" }, ] [[package]] @@ -5115,9 +5246,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/21/30/1f41c3d3b8cec82024b4b277bfd4e5b18b765ae7279eb9871fa25c503778/smart_open-7.1.0.tar.gz", hash = "sha256:a4f09f84f0f6d3637c6543aca7b5487438877a21360e7368ccf1f704789752ba", size = 72044 } +sdist = { url = "https://files.pythonhosted.org/packages/21/30/1f41c3d3b8cec82024b4b277bfd4e5b18b765ae7279eb9871fa25c503778/smart_open-7.1.0.tar.gz", hash = "sha256:a4f09f84f0f6d3637c6543aca7b5487438877a21360e7368ccf1f704789752ba", size = 72044, upload_time = "2024-12-17T13:19:17.71Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/18/9a8d9f01957aa1f8bbc5676d54c2e33102d247e146c1a3679d3bd5cc2e3a/smart_open-7.1.0-py3-none-any.whl", hash = "sha256:4b8489bb6058196258bafe901730c7db0dcf4f083f316e97269c66f45502055b", size = 61746 }, + { url = "https://files.pythonhosted.org/packages/7a/18/9a8d9f01957aa1f8bbc5676d54c2e33102d247e146c1a3679d3bd5cc2e3a/smart_open-7.1.0-py3-none-any.whl", hash = "sha256:4b8489bb6058196258bafe901730c7db0dcf4f083f316e97269c66f45502055b", size = 61746, upload_time = "2024-12-17T13:19:21.076Z" }, ] [package.optional-dependencies] @@ -5129,45 +5260,45 @@ http = [ name = "smmap" version = "5.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload_time = "2025-01-02T07:14:40.909Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload_time = "2025-01-02T07:14:38.724Z" }, ] [[package]] name = "sniffio" version = "1.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload_time = "2024-02-25T23:20:04.057Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload_time = "2024-02-25T23:20:01.196Z" }, ] [[package]] name = "snowballstemmer" version = "2.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699 } +sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699, upload_time = "2021-11-16T18:38:38.009Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002 }, + { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002, upload_time = "2021-11-16T18:38:34.792Z" }, ] [[package]] name = "sortedcontainers" version = "2.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594 } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload_time = "2021-05-16T22:03:42.897Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575 }, + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload_time = "2021-05-16T22:03:41.177Z" }, ] [[package]] name = "soupsieve" -version = "2.6" +version = "2.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload_time = "2025-04-20T18:50:08.518Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload_time = "2025-04-20T18:50:07.196Z" }, ] [[package]] @@ -5193,9 +5324,9 @@ dependencies = [ { name = "sphinxcontrib-qthelp" }, { name = "sphinxcontrib-serializinghtml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876 } +sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload_time = "2025-03-02T22:31:59.658Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741 }, + { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload_time = "2025-03-02T22:31:56.836Z" }, ] [[package]] @@ -5210,21 +5341,21 @@ dependencies = [ { name = "watchfiles" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/2c/155e1de2c1ba96a72e5dba152c509a8b41e047ee5c2def9e9f0d812f8be7/sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1", size = 14023 } +sdist = { url = "https://files.pythonhosted.org/packages/a5/2c/155e1de2c1ba96a72e5dba152c509a8b41e047ee5c2def9e9f0d812f8be7/sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1", size = 14023, upload_time = "2024-10-02T23:15:30.172Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/c0/eba125db38c84d3c74717008fd3cb5000b68cd7e2cbafd1349c6a38c3d3b/sphinx_autobuild-2024.10.3-py3-none-any.whl", hash = "sha256:158e16c36f9d633e613c9aaf81c19b0fc458ca78b112533b20dafcda430d60fa", size = 11908 }, + { url = "https://files.pythonhosted.org/packages/18/c0/eba125db38c84d3c74717008fd3cb5000b68cd7e2cbafd1349c6a38c3d3b/sphinx_autobuild-2024.10.3-py3-none-any.whl", hash = "sha256:158e16c36f9d633e613c9aaf81c19b0fc458ca78b112533b20dafcda430d60fa", size = 11908, upload_time = "2024-10-02T23:15:28.739Z" }, ] [[package]] name = "sphinx-autodoc-typehints" -version = "3.1.0" +version = "3.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cb/cc/d38e7260b1bd3af0c84ad8285dfd78236584b74544510584e07963e000ec/sphinx_autodoc_typehints-3.1.0.tar.gz", hash = "sha256:a6b7b0b6df0a380783ce5b29150c2d30352746f027a3e294d37183995d3f23ed", size = 36528 } +sdist = { url = "https://files.pythonhosted.org/packages/93/68/a388a9b8f066cd865d9daa65af589d097efbfab9a8c302d2cb2daa43b52e/sphinx_autodoc_typehints-3.2.0.tar.gz", hash = "sha256:107ac98bc8b4837202c88c0736d59d6da44076e65a0d7d7d543a78631f662a9b", size = 36724, upload_time = "2025-04-25T16:53:25.872Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/2f/bc5bed0677ae00b9ca7919968ea675e2f696b6b20f1648262f26a7a6c6b4/sphinx_autodoc_typehints-3.1.0-py3-none-any.whl", hash = "sha256:67bdee7e27ba943976ce92ebc5647a976a7a08f9f689a826c54617b96a423913", size = 20404 }, + { url = "https://files.pythonhosted.org/packages/f7/c7/8aab362e86cbf887e58be749a78d20ad743e1eb2c73c2b13d4761f39a104/sphinx_autodoc_typehints-3.2.0-py3-none-any.whl", hash = "sha256:884b39be23b1d884dcc825d4680c9c6357a476936e3b381a67ae80091984eb49", size = 20563, upload_time = "2025-04-25T16:53:24.492Z" }, ] [[package]] @@ -5234,9 +5365,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736 } +sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736, upload_time = "2023-07-08T18:40:54.166Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496 }, + { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496, upload_time = "2023-07-08T18:40:52.659Z" }, ] [[package]] @@ -5248,9 +5379,9 @@ dependencies = [ { name = "docutils" }, { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/db/0a/5b1e8d0579dbb4ca8114e456ca4a68020bfe8e15c7001f3856be4929ab83/sphinx_click-6.0.0.tar.gz", hash = "sha256:f5d664321dc0c6622ff019f1e1c84e58ce0cecfddeb510e004cf60c2a3ab465b", size = 29574 } +sdist = { url = "https://files.pythonhosted.org/packages/db/0a/5b1e8d0579dbb4ca8114e456ca4a68020bfe8e15c7001f3856be4929ab83/sphinx_click-6.0.0.tar.gz", hash = "sha256:f5d664321dc0c6622ff019f1e1c84e58ce0cecfddeb510e004cf60c2a3ab465b", size = 29574, upload_time = "2024-05-15T14:49:17.044Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/d7/8621c4726ad3f788a1db4c0c409044b16edc563f5c9542807b3724037555/sphinx_click-6.0.0-py3-none-any.whl", hash = "sha256:1e0a3c83bcb7c55497751b19d07ebe56b5d7b85eb76dd399cf9061b497adc317", size = 9922 }, + { url = "https://files.pythonhosted.org/packages/d0/d7/8621c4726ad3f788a1db4c0c409044b16edc563f5c9542807b3724037555/sphinx_click-6.0.0-py3-none-any.whl", hash = "sha256:1e0a3c83bcb7c55497751b19d07ebe56b5d7b85eb76dd399cf9061b497adc317", size = 9922, upload_time = "2024-05-15T14:49:15.768Z" }, ] [[package]] @@ -5260,9 +5391,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039 } +sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039, upload_time = "2023-04-14T08:10:22.998Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343 }, + { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343, upload_time = "2023-04-14T08:10:20.844Z" }, ] [[package]] @@ -5272,9 +5403,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/48/f5/f8a2be63ed7be9f91a4c2bea0e25bcb56aa4c5cc37ec4d8ead8065f926b1/sphinx_inline_tabs-2023.4.21.tar.gz", hash = "sha256:5df2f13f602c158f3f5f6c509e008aeada199a8c76d97ba3aa2822206683bebc", size = 42664 } +sdist = { url = "https://files.pythonhosted.org/packages/48/f5/f8a2be63ed7be9f91a4c2bea0e25bcb56aa4c5cc37ec4d8ead8065f926b1/sphinx_inline_tabs-2023.4.21.tar.gz", hash = "sha256:5df2f13f602c158f3f5f6c509e008aeada199a8c76d97ba3aa2822206683bebc", size = 42664, upload_time = "2023-04-21T20:25:30.578Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/60/1e4c9017d722b9c7731abc11f39ac8b083b479fbcefe12015b57e457a296/sphinx_inline_tabs-2023.4.21-py3-none-any.whl", hash = "sha256:06809ac613f7c48ddd6e2fa588413e3fe92cff2397b56e2ccf0b0218f9ef6a78", size = 6850 }, + { url = "https://files.pythonhosted.org/packages/9d/60/1e4c9017d722b9c7731abc11f39ac8b083b479fbcefe12015b57e457a296/sphinx_inline_tabs-2023.4.21-py3-none-any.whl", hash = "sha256:06809ac613f7c48ddd6e2fa588413e3fe92cff2397b56e2ccf0b0218f9ef6a78", size = 6850, upload_time = "2023-04-21T20:25:28.778Z" }, ] [[package]] @@ -5286,9 +5417,9 @@ dependencies = [ { name = "markupsafe" }, { name = "standard-imghdr", marker = "python_full_version >= '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/26/df/27282da6f8c549f765beca9de1a5fc56f9651ed87711a5cac1e914137753/sphinx_jinja2_compat-0.3.0.tar.gz", hash = "sha256:f3c1590b275f42e7a654e081db5e3e5fb97f515608422bde94015ddf795dfe7c", size = 4998 } +sdist = { url = "https://files.pythonhosted.org/packages/26/df/27282da6f8c549f765beca9de1a5fc56f9651ed87711a5cac1e914137753/sphinx_jinja2_compat-0.3.0.tar.gz", hash = "sha256:f3c1590b275f42e7a654e081db5e3e5fb97f515608422bde94015ddf795dfe7c", size = 4998, upload_time = "2024-06-19T10:27:00.781Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/42/2fd09d672eaaa937d6893d8b747d07943f97a6e5e30653aee6ebd339b704/sphinx_jinja2_compat-0.3.0-py3-none-any.whl", hash = "sha256:b1e4006d8e1ea31013fa9946d1b075b0c8d2a42c6e3425e63542c1e9f8be9084", size = 7883 }, + { url = "https://files.pythonhosted.org/packages/6f/42/2fd09d672eaaa937d6893d8b747d07943f97a6e5e30653aee6ebd339b704/sphinx_jinja2_compat-0.3.0-py3-none-any.whl", hash = "sha256:b1e4006d8e1ea31013fa9946d1b075b0c8d2a42c6e3425e63542c1e9f8be9084", size = 7883, upload_time = "2024-06-19T10:26:59.121Z" }, ] [[package]] @@ -5301,9 +5432,9 @@ dependencies = [ { name = "pygments" }, { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b6/a7/c9a7888bb2187fdb06955d71e75f6f266b7e179b356ac76138d160a5b7eb/sphinx_mdinclude-0.6.2.tar.gz", hash = "sha256:447462e82cb8be61404a2204227f920769eb923d2f57608e3325f3bb88286b4c", size = 65257 } +sdist = { url = "https://files.pythonhosted.org/packages/b6/a7/c9a7888bb2187fdb06955d71e75f6f266b7e179b356ac76138d160a5b7eb/sphinx_mdinclude-0.6.2.tar.gz", hash = "sha256:447462e82cb8be61404a2204227f920769eb923d2f57608e3325f3bb88286b4c", size = 65257, upload_time = "2024-08-03T19:07:37.643Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/3d/6b41fe1637cd53c4b10d56e0e6f396546f837973dabf9c4b2a1de44620ac/sphinx_mdinclude-0.6.2-py3-none-any.whl", hash = "sha256:648e78edb067c0e4bffc22943278d49d54a0714494743592032fa3ad82a86984", size = 16911 }, + { url = "https://files.pythonhosted.org/packages/42/3d/6b41fe1637cd53c4b10d56e0e6f396546f837973dabf9c4b2a1de44620ac/sphinx_mdinclude-0.6.2-py3-none-any.whl", hash = "sha256:648e78edb067c0e4bffc22943278d49d54a0714494743592032fa3ad82a86984", size = 16911, upload_time = "2024-08-03T19:07:30.406Z" }, ] [[package]] @@ -5318,9 +5449,9 @@ dependencies = [ { name = "sphinx" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/34/fe/ac4e24f35b5148b31ac717ae7dcc7a2f7ec56eb729e22c7252ed8ad2d9a5/sphinx_prompt-1.9.0.tar.gz", hash = "sha256:471b3c6d466dce780a9b167d9541865fd4e9a80ed46e31b06a52a0529ae995a1", size = 5340 } +sdist = { url = "https://files.pythonhosted.org/packages/34/fe/ac4e24f35b5148b31ac717ae7dcc7a2f7ec56eb729e22c7252ed8ad2d9a5/sphinx_prompt-1.9.0.tar.gz", hash = "sha256:471b3c6d466dce780a9b167d9541865fd4e9a80ed46e31b06a52a0529ae995a1", size = 5340, upload_time = "2024-08-07T15:46:51.428Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/98/e90ca466e0ede452d3e5a8d92b8fb68db6de269856e019ed9cab69440522/sphinx_prompt-1.9.0-py3-none-any.whl", hash = "sha256:fd731446c03f043d1ff6df9f22414495b23067c67011cc21658ea8d36b3575fc", size = 7311 }, + { url = "https://files.pythonhosted.org/packages/76/98/e90ca466e0ede452d3e5a8d92b8fb68db6de269856e019ed9cab69440522/sphinx_prompt-1.9.0-py3-none-any.whl", hash = "sha256:fd731446c03f043d1ff6df9f22414495b23067c67011cc21658ea8d36b3575fc", size = 7311, upload_time = "2024-08-07T15:46:50.329Z" }, ] [[package]] @@ -5332,16 +5463,16 @@ dependencies = [ { name = "sphinx" }, { name = "sphinxcontrib-jquery" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/44/c97faec644d29a5ceddd3020ae2edffa69e7d00054a8c7a6021e82f20335/sphinx_rtd_theme-3.0.2.tar.gz", hash = "sha256:b7457bc25dda723b20b086a670b9953c859eab60a2a03ee8eb2bb23e176e5f85", size = 7620463 } +sdist = { url = "https://files.pythonhosted.org/packages/91/44/c97faec644d29a5ceddd3020ae2edffa69e7d00054a8c7a6021e82f20335/sphinx_rtd_theme-3.0.2.tar.gz", hash = "sha256:b7457bc25dda723b20b086a670b9953c859eab60a2a03ee8eb2bb23e176e5f85", size = 7620463, upload_time = "2024-11-13T11:06:04.545Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/77/46e3bac77b82b4df5bb5b61f2de98637724f246b4966cfc34bc5895d852a/sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl", hash = "sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13", size = 7655561 }, + { url = "https://files.pythonhosted.org/packages/85/77/46e3bac77b82b4df5bb5b61f2de98637724f246b4966cfc34bc5895d852a/sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl", hash = "sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13", size = 7655561, upload_time = "2024-11-13T11:06:02.094Z" }, ] [[package]] name = "sphinx-selective-exclude" version = "1.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c2/07/4d6cb9dbe1b06be5caa21eed9813ac1e5ca5b29f3728be1d5e52f1cd7267/sphinx_selective_exclude-1.0.3.tar.gz", hash = "sha256:76fc8fd7c24311e0ca2199a9e4db2156585acd7652a5cead98b07ef4f70f9b78", size = 7227 } +sdist = { url = "https://files.pythonhosted.org/packages/c2/07/4d6cb9dbe1b06be5caa21eed9813ac1e5ca5b29f3728be1d5e52f1cd7267/sphinx_selective_exclude-1.0.3.tar.gz", hash = "sha256:76fc8fd7c24311e0ca2199a9e4db2156585acd7652a5cead98b07ef4f70f9b78", size = 7227, upload_time = "2019-12-23T22:59:35.281Z" } [[package]] name = "sphinx-tabs" @@ -5352,9 +5483,9 @@ dependencies = [ { name = "pygments" }, { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/27/32/ab475e252dc2b704e82a91141fa404cdd8901a5cf34958fd22afacebfccd/sphinx-tabs-3.4.5.tar.gz", hash = "sha256:ba9d0c1e3e37aaadd4b5678449eb08176770e0fc227e769b6ce747df3ceea531", size = 16070 } +sdist = { url = "https://files.pythonhosted.org/packages/27/32/ab475e252dc2b704e82a91141fa404cdd8901a5cf34958fd22afacebfccd/sphinx-tabs-3.4.5.tar.gz", hash = "sha256:ba9d0c1e3e37aaadd4b5678449eb08176770e0fc227e769b6ce747df3ceea531", size = 16070, upload_time = "2024-01-21T12:13:39.392Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/9f/4ac7dbb9f23a2ff5a10903a4f9e9f43e0ff051f63a313e989c962526e305/sphinx_tabs-3.4.5-py3-none-any.whl", hash = "sha256:92cc9473e2ecf1828ca3f6617d0efc0aa8acb06b08c56ba29d1413f2f0f6cf09", size = 9904 }, + { url = "https://files.pythonhosted.org/packages/20/9f/4ac7dbb9f23a2ff5a10903a4f9e9f43e0ff051f63a313e989c962526e305/sphinx_tabs-3.4.5-py3-none-any.whl", hash = "sha256:92cc9473e2ecf1828ca3f6617d0efc0aa8acb06b08c56ba29d1413f2f0f6cf09", size = 9904, upload_time = "2024-01-21T12:13:37.67Z" }, ] [[package]] @@ -5380,36 +5511,36 @@ dependencies = [ { name = "tabulate" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/32/e10c272614a1f4d84b680007bd45f9b77db3262ee6c3c61a0e27932a55b7/sphinx_toolbox-3.9.0.tar.gz", hash = "sha256:9ee0603b090762d6eed4d0ec9fa91445e3ef95d40a584af125308541c1bf7b8d", size = 114497 } +sdist = { url = "https://files.pythonhosted.org/packages/df/32/e10c272614a1f4d84b680007bd45f9b77db3262ee6c3c61a0e27932a55b7/sphinx_toolbox-3.9.0.tar.gz", hash = "sha256:9ee0603b090762d6eed4d0ec9fa91445e3ef95d40a584af125308541c1bf7b8d", size = 114497, upload_time = "2025-02-26T13:32:07.253Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/7e/9811c8cf0df10c2b6c9c72667837d731dd4f0dc0d0e68980938c8eb6f7f8/sphinx_toolbox-3.9.0-py3-none-any.whl", hash = "sha256:49024961c7791ad6e9dd39c611f89b5162550afa26ccad087be38388c3dd3c1e", size = 195429 }, + { url = "https://files.pythonhosted.org/packages/5d/7e/9811c8cf0df10c2b6c9c72667837d731dd4f0dc0d0e68980938c8eb6f7f8/sphinx_toolbox-3.9.0-py3-none-any.whl", hash = "sha256:49024961c7791ad6e9dd39c611f89b5162550afa26ccad087be38388c3dd3c1e", size = 195429, upload_time = "2025-02-26T13:32:04.4Z" }, ] [[package]] name = "sphinxcontrib-applehelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053 } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload_time = "2024-07-29T01:09:00.465Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300 }, + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload_time = "2024-07-29T01:08:58.99Z" }, ] [[package]] name = "sphinxcontrib-devhelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload_time = "2024-07-29T01:09:23.417Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530 }, + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload_time = "2024-07-29T01:09:21.945Z" }, ] [[package]] name = "sphinxcontrib-htmlhelp" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617 } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload_time = "2024-07-29T01:09:37.889Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705 }, + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload_time = "2024-07-29T01:09:36.407Z" }, ] [[package]] @@ -5419,36 +5550,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/de/f3/aa67467e051df70a6330fe7770894b3e4f09436dea6881ae0b4f3d87cad8/sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", size = 122331 } +sdist = { url = "https://files.pythonhosted.org/packages/de/f3/aa67467e051df70a6330fe7770894b3e4f09436dea6881ae0b4f3d87cad8/sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", size = 122331, upload_time = "2023-03-14T15:01:01.944Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae", size = 121104 }, + { url = "https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae", size = 121104, upload_time = "2023-03-14T15:01:00.356Z" }, ] [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload_time = "2019-01-21T16:10:16.347Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 }, + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload_time = "2019-01-21T16:10:14.333Z" }, ] [[package]] name = "sphinxcontrib-qthelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165 } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload_time = "2024-07-29T01:09:56.435Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743 }, + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload_time = "2024-07-29T01:09:54.885Z" }, ] [[package]] name = "sphinxcontrib-serializinghtml" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080 } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload_time = "2024-07-29T01:10:09.332Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload_time = "2024-07-29T01:10:08.203Z" }, ] [[package]] @@ -5458,9 +5589,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2c/27/d8e269030e1f063494ee2b8110256de8fa05b1ef532c76e6807b5c42c8b1/sphinxext_opengraph-0.10.0.tar.gz", hash = "sha256:5781149c1dfc306c3701661acdd02c512c2e6f21d2253487bf0b39639017fc24", size = 1027562 } +sdist = { url = "https://files.pythonhosted.org/packages/2c/27/d8e269030e1f063494ee2b8110256de8fa05b1ef532c76e6807b5c42c8b1/sphinxext_opengraph-0.10.0.tar.gz", hash = "sha256:5781149c1dfc306c3701661acdd02c512c2e6f21d2253487bf0b39639017fc24", size = 1027562, upload_time = "2025-04-04T21:35:19.646Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/3f/bb8bbee4d26aa2abd46e76025697040708e1b0d37c9f198877cebf0e3ba0/sphinxext_opengraph-0.10.0-py3-none-any.whl", hash = "sha256:8afd33f96a02d9506d9dc8f284840888ca8948482ac93015a68d88493df43712", size = 1004031 }, + { url = "https://files.pythonhosted.org/packages/47/3f/bb8bbee4d26aa2abd46e76025697040708e1b0d37c9f198877cebf0e3ba0/sphinxext_opengraph-0.10.0-py3-none-any.whl", hash = "sha256:8afd33f96a02d9506d9dc8f284840888ca8948482ac93015a68d88493df43712", size = 1004031, upload_time = "2025-04-04T21:35:17.637Z" }, ] [[package]] @@ -5472,30 +5603,30 @@ dependencies = [ { name = "executing" }, { name = "pure-eval" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload_time = "2023-09-30T13:58:05.479Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload_time = "2023-09-30T13:58:03.53Z" }, ] [[package]] name = "standard-imghdr" version = "3.10.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/d2/2eb5521072c9598886035c65c023f39f7384bcb73eed70794f469e34efac/standard_imghdr-3.10.14.tar.gz", hash = "sha256:2598fe2e7c540dbda34b233295e10957ab8dc8ac6f3bd9eaa8d38be167232e52", size = 5474 } +sdist = { url = "https://files.pythonhosted.org/packages/09/d2/2eb5521072c9598886035c65c023f39f7384bcb73eed70794f469e34efac/standard_imghdr-3.10.14.tar.gz", hash = "sha256:2598fe2e7c540dbda34b233295e10957ab8dc8ac6f3bd9eaa8d38be167232e52", size = 5474, upload_time = "2024-04-21T18:55:10.859Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/d0/9852f70eb01f814843530c053542b72d30e9fbf74da7abb0107e71938389/standard_imghdr-3.10.14-py3-none-any.whl", hash = "sha256:cdf6883163349624dee9a81d2853a20260337c4cd41c04e99c082e01833a08e2", size = 5598 }, + { url = "https://files.pythonhosted.org/packages/fb/d0/9852f70eb01f814843530c053542b72d30e9fbf74da7abb0107e71938389/standard_imghdr-3.10.14-py3-none-any.whl", hash = "sha256:cdf6883163349624dee9a81d2853a20260337c4cd41c04e99c082e01833a08e2", size = 5598, upload_time = "2024-04-21T18:54:48.587Z" }, ] [[package]] name = "starlette" -version = "0.46.1" +version = "0.46.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/1b/52b27f2e13ceedc79a908e29eac426a63465a1a01248e5f24aa36a62aeb3/starlette-0.46.1.tar.gz", hash = "sha256:3c88d58ee4bd1bb807c0d1acb381838afc7752f9ddaec81bbe4383611d833230", size = 2580102 } +sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846, upload_time = "2025-04-13T13:56:17.942Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/4b/528ccf7a982216885a1ff4908e886b8fb5f19862d1962f56a3fce2435a70/starlette-0.46.1-py3-none-any.whl", hash = "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227", size = 71995 }, + { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037, upload_time = "2025-04-13T13:56:16.21Z" }, ] [[package]] @@ -5522,9 +5653,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "watchdog", marker = "sys_platform != 'darwin'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/c0/7286284567e5045f0c587c426d0c41aee5d10c0a2e360e627a83037e9f0c/streamlit-1.44.1.tar.gz", hash = "sha256:c6914ed6d5b76870b461510476806db370f36425ae0e6654d227c988288198d3", size = 9423685 } +sdist = { url = "https://files.pythonhosted.org/packages/3e/c0/7286284567e5045f0c587c426d0c41aee5d10c0a2e360e627a83037e9f0c/streamlit-1.44.1.tar.gz", hash = "sha256:c6914ed6d5b76870b461510476806db370f36425ae0e6654d227c988288198d3", size = 9423685, upload_time = "2025-04-01T20:36:19.91Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/17/fc425e1d4d86e31b2aaf0812a2ef2163763a0670d671720c7c36e8679323/streamlit-1.44.1-py3-none-any.whl", hash = "sha256:9fe355f58b11f4eb71e74f115ce1f38c4c9eaff2733e6bcffb510ac1298a5990", size = 9812242 }, + { url = "https://files.pythonhosted.org/packages/eb/17/fc425e1d4d86e31b2aaf0812a2ef2163763a0670d671720c7c36e8679323/streamlit-1.44.1-py3-none-any.whl", hash = "sha256:9fe355f58b11f4eb71e74f115ce1f38c4c9eaff2733e6bcffb510ac1298a5990", size = 9812242, upload_time = "2025-04-01T20:36:16.785Z" }, ] [[package]] @@ -5536,27 +5667,49 @@ dependencies = [ { name = "jinja2" }, { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b3/51/d9c1873397c37c717f415b77dfdc7956633d05307e02347a68676c46afd1/swagger_plugin_for_sphinx-5.1.0.tar.gz", hash = "sha256:81b1d3ba0f20c68bfacca9fa1fe3e6f606656e17319de119e6b6a05e630fab78", size = 15022 } +sdist = { url = "https://files.pythonhosted.org/packages/b3/51/d9c1873397c37c717f415b77dfdc7956633d05307e02347a68676c46afd1/swagger_plugin_for_sphinx-5.1.0.tar.gz", hash = "sha256:81b1d3ba0f20c68bfacca9fa1fe3e6f606656e17319de119e6b6a05e630fab78", size = 15022, upload_time = "2025-01-25T12:02:37.77Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/c7/eee3801990944602fbddb1362c5d190d2b4b9a65f440c9554315caa0acfb/swagger_plugin_for_sphinx-5.1.0-py3-none-any.whl", hash = "sha256:e62e94e1380989894b6c258dfb09c08076704e272182cfb44849bc3d95da84bb", size = 11150 }, + { url = "https://files.pythonhosted.org/packages/84/c7/eee3801990944602fbddb1362c5d190d2b4b9a65f440c9554315caa0acfb/swagger_plugin_for_sphinx-5.1.0-py3-none-any.whl", hash = "sha256:e62e94e1380989894b6c258dfb09c08076704e272182cfb44849bc3d95da84bb", size = 11150, upload_time = "2025-01-25T12:02:35.791Z" }, +] + +[[package]] +name = "tabledata" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dataproperty" }, + { name = "typepy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/35/171c8977162f1163368406deddde4c59673b62bd0cb2f34948a02effb075/tabledata-1.3.4.tar.gz", hash = "sha256:e9649cab129d718f3bff4150083b77f8a78c30f6634a30caf692b10fdc60cb97", size = 25074, upload_time = "2024-12-31T14:12:31.198Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/64/fa4160151976ee4b2cf0c1217a99443ffaeb991956feddfeac9eee9952f8/tabledata-1.3.4-py3-none-any.whl", hash = "sha256:1f56e433bfdeb89f4487abfa48c4603a3b07c5d3a3c7e05ff73dd018c24bd0d4", size = 11820, upload_time = "2024-12-31T14:12:28.584Z" }, ] [[package]] name = "tabulate" version = "0.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload_time = "2022-10-06T17:21:48.54Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 }, + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload_time = "2022-10-06T17:21:44.262Z" }, +] + +[[package]] +name = "tcolorpy" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/80/cc/44f2d81d8f9093aad81c3467a5bf5718d2b5f786e887b6e4adcfc17ec6b9/tcolorpy-0.1.7.tar.gz", hash = "sha256:0fbf6bf238890bbc2e32662aa25736769a29bf6d880328f310c910a327632614", size = 299437, upload_time = "2024-12-29T15:24:23.847Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/a2/ed023f2edd1e011b4d99b6727bce8253842d66c3fbf9ed0a26fc09a92571/tcolorpy-0.1.7-py3-none-any.whl", hash = "sha256:26a59d52027e175a37e0aba72efc99dda43f074db71f55b316d3de37d3251378", size = 8096, upload_time = "2024-12-29T15:24:21.33Z" }, ] [[package]] name = "tenacity" version = "9.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload_time = "2025-04-02T08:25:09.966Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 }, + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload_time = "2025-04-02T08:25:07.678Z" }, ] [[package]] @@ -5568,9 +5721,9 @@ dependencies = [ { name = "pywinpty", marker = "os_name == 'nt'" }, { name = "tornado" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701 } +sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload_time = "2024-03-12T14:34:39.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154 }, + { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload_time = "2024-03-12T14:34:36.569Z" }, ] [[package]] @@ -5580,84 +5733,84 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085 } +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload_time = "2024-10-24T14:58:29.895Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 }, + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload_time = "2024-10-24T14:58:28.029Z" }, ] [[package]] name = "toml" version = "0.10.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253 } +sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload_time = "2020-11-01T01:40:22.204Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588 }, + { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload_time = "2020-11-01T01:40:20.672Z" }, ] [[package]] name = "tomli" version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, - { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, - { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, - { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, - { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, - { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, - { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, - { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, - { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, - { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, - { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, - { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, - { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, - { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, - { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, - { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, - { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, - { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, - { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, - { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, - { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 }, - { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 }, - { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 }, - { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 }, - { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 }, - { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 }, - { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 }, - { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 }, - { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 }, - { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 }, - { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload_time = "2024-11-27T22:38:36.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload_time = "2024-11-27T22:37:54.956Z" }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload_time = "2024-11-27T22:37:56.698Z" }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload_time = "2024-11-27T22:37:57.63Z" }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload_time = "2024-11-27T22:37:59.344Z" }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload_time = "2024-11-27T22:38:00.429Z" }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload_time = "2024-11-27T22:38:02.094Z" }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload_time = "2024-11-27T22:38:03.206Z" }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload_time = "2024-11-27T22:38:04.217Z" }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload_time = "2024-11-27T22:38:05.908Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload_time = "2024-11-27T22:38:06.812Z" }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload_time = "2024-11-27T22:38:07.731Z" }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload_time = "2024-11-27T22:38:09.384Z" }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload_time = "2024-11-27T22:38:10.329Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload_time = "2024-11-27T22:38:11.443Z" }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload_time = "2024-11-27T22:38:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload_time = "2024-11-27T22:38:14.766Z" }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload_time = "2024-11-27T22:38:15.843Z" }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload_time = "2024-11-27T22:38:17.645Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload_time = "2024-11-27T22:38:19.159Z" }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload_time = "2024-11-27T22:38:20.064Z" }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload_time = "2024-11-27T22:38:21.659Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload_time = "2024-11-27T22:38:22.693Z" }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload_time = "2024-11-27T22:38:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload_time = "2024-11-27T22:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload_time = "2024-11-27T22:38:27.921Z" }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload_time = "2024-11-27T22:38:29.591Z" }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload_time = "2024-11-27T22:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload_time = "2024-11-27T22:38:31.702Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload_time = "2024-11-27T22:38:32.837Z" }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload_time = "2024-11-27T22:38:34.455Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload_time = "2024-11-27T22:38:35.385Z" }, ] [[package]] name = "tomlkit" version = "0.13.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885 } +sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885, upload_time = "2024-08-14T08:19:41.488Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 }, + { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955, upload_time = "2024-08-14T08:19:40.05Z" }, ] [[package]] name = "tornado" version = "6.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } +sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135, upload_time = "2024-11-22T03:06:38.036Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, - { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, - { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, - { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, - { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, - { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, - { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, - { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, - { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, - { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, + { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299, upload_time = "2024-11-22T03:06:20.162Z" }, + { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253, upload_time = "2024-11-22T03:06:22.39Z" }, + { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602, upload_time = "2024-11-22T03:06:24.214Z" }, + { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972, upload_time = "2024-11-22T03:06:25.559Z" }, + { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173, upload_time = "2024-11-22T03:06:27.584Z" }, + { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892, upload_time = "2024-11-22T03:06:28.933Z" }, + { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334, upload_time = "2024-11-22T03:06:30.428Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261, upload_time = "2024-11-22T03:06:32.458Z" }, + { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463, upload_time = "2024-11-22T03:06:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907, upload_time = "2024-11-22T03:06:36.71Z" }, ] [[package]] @@ -5667,18 +5820,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload_time = "2024-11-24T20:12:22.481Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload_time = "2024-11-24T20:12:19.698Z" }, ] [[package]] name = "traitlets" version = "5.14.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload_time = "2024-04-19T11:11:49.746Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload_time = "2024-04-19T11:11:46.763Z" }, ] [[package]] @@ -5693,9 +5846,9 @@ dependencies = [ { name = "sniffio" }, { name = "sortedcontainers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/01/c1/68d582b4d3a1c1f8118e18042464bb12a7c1b75d64d75111b297687041e3/trio-0.30.0.tar.gz", hash = "sha256:0781c857c0c81f8f51e0089929a26b5bb63d57f927728a5586f7e36171f064df", size = 593776 } +sdist = { url = "https://files.pythonhosted.org/packages/01/c1/68d582b4d3a1c1f8118e18042464bb12a7c1b75d64d75111b297687041e3/trio-0.30.0.tar.gz", hash = "sha256:0781c857c0c81f8f51e0089929a26b5bb63d57f927728a5586f7e36171f064df", size = 593776, upload_time = "2025-04-21T00:48:19.507Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/8e/3f6dfda475ecd940e786defe6df6c500734e686c9cd0a0f8ef6821e9b2f2/trio-0.30.0-py3-none-any.whl", hash = "sha256:3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5", size = 499194 }, + { url = "https://files.pythonhosted.org/packages/69/8e/3f6dfda475ecd940e786defe6df6c500734e686c9cd0a0f8ef6821e9b2f2/trio-0.30.0-py3-none-any.whl", hash = "sha256:3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5", size = 499194, upload_time = "2025-04-21T00:48:17.167Z" }, ] [[package]] @@ -5707,9 +5860,28 @@ dependencies = [ { name = "trio" }, { name = "wsproto" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/3c/8b4358e81f2f2cfe71b66a267f023a91db20a817b9425dd964873796980a/trio_websocket-0.12.2.tar.gz", hash = "sha256:22c72c436f3d1e264d0910a3951934798dcc5b00ae56fc4ee079d46c7cf20fae", size = 33549 } +sdist = { url = "https://files.pythonhosted.org/packages/d1/3c/8b4358e81f2f2cfe71b66a267f023a91db20a817b9425dd964873796980a/trio_websocket-0.12.2.tar.gz", hash = "sha256:22c72c436f3d1e264d0910a3951934798dcc5b00ae56fc4ee079d46c7cf20fae", size = 33549, upload_time = "2025-02-25T05:16:58.947Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/19/eb640a397bba49ba49ef9dbe2e7e5c04202ba045b6ce2ec36e9cadc51e04/trio_websocket-0.12.2-py3-none-any.whl", hash = "sha256:df605665f1db533f4a386c94525870851096a223adcb97f72a07e8b4beba45b6", size = 21221 }, + { url = "https://files.pythonhosted.org/packages/c7/19/eb640a397bba49ba49ef9dbe2e7e5c04202ba045b6ce2ec36e9cadc51e04/trio_websocket-0.12.2-py3-none-any.whl", hash = "sha256:df605665f1db533f4a386c94525870851096a223adcb97f72a07e8b4beba45b6", size = 21221, upload_time = "2025-02-25T05:16:57.545Z" }, +] + +[[package]] +name = "typepy" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mbstrdecoder" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/59/4c39942077d7de285f762a91024dbda731be693591732977358f77d120fb/typepy-1.3.4.tar.gz", hash = "sha256:89c1f66de6c6133209c43a94d23431d320ba03ef5db18f241091ea594035d9de", size = 39558, upload_time = "2024-12-29T09:18:15.774Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/31/e393c3830bdedd01735bd195c85ac3034b6bcaf6c18142bab60a4047ca36/typepy-1.3.4-py3-none-any.whl", hash = "sha256:d5ed3e0c7f49521bff0603dd08cf8d453371cf68d65a29d3d0038552ccc46e2e", size = 31449, upload_time = "2024-12-29T09:18:13.135Z" }, +] + +[package.optional-dependencies] +datetime = [ + { name = "packaging" }, + { name = "python-dateutil" }, + { name = "pytz" }, ] [[package]] @@ -5722,27 +5894,27 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711 } +sdist = { url = "https://files.pythonhosted.org/packages/8b/6f/3991f0f1c7fcb2df31aef28e0594d8d54b05393a0e4e34c65e475c2a5d41/typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5", size = 100711, upload_time = "2025-02-27T19:17:34.807Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061 }, + { url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc", size = 45061, upload_time = "2025-02-27T19:17:32.111Z" }, ] [[package]] name = "types-python-dateutil" version = "2.9.0.20241206" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/60/47d92293d9bc521cd2301e423a358abfac0ad409b3a1606d8fbae1321961/types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb", size = 13802 } +sdist = { url = "https://files.pythonhosted.org/packages/a9/60/47d92293d9bc521cd2301e423a358abfac0ad409b3a1606d8fbae1321961/types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb", size = 13802, upload_time = "2024-12-06T02:56:41.019Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/b3/ca41df24db5eb99b00d97f89d7674a90cb6b3134c52fb8121b6d8d30f15c/types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53", size = 14384 }, + { url = "https://files.pythonhosted.org/packages/0f/b3/ca41df24db5eb99b00d97f89d7674a90cb6b3134c52fb8121b6d8d30f15c/types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53", size = 14384, upload_time = "2024-12-06T02:56:39.412Z" }, ] [[package]] name = "types-pyyaml" version = "6.0.12.20250402" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2d/68/609eed7402f87c9874af39d35942744e39646d1ea9011765ec87b01b2a3c/types_pyyaml-6.0.12.20250402.tar.gz", hash = "sha256:d7c13c3e6d335b6af4b0122a01ff1d270aba84ab96d1a1a1063ecba3e13ec075", size = 17282 } +sdist = { url = "https://files.pythonhosted.org/packages/2d/68/609eed7402f87c9874af39d35942744e39646d1ea9011765ec87b01b2a3c/types_pyyaml-6.0.12.20250402.tar.gz", hash = "sha256:d7c13c3e6d335b6af4b0122a01ff1d270aba84ab96d1a1a1063ecba3e13ec075", size = 17282, upload_time = "2025-04-02T02:56:00.235Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/56/1fe61db05685fbb512c07ea9323f06ea727125951f1eb4dff110b3311da3/types_pyyaml-6.0.12.20250402-py3-none-any.whl", hash = "sha256:652348fa9e7a203d4b0d21066dfb00760d3cbd5a15ebb7cf8d33c88a49546681", size = 20329 }, + { url = "https://files.pythonhosted.org/packages/ed/56/1fe61db05685fbb512c07ea9323f06ea727125951f1eb4dff110b3311da3/types_pyyaml-6.0.12.20250402-py3-none-any.whl", hash = "sha256:652348fa9e7a203d4b0d21066dfb00760d3cbd5a15ebb7cf8d33c88a49546681", size = 20329, upload_time = "2025-04-02T02:55:59.382Z" }, ] [[package]] @@ -5752,18 +5924,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/7d/eb174f74e3f5634eaacb38031bbe467dfe2e545bc255e5c90096ec46bc46/types_requests-2.32.0.20250328.tar.gz", hash = "sha256:c9e67228ea103bd811c96984fac36ed2ae8da87a36a633964a21f199d60baf32", size = 22995 } +sdist = { url = "https://files.pythonhosted.org/packages/00/7d/eb174f74e3f5634eaacb38031bbe467dfe2e545bc255e5c90096ec46bc46/types_requests-2.32.0.20250328.tar.gz", hash = "sha256:c9e67228ea103bd811c96984fac36ed2ae8da87a36a633964a21f199d60baf32", size = 22995, upload_time = "2025-03-28T02:55:13.271Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl", hash = "sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2", size = 20663 }, + { url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl", hash = "sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2", size = 20663, upload_time = "2025-03-28T02:55:11.946Z" }, ] [[package]] name = "typing-extensions" -version = "4.13.1" +version = "4.13.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/ad/cd3e3465232ec2416ae9b983f27b9e94dc8171d56ac99b345319a9475967/typing_extensions-4.13.1.tar.gz", hash = "sha256:98795af00fb9640edec5b8e31fc647597b4691f099ad75f469a2616be1a76dff", size = 106633 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload_time = "2025-04-10T14:19:05.416Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/df/c5/e7a0b0f5ed69f94c8ab7379c599e6036886bffcde609969a5325f47f1332/typing_extensions-4.13.1-py3-none-any.whl", hash = "sha256:4b6cf02909eb5495cfbc3f6e8fd49217e6cc7944e145cdda8caa3734777f9e69", size = 45739 }, + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload_time = "2025-04-10T14:19:03.967Z" }, ] [[package]] @@ -5773,56 +5945,56 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload_time = "2025-02-25T17:27:59.638Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload_time = "2025-02-25T17:27:57.754Z" }, ] [[package]] name = "tzdata" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload_time = "2025-03-23T13:54:43.652Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload_time = "2025-03-23T13:54:41.845Z" }, ] [[package]] name = "ujson" version = "5.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/00/3110fd566786bfa542adb7932d62035e0c0ef662a8ff6544b6643b3d6fd7/ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1", size = 7154885 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/23/ec/3c551ecfe048bcb3948725251fb0214b5844a12aa60bee08d78315bb1c39/ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00", size = 55353 }, - { url = "https://files.pythonhosted.org/packages/8d/9f/4731ef0671a0653e9f5ba18db7c4596d8ecbf80c7922dd5fe4150f1aea76/ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126", size = 51813 }, - { url = "https://files.pythonhosted.org/packages/1f/2b/44d6b9c1688330bf011f9abfdb08911a9dc74f76926dde74e718d87600da/ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8", size = 51988 }, - { url = "https://files.pythonhosted.org/packages/29/45/f5f5667427c1ec3383478092a414063ddd0dfbebbcc533538fe37068a0a3/ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b", size = 53561 }, - { url = "https://files.pythonhosted.org/packages/26/21/a0c265cda4dd225ec1be595f844661732c13560ad06378760036fc622587/ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9", size = 58497 }, - { url = "https://files.pythonhosted.org/packages/28/36/8fde862094fd2342ccc427a6a8584fed294055fdee341661c78660f7aef3/ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f", size = 997877 }, - { url = "https://files.pythonhosted.org/packages/90/37/9208e40d53baa6da9b6a1c719e0670c3f474c8fc7cc2f1e939ec21c1bc93/ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4", size = 1140632 }, - { url = "https://files.pythonhosted.org/packages/89/d5/2626c87c59802863d44d19e35ad16b7e658e4ac190b0dead17ff25460b4c/ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1", size = 1043513 }, - { url = "https://files.pythonhosted.org/packages/2f/ee/03662ce9b3f16855770f0d70f10f0978ba6210805aa310c4eebe66d36476/ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f", size = 38616 }, - { url = "https://files.pythonhosted.org/packages/3e/20/952dbed5895835ea0b82e81a7be4ebb83f93b079d4d1ead93fcddb3075af/ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720", size = 42071 }, - { url = "https://files.pythonhosted.org/packages/e8/a6/fd3f8bbd80842267e2d06c3583279555e8354c5986c952385199d57a5b6c/ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5", size = 55642 }, - { url = "https://files.pythonhosted.org/packages/a8/47/dd03fd2b5ae727e16d5d18919b383959c6d269c7b948a380fdd879518640/ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e", size = 51807 }, - { url = "https://files.pythonhosted.org/packages/25/23/079a4cc6fd7e2655a473ed9e776ddbb7144e27f04e8fc484a0fb45fe6f71/ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043", size = 51972 }, - { url = "https://files.pythonhosted.org/packages/04/81/668707e5f2177791869b624be4c06fb2473bf97ee33296b18d1cf3092af7/ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1", size = 53686 }, - { url = "https://files.pythonhosted.org/packages/bd/50/056d518a386d80aaf4505ccf3cee1c40d312a46901ed494d5711dd939bc3/ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3", size = 58591 }, - { url = "https://files.pythonhosted.org/packages/fc/d6/aeaf3e2d6fb1f4cfb6bf25f454d60490ed8146ddc0600fae44bfe7eb5a72/ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21", size = 997853 }, - { url = "https://files.pythonhosted.org/packages/f8/d5/1f2a5d2699f447f7d990334ca96e90065ea7f99b142ce96e85f26d7e78e2/ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2", size = 1140689 }, - { url = "https://files.pythonhosted.org/packages/f2/2c/6990f4ccb41ed93744aaaa3786394bca0875503f97690622f3cafc0adfde/ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e", size = 1043576 }, - { url = "https://files.pythonhosted.org/packages/14/f5/a2368463dbb09fbdbf6a696062d0c0f62e4ae6fa65f38f829611da2e8fdd/ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e", size = 38764 }, - { url = "https://files.pythonhosted.org/packages/59/2d/691f741ffd72b6c84438a93749ac57bf1a3f217ac4b0ea4fd0e96119e118/ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc", size = 42211 }, - { url = "https://files.pythonhosted.org/packages/0d/69/b3e3f924bb0e8820bb46671979770c5be6a7d51c77a66324cdb09f1acddb/ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287", size = 55646 }, - { url = "https://files.pythonhosted.org/packages/32/8a/9b748eb543c6cabc54ebeaa1f28035b1bd09c0800235b08e85990734c41e/ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e", size = 51806 }, - { url = "https://files.pythonhosted.org/packages/39/50/4b53ea234413b710a18b305f465b328e306ba9592e13a791a6a6b378869b/ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557", size = 51975 }, - { url = "https://files.pythonhosted.org/packages/b4/9d/8061934f960cdb6dd55f0b3ceeff207fcc48c64f58b43403777ad5623d9e/ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988", size = 53693 }, - { url = "https://files.pythonhosted.org/packages/f5/be/7bfa84b28519ddbb67efc8410765ca7da55e6b93aba84d97764cd5794dbc/ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816", size = 58594 }, - { url = "https://files.pythonhosted.org/packages/48/eb/85d465abafb2c69d9699cfa5520e6e96561db787d36c677370e066c7e2e7/ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20", size = 997853 }, - { url = "https://files.pythonhosted.org/packages/9f/76/2a63409fc05d34dd7d929357b7a45e3a2c96f22b4225cd74becd2ba6c4cb/ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0", size = 1140694 }, - { url = "https://files.pythonhosted.org/packages/45/ed/582c4daba0f3e1688d923b5cb914ada1f9defa702df38a1916c899f7c4d1/ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f", size = 1043580 }, - { url = "https://files.pythonhosted.org/packages/d7/0c/9837fece153051e19c7bade9f88f9b409e026b9525927824cdf16293b43b/ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165", size = 38766 }, - { url = "https://files.pythonhosted.org/packages/d7/72/6cb6728e2738c05bbe9bd522d6fc79f86b9a28402f38663e85a28fddd4a0/ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539", size = 42212 }, +sdist = { url = "https://files.pythonhosted.org/packages/f0/00/3110fd566786bfa542adb7932d62035e0c0ef662a8ff6544b6643b3d6fd7/ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1", size = 7154885, upload_time = "2024-05-14T02:02:34.233Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/ec/3c551ecfe048bcb3948725251fb0214b5844a12aa60bee08d78315bb1c39/ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00", size = 55353, upload_time = "2024-05-14T02:00:48.04Z" }, + { url = "https://files.pythonhosted.org/packages/8d/9f/4731ef0671a0653e9f5ba18db7c4596d8ecbf80c7922dd5fe4150f1aea76/ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126", size = 51813, upload_time = "2024-05-14T02:00:49.28Z" }, + { url = "https://files.pythonhosted.org/packages/1f/2b/44d6b9c1688330bf011f9abfdb08911a9dc74f76926dde74e718d87600da/ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8", size = 51988, upload_time = "2024-05-14T02:00:50.484Z" }, + { url = "https://files.pythonhosted.org/packages/29/45/f5f5667427c1ec3383478092a414063ddd0dfbebbcc533538fe37068a0a3/ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b", size = 53561, upload_time = "2024-05-14T02:00:52.146Z" }, + { url = "https://files.pythonhosted.org/packages/26/21/a0c265cda4dd225ec1be595f844661732c13560ad06378760036fc622587/ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9", size = 58497, upload_time = "2024-05-14T02:00:53.366Z" }, + { url = "https://files.pythonhosted.org/packages/28/36/8fde862094fd2342ccc427a6a8584fed294055fdee341661c78660f7aef3/ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f", size = 997877, upload_time = "2024-05-14T02:00:55.095Z" }, + { url = "https://files.pythonhosted.org/packages/90/37/9208e40d53baa6da9b6a1c719e0670c3f474c8fc7cc2f1e939ec21c1bc93/ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4", size = 1140632, upload_time = "2024-05-14T02:00:57.099Z" }, + { url = "https://files.pythonhosted.org/packages/89/d5/2626c87c59802863d44d19e35ad16b7e658e4ac190b0dead17ff25460b4c/ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1", size = 1043513, upload_time = "2024-05-14T02:00:58.488Z" }, + { url = "https://files.pythonhosted.org/packages/2f/ee/03662ce9b3f16855770f0d70f10f0978ba6210805aa310c4eebe66d36476/ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f", size = 38616, upload_time = "2024-05-14T02:01:00.463Z" }, + { url = "https://files.pythonhosted.org/packages/3e/20/952dbed5895835ea0b82e81a7be4ebb83f93b079d4d1ead93fcddb3075af/ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720", size = 42071, upload_time = "2024-05-14T02:01:02.211Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a6/fd3f8bbd80842267e2d06c3583279555e8354c5986c952385199d57a5b6c/ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5", size = 55642, upload_time = "2024-05-14T02:01:04.055Z" }, + { url = "https://files.pythonhosted.org/packages/a8/47/dd03fd2b5ae727e16d5d18919b383959c6d269c7b948a380fdd879518640/ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e", size = 51807, upload_time = "2024-05-14T02:01:05.25Z" }, + { url = "https://files.pythonhosted.org/packages/25/23/079a4cc6fd7e2655a473ed9e776ddbb7144e27f04e8fc484a0fb45fe6f71/ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043", size = 51972, upload_time = "2024-05-14T02:01:06.458Z" }, + { url = "https://files.pythonhosted.org/packages/04/81/668707e5f2177791869b624be4c06fb2473bf97ee33296b18d1cf3092af7/ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1", size = 53686, upload_time = "2024-05-14T02:01:07.618Z" }, + { url = "https://files.pythonhosted.org/packages/bd/50/056d518a386d80aaf4505ccf3cee1c40d312a46901ed494d5711dd939bc3/ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3", size = 58591, upload_time = "2024-05-14T02:01:08.901Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d6/aeaf3e2d6fb1f4cfb6bf25f454d60490ed8146ddc0600fae44bfe7eb5a72/ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21", size = 997853, upload_time = "2024-05-14T02:01:10.772Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d5/1f2a5d2699f447f7d990334ca96e90065ea7f99b142ce96e85f26d7e78e2/ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2", size = 1140689, upload_time = "2024-05-14T02:01:12.214Z" }, + { url = "https://files.pythonhosted.org/packages/f2/2c/6990f4ccb41ed93744aaaa3786394bca0875503f97690622f3cafc0adfde/ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e", size = 1043576, upload_time = "2024-05-14T02:01:14.39Z" }, + { url = "https://files.pythonhosted.org/packages/14/f5/a2368463dbb09fbdbf6a696062d0c0f62e4ae6fa65f38f829611da2e8fdd/ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e", size = 38764, upload_time = "2024-05-14T02:01:15.83Z" }, + { url = "https://files.pythonhosted.org/packages/59/2d/691f741ffd72b6c84438a93749ac57bf1a3f217ac4b0ea4fd0e96119e118/ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc", size = 42211, upload_time = "2024-05-14T02:01:17.567Z" }, + { url = "https://files.pythonhosted.org/packages/0d/69/b3e3f924bb0e8820bb46671979770c5be6a7d51c77a66324cdb09f1acddb/ujson-5.10.0-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287", size = 55646, upload_time = "2024-05-14T02:01:19.26Z" }, + { url = "https://files.pythonhosted.org/packages/32/8a/9b748eb543c6cabc54ebeaa1f28035b1bd09c0800235b08e85990734c41e/ujson-5.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e", size = 51806, upload_time = "2024-05-14T02:01:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/39/50/4b53ea234413b710a18b305f465b328e306ba9592e13a791a6a6b378869b/ujson-5.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557", size = 51975, upload_time = "2024-05-14T02:01:21.904Z" }, + { url = "https://files.pythonhosted.org/packages/b4/9d/8061934f960cdb6dd55f0b3ceeff207fcc48c64f58b43403777ad5623d9e/ujson-5.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988", size = 53693, upload_time = "2024-05-14T02:01:23.742Z" }, + { url = "https://files.pythonhosted.org/packages/f5/be/7bfa84b28519ddbb67efc8410765ca7da55e6b93aba84d97764cd5794dbc/ujson-5.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816", size = 58594, upload_time = "2024-05-14T02:01:25.554Z" }, + { url = "https://files.pythonhosted.org/packages/48/eb/85d465abafb2c69d9699cfa5520e6e96561db787d36c677370e066c7e2e7/ujson-5.10.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20", size = 997853, upload_time = "2024-05-14T02:01:27.151Z" }, + { url = "https://files.pythonhosted.org/packages/9f/76/2a63409fc05d34dd7d929357b7a45e3a2c96f22b4225cd74becd2ba6c4cb/ujson-5.10.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0", size = 1140694, upload_time = "2024-05-14T02:01:29.113Z" }, + { url = "https://files.pythonhosted.org/packages/45/ed/582c4daba0f3e1688d923b5cb914ada1f9defa702df38a1916c899f7c4d1/ujson-5.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f", size = 1043580, upload_time = "2024-05-14T02:01:31.447Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0c/9837fece153051e19c7bade9f88f9b409e026b9525927824cdf16293b43b/ujson-5.10.0-cp313-cp313-win32.whl", hash = "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165", size = 38766, upload_time = "2024-05-14T02:01:32.856Z" }, + { url = "https://files.pythonhosted.org/packages/d7/72/6cb6728e2738c05bbe9bd522d6fc79f86b9a28402f38663e85a28fddd4a0/ujson-5.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539", size = 42212, upload_time = "2024-05-14T02:01:33.97Z" }, ] [[package]] @@ -5832,33 +6004,33 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fsspec" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/21/dd871495af3933e585261adce42678dcdf1168c9d6fa0a8f7b6565e54472/universal_pathlib-0.2.6.tar.gz", hash = "sha256:50817aaeaa9f4163cb1e76f5bdf84207fa05ce728b23fd779479b3462e5430ac", size = 175427 } +sdist = { url = "https://files.pythonhosted.org/packages/eb/21/dd871495af3933e585261adce42678dcdf1168c9d6fa0a8f7b6565e54472/universal_pathlib-0.2.6.tar.gz", hash = "sha256:50817aaeaa9f4163cb1e76f5bdf84207fa05ce728b23fd779479b3462e5430ac", size = 175427, upload_time = "2024-12-13T00:58:27.514Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/4d/2e577f6db7aa0f932d19f799c18f604b2b302c65f733419b900ec07dbade/universal_pathlib-0.2.6-py3-none-any.whl", hash = "sha256:700dec2b58ef34b87998513de6d2ae153b22f083197dfafb8544744edabd1b18", size = 50087 }, + { url = "https://files.pythonhosted.org/packages/e5/4d/2e577f6db7aa0f932d19f799c18f604b2b302c65f733419b900ec07dbade/universal_pathlib-0.2.6-py3-none-any.whl", hash = "sha256:700dec2b58ef34b87998513de6d2ae153b22f083197dfafb8544744edabd1b18", size = 50087, upload_time = "2024-12-13T00:58:24.582Z" }, ] [[package]] name = "uptime" version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ad/53/6c420ddf6949097d6f9406358951c9322505849bea9cb79efe3acc0bb55d/uptime-3.0.1.tar.gz", hash = "sha256:7c300254775b807ce46e3dcbcda30aa3b9a204b9c57a7ac1e79ee6dbe3942973", size = 6630 } +sdist = { url = "https://files.pythonhosted.org/packages/ad/53/6c420ddf6949097d6f9406358951c9322505849bea9cb79efe3acc0bb55d/uptime-3.0.1.tar.gz", hash = "sha256:7c300254775b807ce46e3dcbcda30aa3b9a204b9c57a7ac1e79ee6dbe3942973", size = 6630, upload_time = "2013-10-07T14:19:58.456Z" } [[package]] name = "uri-template" version = "1.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678 } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678, upload_time = "2023-06-21T01:49:05.374Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140 }, + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140, upload_time = "2023-06-21T01:49:03.467Z" }, ] [[package]] name = "urllib3" -version = "2.3.0" +version = "2.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672, upload_time = "2025-04-10T15:23:39.232Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, + { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680, upload_time = "2025-04-10T15:23:37.377Z" }, ] [package.optional-dependencies] @@ -5868,40 +6040,40 @@ socks = [ [[package]] name = "uv" -version = "0.6.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9e/d1/b31059e582f8a92f64a4c98e9684840a83048d3547392d9b14186d98c557/uv-0.6.12.tar.gz", hash = "sha256:b6f67fb3458b2c856152b54b54102f0f3b82cfd18fddbbc38b59ff7fa87e5291", size = 3117528 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/19/70/38f27bdd68f7e187125c6f5bf2aa653d844c9baacb4be07410470b8b4d18/uv-0.6.12-py3-none-linux_armv6l.whl", hash = "sha256:cddc4ffb7c5337efe7584d3654875db6812175326100fa8a2b5f5af0b90f6482", size = 16011234 }, - { url = "https://files.pythonhosted.org/packages/3e/f1/0fffa9c63fbf0e54746109fc94c77c09dd805c3f10605715f00a2e6b8fcc/uv-0.6.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3c048a48df0fb7cc905a4a9f727179d0c65661d61b850afa3a5d413d81dac3d4", size = 16122250 }, - { url = "https://files.pythonhosted.org/packages/54/08/b8369dfade56724ce42df1254d7e483d75cdbc535feff60ac9fa2d6672fa/uv-0.6.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:829999121373dd00990abf35b59da3214977d935021027ae338dd55a7f30daa4", size = 14944312 }, - { url = "https://files.pythonhosted.org/packages/e4/4e/7ff41d3b4b3d6c19276b4f7dd703a7581404fdeabb31756082eb356b72a9/uv-0.6.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:ba1348123de4fdddc9fd75007e42ddc4bf0a213e62fe3d278d7ce98c27da144e", size = 15399035 }, - { url = "https://files.pythonhosted.org/packages/e7/1e/879f09d579e1610cddab2a3908ab9c4aaccd0026a1f984c7aabbb0ccbe6e/uv-0.6.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72ea6424d54b44a21e63e126d11e86c5102e4840cf93c7af712cc2ff23d66e9b", size = 15673445 }, - { url = "https://files.pythonhosted.org/packages/4b/56/22c94b9637770c9851f376886c4b062091858719f64b832c3b7427ef3c91/uv-0.6.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32f2123d3a828857d9757d8bb92c8c4b436f8a420d78364cd6b4bb256f27d8d4", size = 16400873 }, - { url = "https://files.pythonhosted.org/packages/8e/9b/f41b99e547f7d5c2771bb6b28d40d6d97164aaffdf8bda5b132853a81007/uv-0.6.12-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27bade3c1fbcd8ca97fad1846693d79d0cd2c7c1a5b752929eae53b78acfacb7", size = 17341617 }, - { url = "https://files.pythonhosted.org/packages/d7/07/2e04fb798f157e536c5a4ab7fe4107e0e82d09d5250c370604793b69cb23/uv-0.6.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9719c163c89c66afa6fd9f82bc965a02ac4d048908f67ebc2a5384de2d8a5205", size = 17098181 }, - { url = "https://files.pythonhosted.org/packages/c8/f2/91a2e20f55a146bcb4efbdddd5b073137660eb5b22b0b54bbd00fe0256a7/uv-0.6.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e26dd9aa9b52acf8cec4cca50b0158733f8d94e2a23b6d2910d09162ccfa4d8", size = 21278391 }, - { url = "https://files.pythonhosted.org/packages/bc/86/710fd8fa0186539fac8962ecd5cb738e6e93452877c1fbfdf5ea5bfc32da/uv-0.6.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6932436148b8c300aa143e1c38b2711ad1ec27ef22bf61036baf6257d8026250", size = 16762542 }, - { url = "https://files.pythonhosted.org/packages/bb/7f/e11acbbd863ffad2edefdfb57e3cc8e6ab147994f11893ec734eb24aa959/uv-0.6.12-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:15d747d024a93eb5bc9186a601e97c853b9600e522219a7651b4b2041fa6de72", size = 15647309 }, - { url = "https://files.pythonhosted.org/packages/92/d7/034962db8bac194d97c91a1a761205f8bbfbfe0f4a3bbc05e19394e5a1ac/uv-0.6.12-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:4288d00e346fe82847d90335fb812ba5dd27cae6a4d1fcb7f14c8a9eefd46a1d", size = 15705972 }, - { url = "https://files.pythonhosted.org/packages/cc/66/55fe8e114460037736a89df83f7d19ac4d6f761c8634f0d362c5a397d571/uv-0.6.12-py3-none-musllinux_1_1_i686.whl", hash = "sha256:98e0dfcd102d1630681eb73f03e1b307e0487a2e714f22adf6bea3d7bd83d40b", size = 16016347 }, - { url = "https://files.pythonhosted.org/packages/37/7e/f1c95f34de2016d3dba40aad32f15efe21915f128aa7d4f455e0251227e6/uv-0.6.12-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:78f44b83fe4b0e1c747cd5a9d04532e9e4558b63658a7784539a429dbb189160", size = 16902438 }, - { url = "https://files.pythonhosted.org/packages/aa/4a/a355d564a80d18e43a66b9317ff3348986da9621ec2967dbca279c33de08/uv-0.6.12-py3-none-win32.whl", hash = "sha256:28d207fc832909e19b08cbc6d00b849b3951b358d67926cb1b355467d10dace4", size = 16136117 }, - { url = "https://files.pythonhosted.org/packages/65/3a/62ac4182edaf27006a4e7d01a058595b871f226f760204fd765f34610415/uv-0.6.12-py3-none-win_amd64.whl", hash = "sha256:2af26986a94a91cad1805d59e76f529c57dcbb69b37f51e329754c254b90ace2", size = 17582809 }, - { url = "https://files.pythonhosted.org/packages/9f/d5/26b7b5eaa766e7927dca40777aa20c7f685c3ed7aa0bd9fe8f89af46cc8d/uv-0.6.12-py3-none-win_arm64.whl", hash = "sha256:3a016661589c422413acdf2c238cd461570b3cde77a690cbd37205dc21fc1c09", size = 16319209 }, +version = "0.6.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/c3/7bf2ebea42e54f6f82dd7ac0321d20d05ccba144c24844423905ffe351cb/uv-0.6.17.tar.gz", hash = "sha256:cbd40a6f8bdf7a96145af01dcf54252c0c9ddf749f21bfa5b7510fe7bc6d7880", size = 3275231, upload_time = "2025-04-25T18:52:05.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/82/70c83916ac40feaeb1920177e71d27b4ed90c7cd634e358276c246c58d29/uv-0.6.17-py3-none-linux_armv6l.whl", hash = "sha256:8e8d084e2f90e2e0648d4b3c3d5fc92669b2764b5c34f276de6d572cf5e498bf", size = 16474919, upload_time = "2025-04-25T18:51:06.896Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a2/87a989c57f92d60bc3d5751ac1dc2ce16cef2a73e2abfa9c4e50d4cdb7f7/uv-0.6.17-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:094026a024818b0c1d2c5794c9b5c20f6b97c74335e7ae088ac121afbae1fd7e", size = 16580989, upload_time = "2025-04-25T18:51:11.785Z" }, + { url = "https://files.pythonhosted.org/packages/a5/4f/66c7153120c155446f319647c1bafec2d9288f2b48d769cd9f9da39aa1f2/uv-0.6.17-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ce243bec19c47cc274e7e9eedbaeeb3dacbe94430b0f085dd506ba15a41676ee", size = 15305213, upload_time = "2025-04-25T18:51:15.41Z" }, + { url = "https://files.pythonhosted.org/packages/6e/5b/ea18e6dbca255eddbc5c8886fe3a6ee2902cff5fdba6aadf2acc7db700d2/uv-0.6.17-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:fc95d87cbc20cbafb45f2a86b4e1bceddb048a825cc6fd2ca4bf7c3c34fc70c9", size = 15720967, upload_time = "2025-04-25T18:51:18.629Z" }, + { url = "https://files.pythonhosted.org/packages/56/09/df1e31d019a597e9e96bce51f503b13f4704671ea7dfced8e2e84211154b/uv-0.6.17-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f734c4e3936920bf2b12a581c67de599b2ec503da5fb270eaee0bb9d6d24368", size = 16230329, upload_time = "2025-04-25T18:51:21.693Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b0/a1b5fd8fcf895b395d03aafbadc629ff856e435e16014af7f0e4c71b53e6/uv-0.6.17-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b05f991079b9d6231a4d2fcb025989ac998aeb5379d57c90b2b93063733a7d37", size = 16868687, upload_time = "2025-04-25T18:51:24.795Z" }, + { url = "https://files.pythonhosted.org/packages/32/b1/743958cf427becbfb05dce26721a63e7073d21acf805173f73ed089e5e38/uv-0.6.17-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ce6c58d08431c28bcbc059912690bffea761083e2dd66b1d5cc2b95c5f5cf1fd", size = 17796028, upload_time = "2025-04-25T18:51:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/11/9c/4f2c441366adaaa59ee1c1d6f3416bcdc1666e065e0faf56203cc7d19583/uv-0.6.17-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d234bdf77ad466cf8a1dd432431b55e4ea070fc737fffa6ff7315c7678e50387", size = 17533110, upload_time = "2025-04-25T18:51:31.767Z" }, + { url = "https://files.pythonhosted.org/packages/75/70/1f1b4c17f3e6058cfb6ee625ec09eae05d4dab998c45ddc1b986f08d9648/uv-0.6.17-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71851ecf608504878c0dbe0f4523d3b82398c0947eefa06a53f09100d6e4eadb", size = 21877853, upload_time = "2025-04-25T18:51:35.286Z" }, + { url = "https://files.pythonhosted.org/packages/d4/6b/1bea7cff3104890b33c73155c811e48129eed8272e6f4ba848a116994fa4/uv-0.6.17-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa416f287c81bfffd21e82765944035e6c3f4566615bd4fc03db3a704be8e4d5", size = 17247156, upload_time = "2025-04-25T18:51:39.347Z" }, + { url = "https://files.pythonhosted.org/packages/0c/72/b7cce8915bd639799e689d139b8ae8a39a12a70572fef96c5393159e31ec/uv-0.6.17-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:d68686d0f602ea01b388fc9461b980e5095802eacf914a8b67c4b52c8f511eaf", size = 16034761, upload_time = "2025-04-25T18:51:42.513Z" }, + { url = "https://files.pythonhosted.org/packages/69/32/2ad226d4bfea58882919fb17461221b83853fc5d7091120401a18139364c/uv-0.6.17-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:cedc26bc108916c50b1f9c4bb0c538a865fe2d2bee1053f2e13664445482d8c0", size = 16192003, upload_time = "2025-04-25T18:51:45.632Z" }, + { url = "https://files.pythonhosted.org/packages/18/64/6c265eafb4b63302f80d34dbca223c6c6952d1d3a7bc9e506a76273cb09f/uv-0.6.17-py3-none-musllinux_1_1_i686.whl", hash = "sha256:a3aaf2e8f2c2e998328ea59c1a1d5f7477c7ad70c66fefe61dc59a854f37f9aa", size = 16470313, upload_time = "2025-04-25T18:51:48.728Z" }, + { url = "https://files.pythonhosted.org/packages/fb/90/c130b326979ac94ca9af2c5bf9241c64aacccc3c6ccb326fbdeba2e7c194/uv-0.6.17-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:da43740d0529ba4bbd365c06376bd01ecb703bb377537782203254af894621e6", size = 17349425, upload_time = "2025-04-25T18:51:52.362Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b5/542483462ec2ff5b7999df9a0541c83fe7302c126caa91d7f067438aa59d/uv-0.6.17-py3-none-win32.whl", hash = "sha256:d4b95d908a86fdab0302ed15435f2bf600527ba6ffc0611dee4c4892ae0cf948", size = 16502778, upload_time = "2025-04-25T18:51:55.768Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ca/b780d79df46a775cf7f725084dde2d1c7b299d176467822dce92361f4455/uv-0.6.17-py3-none-win_amd64.whl", hash = "sha256:b815d20ffd1ad6cd872227d1f92a29311ba27c519bb8c541e75125496d129e7d", size = 17978928, upload_time = "2025-04-25T18:51:59.382Z" }, + { url = "https://files.pythonhosted.org/packages/60/82/103134de796511b1dd33412cc5e6c650ca504116db8890b36f16ac938d06/uv-0.6.17-py3-none-win_arm64.whl", hash = "sha256:a1117c3787f370b751e01625ee373d53058a5794bb627722d24e98e1c674da21", size = 16679202, upload_time = "2025-04-25T18:52:02.594Z" }, ] [[package]] name = "uvicorn" -version = "0.34.0" +version = "0.34.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 } +sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815, upload_time = "2025-04-19T06:02:50.101Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, + { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483, upload_time = "2025-04-19T06:02:48.42Z" }, ] [package.optional-dependencies] @@ -5919,26 +6091,26 @@ standard = [ name = "uvloop" version = "0.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410 }, - { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476 }, - { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855 }, - { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185 }, - { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256 }, - { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323 }, - { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284 }, - { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349 }, - { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089 }, - { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770 }, - { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321 }, - { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022 }, - { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123 }, - { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325 }, - { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806 }, - { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068 }, - { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428 }, - { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018 }, +sdist = { url = "https://files.pythonhosted.org/packages/af/c0/854216d09d33c543f12a44b393c402e89a920b1a0a7dc634c42de91b9cf6/uvloop-0.21.0.tar.gz", hash = "sha256:3bf12b0fda68447806a7ad847bfa591613177275d35b6724b1ee573faa3704e3", size = 2492741, upload_time = "2024-10-14T23:38:35.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/a7/4cf0334105c1160dd6819f3297f8700fda7fc30ab4f61fbf3e725acbc7cc/uvloop-0.21.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0f3fa6200b3108919f8bdabb9a7f87f20e7097ea3c543754cabc7d717d95cf8", size = 1447410, upload_time = "2024-10-14T23:37:33.612Z" }, + { url = "https://files.pythonhosted.org/packages/8c/7c/1517b0bbc2dbe784b563d6ab54f2ef88c890fdad77232c98ed490aa07132/uvloop-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0878c2640cf341b269b7e128b1a5fed890adc4455513ca710d77d5e93aa6d6a0", size = 805476, upload_time = "2024-10-14T23:37:36.11Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ea/0bfae1aceb82a503f358d8d2fa126ca9dbdb2ba9c7866974faec1cb5875c/uvloop-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9fb766bb57b7388745d8bcc53a359b116b8a04c83a2288069809d2b3466c37e", size = 3960855, upload_time = "2024-10-14T23:37:37.683Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ca/0864176a649838b838f36d44bf31c451597ab363b60dc9e09c9630619d41/uvloop-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a375441696e2eda1c43c44ccb66e04d61ceeffcd76e4929e527b7fa401b90fb", size = 3973185, upload_time = "2024-10-14T23:37:40.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/bf/08ad29979a936d63787ba47a540de2132169f140d54aa25bc8c3df3e67f4/uvloop-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:baa0e6291d91649c6ba4ed4b2f982f9fa165b5bbd50a9e203c416a2797bab3c6", size = 3820256, upload_time = "2024-10-14T23:37:42.839Z" }, + { url = "https://files.pythonhosted.org/packages/da/e2/5cf6ef37e3daf2f06e651aae5ea108ad30df3cb269102678b61ebf1fdf42/uvloop-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4509360fcc4c3bd2c70d87573ad472de40c13387f5fda8cb58350a1d7475e58d", size = 3937323, upload_time = "2024-10-14T23:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/8c/4c/03f93178830dc7ce8b4cdee1d36770d2f5ebb6f3d37d354e061eefc73545/uvloop-0.21.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:359ec2c888397b9e592a889c4d72ba3d6befba8b2bb01743f72fffbde663b59c", size = 1471284, upload_time = "2024-10-14T23:37:47.833Z" }, + { url = "https://files.pythonhosted.org/packages/43/3e/92c03f4d05e50f09251bd8b2b2b584a2a7f8fe600008bcc4523337abe676/uvloop-0.21.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f7089d2dc73179ce5ac255bdf37c236a9f914b264825fdaacaded6990a7fb4c2", size = 821349, upload_time = "2024-10-14T23:37:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/a6/ef/a02ec5da49909dbbfb1fd205a9a1ac4e88ea92dcae885e7c961847cd51e2/uvloop-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa4dcdbd9ae0a372f2167a207cd98c9f9a1ea1188a8a526431eef2f8116cc8d", size = 4580089, upload_time = "2024-10-14T23:37:51.703Z" }, + { url = "https://files.pythonhosted.org/packages/06/a7/b4e6a19925c900be9f98bec0a75e6e8f79bb53bdeb891916609ab3958967/uvloop-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86975dca1c773a2c9864f4c52c5a55631038e387b47eaf56210f873887b6c8dc", size = 4693770, upload_time = "2024-10-14T23:37:54.122Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0c/f07435a18a4b94ce6bd0677d8319cd3de61f3a9eeb1e5f8ab4e8b5edfcb3/uvloop-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:461d9ae6660fbbafedd07559c6a2e57cd553b34b0065b6550685f6653a98c1cb", size = 4451321, upload_time = "2024-10-14T23:37:55.766Z" }, + { url = "https://files.pythonhosted.org/packages/8f/eb/f7032be105877bcf924709c97b1bf3b90255b4ec251f9340cef912559f28/uvloop-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:183aef7c8730e54c9a3ee3227464daed66e37ba13040bb3f350bc2ddc040f22f", size = 4659022, upload_time = "2024-10-14T23:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8d/2cbef610ca21539f0f36e2b34da49302029e7c9f09acef0b1c3b5839412b/uvloop-0.21.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bfd55dfcc2a512316e65f16e503e9e450cab148ef11df4e4e679b5e8253a5281", size = 1468123, upload_time = "2024-10-14T23:38:00.688Z" }, + { url = "https://files.pythonhosted.org/packages/93/0d/b0038d5a469f94ed8f2b2fce2434a18396d8fbfb5da85a0a9781ebbdec14/uvloop-0.21.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:787ae31ad8a2856fc4e7c095341cccc7209bd657d0e71ad0dc2ea83c4a6fa8af", size = 819325, upload_time = "2024-10-14T23:38:02.309Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/0a687f39e78c4c1e02e3272c6b2ccdb4e0085fda3b8352fecd0410ccf915/uvloop-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ee4d4ef48036ff6e5cfffb09dd192c7a5027153948d85b8da7ff705065bacc6", size = 4582806, upload_time = "2024-10-14T23:38:04.711Z" }, + { url = "https://files.pythonhosted.org/packages/d2/19/f5b78616566ea68edd42aacaf645adbf71fbd83fc52281fba555dc27e3f1/uvloop-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3df876acd7ec037a3d005b3ab85a7e4110422e4d9c1571d4fc89b0fc41b6816", size = 4701068, upload_time = "2024-10-14T23:38:06.385Z" }, + { url = "https://files.pythonhosted.org/packages/47/57/66f061ee118f413cd22a656de622925097170b9380b30091b78ea0c6ea75/uvloop-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd53ecc9a0f3d87ab847503c2e1552b690362e005ab54e8a48ba97da3924c0dc", size = 4454428, upload_time = "2024-10-14T23:38:08.416Z" }, + { url = "https://files.pythonhosted.org/packages/63/9a/0962b05b308494e3202d3f794a6e85abe471fe3cafdbcf95c2e8c713aabd/uvloop-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5c39f217ab3c663dc699c04cbd50c13813e31d917642d459fdcec07555cc553", size = 4660018, upload_time = "2024-10-14T23:38:10.888Z" }, ] [[package]] @@ -5948,9 +6120,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pscript" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/22/be/f0c6204a36440bbcc086bfa25964d009b7391c5a3c74d6e73188efd47adb/vbuild-0.8.2.tar.gz", hash = "sha256:270cd9078349d907dfae6c0e6364a5a5e74cb86183bb5093613f12a18b435fa9", size = 8937 } +sdist = { url = "https://files.pythonhosted.org/packages/22/be/f0c6204a36440bbcc086bfa25964d009b7391c5a3c74d6e73188efd47adb/vbuild-0.8.2.tar.gz", hash = "sha256:270cd9078349d907dfae6c0e6364a5a5e74cb86183bb5093613f12a18b435fa9", size = 8937, upload_time = "2023-08-03T09:26:36.196Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/3d/7b22abbdb059d551507275a2815bc2b1974e3b9f6a13781c1eac9e858965/vbuild-0.8.2-py2.py3-none-any.whl", hash = "sha256:d76bcc976a1c53b6a5776ac947606f9e7786c25df33a587ebe33ed09dd8a1076", size = 9371 }, + { url = "https://files.pythonhosted.org/packages/a6/3d/7b22abbdb059d551507275a2815bc2b1974e3b9f6a13781c1eac9e858965/vbuild-0.8.2-py2.py3-none-any.whl", hash = "sha256:d76bcc976a1c53b6a5776ac947606f9e7786c25df33a587ebe33ed09dd8a1076", size = 9371, upload_time = "2023-08-03T09:26:35.023Z" }, ] [[package]] @@ -5962,85 +6134,85 @@ dependencies = [ { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/e0/633e369b91bbc664df47dcb5454b6c7cf441e8f5b9d0c250ce9f0546401e/virtualenv-20.30.0.tar.gz", hash = "sha256:800863162bcaa5450a6e4d721049730e7f2dae07720e0902b0e4040bd6f9ada8", size = 4346945 } +sdist = { url = "https://files.pythonhosted.org/packages/38/e0/633e369b91bbc664df47dcb5454b6c7cf441e8f5b9d0c250ce9f0546401e/virtualenv-20.30.0.tar.gz", hash = "sha256:800863162bcaa5450a6e4d721049730e7f2dae07720e0902b0e4040bd6f9ada8", size = 4346945, upload_time = "2025-03-31T16:33:29.185Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/ed/3cfeb48175f0671ec430ede81f628f9fb2b1084c9064ca67ebe8c0ed6a05/virtualenv-20.30.0-py3-none-any.whl", hash = "sha256:e34302959180fca3af42d1800df014b35019490b119eba981af27f2fa486e5d6", size = 4329461 }, + { url = "https://files.pythonhosted.org/packages/4c/ed/3cfeb48175f0671ec430ede81f628f9fb2b1084c9064ca67ebe8c0ed6a05/virtualenv-20.30.0-py3-none-any.whl", hash = "sha256:e34302959180fca3af42d1800df014b35019490b119eba981af27f2fa486e5d6", size = 4329461, upload_time = "2025-03-31T16:33:26.758Z" }, ] [[package]] name = "watchdog" version = "6.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393 }, - { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392 }, - { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019 }, - { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471 }, - { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449 }, - { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054 }, - { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480 }, - { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451 }, - { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057 }, - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload_time = "2024-11-01T14:07:13.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload_time = "2024-11-01T14:06:31.756Z" }, + { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload_time = "2024-11-01T14:06:32.99Z" }, + { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload_time = "2024-11-01T14:06:34.963Z" }, + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload_time = "2024-11-01T14:06:37.745Z" }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload_time = "2024-11-01T14:06:39.748Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload_time = "2024-11-01T14:06:41.009Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload_time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload_time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload_time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload_time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload_time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload_time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload_time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload_time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload_time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload_time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload_time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload_time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload_time = "2024-11-01T14:07:11.845Z" }, ] [[package]] name = "watchfiles" -version = "1.0.4" +version = "1.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/26/c705fc77d0a9ecdb9b66f1e2976d95b81df3cae518967431e7dbf9b5e219/watchfiles-1.0.4.tar.gz", hash = "sha256:6ba473efd11062d73e4f00c2b730255f9c1bdd73cd5f9fe5b5da8dbd4a717205", size = 94625 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/bb/8461adc4b1fed009546fb797fc0d5698dcfe5e289cb37e1b8f16a93cdc30/watchfiles-1.0.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2a9f93f8439639dc244c4d2902abe35b0279102bca7bbcf119af964f51d53c19", size = 394869 }, - { url = "https://files.pythonhosted.org/packages/55/88/9ebf36b3547176d1709c320de78c1fa3263a46be31b5b1267571d9102686/watchfiles-1.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eea33ad8c418847dd296e61eb683cae1c63329b6d854aefcd412e12d94ee235", size = 384905 }, - { url = "https://files.pythonhosted.org/packages/03/8a/04335ce23ef78d8c69f0913e8b20cf7d9233e3986543aeef95ef2d6e43d2/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31f1a379c9dcbb3f09cf6be1b7e83b67c0e9faabed0471556d9438a4a4e14202", size = 449944 }, - { url = "https://files.pythonhosted.org/packages/17/4e/c8d5dcd14fe637f4633616dabea8a4af0a10142dccf3b43e0f081ba81ab4/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab594e75644421ae0a2484554832ca5895f8cab5ab62de30a1a57db460ce06c6", size = 456020 }, - { url = "https://files.pythonhosted.org/packages/5e/74/3e91e09e1861dd7fbb1190ce7bd786700dc0fbc2ccd33bb9fff5de039229/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc2eb5d14a8e0d5df7b36288979176fbb39672d45184fc4b1c004d7c3ce29317", size = 482983 }, - { url = "https://files.pythonhosted.org/packages/a1/3d/e64de2d1ce4eb6a574fd78ce3a28c279da263be9ef3cfcab6f708df192f2/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f68d8e9d5a321163ddacebe97091000955a1b74cd43724e346056030b0bacee", size = 520320 }, - { url = "https://files.pythonhosted.org/packages/2c/bd/52235f7063b57240c66a991696ed27e2a18bd6fcec8a1ea5a040b70d0611/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9ce064e81fe79faa925ff03b9f4c1a98b0bbb4a1b8c1b015afa93030cb21a49", size = 500988 }, - { url = "https://files.pythonhosted.org/packages/3a/b0/ff04194141a5fe650c150400dd9e42667916bc0f52426e2e174d779b8a74/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b77d5622ac5cc91d21ae9c2b284b5d5c51085a0bdb7b518dba263d0af006132c", size = 452573 }, - { url = "https://files.pythonhosted.org/packages/3d/9d/966164332c5a178444ae6d165082d4f351bd56afd9c3ec828eecbf190e6a/watchfiles-1.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1941b4e39de9b38b868a69b911df5e89dc43767feeda667b40ae032522b9b5f1", size = 615114 }, - { url = "https://files.pythonhosted.org/packages/94/df/f569ae4c1877f96ad4086c153a8eee5a19a3b519487bf5c9454a3438c341/watchfiles-1.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f8c4998506241dedf59613082d1c18b836e26ef2a4caecad0ec41e2a15e4226", size = 613076 }, - { url = "https://files.pythonhosted.org/packages/15/ae/8ce5f29e65d5fa5790e3c80c289819c55e12be2e1b9f5b6a0e55e169b97d/watchfiles-1.0.4-cp311-cp311-win32.whl", hash = "sha256:4ebbeca9360c830766b9f0df3640b791be569d988f4be6c06d6fae41f187f105", size = 271013 }, - { url = "https://files.pythonhosted.org/packages/a4/c6/79dc4a7c598a978e5fafa135090aaf7bbb03b8dec7bada437dfbe578e7ed/watchfiles-1.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:05d341c71f3d7098920f8551d4df47f7b57ac5b8dad56558064c3431bdfc0b74", size = 284229 }, - { url = "https://files.pythonhosted.org/packages/37/3d/928633723211753f3500bfb138434f080363b87a1b08ca188b1ce54d1e05/watchfiles-1.0.4-cp311-cp311-win_arm64.whl", hash = "sha256:32b026a6ab64245b584acf4931fe21842374da82372d5c039cba6bf99ef722f3", size = 276824 }, - { url = "https://files.pythonhosted.org/packages/5b/1a/8f4d9a1461709756ace48c98f07772bc6d4519b1e48b5fa24a4061216256/watchfiles-1.0.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:229e6ec880eca20e0ba2f7e2249c85bae1999d330161f45c78d160832e026ee2", size = 391345 }, - { url = "https://files.pythonhosted.org/packages/bc/d2/6750b7b3527b1cdaa33731438432e7238a6c6c40a9924049e4cebfa40805/watchfiles-1.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5717021b199e8353782dce03bd8a8f64438832b84e2885c4a645f9723bf656d9", size = 381515 }, - { url = "https://files.pythonhosted.org/packages/4e/17/80500e42363deef1e4b4818729ed939aaddc56f82f4e72b2508729dd3c6b/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0799ae68dfa95136dde7c472525700bd48777875a4abb2ee454e3ab18e9fc712", size = 449767 }, - { url = "https://files.pythonhosted.org/packages/10/37/1427fa4cfa09adbe04b1e97bced19a29a3462cc64c78630787b613a23f18/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43b168bba889886b62edb0397cab5b6490ffb656ee2fcb22dec8bfeb371a9e12", size = 455677 }, - { url = "https://files.pythonhosted.org/packages/c5/7a/39e9397f3a19cb549a7d380412fd9e507d4854eddc0700bfad10ef6d4dba/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb2c46e275fbb9f0c92e7654b231543c7bbfa1df07cdc4b99fa73bedfde5c844", size = 482219 }, - { url = "https://files.pythonhosted.org/packages/45/2d/7113931a77e2ea4436cad0c1690c09a40a7f31d366f79c6f0a5bc7a4f6d5/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:857f5fc3aa027ff5e57047da93f96e908a35fe602d24f5e5d8ce64bf1f2fc733", size = 518830 }, - { url = "https://files.pythonhosted.org/packages/f9/1b/50733b1980fa81ef3c70388a546481ae5fa4c2080040100cd7bf3bf7b321/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55ccfd27c497b228581e2838d4386301227fc0cb47f5a12923ec2fe4f97b95af", size = 497997 }, - { url = "https://files.pythonhosted.org/packages/2b/b4/9396cc61b948ef18943e7c85ecfa64cf940c88977d882da57147f62b34b1/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c11ea22304d17d4385067588123658e9f23159225a27b983f343fcffc3e796a", size = 452249 }, - { url = "https://files.pythonhosted.org/packages/fb/69/0c65a5a29e057ad0dc691c2fa6c23b2983c7dabaa190ba553b29ac84c3cc/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:74cb3ca19a740be4caa18f238298b9d472c850f7b2ed89f396c00a4c97e2d9ff", size = 614412 }, - { url = "https://files.pythonhosted.org/packages/7f/b9/319fcba6eba5fad34327d7ce16a6b163b39741016b1996f4a3c96b8dd0e1/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7cce76c138a91e720d1df54014a047e680b652336e1b73b8e3ff3158e05061e", size = 611982 }, - { url = "https://files.pythonhosted.org/packages/f1/47/143c92418e30cb9348a4387bfa149c8e0e404a7c5b0585d46d2f7031b4b9/watchfiles-1.0.4-cp312-cp312-win32.whl", hash = "sha256:b045c800d55bc7e2cadd47f45a97c7b29f70f08a7c2fa13241905010a5493f94", size = 271822 }, - { url = "https://files.pythonhosted.org/packages/ea/94/b0165481bff99a64b29e46e07ac2e0df9f7a957ef13bec4ceab8515f44e3/watchfiles-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:c2acfa49dd0ad0bf2a9c0bb9a985af02e89345a7189be1efc6baa085e0f72d7c", size = 285441 }, - { url = "https://files.pythonhosted.org/packages/11/de/09fe56317d582742d7ca8c2ca7b52a85927ebb50678d9b0fa8194658f536/watchfiles-1.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:22bb55a7c9e564e763ea06c7acea24fc5d2ee5dfc5dafc5cfbedfe58505e9f90", size = 277141 }, - { url = "https://files.pythonhosted.org/packages/08/98/f03efabec64b5b1fa58c0daab25c68ef815b0f320e54adcacd0d6847c339/watchfiles-1.0.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:8012bd820c380c3d3db8435e8cf7592260257b378b649154a7948a663b5f84e9", size = 390954 }, - { url = "https://files.pythonhosted.org/packages/16/09/4dd49ba0a32a45813debe5fb3897955541351ee8142f586303b271a02b40/watchfiles-1.0.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa216f87594f951c17511efe5912808dfcc4befa464ab17c98d387830ce07b60", size = 381133 }, - { url = "https://files.pythonhosted.org/packages/76/59/5aa6fc93553cd8d8ee75c6247763d77c02631aed21551a97d94998bf1dae/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c9953cf85529c05b24705639ffa390f78c26449e15ec34d5339e8108c7c407", size = 449516 }, - { url = "https://files.pythonhosted.org/packages/4c/aa/df4b6fe14b6317290b91335b23c96b488d365d65549587434817e06895ea/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cf684aa9bba4cd95ecb62c822a56de54e3ae0598c1a7f2065d51e24637a3c5d", size = 454820 }, - { url = "https://files.pythonhosted.org/packages/5e/71/185f8672f1094ce48af33252c73e39b48be93b761273872d9312087245f6/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f44a39aee3cbb9b825285ff979ab887a25c5d336e5ec3574f1506a4671556a8d", size = 481550 }, - { url = "https://files.pythonhosted.org/packages/85/d7/50ebba2c426ef1a5cb17f02158222911a2e005d401caf5d911bfca58f4c4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38320582736922be8c865d46520c043bff350956dfc9fbaee3b2df4e1740a4b", size = 518647 }, - { url = "https://files.pythonhosted.org/packages/f0/7a/4c009342e393c545d68987e8010b937f72f47937731225b2b29b7231428f/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39f4914548b818540ef21fd22447a63e7be6e24b43a70f7642d21f1e73371590", size = 497547 }, - { url = "https://files.pythonhosted.org/packages/0f/7c/1cf50b35412d5c72d63b2bf9a4fffee2e1549a245924960dd087eb6a6de4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f12969a3765909cf5dc1e50b2436eb2c0e676a3c75773ab8cc3aa6175c16e902", size = 452179 }, - { url = "https://files.pythonhosted.org/packages/d6/a9/3db1410e1c1413735a9a472380e4f431ad9a9e81711cda2aaf02b7f62693/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0986902677a1a5e6212d0c49b319aad9cc48da4bd967f86a11bde96ad9676ca1", size = 614125 }, - { url = "https://files.pythonhosted.org/packages/f2/e1/0025d365cf6248c4d1ee4c3d2e3d373bdd3f6aff78ba4298f97b4fad2740/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:308ac265c56f936636e3b0e3f59e059a40003c655228c131e1ad439957592303", size = 611911 }, - { url = "https://files.pythonhosted.org/packages/55/55/035838277d8c98fc8c917ac9beeb0cd6c59d675dc2421df5f9fcf44a0070/watchfiles-1.0.4-cp313-cp313-win32.whl", hash = "sha256:aee397456a29b492c20fda2d8961e1ffb266223625346ace14e4b6d861ba9c80", size = 271152 }, - { url = "https://files.pythonhosted.org/packages/f0/e5/96b8e55271685ddbadc50ce8bc53aa2dff278fb7ac4c2e473df890def2dc/watchfiles-1.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:d6097538b0ae5c1b88c3b55afa245a66793a8fec7ada6755322e465fb1a0e8cc", size = 285216 }, +sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537, upload_time = "2025-04-08T10:36:26.722Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/f4/41b591f59021786ef517e1cdc3b510383551846703e03f204827854a96f8/watchfiles-1.0.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:237f9be419e977a0f8f6b2e7b0475ababe78ff1ab06822df95d914a945eac827", size = 405336, upload_time = "2025-04-08T10:34:59.359Z" }, + { url = "https://files.pythonhosted.org/packages/ae/06/93789c135be4d6d0e4f63e96eea56dc54050b243eacc28439a26482b5235/watchfiles-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0da39ff917af8b27a4bdc5a97ac577552a38aac0d260a859c1517ea3dc1a7c4", size = 395977, upload_time = "2025-04-08T10:35:00.522Z" }, + { url = "https://files.pythonhosted.org/packages/d2/db/1cd89bd83728ca37054512d4d35ab69b5f12b8aa2ac9be3b0276b3bf06cc/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfcb3952350e95603f232a7a15f6c5f86c5375e46f0bd4ae70d43e3e063c13d", size = 455232, upload_time = "2025-04-08T10:35:01.698Z" }, + { url = "https://files.pythonhosted.org/packages/40/90/d8a4d44ffe960517e487c9c04f77b06b8abf05eb680bed71c82b5f2cad62/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68b2dddba7a4e6151384e252a5632efcaa9bc5d1c4b567f3cb621306b2ca9f63", size = 459151, upload_time = "2025-04-08T10:35:03.358Z" }, + { url = "https://files.pythonhosted.org/packages/6c/da/267a1546f26465dead1719caaba3ce660657f83c9d9c052ba98fb8856e13/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95cf944fcfc394c5f9de794ce581914900f82ff1f855326f25ebcf24d5397418", size = 489054, upload_time = "2025-04-08T10:35:04.561Z" }, + { url = "https://files.pythonhosted.org/packages/b1/31/33850dfd5c6efb6f27d2465cc4c6b27c5a6f5ed53c6fa63b7263cf5f60f6/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf6cd9f83d7c023b1aba15d13f705ca7b7d38675c121f3cc4a6e25bd0857ee9", size = 523955, upload_time = "2025-04-08T10:35:05.786Z" }, + { url = "https://files.pythonhosted.org/packages/09/84/b7d7b67856efb183a421f1416b44ca975cb2ea6c4544827955dfb01f7dc2/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:852de68acd6212cd6d33edf21e6f9e56e5d98c6add46f48244bd479d97c967c6", size = 502234, upload_time = "2025-04-08T10:35:07.187Z" }, + { url = "https://files.pythonhosted.org/packages/71/87/6dc5ec6882a2254cfdd8b0718b684504e737273903b65d7338efaba08b52/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5730f3aa35e646103b53389d5bc77edfbf578ab6dab2e005142b5b80a35ef25", size = 454750, upload_time = "2025-04-08T10:35:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6c/3786c50213451a0ad15170d091570d4a6554976cf0df19878002fc96075a/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:18b3bd29954bc4abeeb4e9d9cf0b30227f0f206c86657674f544cb032296acd5", size = 631591, upload_time = "2025-04-08T10:35:10.64Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b3/1427425ade4e359a0deacce01a47a26024b2ccdb53098f9d64d497f6684c/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba5552a1b07c8edbf197055bc9d518b8f0d98a1c6a73a293bc0726dce068ed01", size = 625370, upload_time = "2025-04-08T10:35:12.412Z" }, + { url = "https://files.pythonhosted.org/packages/15/ba/f60e053b0b5b8145d682672024aa91370a29c5c921a88977eb565de34086/watchfiles-1.0.5-cp311-cp311-win32.whl", hash = "sha256:2f1fefb2e90e89959447bc0420fddd1e76f625784340d64a2f7d5983ef9ad246", size = 277791, upload_time = "2025-04-08T10:35:13.719Z" }, + { url = "https://files.pythonhosted.org/packages/50/ed/7603c4e164225c12c0d4e8700b64bb00e01a6c4eeea372292a3856be33a4/watchfiles-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:b6e76ceb1dd18c8e29c73f47d41866972e891fc4cc7ba014f487def72c1cf096", size = 291622, upload_time = "2025-04-08T10:35:15.071Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c2/99bb7c96b4450e36877fde33690ded286ff555b5a5c1d925855d556968a1/watchfiles-1.0.5-cp311-cp311-win_arm64.whl", hash = "sha256:266710eb6fddc1f5e51843c70e3bebfb0f5e77cf4f27129278c70554104d19ed", size = 283699, upload_time = "2025-04-08T10:35:16.732Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8c/4f0b9bdb75a1bfbd9c78fad7d8854369283f74fe7cf03eb16be77054536d/watchfiles-1.0.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5eb568c2aa6018e26da9e6c86f3ec3fd958cee7f0311b35c2630fa4217d17f2", size = 401511, upload_time = "2025-04-08T10:35:17.956Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4e/7e15825def77f8bd359b6d3f379f0c9dac4eb09dd4ddd58fd7d14127179c/watchfiles-1.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a04059f4923ce4e856b4b4e5e783a70f49d9663d22a4c3b3298165996d1377f", size = 392715, upload_time = "2025-04-08T10:35:19.202Z" }, + { url = "https://files.pythonhosted.org/packages/58/65/b72fb817518728e08de5840d5d38571466c1b4a3f724d190cec909ee6f3f/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e380c89983ce6e6fe2dd1e1921b9952fb4e6da882931abd1824c092ed495dec", size = 454138, upload_time = "2025-04-08T10:35:20.586Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a4/86833fd2ea2e50ae28989f5950b5c3f91022d67092bfec08f8300d8b347b/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe43139b2c0fdc4a14d4f8d5b5d967f7a2777fd3d38ecf5b1ec669b0d7e43c21", size = 458592, upload_time = "2025-04-08T10:35:21.87Z" }, + { url = "https://files.pythonhosted.org/packages/38/7e/42cb8df8be9a37e50dd3a818816501cf7a20d635d76d6bd65aae3dbbff68/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee0822ce1b8a14fe5a066f93edd20aada932acfe348bede8aa2149f1a4489512", size = 487532, upload_time = "2025-04-08T10:35:23.143Z" }, + { url = "https://files.pythonhosted.org/packages/fc/fd/13d26721c85d7f3df6169d8b495fcac8ab0dc8f0945ebea8845de4681dab/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0dbcb1c2d8f2ab6e0a81c6699b236932bd264d4cef1ac475858d16c403de74d", size = 522865, upload_time = "2025-04-08T10:35:24.702Z" }, + { url = "https://files.pythonhosted.org/packages/a1/0d/7f9ae243c04e96c5455d111e21b09087d0eeaf9a1369e13a01c7d3d82478/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2014a2b18ad3ca53b1f6c23f8cd94a18ce930c1837bd891262c182640eb40a6", size = 499887, upload_time = "2025-04-08T10:35:25.969Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0f/a257766998e26aca4b3acf2ae97dff04b57071e991a510857d3799247c67/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6ae86d5cb647bf58f9f655fcf577f713915a5d69057a0371bc257e2553234", size = 454498, upload_time = "2025-04-08T10:35:27.353Z" }, + { url = "https://files.pythonhosted.org/packages/81/79/8bf142575a03e0af9c3d5f8bcae911ee6683ae93a625d349d4ecf4c8f7df/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1a7bac2bde1d661fb31f4d4e8e539e178774b76db3c2c17c4bb3e960a5de07a2", size = 630663, upload_time = "2025-04-08T10:35:28.685Z" }, + { url = "https://files.pythonhosted.org/packages/f1/80/abe2e79f610e45c63a70d271caea90c49bbf93eb00fa947fa9b803a1d51f/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ab626da2fc1ac277bbf752446470b367f84b50295264d2d313e28dc4405d663", size = 625410, upload_time = "2025-04-08T10:35:30.42Z" }, + { url = "https://files.pythonhosted.org/packages/91/6f/bc7fbecb84a41a9069c2c6eb6319f7f7df113adf113e358c57fc1aff7ff5/watchfiles-1.0.5-cp312-cp312-win32.whl", hash = "sha256:9f4571a783914feda92018ef3901dab8caf5b029325b5fe4558c074582815249", size = 277965, upload_time = "2025-04-08T10:35:32.023Z" }, + { url = "https://files.pythonhosted.org/packages/99/a5/bf1c297ea6649ec59e935ab311f63d8af5faa8f0b86993e3282b984263e3/watchfiles-1.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:360a398c3a19672cf93527f7e8d8b60d8275119c5d900f2e184d32483117a705", size = 291693, upload_time = "2025-04-08T10:35:33.225Z" }, + { url = "https://files.pythonhosted.org/packages/7f/7b/fd01087cc21db5c47e5beae507b87965db341cce8a86f9eb12bf5219d4e0/watchfiles-1.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:1a2902ede862969077b97523987c38db28abbe09fb19866e711485d9fbf0d417", size = 283287, upload_time = "2025-04-08T10:35:34.568Z" }, + { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531, upload_time = "2025-04-08T10:35:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417, upload_time = "2025-04-08T10:35:37.048Z" }, + { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423, upload_time = "2025-04-08T10:35:38.357Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185, upload_time = "2025-04-08T10:35:39.708Z" }, + { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696, upload_time = "2025-04-08T10:35:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327, upload_time = "2025-04-08T10:35:43.289Z" }, + { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741, upload_time = "2025-04-08T10:35:44.574Z" }, + { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995, upload_time = "2025-04-08T10:35:46.336Z" }, + { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693, upload_time = "2025-04-08T10:35:48.161Z" }, + { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677, upload_time = "2025-04-08T10:35:49.65Z" }, + { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804, upload_time = "2025-04-08T10:35:51.093Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087, upload_time = "2025-04-08T10:35:52.458Z" }, ] [[package]] @@ -6050,154 +6222,163 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bracex" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/ab/b3a52228538ccb983653c446c1656eddf1d5303b9cb8b9aef6a91299f862/wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a", size = 115578 } +sdist = { url = "https://files.pythonhosted.org/packages/41/ab/b3a52228538ccb983653c446c1656eddf1d5303b9cb8b9aef6a91299f862/wcmatch-10.0.tar.gz", hash = "sha256:e72f0de09bba6a04e0de70937b0cf06e55f36f37b3deb422dfaf854b867b840a", size = 115578, upload_time = "2024-09-26T18:39:52.505Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/df/4ee467ab39cc1de4b852c212c1ed3becfec2e486a51ac1ce0091f85f38d7/wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a", size = 39347 }, + { url = "https://files.pythonhosted.org/packages/ab/df/4ee467ab39cc1de4b852c212c1ed3becfec2e486a51ac1ce0091f85f38d7/wcmatch-10.0-py3-none-any.whl", hash = "sha256:0dd927072d03c0a6527a20d2e6ad5ba8d0380e60870c383bc533b71744df7b7a", size = 39347, upload_time = "2024-09-26T18:39:51.002Z" }, ] [[package]] name = "wcwidth" version = "0.2.13" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload_time = "2024-01-06T02:10:57.829Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload_time = "2024-01-06T02:10:55.763Z" }, ] [[package]] name = "webcolors" version = "24.11.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/29/061ec845fb58521848f3739e466efd8250b4b7b98c1b6c5bf4d40b419b7e/webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6", size = 45064 } +sdist = { url = "https://files.pythonhosted.org/packages/7b/29/061ec845fb58521848f3739e466efd8250b4b7b98c1b6c5bf4d40b419b7e/webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6", size = 45064, upload_time = "2024-11-11T07:43:24.224Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", size = 14934 }, + { url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", size = 14934, upload_time = "2024-11-11T07:43:22.529Z" }, ] [[package]] name = "webencodings" version = "0.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload_time = "2017-04-05T20:21:34.189Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 }, + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload_time = "2017-04-05T20:21:32.581Z" }, ] [[package]] name = "websocket-client" version = "1.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648 } +sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648, upload_time = "2024-04-23T22:16:16.976Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826 }, + { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826, upload_time = "2024-04-23T22:16:14.422Z" }, ] [[package]] name = "websockets" version = "15.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423 }, - { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082 }, - { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330 }, - { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878 }, - { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883 }, - { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252 }, - { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521 }, - { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958 }, - { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918 }, - { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388 }, - { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828 }, - { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437 }, - { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096 }, - { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332 }, - { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152 }, - { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096 }, - { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523 }, - { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790 }, - { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165 }, - { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160 }, - { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395 }, - { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841 }, - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 }, - { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 }, - { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 }, - { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 }, - { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 }, - { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 }, +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload_time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload_time = "2025-03-05T20:01:56.276Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload_time = "2025-03-05T20:01:57.563Z" }, + { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload_time = "2025-03-05T20:01:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload_time = "2025-03-05T20:02:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload_time = "2025-03-05T20:02:03.148Z" }, + { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload_time = "2025-03-05T20:02:05.29Z" }, + { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload_time = "2025-03-05T20:02:07.458Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload_time = "2025-03-05T20:02:09.842Z" }, + { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload_time = "2025-03-05T20:02:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload_time = "2025-03-05T20:02:13.32Z" }, + { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload_time = "2025-03-05T20:02:14.585Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload_time = "2025-03-05T20:02:16.706Z" }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload_time = "2025-03-05T20:02:18.832Z" }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload_time = "2025-03-05T20:02:20.187Z" }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload_time = "2025-03-05T20:02:22.286Z" }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload_time = "2025-03-05T20:02:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload_time = "2025-03-05T20:02:25.669Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload_time = "2025-03-05T20:02:26.99Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload_time = "2025-03-05T20:02:30.291Z" }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload_time = "2025-03-05T20:02:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload_time = "2025-03-05T20:02:33.017Z" }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload_time = "2025-03-05T20:02:34.498Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload_time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload_time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload_time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload_time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload_time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload_time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload_time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload_time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload_time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload_time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload_time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload_time = "2025-03-05T20:03:39.41Z" }, +] + +[[package]] +name = "wheel" +version = "0.45.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload_time = "2024-11-23T00:18:23.513Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload_time = "2024-11-23T00:18:21.207Z" }, ] [[package]] name = "widgetsnbextension" -version = "4.0.13" +version = "4.0.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/56/fc/238c424fd7f4ebb25f8b1da9a934a3ad7c848286732ae04263661eb0fc03/widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6", size = 1164730 } +sdist = { url = "https://files.pythonhosted.org/packages/41/53/2e0253c5efd69c9656b1843892052a31c36d37ad42812b5da45c62191f7e/widgetsnbextension-4.0.14.tar.gz", hash = "sha256:a3629b04e3edb893212df862038c7232f62973373869db5084aed739b437b5af", size = 1097428, upload_time = "2025-04-10T13:01:25.628Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71", size = 2335872 }, + { url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl", hash = "sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575", size = 2196503, upload_time = "2025-04-10T13:01:23.086Z" }, ] [[package]] name = "wrapt" version = "1.17.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/f7/a2aab2cbc7a665efab072344a8949a71081eed1d2f451f7f7d2b966594a2/wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58", size = 53308 }, - { url = "https://files.pythonhosted.org/packages/50/ff/149aba8365fdacef52b31a258c4dc1c57c79759c335eff0b3316a2664a64/wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda", size = 38488 }, - { url = "https://files.pythonhosted.org/packages/65/46/5a917ce85b5c3b490d35c02bf71aedaa9f2f63f2d15d9949cc4ba56e8ba9/wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438", size = 38776 }, - { url = "https://files.pythonhosted.org/packages/ca/74/336c918d2915a4943501c77566db41d1bd6e9f4dbc317f356b9a244dfe83/wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a", size = 83776 }, - { url = "https://files.pythonhosted.org/packages/09/99/c0c844a5ccde0fe5761d4305485297f91d67cf2a1a824c5f282e661ec7ff/wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000", size = 75420 }, - { url = "https://files.pythonhosted.org/packages/b4/b0/9fc566b0fe08b282c850063591a756057c3247b2362b9286429ec5bf1721/wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6", size = 83199 }, - { url = "https://files.pythonhosted.org/packages/9d/4b/71996e62d543b0a0bd95dda485219856def3347e3e9380cc0d6cf10cfb2f/wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b", size = 82307 }, - { url = "https://files.pythonhosted.org/packages/39/35/0282c0d8789c0dc9bcc738911776c762a701f95cfe113fb8f0b40e45c2b9/wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662", size = 75025 }, - { url = "https://files.pythonhosted.org/packages/4f/6d/90c9fd2c3c6fee181feecb620d95105370198b6b98a0770cba090441a828/wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72", size = 81879 }, - { url = "https://files.pythonhosted.org/packages/8f/fa/9fb6e594f2ce03ef03eddbdb5f4f90acb1452221a5351116c7c4708ac865/wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317", size = 36419 }, - { url = "https://files.pythonhosted.org/packages/47/f8/fb1773491a253cbc123c5d5dc15c86041f746ed30416535f2a8df1f4a392/wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3", size = 38773 }, - { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799 }, - { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821 }, - { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919 }, - { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721 }, - { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899 }, - { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222 }, - { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707 }, - { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685 }, - { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567 }, - { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672 }, - { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865 }, - { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 }, - { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 }, - { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 }, - { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 }, - { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 }, - { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 }, - { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 }, - { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 }, - { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 }, - { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 }, - { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 }, - { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 }, - { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 }, - { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 }, - { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 }, - { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 }, - { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 }, - { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 }, - { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 }, - { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 }, - { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 }, - { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 }, - { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, +sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531, upload_time = "2025-01-14T10:35:45.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/f7/a2aab2cbc7a665efab072344a8949a71081eed1d2f451f7f7d2b966594a2/wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58", size = 53308, upload_time = "2025-01-14T10:33:33.992Z" }, + { url = "https://files.pythonhosted.org/packages/50/ff/149aba8365fdacef52b31a258c4dc1c57c79759c335eff0b3316a2664a64/wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda", size = 38488, upload_time = "2025-01-14T10:33:35.264Z" }, + { url = "https://files.pythonhosted.org/packages/65/46/5a917ce85b5c3b490d35c02bf71aedaa9f2f63f2d15d9949cc4ba56e8ba9/wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438", size = 38776, upload_time = "2025-01-14T10:33:38.28Z" }, + { url = "https://files.pythonhosted.org/packages/ca/74/336c918d2915a4943501c77566db41d1bd6e9f4dbc317f356b9a244dfe83/wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a", size = 83776, upload_time = "2025-01-14T10:33:40.678Z" }, + { url = "https://files.pythonhosted.org/packages/09/99/c0c844a5ccde0fe5761d4305485297f91d67cf2a1a824c5f282e661ec7ff/wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000", size = 75420, upload_time = "2025-01-14T10:33:41.868Z" }, + { url = "https://files.pythonhosted.org/packages/b4/b0/9fc566b0fe08b282c850063591a756057c3247b2362b9286429ec5bf1721/wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6", size = 83199, upload_time = "2025-01-14T10:33:43.598Z" }, + { url = "https://files.pythonhosted.org/packages/9d/4b/71996e62d543b0a0bd95dda485219856def3347e3e9380cc0d6cf10cfb2f/wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b", size = 82307, upload_time = "2025-01-14T10:33:48.499Z" }, + { url = "https://files.pythonhosted.org/packages/39/35/0282c0d8789c0dc9bcc738911776c762a701f95cfe113fb8f0b40e45c2b9/wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662", size = 75025, upload_time = "2025-01-14T10:33:51.191Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6d/90c9fd2c3c6fee181feecb620d95105370198b6b98a0770cba090441a828/wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72", size = 81879, upload_time = "2025-01-14T10:33:52.328Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fa/9fb6e594f2ce03ef03eddbdb5f4f90acb1452221a5351116c7c4708ac865/wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317", size = 36419, upload_time = "2025-01-14T10:33:53.551Z" }, + { url = "https://files.pythonhosted.org/packages/47/f8/fb1773491a253cbc123c5d5dc15c86041f746ed30416535f2a8df1f4a392/wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3", size = 38773, upload_time = "2025-01-14T10:33:56.323Z" }, + { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799, upload_time = "2025-01-14T10:33:57.4Z" }, + { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821, upload_time = "2025-01-14T10:33:59.334Z" }, + { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919, upload_time = "2025-01-14T10:34:04.093Z" }, + { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721, upload_time = "2025-01-14T10:34:07.163Z" }, + { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899, upload_time = "2025-01-14T10:34:09.82Z" }, + { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222, upload_time = "2025-01-14T10:34:11.258Z" }, + { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707, upload_time = "2025-01-14T10:34:12.49Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685, upload_time = "2025-01-14T10:34:15.043Z" }, + { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567, upload_time = "2025-01-14T10:34:16.563Z" }, + { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672, upload_time = "2025-01-14T10:34:17.727Z" }, + { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865, upload_time = "2025-01-14T10:34:19.577Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800, upload_time = "2025-01-14T10:34:21.571Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824, upload_time = "2025-01-14T10:34:22.999Z" }, + { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920, upload_time = "2025-01-14T10:34:25.386Z" }, + { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690, upload_time = "2025-01-14T10:34:28.058Z" }, + { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861, upload_time = "2025-01-14T10:34:29.167Z" }, + { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174, upload_time = "2025-01-14T10:34:31.702Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721, upload_time = "2025-01-14T10:34:32.91Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763, upload_time = "2025-01-14T10:34:34.903Z" }, + { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585, upload_time = "2025-01-14T10:34:36.13Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676, upload_time = "2025-01-14T10:34:37.962Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871, upload_time = "2025-01-14T10:34:39.13Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312, upload_time = "2025-01-14T10:34:40.604Z" }, + { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062, upload_time = "2025-01-14T10:34:45.011Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155, upload_time = "2025-01-14T10:34:47.25Z" }, + { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471, upload_time = "2025-01-14T10:34:50.934Z" }, + { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208, upload_time = "2025-01-14T10:34:52.297Z" }, + { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339, upload_time = "2025-01-14T10:34:53.489Z" }, + { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232, upload_time = "2025-01-14T10:34:55.327Z" }, + { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476, upload_time = "2025-01-14T10:34:58.055Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377, upload_time = "2025-01-14T10:34:59.3Z" }, + { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986, upload_time = "2025-01-14T10:35:00.498Z" }, + { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750, upload_time = "2025-01-14T10:35:03.378Z" }, + { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594, upload_time = "2025-01-14T10:35:44.018Z" }, ] [[package]] name = "wsidicom" -version = "0.26.0" +version = "0.27.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dicomweb-client" }, @@ -6208,9 +6389,9 @@ dependencies = [ { name = "pydicom" }, { name = "universal-pathlib" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/ff/9a248d5ec84c7e9f50df4bc00bead18dcf1e63fe5ca55fc5e8f4be466497/wsidicom-0.26.0.tar.gz", hash = "sha256:45435b6ed2e3947f453653bc777491ad050afc1ca9166b66cad8823855042a63", size = 156973 } +sdist = { url = "https://files.pythonhosted.org/packages/ae/8c/44af929e04c96b7fd7a6327ea6354d52cd7a11a0ec5db3fdbc35ab6a664c/wsidicom-0.27.0.tar.gz", hash = "sha256:185043ec8058b09b59bfd4a8d50339fe8a83c0d4a68a0e412694ab26fa11901e", size = 155866, upload_time = "2025-04-25T14:00:09.534Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/5f/005ef39a82762dc797b90f7f54596d8d770bf4d26e5b456310a674fc6bd4/wsidicom-0.26.0-py3-none-any.whl", hash = "sha256:7db2a2a52786e32c9d8de2d83fcd3ee0ff3a7920ea70da484ee295975c741448", size = 231108 }, + { url = "https://files.pythonhosted.org/packages/57/f7/54e4656572aec4a57618f80743cbfdb01ab7229b49c3ab2e4f97b5383a07/wsidicom-0.27.0-py3-none-any.whl", hash = "sha256:58b4a8e1e5dc48f1fb99ef7fe1c1dc7f7b258140ba427a863bff5b74f35d7590", size = 231280, upload_time = "2025-04-25T14:00:07.773Z" }, ] [[package]] @@ -6220,9 +6401,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425 } +sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425, upload_time = "2022-08-23T19:58:21.447Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226 }, + { url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226, upload_time = "2022-08-23T19:58:19.96Z" }, ] [[package]] @@ -6234,84 +6415,84 @@ dependencies = [ { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/82/a59d8e21b20ffc836775fa7daedac51d16bb8f3010c4fcb495c4496aa922/yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3", size = 145178 }, - { url = "https://files.pythonhosted.org/packages/ba/81/315a3f6f95947cfbf37c92d6fbce42a1a6207b6c38e8c2b452499ec7d449/yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a", size = 96859 }, - { url = "https://files.pythonhosted.org/packages/ad/17/9b64e575583158551b72272a1023cdbd65af54fe13421d856b2850a6ddb7/yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2", size = 94647 }, - { url = "https://files.pythonhosted.org/packages/2c/29/8f291e7922a58a21349683f6120a85701aeefaa02e9f7c8a2dc24fe3f431/yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e", size = 355788 }, - { url = "https://files.pythonhosted.org/packages/26/6d/b4892c80b805c42c228c6d11e03cafabf81662d371b0853e7f0f513837d5/yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9", size = 344613 }, - { url = "https://files.pythonhosted.org/packages/d7/0e/517aa28d3f848589bae9593717b063a544b86ba0a807d943c70f48fcf3bb/yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a", size = 370953 }, - { url = "https://files.pythonhosted.org/packages/5f/9b/5bd09d2f1ad6e6f7c2beae9e50db78edd2cca4d194d227b958955573e240/yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2", size = 369204 }, - { url = "https://files.pythonhosted.org/packages/9c/85/d793a703cf4bd0d4cd04e4b13cc3d44149470f790230430331a0c1f52df5/yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2", size = 358108 }, - { url = "https://files.pythonhosted.org/packages/6f/54/b6c71e13549c1f6048fbc14ce8d930ac5fb8bafe4f1a252e621a24f3f1f9/yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8", size = 346610 }, - { url = "https://files.pythonhosted.org/packages/a0/1a/d6087d58bdd0d8a2a37bbcdffac9d9721af6ebe50d85304d9f9b57dfd862/yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902", size = 365378 }, - { url = "https://files.pythonhosted.org/packages/02/84/e25ddff4cbc001dbc4af76f8d41a3e23818212dd1f0a52044cbc60568872/yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791", size = 356919 }, - { url = "https://files.pythonhosted.org/packages/04/76/898ae362353bf8f64636495d222c8014c8e5267df39b1a9fe1e1572fb7d0/yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f", size = 364248 }, - { url = "https://files.pythonhosted.org/packages/1b/b0/9d9198d83a622f1c40fdbf7bd13b224a6979f2e1fc2cf50bfb1d8773c495/yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da", size = 378418 }, - { url = "https://files.pythonhosted.org/packages/c7/ce/1f50c1cc594cf5d3f5bf4a9b616fca68680deaec8ad349d928445ac52eb8/yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4", size = 383850 }, - { url = "https://files.pythonhosted.org/packages/89/1e/a59253a87b35bfec1a25bb5801fb69943330b67cfd266278eb07e0609012/yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5", size = 381218 }, - { url = "https://files.pythonhosted.org/packages/85/b0/26f87df2b3044b0ef1a7cf66d321102bdca091db64c5ae853fcb2171c031/yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6", size = 86606 }, - { url = "https://files.pythonhosted.org/packages/33/46/ca335c2e1f90446a77640a45eeb1cd8f6934f2c6e4df7db0f0f36ef9f025/yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb", size = 93374 }, - { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089 }, - { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706 }, - { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719 }, - { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972 }, - { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639 }, - { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745 }, - { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178 }, - { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219 }, - { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266 }, - { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873 }, - { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524 }, - { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370 }, - { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297 }, - { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771 }, - { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000 }, - { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355 }, - { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904 }, - { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030 }, - { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894 }, - { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457 }, - { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070 }, - { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739 }, - { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338 }, - { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636 }, - { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061 }, - { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150 }, - { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207 }, - { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277 }, - { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990 }, - { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684 }, - { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599 }, - { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573 }, - { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051 }, - { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742 }, - { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575 }, - { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121 }, - { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815 }, - { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231 }, - { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221 }, - { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400 }, - { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714 }, - { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279 }, - { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044 }, - { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236 }, - { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034 }, - { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943 }, - { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058 }, - { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792 }, - { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242 }, - { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816 }, - { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093 }, - { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124 }, +sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258, upload_time = "2025-04-17T00:45:14.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/82/a59d8e21b20ffc836775fa7daedac51d16bb8f3010c4fcb495c4496aa922/yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3", size = 145178, upload_time = "2025-04-17T00:42:04.511Z" }, + { url = "https://files.pythonhosted.org/packages/ba/81/315a3f6f95947cfbf37c92d6fbce42a1a6207b6c38e8c2b452499ec7d449/yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a", size = 96859, upload_time = "2025-04-17T00:42:06.43Z" }, + { url = "https://files.pythonhosted.org/packages/ad/17/9b64e575583158551b72272a1023cdbd65af54fe13421d856b2850a6ddb7/yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2", size = 94647, upload_time = "2025-04-17T00:42:07.976Z" }, + { url = "https://files.pythonhosted.org/packages/2c/29/8f291e7922a58a21349683f6120a85701aeefaa02e9f7c8a2dc24fe3f431/yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e", size = 355788, upload_time = "2025-04-17T00:42:09.902Z" }, + { url = "https://files.pythonhosted.org/packages/26/6d/b4892c80b805c42c228c6d11e03cafabf81662d371b0853e7f0f513837d5/yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9", size = 344613, upload_time = "2025-04-17T00:42:11.768Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0e/517aa28d3f848589bae9593717b063a544b86ba0a807d943c70f48fcf3bb/yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a", size = 370953, upload_time = "2025-04-17T00:42:13.983Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/5bd09d2f1ad6e6f7c2beae9e50db78edd2cca4d194d227b958955573e240/yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2", size = 369204, upload_time = "2025-04-17T00:42:16.386Z" }, + { url = "https://files.pythonhosted.org/packages/9c/85/d793a703cf4bd0d4cd04e4b13cc3d44149470f790230430331a0c1f52df5/yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2", size = 358108, upload_time = "2025-04-17T00:42:18.622Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/b6c71e13549c1f6048fbc14ce8d930ac5fb8bafe4f1a252e621a24f3f1f9/yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8", size = 346610, upload_time = "2025-04-17T00:42:20.9Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1a/d6087d58bdd0d8a2a37bbcdffac9d9721af6ebe50d85304d9f9b57dfd862/yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902", size = 365378, upload_time = "2025-04-17T00:42:22.926Z" }, + { url = "https://files.pythonhosted.org/packages/02/84/e25ddff4cbc001dbc4af76f8d41a3e23818212dd1f0a52044cbc60568872/yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791", size = 356919, upload_time = "2025-04-17T00:42:25.145Z" }, + { url = "https://files.pythonhosted.org/packages/04/76/898ae362353bf8f64636495d222c8014c8e5267df39b1a9fe1e1572fb7d0/yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f", size = 364248, upload_time = "2025-04-17T00:42:27.475Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b0/9d9198d83a622f1c40fdbf7bd13b224a6979f2e1fc2cf50bfb1d8773c495/yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da", size = 378418, upload_time = "2025-04-17T00:42:29.333Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ce/1f50c1cc594cf5d3f5bf4a9b616fca68680deaec8ad349d928445ac52eb8/yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4", size = 383850, upload_time = "2025-04-17T00:42:31.668Z" }, + { url = "https://files.pythonhosted.org/packages/89/1e/a59253a87b35bfec1a25bb5801fb69943330b67cfd266278eb07e0609012/yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5", size = 381218, upload_time = "2025-04-17T00:42:33.523Z" }, + { url = "https://files.pythonhosted.org/packages/85/b0/26f87df2b3044b0ef1a7cf66d321102bdca091db64c5ae853fcb2171c031/yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6", size = 86606, upload_time = "2025-04-17T00:42:35.873Z" }, + { url = "https://files.pythonhosted.org/packages/33/46/ca335c2e1f90446a77640a45eeb1cd8f6934f2c6e4df7db0f0f36ef9f025/yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb", size = 93374, upload_time = "2025-04-17T00:42:37.586Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089, upload_time = "2025-04-17T00:42:39.602Z" }, + { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706, upload_time = "2025-04-17T00:42:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719, upload_time = "2025-04-17T00:42:43.666Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972, upload_time = "2025-04-17T00:42:45.391Z" }, + { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639, upload_time = "2025-04-17T00:42:47.552Z" }, + { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745, upload_time = "2025-04-17T00:42:49.406Z" }, + { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178, upload_time = "2025-04-17T00:42:51.588Z" }, + { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219, upload_time = "2025-04-17T00:42:53.674Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266, upload_time = "2025-04-17T00:42:55.49Z" }, + { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873, upload_time = "2025-04-17T00:42:57.895Z" }, + { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524, upload_time = "2025-04-17T00:43:00.094Z" }, + { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370, upload_time = "2025-04-17T00:43:02.242Z" }, + { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297, upload_time = "2025-04-17T00:43:04.189Z" }, + { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771, upload_time = "2025-04-17T00:43:06.609Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000, upload_time = "2025-04-17T00:43:09.01Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355, upload_time = "2025-04-17T00:43:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904, upload_time = "2025-04-17T00:43:13.087Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030, upload_time = "2025-04-17T00:43:15.083Z" }, + { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894, upload_time = "2025-04-17T00:43:17.372Z" }, + { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457, upload_time = "2025-04-17T00:43:19.431Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070, upload_time = "2025-04-17T00:43:21.426Z" }, + { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739, upload_time = "2025-04-17T00:43:23.634Z" }, + { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338, upload_time = "2025-04-17T00:43:25.695Z" }, + { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636, upload_time = "2025-04-17T00:43:27.876Z" }, + { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061, upload_time = "2025-04-17T00:43:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150, upload_time = "2025-04-17T00:43:31.742Z" }, + { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207, upload_time = "2025-04-17T00:43:34.099Z" }, + { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277, upload_time = "2025-04-17T00:43:36.202Z" }, + { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990, upload_time = "2025-04-17T00:43:38.551Z" }, + { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684, upload_time = "2025-04-17T00:43:40.481Z" }, + { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599, upload_time = "2025-04-17T00:43:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573, upload_time = "2025-04-17T00:43:44.797Z" }, + { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051, upload_time = "2025-04-17T00:43:47.076Z" }, + { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742, upload_time = "2025-04-17T00:43:49.193Z" }, + { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575, upload_time = "2025-04-17T00:43:51.533Z" }, + { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121, upload_time = "2025-04-17T00:43:53.506Z" }, + { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815, upload_time = "2025-04-17T00:43:55.41Z" }, + { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231, upload_time = "2025-04-17T00:43:57.825Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221, upload_time = "2025-04-17T00:44:00.526Z" }, + { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400, upload_time = "2025-04-17T00:44:02.853Z" }, + { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714, upload_time = "2025-04-17T00:44:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279, upload_time = "2025-04-17T00:44:07.721Z" }, + { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044, upload_time = "2025-04-17T00:44:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236, upload_time = "2025-04-17T00:44:11.734Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034, upload_time = "2025-04-17T00:44:13.975Z" }, + { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943, upload_time = "2025-04-17T00:44:16.052Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058, upload_time = "2025-04-17T00:44:18.547Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792, upload_time = "2025-04-17T00:44:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242, upload_time = "2025-04-17T00:44:22.851Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816, upload_time = "2025-04-17T00:44:25.491Z" }, + { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093, upload_time = "2025-04-17T00:44:27.418Z" }, + { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124, upload_time = "2025-04-17T00:45:12.199Z" }, ] [[package]] name = "zipp" version = "3.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545 } +sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545, upload_time = "2024-11-10T15:05:20.202Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, + { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630, upload_time = "2024-11-10T15:05:19.275Z" }, ] From 2e0eea480c675a169a3bbb221452cec662b024c1 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 27 Apr 2025 11:24:33 +0200 Subject: [PATCH 105/110] fix(system/info): wired on linux --- .copier-answers.yml | 2 +- src/aignostics/system/_service.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index da4994ca..c62a3280 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.16.10 +_commit: v0.16.11 _src_path: gh:helmut-hoffer-von-ankershoffen/oe-python-template attestations_enabled: false author_email: helmut@aignostics.com diff --git a/src/aignostics/system/_service.py b/src/aignostics/system/_service.py index cae2c9ec..bb884a1b 100644 --- a/src/aignostics/system/_service.py +++ b/src/aignostics/system/_service.py @@ -205,9 +205,6 @@ def info(include_environ: bool = False, filter_secrets: bool = True) -> dict[str "available": vmem.available, "used": vmem.used, "free": vmem.free, - "active": vmem.active, - "inactive": vmem.inactive, - "wired": vmem.wired, }, "swap": { "percent": swap.percent, From 35b325605387ed5bd5c99cc84754845f9beaf383 Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Sun, 27 Apr 2025 11:42:10 +0200 Subject: [PATCH 106/110] fix(system/info): freq --- .copier-answers.yml | 2 +- src/aignostics/system/_service.py | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index c62a3280..cfd937e0 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,4 +1,4 @@ -_commit: v0.16.11 +_commit: v0.16.12 _src_path: gh:helmut-hoffer-von-ankershoffen/oe-python-template attestations_enabled: false author_email: helmut@aignostics.com diff --git a/src/aignostics/system/_service.py b/src/aignostics/system/_service.py index bb884a1b..9905b2d8 100644 --- a/src/aignostics/system/_service.py +++ b/src/aignostics/system/_service.py @@ -162,8 +162,8 @@ def info(include_environ: bool = False, filter_secrets: bool = True) -> dict[str bootdatetime = boottime() vmem = psutil.virtual_memory() swap = psutil.swap_memory() - cpu_percent = psutil.cpu_percent(interval=5) - cpu_times_percent = psutil.cpu_times_percent(interval=5) + cpu_percent = psutil.cpu_percent(interval=2) + cpu_times_percent = psutil.cpu_times_percent(interval=2) rtn: InfoDict = { "package": { @@ -197,7 +197,11 @@ def info(include_environ: bool = False, filter_secrets: bool = True) -> dict[str "arch": platform.machine(), "processor": platform.processor(), "count": os.cpu_count(), - "frequency": psutil.cpu_freq(), + "frequency": { + "current": psutil.cpu_freq().max, + "min": psutil.cpu_freq().max, + "max": psutil.cpu_freq().max, + }, }, "memory": { "percent": vmem.percent, From bff4251ff7d4737f4a788405700f76e7dbd87b2c Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Mon, 28 Apr 2025 10:20:54 +0200 Subject: [PATCH 107/110] chore: fix hearbeat --- .github/workflows/_scheduled-test.yml | 8 ++++++++ .gitignore | 2 ++ data/.keep | 0 3 files changed, 10 insertions(+) create mode 100644 data/.keep diff --git a/.github/workflows/_scheduled-test.yml b/.github/workflows/_scheduled-test.yml index 29d34682..6a6bd784 100644 --- a/.github/workflows/_scheduled-test.yml +++ b/.github/workflows/_scheduled-test.yml @@ -75,6 +75,14 @@ jobs: echo "# No test coverage computed." >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY fi + # Provide heartbeat to betterstack for monitoring/alerting if heartbeat url is configured as secret + if [ -n "$BETTERSTACK_HEARTBEAT_URL" ]; then + if [ $EXIT_CODE -eq 0 ]; then + curl -s $BETTERSTACK_HEARTBEAT_URL + else + curl -s $BETTERSTACK_HEARTBEAT_URL/$EXIT_CODE + fi + fi exit $EXIT_CODE - name: Upload test results diff --git a/.gitignore b/.gitignore index 01cf6cd9..23d310f0 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,5 @@ profile.html # Application specific +data/** +!data/.keep \ No newline at end of file diff --git a/data/.keep b/data/.keep new file mode 100644 index 00000000..e69de29b From 77f1e22282b54e9fe08c07cdb449a0ad739d36cb Mon Sep 17 00:00:00 2001 From: Helmut Hoffer von Ankershoffen Date: Mon, 28 Apr 2025 16:10:14 +0200 Subject: [PATCH 108/110] chore: betterstack --- .github/workflows/_scheduled-test.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/_scheduled-test.yml b/.github/workflows/_scheduled-test.yml index 6a6bd784..f6b79a2d 100644 --- a/.github/workflows/_scheduled-test.yml +++ b/.github/workflows/_scheduled-test.yml @@ -50,6 +50,8 @@ jobs: run: make audit - name: Test / scheduled + env: + BETTERSTACK_HEARTBEAT_URL: "${{ secrets.BETTERSTACK_HEARTBEAT_URL }}" run: | set +e make test_scheduled @@ -75,7 +77,7 @@ jobs: echo "# No test coverage computed." >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY fi - # Provide heartbeat to betterstack for monitoring/alerting if heartbeat url is configured as secret + # Provide heartbeat to bettersqtack for monitoring/alerting if heartbeat url is configured as secret if [ -n "$BETTERSTACK_HEARTBEAT_URL" ]; then if [ $EXIT_CODE -eq 0 ]; then curl -s $BETTERSTACK_HEARTBEAT_URL From 413a184dccbbb2ea411fe89d66b8abf00b22dac5 Mon Sep 17 00:00:00 2001 From: Andreas Kunft Date: Tue, 29 Apr 2025 16:12:18 +0200 Subject: [PATCH 109/110] chore: Expose ApplicationRun & Status --- CLI_REFERENCE.md | 2 +- src/aignostics/platform/__init__.py | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CLI_REFERENCE.md b/CLI_REFERENCE.md index 812f7680..25ffd53d 100644 --- a/CLI_REFERENCE.md +++ b/CLI_REFERENCE.md @@ -460,7 +460,7 @@ $ aignostics idc download [OPTIONS] SOURCE [TARGET] **Arguments**: * `SOURCE`: Filename of manifest, identifier, or comma-separate set of identifiers [required] -* `[TARGET]`: target directory for download [default: /Users/helmut/Code/python-sdk] +* `[TARGET]`: target directory for download [default: /Users/akunft/dev/python-sdk] **Options**: diff --git a/src/aignostics/platform/__init__.py b/src/aignostics/platform/__init__.py index a3ee1e09..fbfaf1e5 100644 --- a/src/aignostics/platform/__init__.py +++ b/src/aignostics/platform/__init__.py @@ -6,12 +6,11 @@ for all interactions with the Aignostics platform. """ +from aignx.codegen.models import ApplicationRunStatus, ItemStatus from aignx.codegen.models import ( InputArtifactCreationRequest as InputArtifact, ) -from aignx.codegen.models import ( - ItemCreationRequest as InputItem, -) +from aignx.codegen.models import ItemCreationRequest as InputItem from aignostics.platform._utils import generate_signed_url @@ -42,6 +41,7 @@ from ._messages import AUTHENTICATION_FAILED, NOT_YET_IMPLEMENTED, UNKNOWN_ENDPOINT_URL from ._settings import Settings, settings from ._utils import calculate_file_crc32c, download_file, mime_type_to_file_ending +from .resources.runs import ApplicationRun __all__ = [ "API_ROOT_DEV", @@ -69,9 +69,12 @@ "TOKEN_URL_PRODUCTION", "TOKEN_URL_STAGING", "UNKNOWN_ENDPOINT_URL", + "ApplicationRun", + "ApplicationRunStatus", "Client", "InputArtifact", "InputItem", + "ItemStatus", "Settings", "calculate_file_crc32c", "download_file", From 1a5852132273beba5dbc878adaefa76f9719aac5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 06:04:43 +0000 Subject: [PATCH 110/110] chore(deps): bump SonarSource/sonarqube-scan-action from 5.0.0 to 5.2.0 Bumps [SonarSource/sonarqube-scan-action](https://github.com/sonarsource/sonarqube-scan-action) from 5.0.0 to 5.2.0. - [Release notes](https://github.com/sonarsource/sonarqube-scan-action/releases) - [Commits](https://github.com/sonarsource/sonarqube-scan-action/compare/0303d6b62e310685c0e34d0b9cde218036885c4d...2500896589ef8f7247069a56136f8dc177c27ccf) --- updated-dependencies: - dependency-name: SonarSource/sonarqube-scan-action dependency-version: 5.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/_test.yml b/.github/workflows/_test.yml index ce50d9a6..08b7fb71 100644 --- a/.github/workflows/_test.yml +++ b/.github/workflows/_test.yml @@ -163,7 +163,7 @@ jobs: - name: SonarQube Scan if: ${{ !cancelled() && (env.GITHUB_WORKFLOW_RUNTIME != 'ACT') }} - uses: SonarSource/sonarqube-scan-action@0303d6b62e310685c0e34d0b9cde218036885c4d # v5.0.0 + uses: SonarSource/sonarqube-scan-action@2500896589ef8f7247069a56136f8dc177c27ccf # v5.2.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}